changeset 107:ce3c2d25fc44

JMC-6277: Supporting new JavaFX 12 events (also fixing various warnings and mounting optional pages in better places) Reviewed-by: ghb
author hirt <marcus.hirt@oracle.com>
date Tue, 08 Jan 2019 09:00:45 +0100
parents d96709511300
children f8a214df14d4
files application/org.openjdk.jmc.browser.attach/src/main/java/org/openjdk/jmc/browser/attach/LocalJVMToolkit.java application/org.openjdk.jmc.flightrecorder.ext.g1/pages.xml application/org.openjdk.jmc.flightrecorder.ext.jfx/pages.xml application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/java/org/openjdk/jmc/flightrecorder/ext/jfx/JfxConstants.java application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/java/org/openjdk/jmc/flightrecorder/ext/jfx/JfxPage.java application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/java/org/openjdk/jmc/flightrecorder/ext/jfx/JfxPulseDurationRule.java application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/java/org/openjdk/jmc/flightrecorder/ext/jfx/JfxVersionUtil.java application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/java/org/openjdk/jmc/flightrecorder/ext/jfx/Messages.java application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/resources/org/openjdk/jmc/flightrecorder/ext/jfx/messages.properties application/org.openjdk.jmc.flightrecorder.metadata/pages.xml application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/DataPageDescriptor.java application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/common/DataPageToolkit.java application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/overview/ResultReportUi.java application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/pages/ClassLoadingPage.java application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/pages/GarbageCollectionsPage.java application/org.openjdk.jmc.rjmx/src/main/java/org/openjdk/jmc/rjmx/services/internal/HotSpot24DiagnosticCommandService.java application/org.openjdk.jmc.ui/src/main/java/org/openjdk/jmc/ui/charts/XYDataRenderer.java application/org.openjdk.jmc.ui/src/main/java/org/openjdk/jmc/ui/misc/AwtCanvas.java core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/general/DuplicateFlagsRule.java core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/latency/MethodProfilingRule.java core/org.openjdk.jmc.flightrecorder/src/main/java/org/openjdk/jmc/flightrecorder/jdk/JdkAttributes.java core/org.openjdk.jmc.flightrecorder/src/main/java/org/openjdk/jmc/flightrecorder/jdk/messages/internal/Messages.java
diffstat 22 files changed, 170 insertions(+), 77 deletions(-) [+]
line wrap: on
line diff
--- a/application/org.openjdk.jmc.browser.attach/src/main/java/org/openjdk/jmc/browser/attach/LocalJVMToolkit.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.browser.attach/src/main/java/org/openjdk/jmc/browser/attach/LocalJVMToolkit.java	Tue Jan 08 09:00:45 2019 +0100
@@ -266,7 +266,7 @@
 			});
 			return future.get(TIMEOUT_THRESHOLD, TimeUnit.SECONDS);
 		} catch (Exception e) {
-			BrowserAttachPlugin.getPluginLogger().log(Level.WARNING, "Failed to create descriptor for jvm with PID " + vmid, e);
+			BrowserAttachPlugin.getPluginLogger().log(Level.WARNING, "Failed to create descriptor for jvm with PID " + vmid, e); //$NON-NLS-1$
 			return null;
 		}
 	}
--- a/application/org.openjdk.jmc.flightrecorder.ext.g1/pages.xml	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.flightrecorder.ext.g1/pages.xml	Tue Jan 08 09:00:45 2019 +0100
@@ -32,7 +32,7 @@
    WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <pages>
-	<page factory="org.openjdk.jmc.flightrecorder.ext.g1" id="org.openjdk.jmc.flightrecorder.ext.g1">
+	<page factory="org.openjdk.jmc.flightrecorder.ext.g1" id="org.openjdk.jmc.flightrecorder.ext.g1" parent="org.openjdk.jmc.flightrecorder.ui.jvminternals">
 		<state>
 		</state>
 	</page>
--- a/application/org.openjdk.jmc.flightrecorder.ext.jfx/pages.xml	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.flightrecorder.ext.jfx/pages.xml	Tue Jan 08 09:00:45 2019 +0100
@@ -33,7 +33,7 @@
 -->
 <pages>
 	<page factory="org.openjdk.jmc.flightrecorder.ext.jfx" id="mc.flr.page.javafx"
-		weight="/#9.0">
+		weight="/#5JavaFx">
 		<state>
 			<mainSash weights="2,1" />
 			<tableSash weights="15,8" horizontal="true" />
--- a/application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/java/org/openjdk/jmc/flightrecorder/ext/jfx/JfxConstants.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/java/org/openjdk/jmc/flightrecorder/ext/jfx/JfxConstants.java	Tue Jan 08 09:00:45 2019 +0100
@@ -32,8 +32,6 @@
  */
 package org.openjdk.jmc.flightrecorder.ext.jfx;
 
-import java.awt.Color;
-
 import org.openjdk.jmc.common.item.Aggregators;
 import org.openjdk.jmc.common.item.Attribute;
 import org.openjdk.jmc.common.item.IAggregator;
@@ -44,29 +42,33 @@
 import org.openjdk.jmc.common.unit.UnitLookup;
 import org.openjdk.jmc.flightrecorder.JfrAttributes;
 
-public class JfxConstants {
+final class JfxConstants {
 
-	static final String JFX_PULSE_ID = "http://www.oracle.com/technetwork/java/javafx/index.html/javafx/pulse"; //$NON-NLS-1$
-	static final String JFX_INPUT_ID = "http://www.oracle.com/technetwork/java/javafx/index.html/javafx/input"; //$NON-NLS-1$
+	static final String TYPE_ID_PULSE_PHASE_8 = "http://www.oracle.com/technetwork/java/javafx/index.html/javafx/pulse"; //$NON-NLS-1$
+	static final String TYPE_ID_INPUT_8 = "http://www.oracle.com/technetwork/java/javafx/index.html/javafx/input"; //$NON-NLS-1$
+	static final String TYPE_ID_PULSE_PHASE_12 = "javafx.PulsePhase"; //$NON-NLS-1$
+	static final String TYPE_ID_INPUT_12 = "javafx.Input"; //$NON-NLS-1$
 
 	static final String JFX_RULE_PATH = "javaFx"; //$NON-NLS-1$
 
-	static final Color PULSE_ID_COLOR = new Color(0xE37A44);
-
-	static final IItemFilter JFX_PULSE_FILTER = ItemFilters.type(JFX_PULSE_ID);
-	static final IItemFilter JFX_INPUT_FILTER = ItemFilters.type(JFX_INPUT_ID);
+	static final IItemFilter JFX_PULSE_FILTER = ItemFilters.or(ItemFilters.type(TYPE_ID_PULSE_PHASE_8), ItemFilters.type(TYPE_ID_PULSE_PHASE_12));
+	static final IItemFilter JFX_INPUT_FILTER = ItemFilters.or(ItemFilters.type(TYPE_ID_INPUT_8), ItemFilters.type(TYPE_ID_INPUT_12));
 
 	static final IItemFilter JFX_FILTER = ItemFilters.or(JFX_INPUT_FILTER, JFX_PULSE_FILTER);
 
-	static final IAttribute<IQuantity> PULSE_ID = Attribute.attr("pulseNumber", Messages.JfxConstants_PULSE_ID, //$NON-NLS-1$
+	static final IAttribute<IQuantity> ATTRIBUTE_PULSE_ID_8 = Attribute.attr("pulseNumber", Messages.JfxConstants_PULSE_ID, //$NON-NLS-1$
 			UnitLookup.NUMBER);
-	static final IAttribute<String> PHASE_NAME = Attribute.attr("phase", Messages.JfxConstants_PHASE, //$NON-NLS-1$
+	static final IAttribute<IQuantity> ATTRIBUTE_PULSE_ID_12 = Attribute.attr("pulseId", Messages.JfxConstants_PULSE_ID, //$NON-NLS-1$
+			UnitLookup.NUMBER);
+	static final IAttribute<String> ATTRIBUTE_PHASE_NAME_8 = Attribute.attr("phase", Messages.JfxConstants_PHASE_NAME, //$NON-NLS-1$
+			UnitLookup.PLAIN_TEXT);
+	static final IAttribute<String> ATTRIBUTE_PHASE_NAME_12 = Attribute.attr("phaseName", Messages.JfxConstants_PHASE_NAME, //$NON-NLS-1$
 			UnitLookup.PLAIN_TEXT);
 	static final IAttribute<String> INPUT_TYPE = Attribute.attr("input", Messages.JfxConstants_INPUT_TYPE, //$NON-NLS-1$
 			UnitLookup.PLAIN_TEXT);
 
-	static final IAggregator<IQuantity, ?> MAX_PULSE_DURATION = Aggregators.max(JFX_PULSE_ID, JfrAttributes.DURATION);
+	static final IAggregator<IQuantity, ?> MAX_PULSE_DURATION = Aggregators.max(TYPE_ID_PULSE_PHASE_12, JfrAttributes.DURATION);
 	static final IAggregator<IQuantity, ?> PULSE_START = Aggregators.min(Messages.JfxConstants_PULSE_START,
-			Messages.JfxConstants_PULSE_START_DESCRIPTION, JfxConstants.JFX_PULSE_ID, JfrAttributes.START_TIME);
+			Messages.JfxConstants_PULSE_START_DESCRIPTION, JfxConstants.TYPE_ID_PULSE_PHASE_12, JfrAttributes.START_TIME);
 
 }
--- a/application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/java/org/openjdk/jmc/flightrecorder/ext/jfx/JfxPage.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/java/org/openjdk/jmc/flightrecorder/ext/jfx/JfxPage.java	Tue Jan 08 09:00:45 2019 +0100
@@ -56,6 +56,7 @@
 import org.openjdk.jmc.common.unit.IQuantity;
 import org.openjdk.jmc.common.unit.IRange;
 import org.openjdk.jmc.flightrecorder.JfrAttributes;
+import org.openjdk.jmc.flightrecorder.ext.jfx.JfxVersionUtil.JavaFxEventAvailability;
 import org.openjdk.jmc.flightrecorder.ui.IDataPageFactory;
 import org.openjdk.jmc.flightrecorder.ui.IDisplayablePage;
 import org.openjdk.jmc.flightrecorder.ui.IPageContainer;
@@ -115,7 +116,7 @@
 
 	private static final ItemHistogramBuilder BY_PULSE_HISTOGRAM = new ItemHistogramBuilder();
 	private static final ItemHistogramBuilder INPUT_HISTOGRAM = new ItemHistogramBuilder();
-	private static final ItemListBuilder PHASE_LIST = new ItemListBuilder();
+	private final ItemListBuilder phaseList = new ItemListBuilder();
 
 	private static final String TOTAL_DURATION = "totalDuration"; //$NON-NLS-1$
 	private static final String PULSE_START = "pulseStart"; //$NON-NLS-1$
@@ -125,12 +126,6 @@
 		BY_PULSE_HISTOGRAM.addColumn(TOTAL_DURATION, Aggregators.sum(JfrAttributes.DURATION));
 		BY_PULSE_HISTOGRAM.addColumn(PULSE_START, JfxConstants.PULSE_START);
 
-		PHASE_LIST.addColumn(JfrAttributes.DURATION);
-		PHASE_LIST.addColumn(JfrAttributes.START_TIME);
-		PHASE_LIST.addColumn(JfxConstants.PHASE_NAME);
-		PHASE_LIST.addColumn(JfrAttributes.EVENT_THREAD);
-		PHASE_LIST.addColumn(JfxConstants.PULSE_ID);
-
 		INPUT_HISTOGRAM.addCountColumn();
 		INPUT_HISTOGRAM.addColumn(TOTAL_DURATION, Aggregators.sum(JfrAttributes.DURATION));
 	}
@@ -171,6 +166,8 @@
 			this.items = items;
 			Form form = DataPageToolkit.createForm(parent, toolkit, name, icon);
 
+			JavaFxEventAvailability availability = JfxVersionUtil.getAvailability(getItems());
+			
 			mainSash = new SashForm(form.getBody(), SWT.VERTICAL | SWT.SMOOTH);
 			toolkit.adapt(mainSash);
 			tableSash = new SashForm(mainSash, SWT.HORIZONTAL | SWT.SMOOTH);
@@ -179,7 +176,7 @@
 			Section phases = CompositeToolkit.createSection(tableSash, toolkit, Messages.JfxPage_PHASES);
 			phasesSash = new SashForm(phases, SWT.HORIZONTAL | SWT.SMOOTH);
 			phases.setClient(phasesSash);
-			pulsesTable = BY_PULSE_HISTOGRAM.buildWithoutBorder(phasesSash, JfxConstants.PULSE_ID,
+			pulsesTable = BY_PULSE_HISTOGRAM.buildWithoutBorder(phasesSash, JfxVersionUtil.getPulseIdAttribute(availability),
 					getPulseTableSettings(state.getChild(PULSES_TABLE)));
 			pulsesFilter = FilterComponent.createFilterComponent(pulsesTable, pulsesTableFilter,
 					getItems().apply(JfxConstants.JFX_PULSE_FILTER), pageContainer.getSelectionStore()::getSelections,
@@ -189,7 +186,13 @@
 					pulsesFilter.getShowSearchAction(), pulsesFilter.getShowFilterAction());
 			pulsesFilter.loadState(state.getChild(PULSES_FILTER));
 
-			phasesTable = PHASE_LIST.buildWithoutBorder(phasesSash, getPhaseListSettings(state.getChild(PHASES_TABLE)));
+			phaseList.addColumn(JfrAttributes.DURATION);
+			phaseList.addColumn(JfrAttributes.START_TIME);
+			phaseList.addColumn(JfxVersionUtil.getPhaseNameAttribute(availability));
+			phaseList.addColumn(JfrAttributes.EVENT_THREAD);
+			phaseList.addColumn(JfxVersionUtil.getPulseIdAttribute(availability));
+			
+			phasesTable = phaseList.buildWithoutBorder(phasesSash, getPhaseListSettings(state.getChild(PHASES_TABLE)));
 			phasesFilter = FilterComponent.createFilterComponent(phasesTable, phasesTableFilter,
 					getItems().apply(JfxConstants.JFX_PULSE_FILTER), pageContainer.getSelectionStore()::getSelections,
 					this::onPhasesFilterChange);
@@ -370,9 +373,10 @@
 	}
 
 	private static IXDataRenderer buildThreadRenderer(Object threadName, IItemCollection items) {
+		// Attribute only used for looking up color and name information here
 		IXDataRenderer phaseRenderer = DataPageToolkit.buildSpanRenderer(items,
-				DataPageToolkit.getAttributeValueColor(JfxConstants.PHASE_NAME));
-		return new ItemRow(String.valueOf(threadName), JfxConstants.PHASE_NAME.getDescription(), phaseRenderer, items);
+				DataPageToolkit.getAttributeValueColor(JfxConstants.ATTRIBUTE_PHASE_NAME_12));
+		return new ItemRow(String.valueOf(threadName), JfxConstants.ATTRIBUTE_PHASE_NAME_12.getDescription(), phaseRenderer, items);
 	}
 
 	private static TableSettings getPulseTableSettings(IState state) {
@@ -390,8 +394,8 @@
 			return new TableSettings(JfrAttributes.DURATION.getIdentifier(),
 					Arrays.asList(new ColumnSettings(JfrAttributes.DURATION.getIdentifier(), false, 100, false),
 							new ColumnSettings(JfrAttributes.DURATION.getIdentifier(), false, 200, false),
-							new ColumnSettings(JfxConstants.PHASE_NAME.getIdentifier(), false, 100, false),
-							new ColumnSettings(JfxConstants.PULSE_ID.getIdentifier(), false, 100, false),
+							new ColumnSettings(JfxConstants.ATTRIBUTE_PHASE_NAME_12.getIdentifier(), false, 100, false),
+							new ColumnSettings(JfxConstants.ATTRIBUTE_PULSE_ID_12.getIdentifier(), false, 100, false),
 							new ColumnSettings(JfrAttributes.EVENT_THREAD.getIdentifier(), false, 200, false)));
 		} else {
 			return new TableSettings(state);
--- a/application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/java/org/openjdk/jmc/flightrecorder/ext/jfx/JfxPulseDurationRule.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/java/org/openjdk/jmc/flightrecorder/ext/jfx/JfxPulseDurationRule.java	Tue Jan 08 09:00:45 2019 +0100
@@ -52,10 +52,10 @@
 import org.openjdk.jmc.common.util.IPreferenceValueProvider;
 import org.openjdk.jmc.common.util.TypedPreference;
 import org.openjdk.jmc.flightrecorder.JfrAttributes;
+import org.openjdk.jmc.flightrecorder.ext.jfx.JfxVersionUtil.JavaFxEventAvailability;
 import org.openjdk.jmc.flightrecorder.rules.IRule;
 import org.openjdk.jmc.flightrecorder.rules.Result;
 import org.openjdk.jmc.flightrecorder.rules.util.RulesToolkit;
-import org.openjdk.jmc.flightrecorder.rules.util.RulesToolkit.EventAvailability;
 
 public class JfxPulseDurationRule implements IRule {
 	private static final String RESULT_ID = "pulseDuration"; //$NON-NLS-1$
@@ -76,18 +76,23 @@
 			.<TypedPreference<?>> asList(CONFIG_TARGET_FRAME_RATE);
 
 	private Result getResult(IItemCollection items, IPreferenceValueProvider valueProvider) {
-		EventAvailability eventAvailability = RulesToolkit.getEventAvailability(items, JfxConstants.JFX_PULSE_ID);
-		if (eventAvailability == EventAvailability.DISABLED || eventAvailability == EventAvailability.UNKNOWN
-				|| eventAvailability == EventAvailability.NONE) {
-			return RulesToolkit.getEventAvailabilityResult(this, items, eventAvailability, JfxConstants.JFX_PULSE_ID);
+		JavaFxEventAvailability availability = JfxVersionUtil.getAvailability(items);
+		if (availability == JavaFxEventAvailability.None) {
+			// Could possibly check the JVM version for better suggestions here, but not very important
+			return RulesToolkit.getEventAvailabilityResult(this, items,
+					RulesToolkit.getEventAvailability(items, JfxConstants.TYPE_ID_PULSE_PHASE_12),
+					JfxConstants.TYPE_ID_PULSE_PHASE_12);
 		}
+
 		IQuantity targetFramerate = valueProvider.getPreferenceValue(CONFIG_TARGET_FRAME_RATE);
 		ITypedQuantity<LinearUnit> targetPhaseTime = UnitLookup.MILLISECOND
 				.quantity(1000.0 / targetFramerate.longValue());
 		IItemFilter longDurationFilter = ItemFilters.more(JfrAttributes.DURATION, targetPhaseTime);
-		IItemFilter longPhasesFilter = ItemFilters.and(longDurationFilter, ItemFilters.type(JfxConstants.JFX_PULSE_ID));
+		IItemFilter longPhasesFilter = ItemFilters.and(longDurationFilter,
+				ItemFilters.type(JfxVersionUtil.getPulseTypeId(availability)));
 		IQuantity longPhases = items.getAggregate(Aggregators.count(longPhasesFilter));
-		IQuantity allPhases = items.getAggregate(Aggregators.count(ItemFilters.type(JfxConstants.JFX_PULSE_ID)));
+		IQuantity allPhases = items
+				.getAggregate(Aggregators.count(ItemFilters.type(JfxVersionUtil.getPulseTypeId(availability))));
 		if (longPhases != null && longPhases.doubleValue() > 0) {
 			double ratioOfLongPhases = longPhases.ratioTo(allPhases);
 			double mappedScore = RulesToolkit.mapExp100(ratioOfLongPhases, 0.05, 0.5);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/java/org/openjdk/jmc/flightrecorder/ext/jfx/JfxVersionUtil.java	Tue Jan 08 09:00:45 2019 +0100
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * The contents of this file are subject to the terms of either the Universal Permissive License
+ * v 1.0 as shown at http://oss.oracle.com/licenses/upl
+ *
+ * or the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are permitted
+ * provided that the following conditions are met:
+ * 
+ * 1. Redistributions of source code must retain the above copyright notice, this list of conditions
+ * and the following disclaimer.
+ * 
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other materials provided with
+ * the distribution.
+ * 
+ * 3. Neither the name of the copyright holder nor the names of its contributors may be used to
+ * endorse or promote products derived from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.openjdk.jmc.flightrecorder.ext.jfx;
+
+import org.openjdk.jmc.common.item.IAttribute;
+import org.openjdk.jmc.common.item.IItemCollection;
+import org.openjdk.jmc.common.unit.IQuantity;
+import org.openjdk.jmc.flightrecorder.rules.util.RulesToolkit;
+import org.openjdk.jmc.flightrecorder.rules.util.RulesToolkit.EventAvailability;
+
+/**
+ * Package local helper.
+ */
+final class JfxVersionUtil {
+	enum JavaFxEventAvailability {
+		None, JavaFx8, JavaFx12
+	}
+	
+	static JavaFxEventAvailability getAvailability(IItemCollection items) {
+		EventAvailability eventAvailability = RulesToolkit.getEventAvailability(items, JfxConstants.TYPE_ID_PULSE_PHASE_12);
+		if (RulesToolkit.isEventsEnabled(eventAvailability)) {
+			return JavaFxEventAvailability.JavaFx12;
+		}		
+		eventAvailability = RulesToolkit.getEventAvailability(items, JfxConstants.TYPE_ID_PULSE_PHASE_8);
+		if (RulesToolkit.isEventsEnabled(eventAvailability)) {
+			return JavaFxEventAvailability.JavaFx8;
+		}
+		return JavaFxEventAvailability.None;
+	}
+	
+
+	static String getPulseTypeId(JavaFxEventAvailability availability) {
+		if (availability == JavaFxEventAvailability.JavaFx8) {
+			return JfxConstants.TYPE_ID_PULSE_PHASE_8;
+		}
+		return JfxConstants.TYPE_ID_PULSE_PHASE_12;
+	}
+
+
+	static IAttribute<IQuantity> getPulseIdAttribute(JavaFxEventAvailability availability) {
+		if (availability == JavaFxEventAvailability.JavaFx8) {
+			return JfxConstants.ATTRIBUTE_PULSE_ID_8;
+		}
+		return JfxConstants.ATTRIBUTE_PULSE_ID_12;
+	}
+
+
+	static IAttribute<String> getPhaseNameAttribute(JavaFxEventAvailability availability) {
+		if (availability == JavaFxEventAvailability.JavaFx8) {
+			return JfxConstants.ATTRIBUTE_PHASE_NAME_8;
+		}
+		return JfxConstants.ATTRIBUTE_PHASE_NAME_12;
+	}
+}
--- a/application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/java/org/openjdk/jmc/flightrecorder/ext/jfx/Messages.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/java/org/openjdk/jmc/flightrecorder/ext/jfx/Messages.java	Tue Jan 08 09:00:45 2019 +0100
@@ -38,7 +38,7 @@
 	private static final String BUNDLE_NAME = "org.openjdk.jmc.flightrecorder.ext.jfx.messages"; //$NON-NLS-1$
 
 	public static String JfxConstants_INPUT_TYPE;
-	public static String JfxConstants_PHASE;
+	public static String JfxConstants_PHASE_NAME;
 	public static String JfxConstants_PULSE_ID;
 	public static String JfxConstants_PULSE_START;
 	public static String JfxConstants_PULSE_START_DESCRIPTION;
--- a/application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/resources/org/openjdk/jmc/flightrecorder/ext/jfx/messages.properties	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.flightrecorder.ext.jfx/src/main/resources/org/openjdk/jmc/flightrecorder/ext/jfx/messages.properties	Tue Jan 08 09:00:45 2019 +0100
@@ -31,7 +31,7 @@
 #  WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
 JfxConstants_INPUT_TYPE=Input Type
-JfxConstants_PHASE=Phase
+JfxConstants_PHASE_NAME=Phase Name
 JfxConstants_PULSE_ID=Pulse ID
 JfxConstants_PULSE_START=Pulse Start
 JfxConstants_PULSE_START_DESCRIPTION=The time the pulse started
--- a/application/org.openjdk.jmc.flightrecorder.metadata/pages.xml	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.flightrecorder.metadata/pages.xml	Tue Jan 08 09:00:45 2019 +0100
@@ -35,6 +35,7 @@
       <page
             factory="org.openjdk.jmc.flightrecorder.metadata"
             id="mc.flr.page.metadata"
+            parent="org.openjdk.jmc.flightrecorder.ui.eventbrowser"
             weight="/#9.0">
   		<state>
            <attributeTable sortColumn="id">
--- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/DataPageDescriptor.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/DataPageDescriptor.java	Tue Jan 08 09:00:45 2019 +0100
@@ -156,5 +156,9 @@
 	public ImageDescriptor getImageDescriptor() {
 		return factory.getImageDescriptor(pageState);
 	}
-
+	
+	@Override
+	public String toString() {
+		return getId() + " children:" + String.valueOf(children); //$NON-NLS-1$
+	}
 }
--- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/common/DataPageToolkit.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/common/DataPageToolkit.java	Tue Jan 08 09:00:45 2019 +0100
@@ -238,7 +238,7 @@
 	}
 
 	private static String createColumnId(IAttribute<?> attr) {
-		return new StringBuilder().append(attr.getIdentifier()).append(":")
+		return new StringBuilder().append(attr.getIdentifier()).append(":") //$NON-NLS-1$
 				.append(attr.getContentType().getIdentifier()).toString();
 	}
 
--- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/overview/ResultReportUi.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/overview/ResultReportUi.java	Tue Jan 08 09:00:45 2019 +0100
@@ -87,8 +87,8 @@
 
 	private static final String OVERVIEW_MAKE_SCALABLE = "overview.makeScalable();"; //$NON-NLS-1$
 	private static final String OVERVIEW_UPDATE_PAGE_HEADERS_VISIBILITY = "overview.updatePageHeadersVisibility();"; //$NON-NLS-1$
-	private static final Pattern HTML_ANCHOR_PATTERN = Pattern.compile("<a href=\"(.*?)\">(.*?)</a>");
-	private static final String OPEN_BROWSER_WINDOW = "openWindowByUrl";
+	private static final Pattern HTML_ANCHOR_PATTERN = Pattern.compile("<a href=\"(.*?)\">(.*?)</a>"); //$NON-NLS-1$
+	private static final String OPEN_BROWSER_WINDOW = "openWindowByUrl"; //$NON-NLS-1$
 
 	private static class Linker extends BrowserFunction {
 
@@ -291,9 +291,9 @@
 	}
 
 	private static String openWindowMethod(String url, String name){
-        return new StringBuilder().append("#\" onclick=\"").append(OPEN_BROWSER_WINDOW).append("(").append("\u0027")
-                .append(url).append("\u0027").append(',').append("\u0027")
-                .append(name).append("\u0027").append(");return false;").toString();
+        return new StringBuilder().append("#\" onclick=\"").append(OPEN_BROWSER_WINDOW).append("(").append("\u0027") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+                .append(url).append("\u0027").append(',').append("\u0027") //$NON-NLS-1$ //$NON-NLS-2$
+                .append(name).append("\u0027").append(");return false;").toString();  //$NON-NLS-1$//$NON-NLS-2$
     }
 
 	public ResultReportUi(boolean isSinglePage) {
@@ -351,7 +351,7 @@
 						continue;
 					}
 					long score = Math.round(result.getScore());
-					String adjustedHtml = adjustAnchorFollowAction(RulesHtmlToolkit.getDescription(result));//$NON-NLS-1$ //$NON-NLS-2$
+					String adjustedHtml = adjustAnchorFollowAction(RulesHtmlToolkit.getDescription(result));
 					String quoteEscape = adjustedHtml.replaceAll("\\\"", "\\\\\""); //$NON-NLS-1$ //$NON-NLS-2$
 					String description = quoteEscape.replaceAll("\n", "</br>"); //$NON-NLS-1$ //$NON-NLS-2$
 					script.append(String.format("overview.updateResult(\"%s\", %d, \"%s\");", //$NON-NLS-1$
@@ -430,7 +430,7 @@
 			browser.addProgressListener(new ProgressAdapter() {
 				@Override
 				public void completed(ProgressEvent event) {
-					new OpenWindowFunction(browser, OPEN_BROWSER_WINDOW); //$NON-NLS-1$
+					new OpenWindowFunction(browser, OPEN_BROWSER_WINDOW);
 					new Linker(browser, "linker", descriptors, editor); //$NON-NLS-1$
 					new Expander(browser, "expander"); //$NON-NLS-1$
 					browser.execute(String.format("overview.showOk(%b);", showOk)); //$NON-NLS-1$
--- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/pages/ClassLoadingPage.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/pages/ClassLoadingPage.java	Tue Jan 08 09:00:45 2019 +0100
@@ -33,11 +33,7 @@
 package org.openjdk.jmc.flightrecorder.ui.pages;
 
 
-import static org.openjdk.jmc.common.item.ItemQueryBuilder.fromWhere;
-
 import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -60,7 +56,6 @@
 import org.openjdk.jmc.common.IState;
 import org.openjdk.jmc.common.IWritableState;
 import org.openjdk.jmc.common.item.Aggregators;
-import org.openjdk.jmc.common.item.IAggregator;
 import org.openjdk.jmc.common.item.IAttribute;
 import org.openjdk.jmc.common.item.IItemCollection;
 import org.openjdk.jmc.common.item.IItemFilter;
--- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/pages/GarbageCollectionsPage.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/pages/GarbageCollectionsPage.java	Tue Jan 08 09:00:45 2019 +0100
@@ -64,7 +64,6 @@
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
 import org.eclipse.ui.forms.widgets.Form;
 import org.eclipse.ui.forms.widgets.FormToolkit;
 
@@ -161,7 +160,7 @@
 	private static final ReferenceStatisticsType[] REF_TYPE = ReferenceStatisticsType.values();
 	private static final String SASH = "sash"; //$NON-NLS-1$
 	private static final String TABLE_SASH = "tableSash"; //$NON-NLS-1$
-	private static final String THREAD_LANES = "threadLane"; // $NON-NLS-1$
+	private static final String THREAD_LANES = "threadLane"; //$NON-NLS-1$
 	private static final String GCS = "gcs"; //$NON-NLS-1$
 	private static final String CHART = "chart"; //$NON-NLS-1$
 	private static final String PHASE_TABLE_FILTER = "phaseTableFilter"; //$NON-NLS-1$
--- a/application/org.openjdk.jmc.rjmx/src/main/java/org/openjdk/jmc/rjmx/services/internal/HotSpot24DiagnosticCommandService.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.rjmx/src/main/java/org/openjdk/jmc/rjmx/services/internal/HotSpot24DiagnosticCommandService.java	Tue Jan 08 09:00:45 2019 +0100
@@ -287,7 +287,7 @@
 	}
 
 	private void refreshOperations() throws Exception {
-		RJMXPlugin.getDefault().getLogger().finer("Refreshing diagnostic operations");
+		RJMXPlugin.getDefault().getLogger().finer("Refreshing diagnostic operations"); //$NON-NLS-1$
 		MBeanInfo info = m_mbeanServer.getMBeanInfo(DIAGNOSTIC_BEAN);
 		operations = new ArrayList<>(info.getOperations().length);
 		commandNameToOperation.clear();
--- a/application/org.openjdk.jmc.ui/src/main/java/org/openjdk/jmc/ui/charts/XYDataRenderer.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.ui/src/main/java/org/openjdk/jmc/ui/charts/XYDataRenderer.java	Tue Jan 08 09:00:45 2019 +0100
@@ -44,7 +44,6 @@
 
 import org.openjdk.jmc.common.IDisplayable;
 import org.openjdk.jmc.common.unit.IQuantity;
-import org.openjdk.jmc.common.unit.LinearUnit;
 import org.openjdk.jmc.common.unit.UnitLookup;
 import org.openjdk.jmc.common.util.ColorToolkit;
 import org.openjdk.jmc.ui.charts.AWTChartToolkit.IColorProvider;
--- a/application/org.openjdk.jmc.ui/src/main/java/org/openjdk/jmc/ui/misc/AwtCanvas.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/application/org.openjdk.jmc.ui/src/main/java/org/openjdk/jmc/ui/misc/AwtCanvas.java	Tue Jan 08 09:00:45 2019 +0100
@@ -68,13 +68,13 @@
 			imageDataSWT = new ImageData(width, height, 24, vpPalette, scanlinePad, byteData);
 			Graphics2D graphicsAWT = imageAWT.createGraphics();
 			setAntiAliasing(graphicsAWT);
-			graphicsAWT.setFont(new Font("OptionPane.font", Font.PLAIN, 12));
+			graphicsAWT.setFont(new Font("OptionPane.font", Font.PLAIN, 12)); //$NON-NLS-1$
 			fixDPI(graphicsAWT);
 			return graphicsAWT;
 		} else {
 			Graphics2D graphicsAWT = imageAWT.createGraphics();
 			setAntiAliasing(graphicsAWT);
-			graphicsAWT.setFont(new Font("OptionPane.font", Font.PLAIN, 12));
+			graphicsAWT.setFont(new Font("OptionPane.font", Font.PLAIN, 12)); //$NON-NLS-1$
 			graphicsAWT.clearRect(0, 0, width, height);
 			fixDPI(graphicsAWT);
 			return graphicsAWT;
--- a/core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/general/DuplicateFlagsRule.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/general/DuplicateFlagsRule.java	Tue Jan 08 09:00:45 2019 +0100
@@ -82,7 +82,7 @@
 				StringBuilder sb = new StringBuilder();
 				sb.append("<ul>"); //$NON-NLS-1$
 				for (ArrayList<String> dupe : dupes) {
-					sb.append("<li>" + Encode.forHtml(StringToolkit.join(dupe, ", ")) + "</li>"); //$NON-NLS-1$ //$NON-NLS-2$
+					sb.append("<li>" + Encode.forHtml(StringToolkit.join(dupe, ", ")) + "</li>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 				}
 				sb.append("</ul>"); //$NON-NLS-1$
 				String shortDescription = dupes.size() > 1
--- a/core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/latency/MethodProfilingRule.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/core/org.openjdk.jmc.flightrecorder.rules.jdk/src/main/java/org/openjdk/jmc/flightrecorder/rules/jdk/latency/MethodProfilingRule.java	Tue Jan 08 09:00:45 2019 +0100
@@ -176,7 +176,7 @@
 			"method.profiling.evaluation.excluded.package", //$NON-NLS-1$
 			Messages.getString(Messages.MethodProfilingRule_EXCLUDED_PACKAGES),
 			Messages.getString(Messages.MethodProfilingRule_EXCLUDED_PACKAGES_DESC),
-			UnitLookup.PLAIN_TEXT.getPersister(), "java\\.(lang|util)");
+			UnitLookup.PLAIN_TEXT.getPersister(), "java\\.(lang|util)"); //$NON-NLS-1$
 	private static final List<TypedPreference<?>> CONFIG_ATTRIBUTES = Arrays.<TypedPreference<?>> asList(WINDOW_SIZE, EXCLUDED_PACKAGE_REGEXP);
 
 	/**
@@ -232,7 +232,7 @@
 			excludes = Pattern.compile(excludedPattern);
 		} catch (Exception e) {
 			// Make sure we don't blow up on an invalid pattern.
-			excludes = Pattern.compile("");
+			excludes = Pattern.compile(""); //$NON-NLS-1$
 		}
 		List<MethodProfilingWindowResult> windowResults = new ArrayList<>();
 		IUnorderedWindowVisitor visitor = createWindowVisitor(settings, settingsFilter, windowSize, windowResults,
@@ -401,7 +401,7 @@
 				final IMCMethod[] maxMethod = new IMCMethod[1];
 				final IMCStackTrace[] maxPath = new IMCStackTrace[1];
 				// Using this GroupingAggregator because it's the only way to extract the keys from the aggregation along with values
-				IAggregator<IQuantity, ?> aggregator = GroupingAggregator.build("", "", //$NON-NLS-1$ //$NON_NLS_2$
+				IAggregator<IQuantity, ?> aggregator = GroupingAggregator.build("", "", //$NON-NLS-1$ //$NON-NLS-2$
 						MethodProfilingDataProvider.PATH_ACCESSOR_FACTORY, Aggregators.count(),
 						new GroupingAggregator.IGroupsFinisher<IQuantity, IMCStackTrace, CountConsumer>() {
 
@@ -454,7 +454,7 @@
 								for (IMCFrame frame : frames) {
 									IMCPackage p = frame.getMethod().getType().getPackage();
 									// Under some circumstances p.getName() will return a raw null, we need to handle this case.
-									Matcher m = excludes.matcher(p.getName() == null ? "" : p.getName());
+									Matcher m = excludes.matcher(p.getName() == null ? "" : p.getName()); //$NON-NLS-1$
 									if (m.matches()) {
 										framesToDrop.add(frame);
 									} else {
--- a/core/org.openjdk.jmc.flightrecorder/src/main/java/org/openjdk/jmc/flightrecorder/jdk/JdkAttributes.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/core/org.openjdk.jmc.flightrecorder/src/main/java/org/openjdk/jmc/flightrecorder/jdk/JdkAttributes.java	Tue Jan 08 09:00:45 2019 +0100
@@ -701,7 +701,7 @@
 			Messages.getString(Messages.ATTR_DUMP_REASON_RECORDING_ID),
 			Messages.getString(Messages.ATTR_DUMP_REASON_RECORDING_ID_DESC), PLAIN_TEXT);
 	
-	public static final IAttribute<String> SHUTDOWN_REASON = attr("reason", // $NON-NLS-1$
+	public static final IAttribute<String> SHUTDOWN_REASON = attr("reason", //$NON-NLS-1$
 			Messages.getString(Messages.ATTR_SHUTDOWN_REASON),
 			Messages.getString(Messages.ATTR_SHUTDOWN_REASON_DESC), PLAIN_TEXT);
 
@@ -716,9 +716,9 @@
 			Messages.getString(Messages.ATTR_CLASS_DEFINING_CLASSLOADER), CLASS);
 	private static final IAttribute<IMCType> CLASS_INITIATING_CLASSLOADER_V0 = attr("initiatingClassLoader", //$NON-NLS-1$
 			Messages.getString(Messages.ATTR_CLASS_INITIATING_CLASSLOADER), CLASS);
-	private static final IAttribute<IMCType> PARENT_CLASSLOADER_V0 = attr("parentClassLoader", // $NON-NLS-1$
+	private static final IAttribute<IMCType> PARENT_CLASSLOADER_V0 = attr("parentClassLoader", //$NON-NLS-1$
 			Messages.getString(Messages.ATTR_PARENT_CLASSLOADER), CLASS);
-	private static final IAttribute<IMCType> CLASSLOADER_V0 = attr("classLoader", // $NON-NLS-1$
+	private static final IAttribute<IMCType> CLASSLOADER_V0 = attr("classLoader", //$NON-NLS-1$
 			Messages.getString(Messages.ATTR_CLASSLOADER), CLASS);
 
 	public static final IAttribute<IMCClassLoader> CLASS_DEFINING_CLASSLOADER = Attribute
@@ -863,21 +863,21 @@
 			Messages.getString(Messages.ATTR_CLASS_LOADED), CLASS);
 	public static final IAttribute<IMCType> CLASS_UNLOADED = attr("unloadedClass", //$NON-NLS-1$
 			Messages.getString(Messages.ATTR_CLASS_UNLOADED), CLASS);
-	public static final IAttribute<IMCType> CLASS_DEFINED = attr("definedClass", // $NON-NLS-1$
+	public static final IAttribute<IMCType> CLASS_DEFINED = attr("definedClass", //$NON-NLS-1$
 			Messages.getString(Messages.ATTR_CLASS_DEFINED), CLASS);
-	public static final IAttribute<IQuantity> ANONYMOUS_BLOCK_SIZE = attr("anonymousBlockSize", // $NON-NLS-1$
+	public static final IAttribute<IQuantity> ANONYMOUS_BLOCK_SIZE = attr("anonymousBlockSize", //$NON-NLS-1$
 			Messages.getString(Messages.ATTR_ANONYMOUS_BLOCK_SIZE), MEMORY);
-	public static final IAttribute<IQuantity> ANONYMOUS_CHUNK_SIZE = attr("anonymousChunkSize", // $NON-NLS-1$ 
+	public static final IAttribute<IQuantity> ANONYMOUS_CHUNK_SIZE = attr("anonymousChunkSize", //$NON-NLS-1$ 
 			Messages.getString(Messages.ATTR_ANONYMOUS_CHUNK_SIZE), MEMORY);
-	public static final IAttribute<IQuantity> ANONYMOUS_CLASS_COUNT = attr("anonymousClassCount", // $NON-NLS-1$
+	public static final IAttribute<IQuantity> ANONYMOUS_CLASS_COUNT = attr("anonymousClassCount", //$NON-NLS-1$
 			Messages.getString(Messages.ATTR_ANONYMOUS_CLASS_COUNT), NUMBER);
-	public static final IAttribute<IQuantity> BLOCK_SIZE = attr("blockSize", // $NON-NLS-1$
+	public static final IAttribute<IQuantity> BLOCK_SIZE = attr("blockSize", //$NON-NLS-1$
 			Messages.getString(Messages.ATTR_BLOCK_SIZE), MEMORY);
-	public static final IAttribute<IQuantity> CHUNK_SIZE = attr("chunkSize", // $NON-NLS-1$
+	public static final IAttribute<IQuantity> CHUNK_SIZE = attr("chunkSize", //$NON-NLS-1$
 			Messages.getString(Messages.ATTR_CHUNK_SIZE), MEMORY);
-	public static final IAttribute<IQuantity> CLASS_COUNT = attr("classCount", // $NON-NLS-1$
+	public static final IAttribute<IQuantity> CLASS_COUNT = attr("classCount", //$NON-NLS-1$
 			Messages.getString(Messages.ATTR_CLASS_COUNT), NUMBER);
-	public static final IAttribute<IQuantity> CLASS_LOADER_DATA = attr("classLoaderData", // $NON-NLS-1$
+	public static final IAttribute<IQuantity> CLASS_LOADER_DATA = attr("classLoaderData", //$NON-NLS-1$
 			Messages.getString(Messages.ATTR_CLASSLOADER_DATA), ADDRESS);	
 
 	public static final IAttribute<IQuantity> COMPILER_COMPILATION_ID = attr("compileId", //$NON-NLS-1$
--- a/core/org.openjdk.jmc.flightrecorder/src/main/java/org/openjdk/jmc/flightrecorder/jdk/messages/internal/Messages.java	Tue Jan 08 12:07:06 2019 +0530
+++ b/core/org.openjdk.jmc.flightrecorder/src/main/java/org/openjdk/jmc/flightrecorder/jdk/messages/internal/Messages.java	Tue Jan 08 09:00:45 2019 +0100
@@ -443,9 +443,9 @@
 	public static final String ATTR_YOUNG_COLLECTOR_DESC = "ATTR_YOUNG_COLLECTOR_DESC"; //$NON-NLS-1$
 	public static final String ATTR_YOUNG_GENERATION_MAX_SIZE = "ATTR_YOUNG_GENERATION_MAX_SIZE"; //$NON-NLS-1$
 	public static final String ATTR_YOUNG_GENERATION_MIN_SIZE = "ATTR_YOUNG_GENERATION_MIN_SIZE"; //$NON-NLS-1$
-	public static final String ATTR_SHUTDOWN_REASON = "ATTR_SHUTDOWN_REASON"; // $NON-NLS-1$
-	public static final String ATTR_SHUTDOWN_REASON_DESC = "ATTR_SHUTDOWN_REASON_DESC"; // $NON-NLS-1$
-	public static final String ATTR_SHUTDOWN_TIME = "ATTR_SHUTDOWN_TIME"; // $NON-NLS-1$
+	public static final String ATTR_SHUTDOWN_REASON = "ATTR_SHUTDOWN_REASON"; //$NON-NLS-1$
+	public static final String ATTR_SHUTDOWN_REASON_DESC = "ATTR_SHUTDOWN_REASON_DESC"; //$NON-NLS-1$
+	public static final String ATTR_SHUTDOWN_TIME = "ATTR_SHUTDOWN_TIME"; //$NON-NLS-1$
 
 	private Messages() {
 	}