diff --git a/.jmc.metadata b/.jmc.metadata
index ecc1f15..cf0f192 100644
--- a/.jmc.metadata
+++ b/.jmc.metadata
@@ -1,2 +1,2 @@
686f6d6b9bcab052a6a815e59e55bebb272a03fe SOURCES/8.2.0-ga.tar.gz
-5a570644593d9f5da81a86e8722be4f8a5748d77 SOURCES/repository-8.2.0.tar.gz
+16f9083dc818e16f163106ea3bc729bb460cb08a SOURCES/repository-8.2.0.tar.gz
diff --git a/SOURCES/4-remove-websocket.patch b/SOURCES/4-remove-websocket.patch
new file mode 100644
index 0000000..549a34d
--- /dev/null
+++ b/SOURCES/4-remove-websocket.patch
@@ -0,0 +1,590 @@
+diff --git a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml
+index 81af1d65..af766c5b 100644
+--- a/application/org.openjdk.jmc.feature.flightrecorder/feature.xml
++++ b/application/org.openjdk.jmc.feature.flightrecorder/feature.xml
+@@ -157,27 +157,6 @@
+ version="0.0.0"
+ unpack="false"/>
+
+-
+-
+-
+-
+-
+-
+ 0 && port < 65535;
+- }
+-
+ public static String validateDumpTimespan(String text) {
+ try {
+ IQuantity timespan = UnitLookup.TIMESPAN.parseInteractive(text);
+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 7dc8dcd7..b5b67d0d 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
+@@ -83,7 +83,6 @@ import org.openjdk.jmc.flightrecorder.ui.messages.internal.Messages;
+ import org.openjdk.jmc.flightrecorder.ui.preferences.PreferenceKeys;
+ import org.openjdk.jmc.flightrecorder.ui.selection.IFlavoredSelection;
+ import org.openjdk.jmc.flightrecorder.ui.selection.SelectionStore;
+-import org.openjdk.jmc.flightrecorder.ui.websocket.WebsocketServer;
+ import org.openjdk.jmc.ui.MCPathEditorInput;
+ import org.openjdk.jmc.ui.idesupport.IDESupportUIToolkit;
+ import org.openjdk.jmc.ui.misc.CompositeToolkit;
+@@ -113,8 +112,6 @@ public class JfrEditor extends EditorPart implements INavigationLocationProvider
+ private Reference resultPageRef = new WeakReference<>(null);
+ private RuleManager ruleEngine;
+ private IPropertyChangeListener analysisEnabledListener;
+- private IPropertyChangeListener websocketServerEnabledListener;
+- private WebsocketServer websocketServer;
+
+ public JfrEditor() {
+ super();
+@@ -126,29 +123,7 @@ public class JfrEditor extends EditorPart implements INavigationLocationProvider
+ }
+ }
+ };
+- if (FlightRecorderUI.getDefault().isWebsocketServerEnabled()) {
+- int websocketServerPort = FlightRecorderUI.getDefault().getWebsocketPort();
+- websocketServer = new WebsocketServer(websocketServerPort);
+- }
+- websocketServerEnabledListener = e -> {
+- if (e.getProperty().equals(PreferenceKeys.PROPERTY_WEBSOCKET_SERVER_PORT)) {
+- int newWebsocketServerPort = FlightRecorderUI.parseWebsocketPort((String) e.getNewValue());
+- if (newWebsocketServerPort > 0) {
+- if (websocketServer != null) {
+- websocketServer.shutdown();
+- websocketServer = null;
+- }
+- websocketServer = new WebsocketServer(newWebsocketServerPort);
+- } else {
+- if (websocketServer != null) {
+- websocketServer.shutdown();
+- websocketServer = null;
+- }
+- }
+- }
+- };
+ FlightRecorderUI.getDefault().getPreferenceStore().addPropertyChangeListener(analysisEnabledListener);
+- FlightRecorderUI.getDefault().getPreferenceStore().addPropertyChangeListener(websocketServerEnabledListener);
+ }
+
+ @Override
+@@ -214,9 +189,6 @@ public class JfrEditor extends EditorPart implements INavigationLocationProvider
+ if (!items.hasItems() && currentPage != null) {
+ selectionItems = getModel().getItems().apply(getDisplayablePage(currentPage).getDefaultSelectionFilter());
+ }
+- if (websocketServer != null) {
+- websocketServer.notifyAll(selectionItems);
+- }
+ getSite().getSelectionProvider().setSelection(new StructuredSelection(selectionItems));
+ }
+
+@@ -429,7 +401,6 @@ public class JfrEditor extends EditorPart implements INavigationLocationProvider
+ public void dispose() {
+ ruleEngine.dispose();
+ FlightRecorderUI.getDefault().getPreferenceStore().removePropertyChangeListener(analysisEnabledListener);
+- FlightRecorderUI.getDefault().getPreferenceStore().removePropertyChangeListener(websocketServerEnabledListener);
+ super.dispose();
+ }
+
+diff --git a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/messages/internal/Messages.java b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/messages/internal/Messages.java
+index 278456a7..771529fe 100644
+--- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/messages/internal/Messages.java
++++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/messages/internal/Messages.java
+@@ -453,9 +453,6 @@ public class Messages extends NLS {
+ public static String PREFERENCES_REMOVE_FINISHED_RECORDING_TEXT;
+ public static String PREFERENCES_RULES_CONFIGURE_SELECTED;
+ public static String PREFERENCES_SHOW_MONITORING_WARNING_TEXT;
+- public static String PREFERENCES_WEBSOCKET_SERVER_PORT_INVALID;
+- public static String PREFERENCES_WEBSOCKET_SERVER_PORT_TEXT;
+- public static String PREFERENCES_WEBSOCKET_SERVER_PORT_TOOLTIP;
+ public static String ProcessesPage_AGGR_CONCURRENT_PROCESSES;
+ public static String ProcessesPage_AGGR_CONCURRENT_PROCESSES_DESC;
+ public static String ProcessesPage_AGGR_FIRST_SAMPLE;
+diff --git a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/preferences/GeneralPage.java b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/preferences/GeneralPage.java
+index 7207a8a6..a7332aa3 100644
+--- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/preferences/GeneralPage.java
++++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/preferences/GeneralPage.java
+@@ -93,7 +93,6 @@ public class GeneralPage extends PreferencePage implements IWorkbenchPreferenceP
+ private Text itemListValue;
+ private Text propertiesArrayStringSizeValue;
+ private Text editorRuleEvaluationThreadsValue;
+- private Text websocketPortValue;
+
+ @Override
+ protected Control createContents(Composite parent) {
+@@ -170,21 +169,12 @@ public class GeneralPage extends PreferencePage implements IWorkbenchPreferenceP
+ editorRuleEvaluationThreadsValue.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ QuantityKindProposal.install(editorRuleEvaluationThreadsValue, UnitLookup.NUMBER);
+
+- Label websocketPortLabel = new Label(defaultTimespanContainer, SWT.NONE);
+- websocketPortLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
+- websocketPortLabel.setText(Messages.PREFERENCES_WEBSOCKET_SERVER_PORT_TEXT);
+- websocketPortLabel.setToolTipText(Messages.PREFERENCES_WEBSOCKET_SERVER_PORT_TOOLTIP);
+- websocketPortValue = new Text(defaultTimespanContainer, SWT.BORDER);
+- websocketPortValue.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+- QuantityKindProposal.install(websocketPortValue, UnitLookup.NUMBER);
+-
+ loadDumpTypeFromPrefStore(false);
+ loadTimespanFromPrefStore(false);
+ loadSelectionStoreSizeFromPrefStore(false);
+ loadItemListSizeFromPrefStore(false);
+ loadPropertiesArrayStringSizeFromPrefStore(false);
+ loadEditorRuleEvaluationThreadsFromPrefStore(false);
+- loadWebsocketPortFromPrefStore(false);
+ timespanValue.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+@@ -215,12 +205,6 @@ public class GeneralPage extends PreferencePage implements IWorkbenchPreferenceP
+ validatePage();
+ }
+ });
+- websocketPortValue.addModifyListener(new ModifyListener() {
+- @Override
+- public void modifyText(ModifyEvent e) {
+- validatePage();
+- }
+- });
+
+ return container;
+ }
+@@ -241,23 +225,7 @@ public class GeneralPage extends PreferencePage implements IWorkbenchPreferenceP
+ if (error == null && error2 == null && error3 == null) {
+ setErrorMessage(error4);
+ }
+- String error5 = validateWebsocketPort(websocketPortValue.getText());
+- if (error == null && error2 == null && error3 == null) {
+- setErrorMessage(error5);
+- }
+- setValid(error == null && error2 == null && error3 == null && error4 == null && error5 == null);
+- }
+-
+- public static String validateWebsocketPort(String text) {
+- try {
+- int port = Integer.parseInt(text);
+- if (port < 0 || port > 65535) {
+- return Messages.PREFERENCES_WEBSOCKET_SERVER_PORT_INVALID;
+- }
+- } catch (NumberFormatException e) {
+- return Messages.PREFERENCES_WEBSOCKET_SERVER_PORT_INVALID;
+- }
+- return null;
++ setValid(error == null && error2 == null && error3 == null && error4 == null);
+ }
+
+ public static String validateNumEvaluationThreads(String text) {
+@@ -337,12 +305,6 @@ public class GeneralPage extends PreferencePage implements IWorkbenchPreferenceP
+ editorRuleEvaluationThreadsValue.setText(FlightRecorderUI.parseItemListSize(size).interactiveFormat());
+ }
+
+- private void loadWebsocketPortFromPrefStore(boolean loadDefault) {
+- String port = loadDefault ? getPreferenceStore().getDefaultString(PreferenceKeys.PROPERTY_WEBSOCKET_SERVER_PORT)
+- : getPreferenceStore().getString(PreferenceKeys.PROPERTY_WEBSOCKET_SERVER_PORT);
+- websocketPortValue.setText(Integer.toString(FlightRecorderUI.parseWebsocketPort(port)));
+- }
+-
+ // private Button createClearButton(Composite parent) {
+ // Button button = new Button(parent, SWT.NONE);
+ // button.setText(Messages.PREFERENCES_CLEAR_USER_SETTINGS_TEXT);
+@@ -424,7 +386,6 @@ public class GeneralPage extends PreferencePage implements IWorkbenchPreferenceP
+ loadItemListSizeFromPrefStore(true);
+ loadPropertiesArrayStringSizeFromPrefStore(true);
+ loadEditorRuleEvaluationThreadsFromPrefStore(true);
+- loadWebsocketPortFromPrefStore(true);
+ super.performDefaults();
+ }
+
+@@ -476,13 +437,6 @@ public class GeneralPage extends PreferencePage implements IWorkbenchPreferenceP
+ setErrorMessage(qce.getLocalizedMessage());
+ return false;
+ }
+- try {
+- int port = Integer.parseInt(websocketPortValue.getText());
+- getPreferenceStore().setValue(PreferenceKeys.PROPERTY_WEBSOCKET_SERVER_PORT, Integer.toString(port));
+- } catch (NumberFormatException e) {
+- setErrorMessage(Messages.PREFERENCES_WEBSOCKET_SERVER_PORT_INVALID);
+- return false;
+- }
+
+ setErrorMessage(null);
+ if (timespanRadio.getSelection()) {
+diff --git a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/preferences/PreferenceKeys.java b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/preferences/PreferenceKeys.java
+index ecbd086a..ade4d320 100644
+--- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/preferences/PreferenceKeys.java
++++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/preferences/PreferenceKeys.java
+@@ -45,8 +45,6 @@ public class PreferenceKeys {
+ public static final String PROPERTY_DEFAULT_DUMP_TIMESPAN = "flightrecorder.controlpanel.default.dump.timespan"; //$NON-NLS-1$
+ public static final String PROPERTY_DEFAULT_DUMP_TYPE = "flightrecorder.controlpanel.default.dump.type"; //$NON-NLS-1$
+ public static final String PROPERTY_ENABLE_RECORDING_ANALYSIS = "flightrecorder.controlpanel.enable.recording.analysis"; //$NON-NLS-1$
+- public static final int DEFAULT_WEBSOCKET_PORT = 0;
+- public static final String PROPERTY_WEBSOCKET_SERVER_PORT = "flightrecorder.controlpanel.websocket.server.port"; //$NON-NLS-1$
+ public static final String PROPERTY_INCLUDE_EXPERIMENTAL_EVENTS_AND_FIELDS = "flightrecorder.ui.includeExperimentalEventsAndFields"; //$NON-NLS-1$
+ public static final String PROPERTY_ALLOW_INCOMPLETE_RECORDING_FILE = "flightrecorder.ui.allowIncompleteRecordingFile"; //$NON-NLS-1$
+ public static final IQuantity DUMP_TIMESPAN_DEFAULT = UnitLookup.MINUTE.quantity(5);
+diff --git a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/websocket/WebsocketServer.java b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/websocket/WebsocketServer.java
+deleted file mode 100644
+index 22bd2eb9..00000000
+--- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/websocket/WebsocketServer.java
++++ /dev/null
+@@ -1,256 +0,0 @@
+-/*
+- * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+- * Copyright (c) 2021, Datadog, Inc. 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.ui.websocket;
+-
+-import java.io.IOException;
+-import java.time.Duration;
+-import java.util.HashMap;
+-import java.util.List;
+-import java.util.concurrent.CopyOnWriteArrayList;
+-import java.util.concurrent.ExecutorService;
+-import java.util.concurrent.Executors;
+-import java.util.concurrent.TimeoutException;
+-import java.util.function.Function;
+-import java.util.logging.Level;
+-import java.util.stream.Collectors;
+-
+-import org.eclipse.jetty.server.Server;
+-import org.eclipse.jetty.server.ServerConnector;
+-import org.eclipse.jetty.servlet.ServletContextHandler;
+-import org.eclipse.jetty.websocket.api.Session;
+-import org.eclipse.jetty.websocket.api.WebSocketAdapter;
+-import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer;
+-import org.eclipse.jetty.websocket.servlet.WebSocketUpgradeFilter;
+-import org.openjdk.jmc.common.item.IItemCollection;
+-import org.openjdk.jmc.flightrecorder.serializers.dot.DotSerializer;
+-import org.openjdk.jmc.flightrecorder.serializers.json.FlameGraphJsonSerializer;
+-import org.openjdk.jmc.flightrecorder.serializers.json.IItemCollectionJsonSerializer;
+-import org.openjdk.jmc.flightrecorder.stacktrace.FrameSeparator;
+-import org.openjdk.jmc.flightrecorder.stacktrace.FrameSeparator.FrameCategorization;
+-import org.openjdk.jmc.flightrecorder.stacktrace.graph.StacktraceGraphModel;
+-import org.openjdk.jmc.flightrecorder.stacktrace.tree.StacktraceTreeModel;
+-import org.openjdk.jmc.flightrecorder.ui.FlightRecorderUI;
+-
+-public class WebsocketServer {
+-
+- private static int MAX_MESSAGE_SIZE = 1024 * 1024 * 1024;
+- private static int IDLE_TIMEOUT_MINUTES = 5;
+-
+- private final int port;
+- private Server server;
+- private List handlers = new CopyOnWriteArrayList<>();
+- private List treeHandlers = new CopyOnWriteArrayList<>();
+- private List graphHandlers = new CopyOnWriteArrayList<>();
+- private final ExecutorService executorService = Executors.newSingleThreadExecutor();
+- private IItemCollection currentSelection = null;
+-
+- public WebsocketServer(int port) {
+- this.port = port;
+- executorService.execute(() -> startServer());
+- }
+-
+- public int getPort() {
+- return port;
+- }
+-
+- private void startServer() {
+- server = new Server();
+- ServerConnector connector = new ServerConnector(server);
+- connector.setHost("127.0.0.1");
+- connector.setPort(port);
+- server.addConnector(connector);
+-
+- ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
+- context.setContextPath("/");
+- server.setHandler(context);
+-
+- JettyWebSocketServletContainerInitializer.configure(context, (servletContext, container) -> {
+- container.setMaxBinaryMessageSize(MAX_MESSAGE_SIZE);
+- container.setIdleTimeout(Duration.ofMinutes(IDLE_TIMEOUT_MINUTES));
+- container.addMapping("/events/*", (req, resp) -> {
+- // try to send the current selection when the client connects
+- // for simplicity, we serialise for every new connection
+- String eventsJson = WebsocketServer.toEventsJsonString(currentSelection);
+- WebsocketConnectionHandler handler = new WebsocketConnectionHandler(eventsJson);
+- handlers.add(handler);
+- return handler;
+- });
+- container.addMapping("/tree/*", (req, resp) -> {
+- String treeJson = WebsocketServer.toTreeModelJsonString(currentSelection);
+- WebsocketConnectionHandler handler = new WebsocketConnectionHandler(treeJson);
+- treeHandlers.add(handler);
+- return handler;
+- });
+- container.addMapping("/graph/*", (req, resp) -> {
+- String dot = WebsocketServer.toGraphModelDotString(currentSelection);
+- WebsocketConnectionHandler handler = new WebsocketConnectionHandler(dot);
+- graphHandlers.add(handler);
+- return handler;
+- });
+- });
+-
+- try {
+- WebSocketUpgradeFilter.ensureFilter(context.getServletContext());
+- FlightRecorderUI.getDefault().getLogger().log(Level.INFO,
+- "Starting websocket server listening on port " + port);
+- server.start();
+- server.join();
+- } catch (Exception e) {
+- FlightRecorderUI.getDefault().getLogger().log(Level.SEVERE, "Failed to start websocket server", e);
+- }
+- }
+-
+- public void notifyAll(IItemCollection events) {
+- currentSelection = events;
+- notifyAllEventHandlers(events);
+- notifyAllGraphHandlers(events);
+- notifyAllTreeHandlers(events);
+- }
+-
+- private void notifyAllEventHandlers(IItemCollection events) {
+- handlers = notifyAllHandlers(events, handlers, WebsocketServer::toEventsJsonString);
+- }
+-
+- private void notifyAllGraphHandlers(IItemCollection events) {
+- graphHandlers = notifyAllHandlers(events, graphHandlers, WebsocketServer::toGraphModelDotString);
+- }
+-
+- private void notifyAllTreeHandlers(IItemCollection events) {
+- treeHandlers = notifyAllHandlers(events, treeHandlers, WebsocketServer::toTreeModelJsonString);
+- }
+-
+- private static String toEventsJsonString(IItemCollection items) {
+- if (items == null) {
+- return null;
+- }
+- return IItemCollectionJsonSerializer.toJsonString(items);
+- }
+-
+- private static String toGraphModelDotString(IItemCollection items) {
+- if (items == null) {
+- return null;
+- }
+- FrameSeparator frameSeparator = new FrameSeparator(FrameCategorization.METHOD, false);
+- StacktraceGraphModel model = new StacktraceGraphModel(frameSeparator, items, null);
+- return DotSerializer.toDot(model, 10_000, new HashMap<>());
+- }
+-
+- private static String toTreeModelJsonString(IItemCollection items) {
+- if (items == null) {
+- return null;
+- }
+- StacktraceTreeModel model = new StacktraceTreeModel(items);
+- return FlameGraphJsonSerializer.toJson(model);
+- }
+-
+- private List notifyAllHandlers(
+- IItemCollection events, List handlers,
+- Function jsonSerializer) {
+- handlers = handlers.stream().filter(h -> h.isConnected()).collect(Collectors.toList());
+- if (handlers.size() == 0 || events == null) {
+- // do nothing if no handlers are registered
+- return handlers;
+- }
+- String json = jsonSerializer.apply(events);
+- handlers.forEach(handler -> handler.sendMessage(json));
+- return handlers;
+- }
+-
+- public void shutdown() {
+- try {
+- FlightRecorderUI.getDefault().getLogger().log(Level.INFO,
+- "Stopping websocket server listening on port " + port);
+- server.stop();
+- // TODO: see if we need to cleanup executor service and thread
+- } catch (Exception e) {
+- FlightRecorderUI.getDefault().getLogger().log(Level.SEVERE, "Failed to stop websocket server", e);
+- }
+- }
+-
+- private static class WebsocketConnectionHandler extends WebSocketAdapter {
+- private String firstMessage;
+-
+- WebsocketConnectionHandler(String firstMessage) {
+- this.firstMessage = firstMessage;
+- }
+-
+- public void sendMessage(String message) {
+- if (getSession() != null && isConnected()) {
+- FlightRecorderUI.getDefault().getLogger().log(Level.INFO,
+- "Sending message to " + getSession().getRemoteAddress().toString());
+- try {
+- getSession().getRemote().sendString(message);
+- } catch (IOException e) {
+- FlightRecorderUI.getDefault().getLogger().log(Level.SEVERE, "Failed to send websocket message", e);
+- }
+- }
+- }
+-
+- @Override
+- public void onWebSocketConnect(Session sess) {
+- super.onWebSocketConnect(sess);
+- FlightRecorderUI.getDefault().getLogger().log(Level.INFO,
+- "Socket connected to " + sess.getRemoteAddress().toString());
+- try {
+- if (firstMessage != null) {
+- getSession().getRemote().sendString(firstMessage);
+- firstMessage = null;
+- }
+- } catch (IOException e) {
+- FlightRecorderUI.getDefault().getLogger().log(Level.SEVERE, "Failed to show outline view", e);
+- }
+- }
+-
+- @Override
+- public void onWebSocketText(String message) {
+- super.onWebSocketText(message);
+- }
+-
+- @Override
+- public void onWebSocketClose(int statusCode, String reason) {
+- super.onWebSocketClose(statusCode, reason);
+- FlightRecorderUI.getDefault().getLogger().log(Level.INFO, "Socket closed: [" + statusCode + "] " + reason);
+- }
+-
+- @Override
+- public void onWebSocketError(Throwable cause) {
+- super.onWebSocketError(cause);
+- if (cause.getCause() instanceof TimeoutException) {
+- FlightRecorderUI.getDefault().getLogger().log(Level.INFO, "Websocket timed out");
+- } else {
+- FlightRecorderUI.getDefault().getLogger().log(Level.SEVERE, "Websocket error", cause);
+- }
+- }
+- }
+-}
+diff --git a/application/org.openjdk.jmc.flightrecorder.ui/src/main/resources/org/openjdk/jmc/flightrecorder/ui/messages/internal/messages.properties b/application/org.openjdk.jmc.flightrecorder.ui/src/main/resources/org/openjdk/jmc/flightrecorder/ui/messages/internal/messages.properties
+index af337b20..fa4ddf3c 100644
+--- a/application/org.openjdk.jmc.flightrecorder.ui/src/main/resources/org/openjdk/jmc/flightrecorder/ui/messages/internal/messages.properties
++++ b/application/org.openjdk.jmc.flightrecorder.ui/src/main/resources/org/openjdk/jmc/flightrecorder/ui/messages/internal/messages.properties
+@@ -389,8 +389,6 @@ NAVIGATOR_ZOOM_OUT_TEXT=Zoom Out
+
+ PREFERENCES_CONFIRM_REMOVE_TEMPLATE_TEXT=Ask for confirmation before removing flight recording templates
+ PREFERENCES_ENABLE_RECORDING_ANALYSIS=Enable flight recording analysis
+-PREFERENCES_WEBSOCKET_SERVER_PORT_TEXT=Websocket server port (set to 0 to disable)
+-PREFERENCES_WEBSOCKET_SERVER_PORT_TOOLTIP=Start a websocket server bound to 127.0.0.1 and the selected port. The server pushes updates whenever the selection changes in the UI.
+ PREFERENCES_INCLUDE_EXPERIMENTAL_EVENTS_AND_FIELDS=Include experimental events and fields when reading flight recording files
+ PREFERENCES_ALLOW_INCOMPLETE_RECORDING_FILE=Enable reading of incomplete flight recording files
+ PREFERENCES_SHOW_MONITORING_WARNING_TEXT=Show warnings for problems that occur while monitoring flight recordings.
+@@ -400,7 +398,6 @@ PREFERENCES_ENABLED_RULES=Enabled Rules
+ PREFERENCES_EVALUATION_THREAD_NUMBER_TEXT=Number of rule evaluation threads:
+ PREFERENCES_EVALUATION_THREAD_NUMBER_TOOLTIP=This sets the number of threads each editor will create and run in parallel to evaluate rules for that flight recording.
+ PREFERENCES_EVALUATION_THREAD_NUMBER_LESS_THAN_ONE=Number of rule evaluation threads: Must be at least 1
+-PREFERENCES_WEBSOCKET_SERVER_PORT_INVALID=Websocket server port must be a number between 0 and 65535
+ # {0} is an exception message
+ PREFERENCES_EVALUATION_THREAD_NUMBER_UNPARSEABLE=Number of rule evaluation threads: {0}
+ PREFERENCES_PROPERTIES_ARRAY_STRING_SIZE_TEXT=Maximum display length of arrays in Properties view
+diff --git a/releng/platform-definitions/platform-definition-2021-06/platform-definition-2021-06.target b/releng/platform-definitions/platform-definition-2021-06/platform-definition-2021-06.target
+index 70d29746..e2315328 100644
+--- a/releng/platform-definitions/platform-definition-2021-06/platform-definition-2021-06.target
++++ b/releng/platform-definitions/platform-definition-2021-06/platform-definition-2021-06.target
+@@ -45,10 +45,6 @@
+
+
+
+-
+-
+-
+-
+
+
+
+diff --git a/releng/platform-definitions/platform-definition-2021-12/platform-definition-2021-12.target b/releng/platform-definitions/platform-definition-2021-12/platform-definition-2021-12.target
+index ebfc34eb..48bd6cbe 100644
+--- a/releng/platform-definitions/platform-definition-2021-12/platform-definition-2021-12.target
++++ b/releng/platform-definitions/platform-definition-2021-12/platform-definition-2021-12.target
+@@ -45,10 +45,6 @@
+
+
+
+-
+-
+-
+-
+
+
+
diff --git a/SOURCES/symlink_libs.sh b/SOURCES/symlink_libs.sh
old mode 100644
new mode 100755
diff --git a/SPECS/jmc.spec b/SPECS/jmc.spec
index 5c07f33..709661f 100644
--- a/SPECS/jmc.spec
+++ b/SPECS/jmc.spec
@@ -4,7 +4,7 @@
%global patchlevel 0
# Revision
-%global revnum 18
+%global revnum 19
# set to 1 for snapshots, 0 for release
%global usesnapshot 1
@@ -81,6 +81,8 @@ Patch1: 1-remove-non-linux-environments.patch
Patch2: 2-skip-writer-tests.patch
# Bump the lz4 version up to 1.10.2, as well as the p2 plugin version to resolve an osgi issue
Patch3: 3-bump-lz4-version.patch
+# Remove the websocket plugin.
+Patch4: 4-remove-websocket.patch
# Dependencies are bundled into a tar.gz and passed as a local maven repository for the build
ExclusiveArch: x86_64
@@ -365,26 +367,12 @@ Provides: bundled(osgi(org.eclipse.help.ui.nl_zh)) = 4.21.0
Provides: bundled(osgi(org.eclipse.help.webapp.nl_ja)) = 4.21.0
Provides: bundled(osgi(org.eclipse.help.webapp.nl_zh)) = 4.21.0
Provides: bundled(osgi(org.eclipse.jetty.http)) = 10.0.6
-Provides: bundled(osgi(org.eclipse.jetty.http)) = 10.0.7
Provides: bundled(osgi(org.eclipse.jetty.io)) = 10.0.6
-Provides: bundled(osgi(org.eclipse.jetty.io)) = 10.0.7
Provides: bundled(osgi(org.eclipse.jetty.security)) = 10.0.6
-Provides: bundled(osgi(org.eclipse.jetty.security)) = 10.0.7
Provides: bundled(osgi(org.eclipse.jetty.server)) = 10.0.6
-Provides: bundled(osgi(org.eclipse.jetty.server)) = 10.0.7
Provides: bundled(osgi(org.eclipse.jetty.servlet)) = 10.0.6
-Provides: bundled(osgi(org.eclipse.jetty.servlet)) = 10.0.7
Provides: bundled(osgi(org.eclipse.jetty.util)) = 10.0.6
-Provides: bundled(osgi(org.eclipse.jetty.util)) = 10.0.7
Provides: bundled(osgi(org.eclipse.jetty.util.ajax)) = 10.0.6
-Provides: bundled(osgi(org.eclipse.jetty.webapp)) = 10.0.7
-Provides: bundled(osgi(org.eclipse.jetty.websocket.api)) = 10.0.7
-Provides: bundled(osgi(org.eclipse.jetty.websocket.common)) = 10.0.7
-Provides: bundled(osgi(org.eclipse.jetty.websocket.core.common)) = 10.0.7
-Provides: bundled(osgi(org.eclipse.jetty.websocket.core.server)) = 10.0.7
-Provides: bundled(osgi(org.eclipse.jetty.websocket.server)) = 10.0.7
-Provides: bundled(osgi(org.eclipse.jetty.websocket.servlet)) = 10.0.7
-Provides: bundled(osgi(org.eclipse.jetty.xml)) = 10.0.7
Provides: bundled(osgi(org.eclipse.jface)) = 3.23.0
Provides: bundled(osgi(org.eclipse.jface.databinding)) = 1.13.0
Provides: bundled(osgi(org.eclipse.jface.databinding.nl_ja)) = 4.21.0
@@ -550,6 +538,7 @@ applications running locally or deployed in production environments.
%patch1 -p1
%patch2 -p1
%patch3 -p1
+%patch4 -p1
# explicitly use maven-clean-plugin at v2.5
cat > settings-offline.xml < - 8.2.0-5
+- Remove the websocket plugin. Related: RHEL-168615
+
* Wed Jan 7 2026 Joshua Matsuoka - 8.2.0-4
- Bump LZ4 Version to 1.10.2. Related: RHEL-135478