From 2174610f468bbee285137d6ee153b3df80a45806 Mon Sep 17 00:00:00 2001 From: Simeon Andreev Date: Tue, 26 May 2026 19:02:38 +0300 Subject: [PATCH] Avoid errors when running headless This change adjusts several classes to handle headless state, i.e. when the workbench is not available. The respective operations now do nothing without a workbench, instead of throwing exceptions. Fixes: https://github.com/eclipse-platform/eclipse.platform/issues/2673 --- .../debug/internal/ui/DebugUIPlugin.java | 19 +++++++------- .../ui/DebugUIPreferenceInitializer.java | 8 +++--- .../LaunchingResourceManager.java | 2 +- .../breakpoints/BreakpointSetOrganizer.java | 25 +++++++++++++++---- .../WorkingSetBreakpointOrganizer.java | 17 ++++++++++--- 5 files changed, 47 insertions(+), 24 deletions(-) diff --git a/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java b/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java index 9fb18b4ce20..a3e6b37c84f 100644 --- a/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java +++ b/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java @@ -601,18 +601,17 @@ public void doneSaving(ISaveContext saveContext) { } }; PlatformUI.getWorkbench().getThemeManager().addPropertyChangeListener(fThemeListener); + // do the asynchronous exec last - see bug 209920 + getStandardDisplay().asyncExec( + () -> { + // initialize the selected resource ` + SelectedResourceManager.getDefault(); + // forces launch shortcuts to be initialized so their + // key-bindings work + getLaunchConfigurationManager().getLaunchShortcuts(); + }); } - // do the asynchronous exec last - see bug 209920 - getStandardDisplay().asyncExec( - () -> { - // initialize the selected resource ` - SelectedResourceManager.getDefault(); - // forces launch shortcuts to be initialized so their - // key-bindings work - getLaunchConfigurationManager().getLaunchShortcuts(); - }); - DebugUIPluginSaveParticipant saveParticipant = new DebugUIPluginSaveParticipant(); ResourcesPlugin.getWorkspace().addSaveParticipant(getUniqueIdentifier(), saveParticipant); } diff --git a/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPreferenceInitializer.java b/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPreferenceInitializer.java index 3ff13f5e296..c59d59dcafa 100644 --- a/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPreferenceInitializer.java +++ b/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPreferenceInitializer.java @@ -227,12 +227,12 @@ private static void setDefault(IPreferenceStore store, String key, RGB newValue, } public static void setThemeBasedPreferences(final IPreferenceStore store, final boolean fireEvent) { + if (!PlatformUI.isWorkbenchRunning()) { + return; + } Display display= PlatformUI.getWorkbench().getDisplay(); Runnable runnable = () -> { - ColorRegistry registry = null; - if (PlatformUI.isWorkbenchRunning()) { - registry = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getColorRegistry(); - } + ColorRegistry registry = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getColorRegistry(); setDefault(store, IDebugPreferenceConstants.CONSOLE_BAKGROUND_COLOR, findRGB(registry, IInternalDebugUIConstants.THEME_CONSOLE_COLOR_BACKGROUND, new RGB(255, 255, 255)), fireEvent); setDefault(store, IDebugPreferenceConstants.CONSOLE_SYS_OUT_COLOR, findRGB(registry, IInternalDebugUIConstants.THEME_CONSOLE_COLOR_STD_OUT, new RGB(0, 0, 0)), fireEvent); setDefault(store, IDebugPreferenceConstants.CONSOLE_SYS_IN_COLOR, findRGB(registry, IInternalDebugUIConstants.THEME_CONSOLE_COLOR_STD_IN, new RGB(0, 200, 125)), fireEvent); diff --git a/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/LaunchingResourceManager.java b/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/LaunchingResourceManager.java index 9c239151a53..3e4e9f54e17 100644 --- a/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/LaunchingResourceManager.java +++ b/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/LaunchingResourceManager.java @@ -554,7 +554,7 @@ private void addAllToList(List list, ILaunchConfiguration[ * Starts up the manager */ public void startup() { - IWorkbench workbench = PlatformUI.getWorkbench(); + IWorkbench workbench = PlatformUI.isWorkbenchRunning() ? PlatformUI.getWorkbench() : null; if(workbench != null) { workbench.addWindowListener(this); // initialize for already open windows diff --git a/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointSetOrganizer.java b/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointSetOrganizer.java index 57169aaa918..31a841c594a 100644 --- a/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointSetOrganizer.java +++ b/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointSetOrganizer.java @@ -54,7 +54,9 @@ */ public class BreakpointSetOrganizer extends AbstractBreakpointOrganizerDelegate implements IBreakpointOrganizerDelegateExtension, IPropertyChangeListener, IBreakpointsListener { - private IWorkingSetManager fWorkingSetManager = PlatformUI.getWorkbench().getWorkingSetManager(); + private IWorkingSetManager fWorkingSetManager = PlatformUI.isWorkbenchRunning() + ? PlatformUI.getWorkbench().getWorkingSetManager() + : null; /** * A cache for mapping markers to the working set they belong to @@ -71,7 +73,9 @@ public class BreakpointSetOrganizer extends AbstractBreakpointOrganizerDelegate * working sets and fires property change notification. */ public BreakpointSetOrganizer() { - fWorkingSetManager.addPropertyChangeListener(this); + if (fWorkingSetManager != null) { + fWorkingSetManager.addPropertyChangeListener(this); + } fCache = new BreakpointWorkingSetCache(); DebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this); DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this); @@ -80,6 +84,9 @@ public BreakpointSetOrganizer() { @Override public IAdaptable[] getCategories(IBreakpoint breakpoint) { + if (fWorkingSetManager == null) { + return new IAdaptable[0]; + } List result = new ArrayList<>(); IWorkingSet[] workingSets = fWorkingSetManager.getWorkingSets(); for (IWorkingSet set : workingSets) { @@ -98,8 +105,10 @@ public IAdaptable[] getCategories(IBreakpoint breakpoint) { @Override public void dispose() { - fWorkingSetManager.removePropertyChangeListener(this); - fWorkingSetManager = null; + if (fWorkingSetManager != null) { + fWorkingSetManager.removePropertyChangeListener(this); + fWorkingSetManager = null; + } DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(this); DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this); super.dispose(); @@ -220,6 +229,9 @@ private void addBreakpointsToSet(IBreakpoint[] breakpoints, IWorkingSet set) { @Override public void breakpointsRemoved(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) { + if (fWorkingSetManager == null) { + return; + } IWorkingSet[] workingSets = fWorkingSetManager.getWorkingSets(); IWorkingSet set = null; for (IWorkingSet workingSet : workingSets) { @@ -273,7 +285,7 @@ public void breakpointsChanged(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) public static IWorkingSet getDefaultWorkingSet() { IPreferenceStore preferenceStore = DebugUIPlugin.getDefault().getPreferenceStore(); String name = preferenceStore.getString(IInternalDebugUIConstants.MEMENTO_BREAKPOINT_WORKING_SET_NAME); - if (name != null) { + if (name != null && PlatformUI.isWorkbenchRunning()) { return PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSet(name); } return null; @@ -366,6 +378,9 @@ public void removeBreakpoint(IBreakpoint breakpoint, IAdaptable category) { @Override public IAdaptable[] getCategories() { + if (fWorkingSetManager == null) { + return new IAdaptable[0]; + } IWorkingSet[] workingSets = fWorkingSetManager.getWorkingSets(); List all = new ArrayList<>(); for (IWorkingSet set : workingSets) { diff --git a/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetBreakpointOrganizer.java b/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetBreakpointOrganizer.java index c095aa0ee97..6e546b2cb88 100644 --- a/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetBreakpointOrganizer.java +++ b/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetBreakpointOrganizer.java @@ -34,14 +34,18 @@ */ public class WorkingSetBreakpointOrganizer extends AbstractBreakpointOrganizerDelegate implements IPropertyChangeListener { - IWorkingSetManager fWorkingSetManager = PlatformUI.getWorkbench().getWorkingSetManager(); + IWorkingSetManager fWorkingSetManager = PlatformUI.isWorkbenchRunning() + ? PlatformUI.getWorkbench().getWorkingSetManager() + : null; /** * Constructs a working set breakpoint organizer. Listens for changes in * working sets and fires property change notification. */ public WorkingSetBreakpointOrganizer() { - fWorkingSetManager.addPropertyChangeListener(this); + if (fWorkingSetManager != null) { + fWorkingSetManager.addPropertyChangeListener(this); + } } @Override @@ -56,6 +60,9 @@ public IAdaptable[] getCategories(IBreakpoint breakpoint) { parents.add(res); } } + if (fWorkingSetManager == null) { + return result.toArray(new IAdaptable[result.size()]); + } for (IWorkingSet workingSet : fWorkingSetManager.getWorkingSets()) { if (!IDebugUIConstants.BREAKPOINT_WORKINGSET_ID.equals(workingSet.getId())) { for (IAdaptable element : workingSet.getElements()) { @@ -74,8 +81,10 @@ public IAdaptable[] getCategories(IBreakpoint breakpoint) { @Override public void dispose() { - fWorkingSetManager.removePropertyChangeListener(this); - fWorkingSetManager = null; + if (fWorkingSetManager != null) { + fWorkingSetManager.removePropertyChangeListener(this); + fWorkingSetManager = null; + } super.dispose(); }