From bf58f80ef681f6b88c322227044721f7da109519 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Mon, 3 Aug 2026 18:36:16 +0200 Subject: [PATCH 01/29] feat(cjfr): add native .cjfr file support to JMC Add org.openjdk.jmc.flightrecorder.cjfr OSGi plugin. CjfrRecordingLoader inflates .cjfr to JFR bytes in memory via WritingJFRReader.toJFRStream then delegates to JfrLoaderToolkit; CjfrEditor extends JfrEditor for UI. Make RecordingLoader.doCreateRecording protected, wire the plugin into the flightrecorder feature and application build, and add x-friends access to org.openjdk.jmc.flightrecorder.internal for EventArrays. --- .../feature.xml | 7 +++ .../META-INF/MANIFEST.MF | 21 +++++++ .../build.properties | 5 ++ .../plugin.xml | 14 +++++ .../pom.xml | 22 +++++++ .../jmc/flightrecorder/cjfr/CjfrEditor.java | 27 +++++++++ .../cjfr/CjfrRecordingLoader.java | 59 +++++++++++++++++++ .../jmc/flightrecorder/ui/JfrEditor.java | 6 +- .../flightrecorder/ui/RecordingLoader.java | 8 +-- application/pom.xml | 1 + .../META-INF/MANIFEST.MF | 2 +- 11 files changed, 166 insertions(+), 6 deletions(-) create mode 100644 application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF create mode 100644 application/org.openjdk.jmc.flightrecorder.cjfr/build.properties create mode 100644 application/org.openjdk.jmc.flightrecorder.cjfr/plugin.xml create mode 100644 application/org.openjdk.jmc.flightrecorder.cjfr/pom.xml create mode 100644 application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java create mode 100644 application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrRecordingLoader.java diff --git a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml index f5d1b8eacb..2bd5ebb7df 100644 --- a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml +++ b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml @@ -191,4 +191,11 @@ install-size="0" version="0.0.0" unpack="false"/> + + diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF b/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..e3c12bc4ac --- /dev/null +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF @@ -0,0 +1,21 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-RequiredExecutionEnvironment: JavaSE-21 +Bundle-Name: Condensed Flight Recording Plug-in +Bundle-SymbolicName: org.openjdk.jmc.flightrecorder.cjfr;singleton:=true +Bundle-Version: 10.0.0.qualifier +Bundle-Vendor: Johannes Bechberger +Require-Bundle: org.eclipse.ui, + org.eclipse.core.runtime, + org.openjdk.jmc.flightrecorder, + org.openjdk.jmc.flightrecorder.ui, + org.openjdk.jmc.flightrecorder.writer, + me.bechberger.condensed-data +Import-Package: org.eclipse.jface.dialogs, + org.openjdk.jmc.flightrecorder, + org.openjdk.jmc.flightrecorder.internal, + org.openjdk.jmc.flightrecorder.ui, + me.bechberger.condensed, + me.bechberger.jfr +Bundle-ActivationPolicy: lazy +Automatic-Module-Name: org.openjdk.jmc.flightrecorder.cjfr diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/build.properties b/application/org.openjdk.jmc.flightrecorder.cjfr/build.properties new file mode 100644 index 0000000000..bf4f815c59 --- /dev/null +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/build.properties @@ -0,0 +1,5 @@ +source.. = src/main/java/ +output.. = target/classes/ +bin.includes = META-INF/,\ + plugin.xml,\ + . diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/plugin.xml b/application/org.openjdk.jmc.flightrecorder.cjfr/plugin.xml new file mode 100644 index 0000000000..7bdddf542d --- /dev/null +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/plugin.xml @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/pom.xml b/application/org.openjdk.jmc.flightrecorder.cjfr/pom.xml new file mode 100644 index 0000000000..52d41fde26 --- /dev/null +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/pom.xml @@ -0,0 +1,22 @@ + + + + 4.0.0 + + org.openjdk.jmc + missioncontrol.application + ${revision}${changelist} + + org.openjdk.jmc.flightrecorder.cjfr + eclipse-plugin + + ${project.basedir}/../../configuration + + diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java b/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java new file mode 100644 index 0000000000..187b056b9c --- /dev/null +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2026, Johannes Bechberger 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 https://oss.oracle.com/licenses/upl + */ +package org.openjdk.jmc.flightrecorder.cjfr; + +import org.eclipse.jface.dialogs.ProgressIndicator; +import org.openjdk.jmc.flightrecorder.ui.JfrEditor; +import org.openjdk.jmc.flightrecorder.ui.RecordingLoader; + +/** + * Eclipse editor for .cjfr (condensed JFR) files. Inflates the recording to standard JFR bytes + * in memory and hands them to the standard JFR loading machinery. + */ +public class CjfrEditor extends JfrEditor { + + public static final String EDITOR_ID = "org.openjdk.jmc.flightrecorder.cjfr.CjfrEditor"; //$NON-NLS-1$ + + @Override + protected RecordingLoader createRecordingLoader(ProgressIndicator progressIndicator) { + return new CjfrRecordingLoader(this, progressIndicator); + } +} diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrRecordingLoader.java b/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrRecordingLoader.java new file mode 100644 index 0000000000..aaa7fea7dd --- /dev/null +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrRecordingLoader.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2026, Johannes Bechberger 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 https://oss.oracle.com/licenses/upl + */ +package org.openjdk.jmc.flightrecorder.cjfr; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +import org.eclipse.jface.dialogs.ProgressIndicator; +import org.openjdk.jmc.flightrecorder.CouldNotLoadRecordingException; +import org.openjdk.jmc.flightrecorder.JfrLoaderToolkit; +import org.openjdk.jmc.flightrecorder.internal.EventArrays; +import org.openjdk.jmc.flightrecorder.ui.FlightRecorderUI; +import org.openjdk.jmc.flightrecorder.ui.JfrEditor; +import org.openjdk.jmc.flightrecorder.ui.RecordingLoader; + +import me.bechberger.condensed.CondensedInputStream; +import me.bechberger.jfr.BasicJFRReader; +import me.bechberger.jfr.WritingJFRReader; + +/** + * Loads a .cjfr file by inflating it to standard JFR bytes in memory, then delegating to + * {@link JfrLoaderToolkit#loadStream}. + */ +public class CjfrRecordingLoader extends RecordingLoader { + + public CjfrRecordingLoader(JfrEditor editor, ProgressIndicator ui) { + super(editor, ui); + } + + @Override + protected EventArrays doCreateRecording(File file, Runnable lm) + throws CouldNotLoadRecordingException, IOException { + if (!file.getName().endsWith(".cjfr")) { //$NON-NLS-1$ + return super.doCreateRecording(file, lm); + } + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (CondensedInputStream cin = new CondensedInputStream( + new BufferedInputStream(new FileInputStream(file)))) { + BasicJFRReader reader = new BasicJFRReader(cin); + WritingJFRReader.toJFRStream(reader, baos); + } + boolean hideExperimentals = !FlightRecorderUI.getDefault().includeExperimentalEventsAndFields(); + boolean ignoreTruncated = FlightRecorderUI.getDefault().allowIncompleteRecordingFile(); + boolean showHiddenFrames = shouldShowHiddenFrames(); + return JfrLoaderToolkit.loadStream( + new ByteArrayInputStream(baos.toByteArray()), + hideExperimentals, ignoreTruncated, showHiddenFrames); + } +} diff --git a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/JfrEditor.java b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/JfrEditor.java index ad1c7cf507..e246c085b8 100644 --- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/JfrEditor.java +++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/JfrEditor.java @@ -142,7 +142,11 @@ public void createPartControl(Composite parent) { resultContainer.addDisposeListener(e -> saveCurrentPageState()); ProgressIndicator progressIndicator = CompositeToolkit.createWaitIndicator(toolkit.createComposite(parent), toolkit); - new RecordingLoader(this, progressIndicator).schedule(); + createRecordingLoader(progressIndicator).schedule(); + } + + protected RecordingLoader createRecordingLoader(ProgressIndicator progressIndicator) { + return new RecordingLoader(this, progressIndicator); } @Override diff --git a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/RecordingLoader.java b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/RecordingLoader.java index 2b88f66cd0..5eda56c4bc 100644 --- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/RecordingLoader.java +++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/RecordingLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2026, Oracle and/or its affiliates. All rights reserved. * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -162,7 +162,7 @@ public void run() { }); } - private EventArrays doCreateRecording(File file, ProgressMonitor lm) + protected EventArrays doCreateRecording(File file, Runnable lm) throws CouldNotLoadRecordingException, IOException { // FIXME: Can we calculate available memory without resorting to System.gc? System.gc(); @@ -184,7 +184,7 @@ private EventArrays doCreateRecording(File file, ProgressMonitor lm) if (IOToolkit.isCompressedFile(file)) { file = unzipFile(file); } - return loadFromUnzippedFile(file, fileName, lm, availableMemory); + return loadFromUnzippedFile(file, fileName, (ProgressMonitor) lm, availableMemory); } private static void checkForJRockitRecording(EventArrays events) { @@ -246,7 +246,7 @@ private EventArrays loadFromUnzippedFile( throw new NotEnoughMemoryException(); } - private boolean shouldShowHiddenFrames() { + protected boolean shouldShowHiddenFrames() { return FlightRecorderUI.getDefault().getPreferenceStore() .getBoolean(PreferenceKeys.PROPERTY_STACKTRACE_SHOW_HIDDEN_FRAMES); } diff --git a/application/pom.xml b/application/pom.xml index 72b8317e36..61b6413f13 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -90,6 +90,7 @@ org.openjdk.jmc.flightrecorder.pde org.openjdk.jmc.flightrecorder.rules.extensionprovider org.openjdk.jmc.flightrecorder.ui + org.openjdk.jmc.flightrecorder.cjfr org.openjdk.jmc.greychart org.openjdk.jmc.greychart.ui org.openjdk.jmc.ide.jdt diff --git a/core/org.openjdk.jmc.flightrecorder/META-INF/MANIFEST.MF b/core/org.openjdk.jmc.flightrecorder/META-INF/MANIFEST.MF index 9d3a59a19a..0581e8f8c8 100644 --- a/core/org.openjdk.jmc.flightrecorder/META-INF/MANIFEST.MF +++ b/core/org.openjdk.jmc.flightrecorder/META-INF/MANIFEST.MF @@ -8,7 +8,7 @@ Bundle-Vendor: Oracle Corporation Eclipse-BuddyPolicy: app Eclipse-ExtensibleAPI: true Export-Package: org.openjdk.jmc.flightrecorder, - org.openjdk.jmc.flightrecorder.internal;x-friends:="org.openjdk.jmc.flightrecorder.ui,org.openjdk.jmc.flightrecorder.configuration", + org.openjdk.jmc.flightrecorder.internal;x-friends:="org.openjdk.jmc.flightrecorder.ui,org.openjdk.jmc.flightrecorder.configuration,org.openjdk.jmc.flightrecorder.cjfr", org.openjdk.jmc.flightrecorder.internal.util;x-friends:="org.openjdk.jmc.flightrecorder.test", org.openjdk.jmc.flightrecorder.jdk, org.openjdk.jmc.flightrecorder.memleak, From ffc7abc563985f4e8d1925cba45adf7ca0068fc3 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Mon, 3 Aug 2026 18:36:25 +0200 Subject: [PATCH 02/29] fix(deps): add condensed-data 0.1.1 reader jar to third-party p2 repo Aether coordinate grammar requires version last: groupId:artifactId:extension:classifier:version Register condensed-data-0.1.1-reader.jar as an OSGi bundle exposing me.bechberger.* for use by the cjfr plugin. --- releng/third-party/pom.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/releng/third-party/pom.xml b/releng/third-party/pom.xml index 873a91edd1..27903379d0 100644 --- a/releng/third-party/pom.xml +++ b/releng/third-party/pom.xml @@ -51,6 +51,7 @@ 11.0.15 3.3.0 + 0.1.1 2.0.5 2.0.3 2.1.4 @@ -215,6 +216,18 @@ org.pushingpixels.radiance.animation.api.* + + me.bechberger:condensed-data:jar:reader:${condensed-data.version} + false + false + true + + me.bechberger.condensed-data + Condensed Data Reader + me.bechberger.* + org.openjdk.jmc.flightrecorder.writer.*,org.openjdk.jmc.flightrecorder.writer.api.*,*;resolution:=optional + + @@ -271,4 +284,5 @@ + From a65e04bd61fc8d84c438c0a0ee0511a709c23b44 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Mon, 3 Aug 2026 18:54:02 +0200 Subject: [PATCH 03/29] Fix code formatting --- .../openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java | 4 ++-- .../jmc/flightrecorder/cjfr/CjfrRecordingLoader.java | 11 ++++------- .../jmc/flightrecorder/ui/RecordingLoader.java | 3 +-- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java b/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java index 187b056b9c..a392d2be8f 100644 --- a/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java @@ -13,8 +13,8 @@ import org.openjdk.jmc.flightrecorder.ui.RecordingLoader; /** - * Eclipse editor for .cjfr (condensed JFR) files. Inflates the recording to standard JFR bytes - * in memory and hands them to the standard JFR loading machinery. + * Eclipse editor for .cjfr (condensed JFR) files. Inflates the recording to standard JFR bytes in + * memory and hands them to the standard JFR loading machinery. */ public class CjfrEditor extends JfrEditor { diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrRecordingLoader.java b/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrRecordingLoader.java index aaa7fea7dd..e1d7e61f21 100644 --- a/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrRecordingLoader.java +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrRecordingLoader.java @@ -38,22 +38,19 @@ public CjfrRecordingLoader(JfrEditor editor, ProgressIndicator ui) { } @Override - protected EventArrays doCreateRecording(File file, Runnable lm) - throws CouldNotLoadRecordingException, IOException { + protected EventArrays doCreateRecording(File file, Runnable lm) throws CouldNotLoadRecordingException, IOException { if (!file.getName().endsWith(".cjfr")) { //$NON-NLS-1$ return super.doCreateRecording(file, lm); } ByteArrayOutputStream baos = new ByteArrayOutputStream(); - try (CondensedInputStream cin = new CondensedInputStream( - new BufferedInputStream(new FileInputStream(file)))) { + try (CondensedInputStream cin = new CondensedInputStream(new BufferedInputStream(new FileInputStream(file)))) { BasicJFRReader reader = new BasicJFRReader(cin); WritingJFRReader.toJFRStream(reader, baos); } boolean hideExperimentals = !FlightRecorderUI.getDefault().includeExperimentalEventsAndFields(); boolean ignoreTruncated = FlightRecorderUI.getDefault().allowIncompleteRecordingFile(); boolean showHiddenFrames = shouldShowHiddenFrames(); - return JfrLoaderToolkit.loadStream( - new ByteArrayInputStream(baos.toByteArray()), - hideExperimentals, ignoreTruncated, showHiddenFrames); + return JfrLoaderToolkit.loadStream(new ByteArrayInputStream(baos.toByteArray()), hideExperimentals, + ignoreTruncated, showHiddenFrames); } } diff --git a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/RecordingLoader.java b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/RecordingLoader.java index 5eda56c4bc..c1f5c302c7 100644 --- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/RecordingLoader.java +++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/RecordingLoader.java @@ -162,8 +162,7 @@ public void run() { }); } - protected EventArrays doCreateRecording(File file, Runnable lm) - throws CouldNotLoadRecordingException, IOException { + protected EventArrays doCreateRecording(File file, Runnable lm) throws CouldNotLoadRecordingException, IOException { // FIXME: Can we calculate available memory without resorting to System.gc? System.gc(); Runtime runtime = Runtime.getRuntime(); From 80d854b47141c932d774129bb18ea44fcdc1df81 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Mon, 3 Aug 2026 21:13:07 +0200 Subject: [PATCH 04/29] fix(deps): switch to condensed-data 0.1.2 main jar (includes WritingJFRReader) The reader classifier jar excludes WritingJFRReader (JMC-dependent). Use the full condensed-data jar instead; condensed-data-reader is now a separate artifact for firefox-profiler WASM use. --- .../META-INF/MANIFEST.MF | 3 +-- .../platform-definition-2026-06.target | 1 + releng/third-party/pom.xml | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF b/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF index e3c12bc4ac..cec70079bb 100644 --- a/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF @@ -9,8 +9,7 @@ Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.openjdk.jmc.flightrecorder, org.openjdk.jmc.flightrecorder.ui, - org.openjdk.jmc.flightrecorder.writer, - me.bechberger.condensed-data + me.bechberger.condensed.data Import-Package: org.eclipse.jface.dialogs, org.openjdk.jmc.flightrecorder, org.openjdk.jmc.flightrecorder.internal, diff --git a/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target b/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target index af39e98f25..a7af12cfa4 100644 --- a/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target +++ b/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target @@ -62,6 +62,7 @@ + diff --git a/releng/third-party/pom.xml b/releng/third-party/pom.xml index 27903379d0..fd90bbb2e9 100644 --- a/releng/third-party/pom.xml +++ b/releng/third-party/pom.xml @@ -51,7 +51,7 @@ 11.0.15 3.3.0 - 0.1.1 + 0.1.2 2.0.5 2.0.3 2.1.4 @@ -217,15 +217,15 @@ - me.bechberger:condensed-data:jar:reader:${condensed-data.version} + me.bechberger:condensed-data:${condensed-data.version} false false true - me.bechberger.condensed-data - Condensed Data Reader + me.bechberger.condensed.data + Condensed Data me.bechberger.* - org.openjdk.jmc.flightrecorder.writer.*,org.openjdk.jmc.flightrecorder.writer.api.*,*;resolution:=optional + *;resolution:=optional From cf73c461c60cfa1ef63a671fb3a8451e0fb14f39 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Mon, 3 Aug 2026 23:02:59 +0200 Subject: [PATCH 05/29] fix(cjfr): include flightrecorder.writer bundle in product WritingJFRReader depends on org.openjdk.jmc.flightrecorder.writer.api.Types at runtime. Without the writer bundle in the feature, OSGi throws NoClassDefFoundError when opening a .cjfr file in JMC. Changes: - Add flightrecorder.writer plugin to feature.flightrecorder/feature.xml - Add Require-Bundle: org.openjdk.jmc.flightrecorder.writer to cjfr MANIFEST.MF - Add flightrecorder.writer to application/pom.xml dependencies so Tycho can resolve it during the application build --- .../org.openjdk.jmc.feature.flightrecorder/feature.xml | 6 ++++++ .../META-INF/MANIFEST.MF | 1 + application/pom.xml | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml index 2bd5ebb7df..2769810aae 100644 --- a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml +++ b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml @@ -191,6 +191,12 @@ install-size="0" version="0.0.0" unpack="false"/> + flightrecorder.serializers ${revision}${changelist} + + org.openjdk.jmc + flightrecorder.writer + ${revision}${changelist} + org.openjdk.jmc rjmx.common From d5ad089387a21f65901dbcacb0c5454fa3a7c4b1 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Mon, 3 Aug 2026 23:12:42 +0200 Subject: [PATCH 06/29] fix(cjfr): add Require-Bundle for writer to condensed-data bnd manifest condensed-data's WritingJFRReader references org.openjdk.jmc.flightrecorder.writer.* types. The bnd-wrapped bundle had all imports optional, so OSGi would not wire the writer packages even when the writer bundle was present, causing NoClassDefFoundError at runtime. Add Require-Bundle: org.openjdk.jmc.flightrecorder.writer;resolution:=optional to the condensed-data bnd instructions so OSGi wires writer packages when the writer bundle is available (i.e. inside JMC). --- releng/third-party/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/releng/third-party/pom.xml b/releng/third-party/pom.xml index fd90bbb2e9..d31842ce51 100644 --- a/releng/third-party/pom.xml +++ b/releng/third-party/pom.xml @@ -225,6 +225,7 @@ me.bechberger.condensed.data Condensed Data me.bechberger.* + org.openjdk.jmc.flightrecorder.writer;resolution:=optional *;resolution:=optional From 16903604fdf7a68e969b283d6032b4d4730d7947 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Mon, 3 Aug 2026 23:21:30 +0200 Subject: [PATCH 07/29] fix(cjfr): export writer impl packages so condensed-data can load them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit WritingJFRReader uses internal impl types (RecordingImpl, TypeImpl, TypedValueImpl, TypedFieldImpl, TypedFieldValueImpl) from org.openjdk.jmc.flightrecorder.writer — not just the .api package. The writer bundle only exported .api, so OSGi could not wire the impl packages to condensed-data's classloader, causing NoClassDefFoundError at runtime when opening .cjfr files. Export all three writer packages: .writer.api, .writer, .writer.util. --- .../META-INF/MANIFEST.MF | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/org.openjdk.jmc.flightrecorder.writer/META-INF/MANIFEST.MF b/core/org.openjdk.jmc.flightrecorder.writer/META-INF/MANIFEST.MF index ee946f3712..f323c3f308 100644 --- a/core/org.openjdk.jmc.flightrecorder.writer/META-INF/MANIFEST.MF +++ b/core/org.openjdk.jmc.flightrecorder.writer/META-INF/MANIFEST.MF @@ -5,6 +5,8 @@ Bundle-Name: Mission Control Flight Recorder Writer Bundle-SymbolicName: org.openjdk.jmc.flightrecorder.writer;singleton:=true Bundle-Version: 10.0.0.qualifier Bundle-Vendor: Oracle Corporation -Export-Package: org.openjdk.jmc.flightrecorder.writer.api +Export-Package: org.openjdk.jmc.flightrecorder.writer.api, + org.openjdk.jmc.flightrecorder.writer, + org.openjdk.jmc.flightrecorder.writer.util Require-Bundle: org.openjdk.jmc.common;visibility:=reexport Automatic-Module-Name: org.openjdk.jmc.flightrecorder.writer From d9ed8e1b63fb772e19bba6caf1e5849428bc72ca Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Mon, 3 Aug 2026 23:35:20 +0200 Subject: [PATCH 08/29] fix(writer): add setGmtOffset/setRegion for timezone preservation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit WritingJFRReader calls RecordingImpl.setGmtOffset(long, String) to carry the source recording's timezone through condense→inflate so jfr print renders local time instead of UTC. MetadataImpl gains setRegion() which stores the gmtOffset millis and optional locale, and writeRegion() now emits them as attributes on the element when set. --- .../flightrecorder/writer/MetadataImpl.java | 29 +++++++++++++++++++ .../flightrecorder/writer/RecordingImpl.java | 4 +++ 2 files changed, 33 insertions(+) diff --git a/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/MetadataImpl.java b/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/MetadataImpl.java index a798ef74c6..740f0e4668 100644 --- a/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/MetadataImpl.java +++ b/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/MetadataImpl.java @@ -66,6 +66,9 @@ final class MetadataImpl { private static final String DIMENSION_KEY = "dimension"; private static final String ANNOTATION_KEY = "annotation"; private static final String VAL_1_VALUE = "1"; + private static final String GMT_OFFSET_KEY = "gmtOffset"; + private static final String LOCALE_KEY = "locale"; + private static final long GMT_OFFSET_UNSET = Long.MIN_VALUE; private final AtomicLong typeCounter = new AtomicLong(1); private final ConstantPools constantPools; @@ -75,6 +78,8 @@ final class MetadataImpl { private final Set unresolvedTypes = new CopyOnWriteArraySet<>(); private volatile TypesImpl types; + private volatile long regionGmtOffsetMillis = GMT_OFFSET_UNSET; + private volatile String regionLocale; MetadataImpl(ConstantPools constantPools) { this.constantPools = constantPools; @@ -106,6 +111,19 @@ private void fillStrings() { storeString(REGION_KEY); storeString(DIMENSION_KEY); storeString(ANNOTATION_KEY); + storeString(GMT_OFFSET_KEY); + storeString(LOCALE_KEY); + } + + void setRegion(long gmtOffsetMillis, String locale) { + this.regionGmtOffsetMillis = gmtOffsetMillis; + this.regionLocale = locale; + if (gmtOffsetMillis != GMT_OFFSET_UNSET) { + storeString(Long.toString(gmtOffsetMillis)); + } + if (locale != null) { + storeString(locale); + } } /** @@ -380,6 +398,17 @@ private void writeMetaEventWithSize(LEB128Writer metaWriter, LEB128Writer writer } private void writeRegion(LEB128Writer metaWriter) { + if (regionGmtOffsetMillis != GMT_OFFSET_UNSET) { + boolean hasLocale = regionLocale != null; + int attributes = hasLocale ? 2 : 1; + metaWriter.writeInt(stringIndex(REGION_KEY)).writeInt(attributes).writeInt(stringIndex(GMT_OFFSET_KEY)) + .writeInt(stringIndex(Long.toString(regionGmtOffsetMillis))); + if (hasLocale) { + metaWriter.writeInt(stringIndex(LOCALE_KEY)).writeInt(stringIndex(regionLocale)); + } + metaWriter.writeInt(0); // 0 child elements + return; + } metaWriter.writeInt(stringIndex(REGION_KEY)).writeInt(0) // 0 attributes .writeInt(0); // 0 elements } diff --git a/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/RecordingImpl.java b/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/RecordingImpl.java index 023b5ef9eb..299b48d4c8 100644 --- a/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/RecordingImpl.java +++ b/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/RecordingImpl.java @@ -160,6 +160,10 @@ private void processChunkDataQueue(long pollTimeout, TimeUnit timeUnit) throws I } } + public void setGmtOffset(long gmtOffsetMillis, String locale) { + metadata.setRegion(gmtOffsetMillis, locale); + } + @Override public RecordingImpl rotateChunk() { Chunk chunk = getChunk(); From 9806b3549e2c9a6b45db7a239f083a28c44f8f05 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Mon, 3 Aug 2026 23:40:33 +0200 Subject: [PATCH 09/29] fix(cjfr): add femtojson as p2 bundle for me.bechberger.util.json condensed-data 0.1.2 is deployed as a thin jar; femtojson is a separate dependency providing me.bechberger.util.json.JSONParser used by BasicJFRWriter.parseEventDescription at runtime. Add me.bechberger.util:femtojson:0.4.1 as an OSGi bundle in the p2 third-party site, require it from the condensed-data bundle, and include it in the flightrecorder feature. --- .../feature.xml | 12 ++++++++++++ application/pom.xml | 5 +++++ releng/third-party/pom.xml | 15 ++++++++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml index 2769810aae..3710ebbac8 100644 --- a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml +++ b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml @@ -203,5 +203,17 @@ install-size="0" version="0.0.0" unpack="false"/> + + diff --git a/application/pom.xml b/application/pom.xml index fb9974f627..e6a535a2c6 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -166,6 +166,11 @@ flightrecorder.writer ${revision}${changelist} + + me.bechberger.util + femtojson + 0.4.1 + org.openjdk.jmc rjmx.common diff --git a/releng/third-party/pom.xml b/releng/third-party/pom.xml index d31842ce51..2a852538ba 100644 --- a/releng/third-party/pom.xml +++ b/releng/third-party/pom.xml @@ -52,6 +52,7 @@ 3.3.0 0.1.2 + 0.4.1 2.0.5 2.0.3 2.1.4 @@ -216,6 +217,18 @@ org.pushingpixels.radiance.animation.api.* + + me.bechberger.util:femtojson:${femtojson.version} + false + false + true + + me.bechberger.util.femtojson + FemtoJSON + me.bechberger.util.json.* + *;resolution:=optional + + me.bechberger:condensed-data:${condensed-data.version} false @@ -225,7 +238,7 @@ me.bechberger.condensed.data Condensed Data me.bechberger.* - org.openjdk.jmc.flightrecorder.writer;resolution:=optional + org.openjdk.jmc.flightrecorder.writer;resolution:=optional,me.bechberger.util.femtojson *;resolution:=optional From e7af06234a796a77e4c0fed2e70ed857c4a1ac42 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Mon, 3 Aug 2026 23:58:01 +0200 Subject: [PATCH 10/29] fix(ci): add femtojson unit to target platform definition me.bechberger.util.femtojson 0.4.1 is served by the third-party p2 site but was not listed in the target platform .target file, causing Tycho to fail resolving the flightrecorder feature on CI. --- .../platform-definition-2026-06.target | 1 + 1 file changed, 1 insertion(+) diff --git a/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target b/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target index a7af12cfa4..9c437d45bc 100644 --- a/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target +++ b/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target @@ -63,6 +63,7 @@ + From daf6e6e2827dd60410d3b8610655df7f2832b24f Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 00:05:55 +0200 Subject: [PATCH 11/29] fix(ci): wait for Jetty p2 site to be ready before application build nohup jetty:run starts asynchronously; if the Tycho target platform cache is cold (e.g. after a pom.xml change), the application build starts before Jetty is up and femtojson/condensed-data cannot be resolved from localhost:8080/site. Poll content.jar until Jetty responds before returning. --- scripts/startp2.bat | 7 +++++++ scripts/startp2.sh | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/scripts/startp2.bat b/scripts/startp2.bat index 48456f713a..17a301ff56 100644 --- a/scripts/startp2.bat +++ b/scripts/startp2.bat @@ -5,4 +5,11 @@ cd releng\third-party call mvn %MAVENPARAMS% p2:site || EXIT /B 1 echo "======== Starting p2 repo ===================" start /B cmd /C "mvn %MAVENPARAMS% jetty:run" +echo "======== Waiting for p2 repo to become available ===================" +:wait_loop +curl --silent --fail http://localhost:8080/site/content.jar > nul 2>&1 +if %ERRORLEVEL% neq 0 ( + timeout /T 2 /NOBREAK > nul + goto wait_loop +) echo "======== Done ===============================" diff --git a/scripts/startp2.sh b/scripts/startp2.sh index 821b6569f0..d5422c3787 100755 --- a/scripts/startp2.sh +++ b/scripts/startp2.sh @@ -6,4 +6,8 @@ cd releng/third-party sh -c "mvn ${MAVENPARAMS} p2:site" echo "======== Starting p2 repo ===================" sh -c "nohup mvn ${MAVENPARAMS} jetty:run &" +echo "======== Waiting for p2 repo to become available ===================" +until curl --silent --fail http://localhost:8080/site/content.jar > /dev/null 2>&1; do + sleep 2 +done echo "======== Done ===============================" From 6193ba12a854350728bfcefc5ad3e79c24acb98f Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 03:29:05 +0200 Subject: [PATCH 12/29] fix(ci): robust Jetty readiness check using HTTP status code Use curl --write-out to check HTTP 200 instead of --fail exit code, with || echo '000' fallback to avoid set -e killing the loop on connection refused. Adds per-attempt logging for diagnostics. --- scripts/startp2.sh | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/scripts/startp2.sh b/scripts/startp2.sh index d5422c3787..0094b06d75 100755 --- a/scripts/startp2.sh +++ b/scripts/startp2.sh @@ -7,7 +7,18 @@ sh -c "mvn ${MAVENPARAMS} p2:site" echo "======== Starting p2 repo ===================" sh -c "nohup mvn ${MAVENPARAMS} jetty:run &" echo "======== Waiting for p2 repo to become available ===================" -until curl --silent --fail http://localhost:8080/site/content.jar > /dev/null 2>&1; do +i=0 +while [ $i -lt 60 ]; do + STATUS=$(curl --silent --output /dev/null --write-out "%{http_code}" http://localhost:8080/site/content.jar 2>/dev/null || echo "000") + echo " attempt $i: HTTP $STATUS" + if [ "$STATUS" = "200" ]; then + break + fi + i=$((i+1)) sleep 2 done +if [ $i -ge 60 ]; then + echo "Timed out waiting for p2 site" >&2 + exit 1 +fi echo "======== Done ===============================" From efd4d0b2203aecfd64812d7eb8ef63f98208a303 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 14:23:15 +0200 Subject: [PATCH 13/29] ci: trigger Validation workflow From a9a77e1225b5b5d7c4d25dc57fcea4e8ceb161e7 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 15:04:12 +0200 Subject: [PATCH 14/29] fix: update copyright year to 2026 in MetadataImpl and RecordingImpl --- .../org/openjdk/jmc/flightrecorder/writer/MetadataImpl.java | 4 ++-- .../org/openjdk/jmc/flightrecorder/writer/RecordingImpl.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/MetadataImpl.java b/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/MetadataImpl.java index 740f0e4668..ccba22a444 100644 --- a/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/MetadataImpl.java +++ b/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/MetadataImpl.java @@ -1,6 +1,6 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2021, 2025, Datadog, Inc. All rights reserved. + * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2026, Datadog, Inc. All rights reserved. * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/RecordingImpl.java b/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/RecordingImpl.java index 299b48d4c8..eb2e3f11b5 100644 --- a/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/RecordingImpl.java +++ b/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/RecordingImpl.java @@ -1,6 +1,6 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2021, 2025, Datadog, Inc. All rights reserved. + * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2026, Datadog, Inc. All rights reserved. * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * From 51b8f87dcf17b83b93d9cba48e4b25c976192e43 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 15:44:35 +0200 Subject: [PATCH 15/29] Reduce diff --- .../META-INF/MANIFEST.MF | 4 +-- .../plugin.xml | 34 ++++++++++++++++++- .../pom.xml | 4 +-- .../jmc/flightrecorder/cjfr/CjfrEditor.java | 4 +-- .../cjfr/CjfrRecordingLoader.java | 4 +-- .../jmc/flightrecorder/ui/JfrEditor.java | 3 +- releng/third-party/pom.xml | 5 ++- scripts/startp2.bat | 7 ---- scripts/startp2.sh | 15 -------- 9 files changed, 45 insertions(+), 35 deletions(-) diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF b/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF index a3440c0e58..0bbd3712d2 100644 --- a/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-Name: Condensed Flight Recording Plug-in Bundle-SymbolicName: org.openjdk.jmc.flightrecorder.cjfr;singleton:=true Bundle-Version: 10.0.0.qualifier -Bundle-Vendor: Johannes Bechberger +Bundle-Vendor: SAP SE Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.openjdk.jmc.flightrecorder, @@ -18,4 +18,4 @@ Import-Package: org.eclipse.jface.dialogs, me.bechberger.condensed, me.bechberger.jfr Bundle-ActivationPolicy: lazy -Automatic-Module-Name: org.openjdk.jmc.flightrecorder.cjfr +Automatic-Module-Name: org.openjdk.jmc.flightrecorder.cjfr \ No newline at end of file diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/plugin.xml b/application/org.openjdk.jmc.flightrecorder.cjfr/plugin.xml index 7bdddf542d..04fdd91c8e 100644 --- a/application/org.openjdk.jmc.flightrecorder.cjfr/plugin.xml +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/plugin.xml @@ -1,4 +1,36 @@ + - + \ No newline at end of file diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/pom.xml b/application/org.openjdk.jmc.flightrecorder.cjfr/pom.xml index 52d41fde26..f3a32f9cc7 100644 --- a/application/org.openjdk.jmc.flightrecorder.cjfr/pom.xml +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/pom.xml @@ -1,6 +1,6 @@ 0.1.2 - 0.4.1 + 0.4.1 2.0.5 2.0.3 2.1.4 @@ -298,5 +298,4 @@ - - + \ No newline at end of file diff --git a/scripts/startp2.bat b/scripts/startp2.bat index 17a301ff56..48456f713a 100644 --- a/scripts/startp2.bat +++ b/scripts/startp2.bat @@ -5,11 +5,4 @@ cd releng\third-party call mvn %MAVENPARAMS% p2:site || EXIT /B 1 echo "======== Starting p2 repo ===================" start /B cmd /C "mvn %MAVENPARAMS% jetty:run" -echo "======== Waiting for p2 repo to become available ===================" -:wait_loop -curl --silent --fail http://localhost:8080/site/content.jar > nul 2>&1 -if %ERRORLEVEL% neq 0 ( - timeout /T 2 /NOBREAK > nul - goto wait_loop -) echo "======== Done ===============================" diff --git a/scripts/startp2.sh b/scripts/startp2.sh index 0094b06d75..821b6569f0 100755 --- a/scripts/startp2.sh +++ b/scripts/startp2.sh @@ -6,19 +6,4 @@ cd releng/third-party sh -c "mvn ${MAVENPARAMS} p2:site" echo "======== Starting p2 repo ===================" sh -c "nohup mvn ${MAVENPARAMS} jetty:run &" -echo "======== Waiting for p2 repo to become available ===================" -i=0 -while [ $i -lt 60 ]; do - STATUS=$(curl --silent --output /dev/null --write-out "%{http_code}" http://localhost:8080/site/content.jar 2>/dev/null || echo "000") - echo " attempt $i: HTTP $STATUS" - if [ "$STATUS" = "200" ]; then - break - fi - i=$((i+1)) - sleep 2 -done -if [ $i -ge 60 ]; then - echo "Timed out waiting for p2 site" >&2 - exit 1 -fi echo "======== Done ===============================" From ef9b2e278f5d9ac2156cfce38f2e1fb2ff162c7f Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 15:50:24 +0200 Subject: [PATCH 16/29] refactor(cjfr): inflate .cjfr to temp .jfr in CjfrEditor; drop CjfrRecordingLoader Avoids modifying RecordingLoader, flightrecorder MANIFEST, and writer MANIFEST. CjfrEditor.createRecordingLoader() inflates the .cjfr file to a temporary .jfr, swaps the editor input, and returns a plain RecordingLoader. Removes 60 lines of diff. --- .../feature.xml | 6 -- .../META-INF/MANIFEST.MF | 7 +-- .../plugin.xml | 2 +- .../pom.xml | 2 +- .../jmc/flightrecorder/cjfr/CjfrEditor.java | 33 +++++++++-- .../cjfr/CjfrRecordingLoader.java | 56 ------------------- .../jmc/flightrecorder/ui/JfrEditor.java | 2 +- .../flightrecorder/ui/RecordingLoader.java | 9 +-- application/pom.xml | 10 ---- .../META-INF/MANIFEST.MF | 4 +- .../META-INF/MANIFEST.MF | 2 +- releng/third-party/pom.xml | 2 +- 12 files changed, 42 insertions(+), 93 deletions(-) delete mode 100644 application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrRecordingLoader.java diff --git a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml index 3710ebbac8..a0646cf864 100644 --- a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml +++ b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml @@ -191,12 +191,6 @@ install-size="0" version="0.0.0" unpack="false"/> - - \ No newline at end of file + diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/pom.xml b/application/org.openjdk.jmc.flightrecorder.cjfr/pom.xml index f3a32f9cc7..6d50a72337 100644 --- a/application/org.openjdk.jmc.flightrecorder.cjfr/pom.xml +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/pom.xml @@ -19,4 +19,4 @@ ${project.basedir}/../../configuration - \ No newline at end of file + diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java b/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java index f5d60c2384..0c2d275b02 100644 --- a/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java @@ -8,13 +8,24 @@ */ package org.openjdk.jmc.flightrecorder.cjfr; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + import org.eclipse.jface.dialogs.ProgressIndicator; import org.openjdk.jmc.flightrecorder.ui.JfrEditor; import org.openjdk.jmc.flightrecorder.ui.RecordingLoader; +import org.openjdk.jmc.ui.MCPathEditorInput; + +import me.bechberger.condensed.CondensedInputStream; +import me.bechberger.jfr.BasicJFRReader; +import me.bechberger.jfr.WritingJFRReader; /** - * Eclipse editor for .cjfr (condensed JFR) files. Inflates the recording to standard JFR bytes in - * memory and hands them to the standard JFR loading machinery. + * Eclipse editor for .cjfr (condensed JFR) files. Inflates the recording to a temporary .jfr file + * and delegates to the standard JFR loading machinery. */ public class CjfrEditor extends JfrEditor { @@ -22,6 +33,20 @@ public class CjfrEditor extends JfrEditor { @Override protected RecordingLoader createRecordingLoader(ProgressIndicator progressIndicator) { - return new CjfrRecordingLoader(this, progressIndicator); + File cjfrFile = MCPathEditorInput.getFile(getEditorInput()); + try { + File tempJfr = File.createTempFile("cjfr-inflate-", ".jfr"); //$NON-NLS-1$ //$NON-NLS-2$ + tempJfr.deleteOnExit(); + try (CondensedInputStream cin = new CondensedInputStream( + new BufferedInputStream(new FileInputStream(cjfrFile))); + FileOutputStream fos = new FileOutputStream(tempJfr)) { + BasicJFRReader reader = new BasicJFRReader(cin); + WritingJFRReader.toJFRStream(reader, fos); + } + setInput(new MCPathEditorInput(tempJfr, false)); + } catch (IOException e) { + // Fall through: let RecordingLoader fail gracefully on the original file + } + return new RecordingLoader(this, progressIndicator); } -} \ No newline at end of file +} diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrRecordingLoader.java b/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrRecordingLoader.java deleted file mode 100644 index 019f4893a8..0000000000 --- a/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrRecordingLoader.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2026, SAP SE 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 https://oss.oracle.com/licenses/upl - */ -package org.openjdk.jmc.flightrecorder.cjfr; - -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - -import org.eclipse.jface.dialogs.ProgressIndicator; -import org.openjdk.jmc.flightrecorder.CouldNotLoadRecordingException; -import org.openjdk.jmc.flightrecorder.JfrLoaderToolkit; -import org.openjdk.jmc.flightrecorder.internal.EventArrays; -import org.openjdk.jmc.flightrecorder.ui.FlightRecorderUI; -import org.openjdk.jmc.flightrecorder.ui.JfrEditor; -import org.openjdk.jmc.flightrecorder.ui.RecordingLoader; - -import me.bechberger.condensed.CondensedInputStream; -import me.bechberger.jfr.BasicJFRReader; -import me.bechberger.jfr.WritingJFRReader; - -/** - * Loads a .cjfr file by inflating it to standard JFR bytes in memory, then delegating to - * {@link JfrLoaderToolkit#loadStream}. - */ -public class CjfrRecordingLoader extends RecordingLoader { - - public CjfrRecordingLoader(JfrEditor editor, ProgressIndicator ui) { - super(editor, ui); - } - - @Override - protected EventArrays doCreateRecording(File file, Runnable lm) throws CouldNotLoadRecordingException, IOException { - if (!file.getName().endsWith(".cjfr")) { //$NON-NLS-1$ - return super.doCreateRecording(file, lm); - } - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - try (CondensedInputStream cin = new CondensedInputStream(new BufferedInputStream(new FileInputStream(file)))) { - BasicJFRReader reader = new BasicJFRReader(cin); - WritingJFRReader.toJFRStream(reader, baos); - } - boolean hideExperimentals = !FlightRecorderUI.getDefault().includeExperimentalEventsAndFields(); - boolean ignoreTruncated = FlightRecorderUI.getDefault().allowIncompleteRecordingFile(); - boolean showHiddenFrames = shouldShowHiddenFrames(); - return JfrLoaderToolkit.loadStream(new ByteArrayInputStream(baos.toByteArray()), hideExperimentals, - ignoreTruncated, showHiddenFrames); - } -} \ No newline at end of file diff --git a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/JfrEditor.java b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/JfrEditor.java index 5332ca1992..4ac9125476 100644 --- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/JfrEditor.java +++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/JfrEditor.java @@ -449,4 +449,4 @@ private void setTopics(Collection topics) { Optional.ofNullable(resultPageRef.get()).ifPresent(rp -> rp.setTopics(topics)); } -} \ No newline at end of file +} diff --git a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/RecordingLoader.java b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/RecordingLoader.java index c1f5c302c7..2b88f66cd0 100644 --- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/RecordingLoader.java +++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/RecordingLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2026, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -162,7 +162,8 @@ public void run() { }); } - protected EventArrays doCreateRecording(File file, Runnable lm) throws CouldNotLoadRecordingException, IOException { + private EventArrays doCreateRecording(File file, ProgressMonitor lm) + throws CouldNotLoadRecordingException, IOException { // FIXME: Can we calculate available memory without resorting to System.gc? System.gc(); Runtime runtime = Runtime.getRuntime(); @@ -183,7 +184,7 @@ protected EventArrays doCreateRecording(File file, Runnable lm) throws CouldNotL if (IOToolkit.isCompressedFile(file)) { file = unzipFile(file); } - return loadFromUnzippedFile(file, fileName, (ProgressMonitor) lm, availableMemory); + return loadFromUnzippedFile(file, fileName, lm, availableMemory); } private static void checkForJRockitRecording(EventArrays events) { @@ -245,7 +246,7 @@ private EventArrays loadFromUnzippedFile( throw new NotEnoughMemoryException(); } - protected boolean shouldShowHiddenFrames() { + private boolean shouldShowHiddenFrames() { return FlightRecorderUI.getDefault().getPreferenceStore() .getBoolean(PreferenceKeys.PROPERTY_STACKTRACE_SHOW_HIDDEN_FRAMES); } diff --git a/application/pom.xml b/application/pom.xml index e6a535a2c6..61b6413f13 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -161,16 +161,6 @@ flightrecorder.serializers ${revision}${changelist} - - org.openjdk.jmc - flightrecorder.writer - ${revision}${changelist} - - - me.bechberger.util - femtojson - 0.4.1 - org.openjdk.jmc rjmx.common diff --git a/core/org.openjdk.jmc.flightrecorder.writer/META-INF/MANIFEST.MF b/core/org.openjdk.jmc.flightrecorder.writer/META-INF/MANIFEST.MF index f323c3f308..ee946f3712 100644 --- a/core/org.openjdk.jmc.flightrecorder.writer/META-INF/MANIFEST.MF +++ b/core/org.openjdk.jmc.flightrecorder.writer/META-INF/MANIFEST.MF @@ -5,8 +5,6 @@ Bundle-Name: Mission Control Flight Recorder Writer Bundle-SymbolicName: org.openjdk.jmc.flightrecorder.writer;singleton:=true Bundle-Version: 10.0.0.qualifier Bundle-Vendor: Oracle Corporation -Export-Package: org.openjdk.jmc.flightrecorder.writer.api, - org.openjdk.jmc.flightrecorder.writer, - org.openjdk.jmc.flightrecorder.writer.util +Export-Package: org.openjdk.jmc.flightrecorder.writer.api Require-Bundle: org.openjdk.jmc.common;visibility:=reexport Automatic-Module-Name: org.openjdk.jmc.flightrecorder.writer diff --git a/core/org.openjdk.jmc.flightrecorder/META-INF/MANIFEST.MF b/core/org.openjdk.jmc.flightrecorder/META-INF/MANIFEST.MF index 0581e8f8c8..9d3a59a19a 100644 --- a/core/org.openjdk.jmc.flightrecorder/META-INF/MANIFEST.MF +++ b/core/org.openjdk.jmc.flightrecorder/META-INF/MANIFEST.MF @@ -8,7 +8,7 @@ Bundle-Vendor: Oracle Corporation Eclipse-BuddyPolicy: app Eclipse-ExtensibleAPI: true Export-Package: org.openjdk.jmc.flightrecorder, - org.openjdk.jmc.flightrecorder.internal;x-friends:="org.openjdk.jmc.flightrecorder.ui,org.openjdk.jmc.flightrecorder.configuration,org.openjdk.jmc.flightrecorder.cjfr", + org.openjdk.jmc.flightrecorder.internal;x-friends:="org.openjdk.jmc.flightrecorder.ui,org.openjdk.jmc.flightrecorder.configuration", org.openjdk.jmc.flightrecorder.internal.util;x-friends:="org.openjdk.jmc.flightrecorder.test", org.openjdk.jmc.flightrecorder.jdk, org.openjdk.jmc.flightrecorder.memleak, diff --git a/releng/third-party/pom.xml b/releng/third-party/pom.xml index a402c7a640..2db5b307ce 100644 --- a/releng/third-party/pom.xml +++ b/releng/third-party/pom.xml @@ -298,4 +298,4 @@ - \ No newline at end of file + From e80a5f6f7325ccd9bbdb70e934cba3ea46ba2117 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 15:52:30 +0200 Subject: [PATCH 17/29] refactor(cjfr): drop femtojson as separate bundle (already shaded into condensed-data) --- .../feature.xml | 6 ------ .../platform-definition-2026-06.target | 1 - releng/third-party/pom.xml | 15 +-------------- 3 files changed, 1 insertion(+), 21 deletions(-) diff --git a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml index a0646cf864..c3b4302b42 100644 --- a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml +++ b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml @@ -203,11 +203,5 @@ install-size="0" version="0.0.0" unpack="false"/> - diff --git a/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target b/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target index 9c437d45bc..a7af12cfa4 100644 --- a/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target +++ b/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target @@ -63,7 +63,6 @@ - diff --git a/releng/third-party/pom.xml b/releng/third-party/pom.xml index 2db5b307ce..0daf784ddb 100644 --- a/releng/third-party/pom.xml +++ b/releng/third-party/pom.xml @@ -52,7 +52,6 @@ 3.3.0 0.1.2 - 0.4.1 2.0.5 2.0.3 2.1.4 @@ -217,18 +216,6 @@ org.pushingpixels.radiance.animation.api.* - - me.bechberger.util:femtojson:${femtojson.version} - false - false - true - - me.bechberger.util.femtojson - FemtoJSON - me.bechberger.util.json.* - *;resolution:=optional - - me.bechberger:condensed-data:${condensed-data.version} false @@ -238,7 +225,7 @@ me.bechberger.condensed.data Condensed Data me.bechberger.* - org.openjdk.jmc.flightrecorder.writer;resolution:=optional,me.bechberger.util.femtojson + org.openjdk.jmc.flightrecorder.writer;resolution:=optional *;resolution:=optional From 2af3666325e94667ade7e743a881a6bad9a53928 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 15:53:54 +0200 Subject: [PATCH 18/29] refactor(cjfr): override createPartControl instead of adding hook to JfrEditor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Inflate .cjfr before super.createPartControl() so RecordingLoader sees the temp .jfr — eliminates all changes to JfrEditor.java. --- .../META-INF/MANIFEST.MF | 4 +--- .../openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java | 10 ++++------ .../org/openjdk/jmc/flightrecorder/ui/JfrEditor.java | 7 +------ 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF b/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF index ee0660d0a1..020703c4ce 100644 --- a/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF @@ -9,9 +9,7 @@ Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.openjdk.jmc.flightrecorder.ui, me.bechberger.condensed.data -Import-Package: org.eclipse.jface.dialogs, - org.openjdk.jmc.flightrecorder.ui, - org.openjdk.jmc.ui, +Import-Package: org.openjdk.jmc.ui, me.bechberger.condensed, me.bechberger.jfr Bundle-ActivationPolicy: lazy diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java b/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java index 0c2d275b02..1e53785794 100644 --- a/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/src/main/java/org/openjdk/jmc/flightrecorder/cjfr/CjfrEditor.java @@ -14,9 +14,8 @@ import java.io.FileOutputStream; import java.io.IOException; -import org.eclipse.jface.dialogs.ProgressIndicator; +import org.eclipse.swt.widgets.Composite; import org.openjdk.jmc.flightrecorder.ui.JfrEditor; -import org.openjdk.jmc.flightrecorder.ui.RecordingLoader; import org.openjdk.jmc.ui.MCPathEditorInput; import me.bechberger.condensed.CondensedInputStream; @@ -32,7 +31,7 @@ public class CjfrEditor extends JfrEditor { public static final String EDITOR_ID = "org.openjdk.jmc.flightrecorder.cjfr.CjfrEditor"; //$NON-NLS-1$ @Override - protected RecordingLoader createRecordingLoader(ProgressIndicator progressIndicator) { + public void createPartControl(Composite parent) { File cjfrFile = MCPathEditorInput.getFile(getEditorInput()); try { File tempJfr = File.createTempFile("cjfr-inflate-", ".jfr"); //$NON-NLS-1$ //$NON-NLS-2$ @@ -40,13 +39,12 @@ protected RecordingLoader createRecordingLoader(ProgressIndicator progressIndica try (CondensedInputStream cin = new CondensedInputStream( new BufferedInputStream(new FileInputStream(cjfrFile))); FileOutputStream fos = new FileOutputStream(tempJfr)) { - BasicJFRReader reader = new BasicJFRReader(cin); - WritingJFRReader.toJFRStream(reader, fos); + WritingJFRReader.toJFRStream(new BasicJFRReader(cin), fos); } setInput(new MCPathEditorInput(tempJfr, false)); } catch (IOException e) { // Fall through: let RecordingLoader fail gracefully on the original file } - return new RecordingLoader(this, progressIndicator); + super.createPartControl(parent); } } diff --git a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/JfrEditor.java b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/JfrEditor.java index 4ac9125476..ad1c7cf507 100644 --- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/JfrEditor.java +++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/JfrEditor.java @@ -142,12 +142,7 @@ public void createPartControl(Composite parent) { resultContainer.addDisposeListener(e -> saveCurrentPageState()); ProgressIndicator progressIndicator = CompositeToolkit.createWaitIndicator(toolkit.createComposite(parent), toolkit); - createRecordingLoader(progressIndicator).schedule(); - } - - /** Overloaded by extending editors */ - protected RecordingLoader createRecordingLoader(ProgressIndicator progressIndicator) { - return new RecordingLoader(this, progressIndicator); + new RecordingLoader(this, progressIndicator).schedule(); } @Override From 70e0969accef017ab907ca07c3c159cb0cd85c73 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 15:56:23 +0200 Subject: [PATCH 19/29] refactor(cjfr): remove license header from plugin.xml; drop Require-Bundle for shaded writer --- .../plugin.xml | 32 ------------------- releng/third-party/pom.xml | 1 - 2 files changed, 33 deletions(-) diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/plugin.xml b/application/org.openjdk.jmc.flightrecorder.cjfr/plugin.xml index b58f83d585..7bdddf542d 100644 --- a/application/org.openjdk.jmc.flightrecorder.cjfr/plugin.xml +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/plugin.xml @@ -1,36 +1,4 @@ - me.bechberger.condensed.data Condensed Data me.bechberger.* - org.openjdk.jmc.flightrecorder.writer;resolution:=optional *;resolution:=optional From 31afb98d899e6c4c47aca3b0b8dea13f2e079e77 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 16:01:37 +0200 Subject: [PATCH 20/29] refactor(cjfr): revert writer changes (shaded copy already has timezone support) condensed-data.jar shades its own MetadataImpl/RecordingImpl with setGmtOffset/setRegion. The JMC flightrecorder.writer bundle is not in the product feature, so modifications to those files are unnecessary for the integration. --- .../flightrecorder/writer/MetadataImpl.java | 33 ++----------------- .../flightrecorder/writer/RecordingImpl.java | 8 ++--- 2 files changed, 4 insertions(+), 37 deletions(-) diff --git a/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/MetadataImpl.java b/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/MetadataImpl.java index ccba22a444..a798ef74c6 100644 --- a/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/MetadataImpl.java +++ b/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/MetadataImpl.java @@ -1,6 +1,6 @@ /* - * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2021, 2026, Datadog, Inc. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Datadog, Inc. All rights reserved. * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -66,9 +66,6 @@ final class MetadataImpl { private static final String DIMENSION_KEY = "dimension"; private static final String ANNOTATION_KEY = "annotation"; private static final String VAL_1_VALUE = "1"; - private static final String GMT_OFFSET_KEY = "gmtOffset"; - private static final String LOCALE_KEY = "locale"; - private static final long GMT_OFFSET_UNSET = Long.MIN_VALUE; private final AtomicLong typeCounter = new AtomicLong(1); private final ConstantPools constantPools; @@ -78,8 +75,6 @@ final class MetadataImpl { private final Set unresolvedTypes = new CopyOnWriteArraySet<>(); private volatile TypesImpl types; - private volatile long regionGmtOffsetMillis = GMT_OFFSET_UNSET; - private volatile String regionLocale; MetadataImpl(ConstantPools constantPools) { this.constantPools = constantPools; @@ -111,19 +106,6 @@ private void fillStrings() { storeString(REGION_KEY); storeString(DIMENSION_KEY); storeString(ANNOTATION_KEY); - storeString(GMT_OFFSET_KEY); - storeString(LOCALE_KEY); - } - - void setRegion(long gmtOffsetMillis, String locale) { - this.regionGmtOffsetMillis = gmtOffsetMillis; - this.regionLocale = locale; - if (gmtOffsetMillis != GMT_OFFSET_UNSET) { - storeString(Long.toString(gmtOffsetMillis)); - } - if (locale != null) { - storeString(locale); - } } /** @@ -398,17 +380,6 @@ private void writeMetaEventWithSize(LEB128Writer metaWriter, LEB128Writer writer } private void writeRegion(LEB128Writer metaWriter) { - if (regionGmtOffsetMillis != GMT_OFFSET_UNSET) { - boolean hasLocale = regionLocale != null; - int attributes = hasLocale ? 2 : 1; - metaWriter.writeInt(stringIndex(REGION_KEY)).writeInt(attributes).writeInt(stringIndex(GMT_OFFSET_KEY)) - .writeInt(stringIndex(Long.toString(regionGmtOffsetMillis))); - if (hasLocale) { - metaWriter.writeInt(stringIndex(LOCALE_KEY)).writeInt(stringIndex(regionLocale)); - } - metaWriter.writeInt(0); // 0 child elements - return; - } metaWriter.writeInt(stringIndex(REGION_KEY)).writeInt(0) // 0 attributes .writeInt(0); // 0 elements } diff --git a/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/RecordingImpl.java b/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/RecordingImpl.java index eb2e3f11b5..023b5ef9eb 100644 --- a/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/RecordingImpl.java +++ b/core/org.openjdk.jmc.flightrecorder.writer/src/main/java/org/openjdk/jmc/flightrecorder/writer/RecordingImpl.java @@ -1,6 +1,6 @@ /* - * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2021, 2026, Datadog, Inc. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Datadog, Inc. All rights reserved. * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -160,10 +160,6 @@ private void processChunkDataQueue(long pollTimeout, TimeUnit timeUnit) throws I } } - public void setGmtOffset(long gmtOffsetMillis, String locale) { - metadata.setRegion(gmtOffsetMillis, locale); - } - @Override public RecordingImpl rotateChunk() { Chunk chunk = getChunk(); From 2404396021de7b56a4ad013a2b6e754ea930402a Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 16:11:14 +0200 Subject: [PATCH 21/29] refactor(cjfr): use condensed-data -jmc jar; add flightrecorder.writer to feature Switch to me.bechberger:condensed-data::jar:jmc which excludes shaded writer classes. JMC's flightrecorder.writer OSGi bundle now supplies them at runtime, eliminating drift risk when the writer evolves. --- .../org.openjdk.jmc.feature.flightrecorder/feature.xml | 6 ++++++ .../META-INF/MANIFEST.MF | 3 ++- releng/third-party/pom.xml | 6 +++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml index c3b4302b42..e91dc76b15 100644 --- a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml +++ b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml @@ -203,5 +203,11 @@ install-size="0" version="0.0.0" unpack="false"/> + diff --git a/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF b/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF index 020703c4ce..93eaab3325 100644 --- a/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF +++ b/application/org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF @@ -8,7 +8,8 @@ Bundle-Vendor: SAP SE Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.openjdk.jmc.flightrecorder.ui, - me.bechberger.condensed.data + me.bechberger.condensed.data, + org.openjdk.jmc.flightrecorder.writer Import-Package: org.openjdk.jmc.ui, me.bechberger.condensed, me.bechberger.jfr diff --git a/releng/third-party/pom.xml b/releng/third-party/pom.xml index 8620ab7e1e..cd735c5bfc 100644 --- a/releng/third-party/pom.xml +++ b/releng/third-party/pom.xml @@ -217,7 +217,10 @@ - me.bechberger:condensed-data:${condensed-data.version} + + me.bechberger:condensed-data:${condensed-data.version}:jar:jmc false false true @@ -225,6 +228,7 @@ me.bechberger.condensed.data Condensed Data me.bechberger.* + org.openjdk.jmc.flightrecorder.writer *;resolution:=optional From 9c83643e83cf56fad609c754237b5328b9a926f6 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 16:28:20 +0200 Subject: [PATCH 22/29] build(cjfr): bump condensed-data to 0.1.3 --- .../platform-definition-2026-06.target | 2 +- releng/third-party/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target b/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target index a7af12cfa4..f18f2de332 100644 --- a/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target +++ b/releng/platform-definitions/platform-definition-2026-06/platform-definition-2026-06.target @@ -62,7 +62,7 @@ - + diff --git a/releng/third-party/pom.xml b/releng/third-party/pom.xml index cd735c5bfc..bfc4304b8c 100644 --- a/releng/third-party/pom.xml +++ b/releng/third-party/pom.xml @@ -51,7 +51,7 @@ 11.0.15 3.3.0 - 0.1.2 + 0.1.3 2.0.5 2.0.3 2.1.4 From df7506c47b19a55c19150078d5b1c75ca8bdb61e Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 16:46:30 +0200 Subject: [PATCH 23/29] ci: retrigger after Central sync From 2e1dd289e5eb432b3a07e6d1c8930591ecafc9b1 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 18:36:05 +0200 Subject: [PATCH 24/29] ci: retrigger after condensed-data Central sync From ad5777b281adec63d4002e02343b907c926faa89 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 18:58:39 +0200 Subject: [PATCH 25/29] =?UTF-8?q?fix(p2):=20use=20p2-maven-plugin=20artifa?= =?UTF-8?q?ct=20coordinate=20format=20=E2=80=94=20version=20last?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit p2-maven-plugin expects groupId:artifactId:type:classifier:version, not the standard Maven groupId:artifactId:version:type:classifier. The wrong format caused Aether to fail resolving condensed-data-jmc. --- releng/third-party/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/releng/third-party/pom.xml b/releng/third-party/pom.xml index bfc4304b8c..5138feefe0 100644 --- a/releng/third-party/pom.xml +++ b/releng/third-party/pom.xml @@ -220,7 +220,7 @@ - me.bechberger:condensed-data:${condensed-data.version}:jar:jmc + me.bechberger:condensed-data:jar:jmc:${condensed-data.version} false false true From b2b955b7e561339b92ebd5ddce95a67be3a20006 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 19:17:20 +0200 Subject: [PATCH 26/29] fix(p2): use actual bnd-generated BSN me.bechberger.condensed.data.jmc p2-maven-plugin's bnd appends the Maven classifier to Bundle-SymbolicName, producing me.bechberger.condensed.data.jmc instead of the intended .data. Update target definition, feature.xml, MANIFEST.MF, and p2 instructions to use the actual BSN so Tycho target platform resolution succeeds. --- application/org.openjdk.jmc.feature.flightrecorder/feature.xml | 2 +- .../org.openjdk.jmc.flightrecorder.cjfr/META-INF/MANIFEST.MF | 2 +- .../platform-definition-2026-06.target | 2 +- releng/third-party/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml index e91dc76b15..1be101e2e0 100644 --- a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml +++ b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml @@ -198,7 +198,7 @@ version="0.0.0" unpack="false"/> - + diff --git a/releng/third-party/pom.xml b/releng/third-party/pom.xml index 5138feefe0..646f72489e 100644 --- a/releng/third-party/pom.xml +++ b/releng/third-party/pom.xml @@ -225,7 +225,7 @@ false true - me.bechberger.condensed.data + me.bechberger.condensed.data.jmc Condensed Data me.bechberger.* org.openjdk.jmc.flightrecorder.writer From 16cab89e6c7dec5d7f09a44b4d88b79988049807 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 19:31:36 +0200 Subject: [PATCH 27/29] =?UTF-8?q?fix(p2):=20bnd=20appends=20classifier=20t?= =?UTF-8?q?o=20BSN=20=E2=80=94=20set=20base=20name=20without=20.jmc=20suff?= =?UTF-8?q?ix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit p2-maven-plugin's bnd appends the Maven classifier (.jmc) to whatever Bundle-SymbolicName is specified in . Setting me.bechberger.condensed.data.jmc in the instructions produces me.bechberger.condensed.data.jmc.jmc — one suffix too many. Set the base name me.bechberger.condensed.data so bnd generates the intended me.bechberger.condensed.data.jmc, matching the unit id in the .target file and the Require-Bundle in MANIFEST.MF. --- releng/third-party/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/releng/third-party/pom.xml b/releng/third-party/pom.xml index 646f72489e..5138feefe0 100644 --- a/releng/third-party/pom.xml +++ b/releng/third-party/pom.xml @@ -225,7 +225,7 @@ false true - me.bechberger.condensed.data.jmc + me.bechberger.condensed.data Condensed Data me.bechberger.* org.openjdk.jmc.flightrecorder.writer From b020d9fbe20b6349afb1f2dd08261723bc12991c Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 19:39:56 +0200 Subject: [PATCH 28/29] =?UTF-8?q?fix(p2):=20remove=20Require-Bundle=20?= =?UTF-8?q?=E2=80=94=20writer=20is=20a=20workspace=20bundle,=20not=20a=20t?= =?UTF-8?q?arget=20dep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Require-Bundle: org.openjdk.jmc.flightrecorder.writer causes Tycho target platform resolution to fail because the writer bundle lives in the JMC workspace, not the p2 third-party repository. Remove the directive; Import-Package: *;resolution:=optional covers the runtime wiring via OSGi's package namespace, which Tycho resolves from the workspace. --- releng/third-party/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/releng/third-party/pom.xml b/releng/third-party/pom.xml index 5138feefe0..7ccb4afc0a 100644 --- a/releng/third-party/pom.xml +++ b/releng/third-party/pom.xml @@ -228,7 +228,6 @@ me.bechberger.condensed.data Condensed Data me.bechberger.* - org.openjdk.jmc.flightrecorder.writer *;resolution:=optional From 2fcbc18ed9f2ebf32e182f1afaa8cc85ab01c7d5 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Tue, 4 Aug 2026 19:53:56 +0200 Subject: [PATCH 29/29] fix(app): restore flightrecorder.writer Maven dependency in application pom Commit ef9b2e27 removed this dependency when CjfrRecordingLoader was dropped, but the MANIFEST.MF still has Require-Bundle: org.openjdk.jmc.flightrecorder.writer. Without the Maven dependency, Tycho cannot find the writer bundle when resolving the cjfr plugin's OSGi requirements. --- application/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/application/pom.xml b/application/pom.xml index 61b6413f13..43ce002cc8 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -141,6 +141,11 @@ flightrecorder ${revision}${changelist} + + org.openjdk.jmc + flightrecorder.writer + ${revision}${changelist} + org.openjdk.jmc flightrecorder.configuration