--- /dev/null 2018-06-17 23:18:20.806999507 +0800 +++ new/src/share/classes/jdk/jfr/EventSettings.java 2019-01-29 10:58:36.810397990 +0800 @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr; + +import java.time.Duration; +import java.util.Map; + +/** + * Convenience class for applying event settings to a recording. + *
+ * An event setting object for a recording can be obtained by invoking + * the {@link Recording#enable(String)} method which is configured using method + * chaining. + *
+ * The following example shows how to use the {@code EventSetting} class. + *
+ * {@code + * Recording r = new Recording(); + * r.enable("com.oracle.jdk.CPULoad") + * .withPeriod(Duration.ofSeconds(1)); + * r.enable("com.oracle.jdk.FileWrite") + * .withoutStackTrace() + * .withThreshold(Duration.ofNanos(10)); + * r.start(); + * Thread.sleep(10_000); + * r.stop(); + * r.dump(Files.createTempFile("recording", ".jfr")); + * + * } + *+ * @since 9 + */ +public abstract class EventSettings { + + // package private + EventSettings() { + } + + /** + * Enables stack traces for the event that is associated with this event setting. + * + * Equivalent to invoking the {@code with("stackTrace", "true")} method. + * + * @return event settings object for further configuration, not {@code null} + */ + final public EventSettings withStackTrace() { + return with(StackTrace.NAME, "true"); + } + + /** + * Disables stack traces for the event that is associated with this event setting. + * + * Equivalent to invoking the {@code with("stackTrace", "false")} method. + * + * @return event settings object for further configuration, not {@code null} + */ + final public EventSettings withoutStackTrace() { + return with(StackTrace.NAME, "false"); + } + + /** + * Specifies that a threshold is not used. + *
+ * This is a convenience method, equivalent to invoking the
+ * {@code with("threshold", "0 s")} method.
+ *
+ * @return event settings object for further configuration, not {@code null}
+ */
+ final public EventSettings withoutThreshold() {
+ return with(Threshold.NAME, "0 s");
+ }
+
+ /**
+ * Sets the interval for the event that is associated with this event setting.
+ *
+ * @param duration the duration, not {@code null}
+ *
+ * @return event settings object for further configuration, not {@code null}
+ */
+ final public EventSettings withPeriod(Duration duration) {
+ return with(Period.NAME, duration.toNanos() + " ns");
+ }
+
+ /**
+ * Sets the threshold for the event that is associated with this event setting.
+ *
+ * @param duration the duration, or {@code null} if no duration is used
+ *
+ * @return event settings object for further configuration, not {@code null}
+ */
+ final public EventSettings withThreshold(Duration duration) {
+ if (duration == null) {
+ return with(Threshold.NAME, "0 ns");
+ } else {
+ return with(Threshold.NAME, duration.toNanos() + " ns");
+ }
+ }
+
+ /**
+ * Sets a setting value for the event that is associated with this event setting.
+ *
+ * @param name the name of the setting (for example, {@code "threshold"})
+ *
+ * @param value the value to set (for example {@code "20 ms"} not
+ * {@code null})
+ *
+ * @return event settings object for further configuration, not {@code null}
+ */
+ abstract public EventSettings with(String name, String value);
+
+ /**
+ * Creates a settings {@code Map} for the event that is associated with this
+ * event setting.
+ *
+ * @return a settings {@code Map}, not {@code null}
+ */
+ abstract Map