--- /dev/null 2018-06-17 23:18:20.806999507 +0800 +++ new/src/share/classes/jdk/jfr/internal/management/ManagementSupport.java 2019-01-29 11:00:16.895465113 +0800 @@ -0,0 +1,93 @@ +/* + * 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.internal.management; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import jdk.jfr.EventType; +import jdk.jfr.internal.JVMSupport; +import jdk.jfr.internal.LogLevel; +import jdk.jfr.internal.LogTag; +import jdk.jfr.internal.Logger; +import jdk.jfr.internal.MetadataRepository; +import jdk.jfr.internal.Utils; +import jdk.jfr.internal.instrument.JDKEvents; + +/** + * The management API in module jdk.management.jfr should be built on top of the + * public API in jdk.jfr. Before putting more functionality here, consider if it + * should not be part of the public API, and if not, please provide motivation + * + */ +public final class ManagementSupport { + + // Purpose of this method is to expose the event types to the + // FlightRecorderMXBean without instantiating Flight Recorder. + // + // This allows: + // + // 1) openJDK tests to run without commercial features being + // unlocked, which would be the case if FlightRecorder#getEventTypes would + // be used. + // + // 2 discoverability, so event settings can be exposed without the need to + // create a new Recording in FlightrecorderMXBean. + // + // 3) a graphical JMX client to list all attributes to the user, without + // loading JFR memory buffers. This is especially important when there is + // no intent to use Flight Recorder. + // + // An alternative design would be to make FlightRecorder#getEventTypes + // static, but it would the make the API look strange + // + public static List getEventTypes() { + // would normally be checked when a Flight Recorder instance is created + Utils.checkAccessFlightRecorder(); + if (JVMSupport.isNotAvailable()) { + return new ArrayList<>(); + } + JDKEvents.initialize(); // make sure JDK events are available + return Collections.unmodifiableList(MetadataRepository.getInstance().getRegisteredEventTypes()); + } + + // Reuse internal code for parsing a timespan + public static long parseTimespan(String s) { + return Utils.parseTimespan(s); + } + + // Reuse internal code for formatting settings + public static final String formatTimespan(Duration dValue, String separation) { + return Utils.formatTimespan(dValue, separation); + } + + // Reuse internal logging mechanism + public static void logError(String message) { + Logger.log(LogTag.JFR, LogLevel.ERROR, message); + } +}