From 12beb8a1efdbe3fcf8c50eee4588a4a091e82f16 Mon Sep 17 00:00:00 2001 From: Patrick Ziegler Date: Tue, 1 Apr 2025 21:48:48 +0200 Subject: [PATCH] Remove listeners in MinimalState if bundle is stopped This change adapts the listeners that have been added with 24e9bb548b0de8c8ea79ee70d28096e28202da31 so that they are removed again, once the bundle is shut down and thus makes the classloader eligible for garbage collection. --- .../pde/internal/core/MinimalState.java | 78 +++++++++++-------- .../eclipse/pde/internal/core/PDECore.java | 4 +- 2 files changed, 49 insertions(+), 33 deletions(-) diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/MinimalState.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/MinimalState.java index 6a0c0c00ed8..9eb10a4bcf2 100644 --- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/MinimalState.java +++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/MinimalState.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2024 IBM Corporation and others. + * Copyright (c) 2005, 2025 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -37,6 +37,7 @@ import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; @@ -65,6 +66,38 @@ public class MinimalState { + private static final IPreferenceChangeListener PREF_CHANGE_LISTENER = e -> { + if (e.getKey().equals("org.eclipse.jdt.launching.PREF_DEFAULT_ENVIRONMENTS_XML")) { //$NON-NLS-1$ + Object oldValue = e.getOldValue() == null ? "" : e.getOldValue(); //$NON-NLS-1$ + Object newValue = e.getNewValue() == null ? "" : e.getNewValue(); //$NON-NLS-1$ + if (!oldValue.equals(newValue)) { + triggerSystemPackagesReload(); + } + } + }; + + private static final IVMInstallChangedListener VM_CHANGED_LISTENER = new IVMInstallChangedListener() { + @Override + public void vmRemoved(IVMInstall vm) { + triggerSystemPackagesReload(); + } + + @Override + public void vmChanged(PropertyChangeEvent event) { + triggerSystemPackagesReload(); + } + + @Override + public void vmAdded(IVMInstall vm) { + triggerSystemPackagesReload(); + } + + @Override + public void defaultVMInstallChanged(IVMInstall previous, IVMInstall current) { + triggerSystemPackagesReload(); + } + }; + protected State fState; protected long fId; @@ -268,39 +301,20 @@ protected boolean initializePlatformProperties() { static { // Listen to changes in the available VMInstalls and // ExecutionEnvironment defaults - @SuppressWarnings("restriction") - String nodeQualifier = org.eclipse.jdt.internal.launching.LaunchingPlugin.ID_PLUGIN; - IEclipsePreferences launchingNode = InstanceScope.INSTANCE.getNode(nodeQualifier); - launchingNode.addPreferenceChangeListener(e -> { - if (e.getKey().equals("org.eclipse.jdt.launching.PREF_DEFAULT_ENVIRONMENTS_XML")) { //$NON-NLS-1$ - Object oldValue = e.getOldValue() == null ? "" : e.getOldValue(); //$NON-NLS-1$ - Object newValue = e.getNewValue() == null ? "" : e.getNewValue(); //$NON-NLS-1$ - if (!oldValue.equals(newValue)) { - triggerSystemPackagesReload(); - } - } - }); - JavaRuntime.addVMInstallChangedListener(new IVMInstallChangedListener() { - @Override - public void vmRemoved(IVMInstall vm) { - triggerSystemPackagesReload(); - } - - @Override - public void vmChanged(PropertyChangeEvent event) { - triggerSystemPackagesReload(); - } + IEclipsePreferences launchingNode = getJdtLaunchingPreferences(); + launchingNode.addPreferenceChangeListener(PREF_CHANGE_LISTENER); + JavaRuntime.addVMInstallChangedListener(VM_CHANGED_LISTENER); + } - @Override - public void vmAdded(IVMInstall vm) { - triggerSystemPackagesReload(); - } + static void shutdown() { + IEclipsePreferences launchingNode = getJdtLaunchingPreferences(); + launchingNode.removePreferenceChangeListener(PREF_CHANGE_LISTENER); + JavaRuntime.removeVMInstallChangedListener(VM_CHANGED_LISTENER); + } - @Override - public void defaultVMInstallChanged(IVMInstall previous, IVMInstall current) { - triggerSystemPackagesReload(); - } - }); + @SuppressWarnings("restriction") + private static IEclipsePreferences getJdtLaunchingPreferences() { + return InstanceScope.INSTANCE.getNode(org.eclipse.jdt.internal.launching.LaunchingPlugin.ID_PLUGIN); } public static void triggerSystemPackagesReload() { diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PDECore.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PDECore.java index 9fe9dc2dc21..ae3ddeeebbd 100644 --- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PDECore.java +++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PDECore.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2018 IBM Corporation and others. + * Copyright (c) 2000, 2025 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -424,6 +424,8 @@ public void stop(BundleContext context) throws CoreException { IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.removeSaveParticipant(PLUGIN_ID); workspace.removeResourceChangeListener(bndResourceChangeListener); + + MinimalState.shutdown(); } /**