diff options
author | Marc Khouzam | 2015-03-20 01:10:04 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2015-04-17 15:24:08 +0000 |
commit | d071e969b73264b7b54242a1c38ee7786453c087 (patch) | |
tree | f161daa0e9bca9059a00f80620bae2dcf06a8edd /dsf-gdb | |
parent | 0fec0f9cd303f022387510323f11ca7c8c6a311a (diff) | |
download | org.eclipse.cdt-d071e969b73264b7b54242a1c38ee7786453c087.tar.gz org.eclipse.cdt-d071e969b73264b7b54242a1c38ee7786453c087.tar.xz org.eclipse.cdt-d071e969b73264b7b54242a1c38ee7786453c087.zip |
Bug 462623: Split GdbAdapterFactory to allow overriding
Change-Id: Icb9b8d03c070afa8bdea5218d5d4a1aad5d86ebb
Signed-off-by: Marc Khouzam <marc.khouzam@ericsson.com>
Diffstat (limited to 'dsf-gdb')
13 files changed, 636 insertions, 737 deletions
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/META-INF/MANIFEST.MF b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/META-INF/MANIFEST.MF index eac0507a9c9..25166f596ad 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/META-INF/MANIFEST.MF +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/META-INF/MANIFEST.MF @@ -29,7 +29,7 @@ Require-Bundle: org.eclipse.ui, Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Export-Package: org.eclipse.cdt.dsf.gdb.internal.ui;x-internal:=true, - org.eclipse.cdt.dsf.gdb.internal.ui.actions;x-internal:=true, + org.eclipse.cdt.dsf.gdb.internal.ui.actions;x-friends:="org.eclipse.cdt.examples.dsf.gdb", org.eclipse.cdt.dsf.gdb.internal.ui.breakpoints;x-internal:=true, org.eclipse.cdt.dsf.gdb.internal.ui.commands;x-internal:=true, org.eclipse.cdt.dsf.gdb.internal.ui.console;x-internal:=true, diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml index 4472d898748..6a0e766504f 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml @@ -159,6 +159,10 @@ <adapter type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory"/> <adapter type="org.eclipse.debug.ui.contexts.ISuspendTrigger"/> <adapter type="org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory"/> + <adapter type="org.eclipse.debug.core.commands.ITerminateHandler"/> + <adapter type="org.eclipse.cdt.debug.core.model.IConnectHandler"/> + <adapter type="org.eclipse.debug.core.commands.IDisconnectHandler"/> + <adapter type="org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler"/> </factory> </extension> diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbAdapterFactory.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbAdapterFactory.java index 03bb6e2823b..5911b0753ed 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbAdapterFactory.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbAdapterFactory.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2013 Wind River Systems and others. + * Copyright (c) 2006, 2015 Wind River Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -10,6 +10,7 @@ * Navid Mehregani (TI) - Bug 289526 - Migrate the Restart feature to the new one, as supported by the platform * Patrick Chuong (Texas Instruments) - Add support for icon overlay in the debug view (Bug 334566) * Alvaro Sanchez-Leon (Ericsson AB) - Support for Step into selection (bug 244865) + * Marc Khouzam (Ericsson) - Extracted GdbSessionAdapters to allow overriding *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.internal.ui; @@ -18,79 +19,21 @@ import java.util.HashMap; import java.util.Map; import java.util.WeakHashMap; -import org.eclipse.cdt.debug.core.model.ICBreakpoint; import org.eclipse.cdt.debug.core.model.IConnectHandler; import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler; -import org.eclipse.cdt.debug.core.model.IResumeWithoutSignalHandler; -import org.eclipse.cdt.debug.core.model.IReverseResumeHandler; -import org.eclipse.cdt.debug.core.model.IReverseStepIntoHandler; -import org.eclipse.cdt.debug.core.model.IReverseStepOverHandler; -import org.eclipse.cdt.debug.core.model.IReverseToggleHandler; -import org.eclipse.cdt.debug.core.model.ISaveTraceDataHandler; -import org.eclipse.cdt.debug.core.model.IStartTracingHandler; -import org.eclipse.cdt.debug.core.model.IStepIntoSelectionHandler; -import org.eclipse.cdt.debug.core.model.ISteppingModeTarget; -import org.eclipse.cdt.debug.core.model.IStopTracingHandler; -import org.eclipse.cdt.debug.core.model.IUncallHandler; -import org.eclipse.cdt.debug.ui.IPinProvider; -import org.eclipse.cdt.dsf.concurrent.Immutable; import org.eclipse.cdt.dsf.concurrent.ThreadSafe; -import org.eclipse.cdt.dsf.debug.ui.actions.DsfResumeCommand; -import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepIntoCommand; -import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepIntoSelectionCommand; -import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepOverCommand; -import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepReturnCommand; -import org.eclipse.cdt.dsf.debug.ui.actions.DsfSuspendCommand; -import org.eclipse.cdt.dsf.debug.ui.sourcelookup.DsfSourceDisplayAdapter; -import org.eclipse.cdt.dsf.debug.ui.viewmodel.SteppingController; -import org.eclipse.cdt.dsf.debug.ui.viewmodel.actions.DefaultRefreshAllTarget; -import org.eclipse.cdt.dsf.debug.ui.viewmodel.actions.IRefreshAllTarget; -import org.eclipse.cdt.dsf.debug.ui.viewmodel.launch.DefaultDsfModelSelectionPolicyFactory; -import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectNextTraceRecordHandler; -import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectPrevTraceRecordHandler; -import org.eclipse.cdt.dsf.gdb.internal.ui.actions.DsfTerminateCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbDisconnectCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbRestartCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbSteppingModeTarget; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbConnectCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbDebugNewExecutableCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbResumeWithoutSignalCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseResumeCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepIntoCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepOverCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseToggleCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSaveTraceDataCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSelectNextTraceRecordCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSelectPrevTraceRecordCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbStartTracingCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbStopTracingCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbUncallCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.viewmodel.GdbViewModelAdapter; import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch; -import org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate; import org.eclipse.cdt.dsf.service.DsfSession; -import org.eclipse.cdt.ui.text.c.hover.ICEditorTextHover; import org.eclipse.core.runtime.IAdapterFactory; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchesListener2; import org.eclipse.debug.core.commands.IDisconnectHandler; -import org.eclipse.debug.core.commands.IRestartHandler; -import org.eclipse.debug.core.commands.IResumeHandler; -import org.eclipse.debug.core.commands.IStepIntoHandler; -import org.eclipse.debug.core.commands.IStepOverHandler; -import org.eclipse.debug.core.commands.IStepReturnHandler; -import org.eclipse.debug.core.commands.ISuspendHandler; import org.eclipse.debug.core.commands.ITerminateHandler; -import org.eclipse.debug.core.model.IDebugModelProvider; -import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector; import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputProvider; import org.eclipse.debug.ui.contexts.ISuspendTrigger; -import org.eclipse.debug.ui.sourcelookup.ISourceDisplay; /** * This implementation of platform adapter factory only retrieves the adapters @@ -102,216 +45,12 @@ import org.eclipse.debug.ui.sourcelookup.ISourceDisplay; public class GdbAdapterFactory implements IAdapterFactory, ILaunchesListener2 { - @Immutable - class SessionAdapterSet { - final GdbLaunch fLaunch; - final GdbViewModelAdapter fViewModelAdapter; - final DsfSourceDisplayAdapter fSourceDisplayAdapter; - final DsfStepIntoCommand fStepIntoCommand; - final DsfStepIntoSelectionCommand fStepIntoSelectionCommand; - final GdbReverseStepIntoCommand fReverseStepIntoCommand; - final DsfStepOverCommand fStepOverCommand; - final GdbReverseStepOverCommand fReverseStepOverCommand; - final DsfStepReturnCommand fStepReturnCommand; - final GdbUncallCommand fUncallCommand; - final DsfSuspendCommand fSuspendCommand; - final DsfResumeCommand fResumeCommand; - final GdbReverseResumeCommand fReverseResumeCommand; - final GdbResumeWithoutSignalCommand fResumeWithoutSignalCommand; - final GdbRestartCommand fRestartCommand; - final DsfTerminateCommand fTerminateCommand; - final GdbDebugNewExecutableCommand fDebugNewExecutableCommand; - final GdbConnectCommand fConnectCommand; - final GdbDisconnectCommand fDisconnectCommand; - final IDebugModelProvider fDebugModelProvider; - final GdbSuspendTrigger fSuspendTrigger; - final GdbSteppingModeTarget fSteppingModeTarget; - final IModelSelectionPolicyFactory fModelSelectionPolicyFactory; - final SteppingController fSteppingController; - final DefaultRefreshAllTarget fRefreshAllTarget; - final GdbReverseToggleCommand fReverseToggleTarget; - final GdbStartTracingCommand fStartTracingTarget; - final GdbStopTracingCommand fStopTracingTarget; - final GdbSaveTraceDataCommand fSaveTraceDataTarget; - final GdbSelectNextTraceRecordCommand fSelectNextRecordTarget; - final GdbSelectPrevTraceRecordCommand fSelectPrevRecordTarget; - final GdbDebugTextHover fDebugTextHover; - final GdbPinProvider fPinProvider; - - SessionAdapterSet(GdbLaunch launch) { - fLaunch = launch; - DsfSession session = launch.getSession(); - - // register stepping controller - fSteppingController = new SteppingController(session); - session.registerModelAdapter(SteppingController.class, fSteppingController); - - fViewModelAdapter = new GdbViewModelAdapter(session, fSteppingController); - session.registerModelAdapter(IViewerInputProvider.class, fViewModelAdapter); - - if (launch.getSourceLocator() instanceof ISourceLookupDirector) { - fSourceDisplayAdapter = new DsfSourceDisplayAdapter(session, (ISourceLookupDirector)launch.getSourceLocator(), fSteppingController); - } else { - fSourceDisplayAdapter = null; - } - session.registerModelAdapter(ISourceDisplay.class, fSourceDisplayAdapter); - - fSteppingModeTarget = new GdbSteppingModeTarget(session); - fStepIntoCommand = new DsfStepIntoCommand(session, fSteppingModeTarget); - fStepIntoSelectionCommand = new DsfStepIntoSelectionCommand(session); - fReverseStepIntoCommand = new GdbReverseStepIntoCommand(session, fSteppingModeTarget); - fStepOverCommand = new DsfStepOverCommand(session, fSteppingModeTarget); - fReverseStepOverCommand = new GdbReverseStepOverCommand(session, fSteppingModeTarget); - fStepReturnCommand = new DsfStepReturnCommand(session); - fUncallCommand = new GdbUncallCommand(session, fSteppingModeTarget); - fSuspendCommand = new DsfSuspendCommand(session); - fResumeCommand = new DsfResumeCommand(session); - fReverseResumeCommand = new GdbReverseResumeCommand(session); - fResumeWithoutSignalCommand = new GdbResumeWithoutSignalCommand(session); - fRestartCommand = new GdbRestartCommand(session, fLaunch); - fTerminateCommand = new DsfTerminateCommand(session); - fDebugNewExecutableCommand = new GdbDebugNewExecutableCommand(session, fLaunch); - fConnectCommand = new GdbConnectCommand(session, fLaunch); - fDisconnectCommand = new GdbDisconnectCommand(session); - fSuspendTrigger = new GdbSuspendTrigger(session, fLaunch); - fModelSelectionPolicyFactory = new DefaultDsfModelSelectionPolicyFactory(); - fRefreshAllTarget = new DefaultRefreshAllTarget(); - fReverseToggleTarget = new GdbReverseToggleCommand(session); - fStartTracingTarget = new GdbStartTracingCommand(session); - fStopTracingTarget = new GdbStopTracingCommand(session); - fSaveTraceDataTarget = new GdbSaveTraceDataCommand(session); - fSelectNextRecordTarget = new GdbSelectNextTraceRecordCommand(session); - fSelectPrevRecordTarget = new GdbSelectPrevTraceRecordCommand(session); - fPinProvider = new GdbPinProvider(session); - - session.registerModelAdapter(ISteppingModeTarget.class, fSteppingModeTarget); - session.registerModelAdapter(IStepIntoHandler.class, fStepIntoCommand); - session.registerModelAdapter(IStepIntoSelectionHandler.class, fStepIntoSelectionCommand); - session.registerModelAdapter(IReverseStepIntoHandler.class, fReverseStepIntoCommand); - session.registerModelAdapter(IStepOverHandler.class, fStepOverCommand); - session.registerModelAdapter(IReverseStepOverHandler.class, fReverseStepOverCommand); - session.registerModelAdapter(IStepReturnHandler.class, fStepReturnCommand); - session.registerModelAdapter(IUncallHandler.class, fUncallCommand); - session.registerModelAdapter(ISuspendHandler.class, fSuspendCommand); - session.registerModelAdapter(IResumeHandler.class, fResumeCommand); - session.registerModelAdapter(IReverseResumeHandler.class, fReverseResumeCommand); - session.registerModelAdapter(IResumeWithoutSignalHandler.class, fResumeWithoutSignalCommand); - session.registerModelAdapter(IRestartHandler.class, fRestartCommand); - session.registerModelAdapter(ITerminateHandler.class, fTerminateCommand); - session.registerModelAdapter(IConnectHandler.class, fConnectCommand); - session.registerModelAdapter(IDebugNewExecutableHandler.class, fDebugNewExecutableCommand); - session.registerModelAdapter(IDisconnectHandler.class, fDisconnectCommand); - session.registerModelAdapter(IModelSelectionPolicyFactory.class, fModelSelectionPolicyFactory); - session.registerModelAdapter(IRefreshAllTarget.class, fRefreshAllTarget); - session.registerModelAdapter(IReverseToggleHandler.class, fReverseToggleTarget); - session.registerModelAdapter(IStartTracingHandler.class, fStartTracingTarget); - session.registerModelAdapter(IStopTracingHandler.class, fStopTracingTarget); - session.registerModelAdapter(ISaveTraceDataHandler.class, fSaveTraceDataTarget); - session.registerModelAdapter(ISelectNextTraceRecordHandler.class, fSelectNextRecordTarget); - session.registerModelAdapter(ISelectPrevTraceRecordHandler.class, fSelectPrevRecordTarget); - session.registerModelAdapter(IPinProvider.class, fPinProvider); - - fDebugModelProvider = new IDebugModelProvider() { - // @see org.eclipse.debug.core.model.IDebugModelProvider#getModelIdentifiers() - @Override - public String[] getModelIdentifiers() { - return new String[] { GdbLaunchDelegate.GDB_DEBUG_MODEL_ID, ICBreakpoint.C_BREAKPOINTS_DEBUG_MODEL_ID, "org.eclipse.cdt.gdb" }; //$NON-NLS-1$ - } - }; - session.registerModelAdapter(IDebugModelProvider.class, fDebugModelProvider); - - /* - * Registering the launch as an adapter, ensures that this launch, - * and debug model ID will be associated with all DMContexts from this - * session. - */ - session.registerModelAdapter(ILaunch.class, fLaunch); - - /* - * Register debug hover adapter (bug 309001). - */ - fDebugTextHover = new GdbDebugTextHover(); - session.registerModelAdapter(ICEditorTextHover.class, fDebugTextHover); - } - - void dispose() { - DsfSession session = fLaunch.getSession(); - - fViewModelAdapter.dispose(); - session.unregisterModelAdapter(IViewerInputProvider.class); - - session.unregisterModelAdapter(ISourceDisplay.class); - if (fSourceDisplayAdapter != null) fSourceDisplayAdapter.dispose(); - - session.unregisterModelAdapter(SteppingController.class); - fSteppingController.dispose(); - - session.unregisterModelAdapter(ISteppingModeTarget.class); - session.unregisterModelAdapter(IStepIntoHandler.class); - session.unregisterModelAdapter(IStepIntoSelectionHandler.class); - session.unregisterModelAdapter(IReverseStepIntoHandler.class); - session.unregisterModelAdapter(IStepOverHandler.class); - session.unregisterModelAdapter(IReverseStepOverHandler.class); - session.unregisterModelAdapter(IStepReturnHandler.class); - session.unregisterModelAdapter(IUncallHandler.class); - session.unregisterModelAdapter(ISuspendHandler.class); - session.unregisterModelAdapter(IResumeHandler.class); - session.unregisterModelAdapter(IReverseResumeHandler.class); - session.unregisterModelAdapter(IResumeWithoutSignalHandler.class); - session.unregisterModelAdapter(IRestartHandler.class); - session.unregisterModelAdapter(ITerminateHandler.class); - session.unregisterModelAdapter(IConnectHandler.class); - session.unregisterModelAdapter(IDebugNewExecutableHandler.class); - session.unregisterModelAdapter(IDisconnectHandler.class); - session.unregisterModelAdapter(IModelSelectionPolicyFactory.class); - session.unregisterModelAdapter(IRefreshAllTarget.class); - session.unregisterModelAdapter(IReverseToggleHandler.class); - session.unregisterModelAdapter(IStartTracingHandler.class); - session.unregisterModelAdapter(IStopTracingHandler.class); - session.unregisterModelAdapter(ISaveTraceDataHandler.class); - session.unregisterModelAdapter(ISelectNextTraceRecordHandler.class); - session.unregisterModelAdapter(ISelectPrevTraceRecordHandler.class); - session.unregisterModelAdapter(IPinProvider.class); - - session.unregisterModelAdapter(IDebugModelProvider.class); - session.unregisterModelAdapter(ILaunch.class); - - session.unregisterModelAdapter(ICEditorTextHover.class); - - fSteppingModeTarget.dispose(); - fStepIntoCommand.dispose(); - fStepIntoSelectionCommand.dispose(); - fReverseStepIntoCommand.dispose(); - fStepOverCommand.dispose(); - fReverseStepOverCommand.dispose(); - fStepReturnCommand.dispose(); - fUncallCommand.dispose(); - fSuspendCommand.dispose(); - fResumeCommand.dispose(); - fReverseResumeCommand.dispose(); - fResumeWithoutSignalCommand.dispose(); - fRestartCommand.dispose(); - fTerminateCommand.dispose(); - fConnectCommand.dispose(); - fDebugNewExecutableCommand.dispose(); - fDisconnectCommand.dispose(); - fSuspendTrigger.dispose(); - fReverseToggleTarget.dispose(); - fStartTracingTarget.dispose(); - fStopTracingTarget.dispose(); - fSaveTraceDataTarget.dispose(); - fSelectNextRecordTarget.dispose(); - fSelectPrevRecordTarget.dispose(); - fPinProvider.dispose(); - } - } - /** * Active adapter sets. They are accessed using the launch instance * which owns the debug services session. */ - private static Map<GdbLaunch, SessionAdapterSet> fgLaunchAdapterSets = - Collections.synchronizedMap(new HashMap<GdbLaunch, SessionAdapterSet>()); + private static Map<GdbLaunch, GdbSessionAdapters> fgLaunchAdapterSets = + Collections.synchronizedMap(new HashMap<GdbLaunch, GdbSessionAdapters>()); /** * Map of launches for which adapter sets have already been disposed. @@ -325,17 +64,16 @@ public class GdbAdapterFactory * instance. * </p> */ - private static Map<ILaunch, SessionAdapterSet> fgDisposedLaunchAdapterSets = - new WeakHashMap<ILaunch, SessionAdapterSet>(); - - static void disposeAdapterSet(ILaunch launch) { - synchronized(fgLaunchAdapterSets) { - if ( fgLaunchAdapterSets.containsKey(launch) ) { - fgLaunchAdapterSets.remove(launch).dispose(); - fgDisposedLaunchAdapterSets.put(launch, null); - } - } + private static Map<ILaunch, GdbSessionAdapters> fgDisposedLaunchAdapterSets = new WeakHashMap<>(); + + static void disposeAdapterSet(ILaunch launch) { + synchronized(fgLaunchAdapterSets) { + if ( fgLaunchAdapterSets.containsKey(launch) ) { + fgLaunchAdapterSets.remove(launch).dispose(); + fgDisposedLaunchAdapterSets.put(launch, null); + } } + } public GdbAdapterFactory() { DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this); @@ -344,9 +82,8 @@ public class GdbAdapterFactory /** * This method only actually returns adapters for the launch object. */ - @SuppressWarnings("rawtypes") @Override - public Object getAdapter(Object adaptableObject, Class adapterType) { + public <T> T getAdapter(Object adaptableObject, Class<T> adapterType) { if (!(adaptableObject instanceof GdbLaunch)) return null; GdbLaunch launch = (GdbLaunch)adaptableObject; @@ -362,7 +99,7 @@ public class GdbAdapterFactory // it means that we have a new launch and new session, and we have to create a // new set of adapters. - SessionAdapterSet adapterSet; + GdbSessionAdapters adapterSet; synchronized(fgLaunchAdapterSets) { // The adapter set for the given launch was already disposed. // Return a null adapter. @@ -382,26 +119,27 @@ public class GdbAdapterFactory if (session.isActive() == false) { return null; } - adapterSet = new SessionAdapterSet(launch); + adapterSet = createGdbSessionAdapters(launch, session); fgLaunchAdapterSets.put(launch, adapterSet); } } // Returns the adapter type for the launch object. - if (adapterType.equals(IElementContentProvider.class)) return adapterSet.fViewModelAdapter; - else if (adapterType.equals(IModelProxyFactory.class)) return adapterSet.fViewModelAdapter; - else if (adapterType.equals(IColumnPresentationFactory.class)) return adapterSet.fViewModelAdapter; - else if (adapterType.equals(ISuspendTrigger.class)) return adapterSet.fSuspendTrigger; - else return null; + return adapterSet.getLaunchAdapter(adapterType); } - @SuppressWarnings("rawtypes") @Override - public Class[] getAdapterList() { - return new Class[] { - IElementContentProvider.class, IModelProxyFactory.class, ISuspendTrigger.class, + public Class<?>[] getAdapterList() { + return new Class<?>[] { + IElementContentProvider.class, + IModelProxyFactory.class, + ISuspendTrigger.class, IColumnPresentationFactory.class, - }; + ITerminateHandler.class, + IConnectHandler.class, + IDisconnectHandler.class, + IDebugNewExecutableHandler.class, + }; } @Override @@ -427,4 +165,7 @@ public class GdbAdapterFactory public void launchesChanged(ILaunch[] launches) { } + protected GdbSessionAdapters createGdbSessionAdapters(ILaunch launch, DsfSession session) { + return new GdbSessionAdapters(launch, session, getAdapterList()); + } } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbSessionAdapters.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbSessionAdapters.java new file mode 100644 index 00000000000..f60b0aa4963 --- /dev/null +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbSessionAdapters.java @@ -0,0 +1,431 @@ +/******************************************************************************* + * Copyright (c) 2015 Ericsson and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Marc Khouzam (Ericsson) - initial API and implementation + * Mikhail Khodjaiants (Mentor Graphics) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.dsf.gdb.internal.ui; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.cdt.debug.core.model.ICBreakpoint; +import org.eclipse.cdt.debug.core.model.IConnectHandler; +import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler; +import org.eclipse.cdt.debug.core.model.IResumeWithoutSignalHandler; +import org.eclipse.cdt.debug.core.model.IReverseResumeHandler; +import org.eclipse.cdt.debug.core.model.IReverseStepIntoHandler; +import org.eclipse.cdt.debug.core.model.IReverseStepOverHandler; +import org.eclipse.cdt.debug.core.model.IReverseToggleHandler; +import org.eclipse.cdt.debug.core.model.ISaveTraceDataHandler; +import org.eclipse.cdt.debug.core.model.IStartTracingHandler; +import org.eclipse.cdt.debug.core.model.IStepIntoSelectionHandler; +import org.eclipse.cdt.debug.core.model.ISteppingModeTarget; +import org.eclipse.cdt.debug.core.model.IStopTracingHandler; +import org.eclipse.cdt.debug.core.model.IUncallHandler; +import org.eclipse.cdt.debug.ui.IPinProvider; +import org.eclipse.cdt.dsf.concurrent.Immutable; +import org.eclipse.cdt.dsf.debug.ui.actions.DsfResumeCommand; +import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepIntoCommand; +import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepIntoSelectionCommand; +import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepOverCommand; +import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepReturnCommand; +import org.eclipse.cdt.dsf.debug.ui.actions.DsfSteppingModeTarget; +import org.eclipse.cdt.dsf.debug.ui.actions.DsfSuspendCommand; +import org.eclipse.cdt.dsf.debug.ui.sourcelookup.DsfSourceDisplayAdapter; +import org.eclipse.cdt.dsf.debug.ui.viewmodel.SteppingController; +import org.eclipse.cdt.dsf.debug.ui.viewmodel.actions.DefaultRefreshAllTarget; +import org.eclipse.cdt.dsf.debug.ui.viewmodel.actions.IRefreshAllTarget; +import org.eclipse.cdt.dsf.debug.ui.viewmodel.launch.DefaultDsfModelSelectionPolicyFactory; +import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin; +import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectNextTraceRecordHandler; +import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectPrevTraceRecordHandler; +import org.eclipse.cdt.dsf.gdb.internal.ui.actions.DsfTerminateCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbDisconnectCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbRestartCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbSteppingModeTarget; +import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbConnectCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbDebugNewExecutableCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbResumeWithoutSignalCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseResumeCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepIntoCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepOverCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseToggleCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSaveTraceDataCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSelectNextTraceRecordCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSelectPrevTraceRecordCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbStartTracingCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbStopTracingCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbUncallCommand; +import org.eclipse.cdt.dsf.gdb.internal.ui.viewmodel.GdbViewModelAdapter; +import org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate; +import org.eclipse.cdt.dsf.service.DsfSession; +import org.eclipse.cdt.dsf.ui.viewmodel.IVMAdapter; +import org.eclipse.cdt.ui.text.c.hover.ICEditorTextHover; +import org.eclipse.debug.core.ILaunch; +import org.eclipse.debug.core.commands.IDisconnectHandler; +import org.eclipse.debug.core.commands.IRestartHandler; +import org.eclipse.debug.core.commands.IResumeHandler; +import org.eclipse.debug.core.commands.IStepIntoHandler; +import org.eclipse.debug.core.commands.IStepOverHandler; +import org.eclipse.debug.core.commands.IStepReturnHandler; +import org.eclipse.debug.core.commands.ISuspendHandler; +import org.eclipse.debug.core.commands.ITerminateHandler; +import org.eclipse.debug.core.model.IDebugModelProvider; +import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputProvider; +import org.eclipse.debug.ui.contexts.ISuspendTrigger; +import org.eclipse.debug.ui.sourcelookup.ISourceDisplay; + +/** + * This class creates and holds the different adapters registered with the DSF session + * as well as the adapters for the launch. + */ +@Immutable +public class GdbSessionAdapters { + private final ILaunch fLaunch; + private final DsfSession fSession; + + private final Map<Class<?>, Object> fLaunchAdapters = new HashMap<>(); + private final Class<?>[] fLaunchAdapterTypes; + + public GdbSessionAdapters(ILaunch launch, DsfSession session, Class<?>[] launchAdapterTypes) { + fLaunch = launch; + fSession = session; + fLaunchAdapterTypes = launchAdapterTypes; + createAdapters(); + } + + /** + * Creates all model and launch adapters. + */ + protected void createAdapters() { + for (Class<?> adapterType : getModelAdapters()) { + Object adapter = createModelAdapter(adapterType, getLaunch(), getSession()); + if (adapter != null) { + getSession().registerModelAdapter(adapterType, adapter); + } + } + for (Class<?> adapterType : fLaunchAdapterTypes) { + Object adapter = createLaunchAdapter(adapterType, getLaunch(), getSession()); + if (adapter != null) { + fLaunchAdapters.put(adapterType, adapter); + } + } + } + + /** + * Returns the adapter object registered with the session for the given adapter type + * or null if no adapter is registered. + */ + @SuppressWarnings("unchecked") + public <T> T getModelAdapter(Class<T> adapterType) { + return (T)fSession.getModelAdapter(adapterType); + } + + /** + * Returns the adapter object registered with {@link ILaunch} for the given adapter type + * or null if no adapter is registered. + */ + @SuppressWarnings("unchecked") + public <T> T getLaunchAdapter(Class<T> adapterType) { + if (adapterType.equals(ITerminateHandler.class) || + adapterType.equals(IConnectHandler.class) || + adapterType.equals(IDisconnectHandler.class) || + adapterType.equals(IDebugNewExecutableHandler.class)) { + // These launch adapters re-use the session adapters. + // Return them directly instead of including them + // in fLaunchAdapters to avoid trying to dispose of them + // twice when dispose() is called. + return (T)fSession.getModelAdapter(adapterType); + } + + return (T)fLaunchAdapters.get(adapterType); + } + + public void dispose() { + for (Class<?> adapterType : getModelAdapters()) { + Object adapter = getSession().getModelAdapter(adapterType); + if (adapter != null) { + getSession().unregisterModelAdapter(adapterType); + disposeAdapter(adapter); + } + } + for (Class<?> adapterType : fLaunchAdapterTypes) { + Object adapter = fLaunchAdapters.remove(adapterType); + if (adapter != null) { + disposeAdapter(adapter); + } + } + } + + /** + * Returns all adapter types registered with the session. + * Clients can override this method to add a new adapter type and + * then override {@link GdbSessionAdapters.createModelAdapter()} + * to provide the adapter object. + */ + protected List<Class<?>> getModelAdapters() { + // Return a list to which elements can be added + return new ArrayList<>(Arrays.asList( + SteppingController.class, + IViewerInputProvider.class, + ISteppingModeTarget.class, + ISourceDisplay.class, + IStepIntoHandler.class, + IStepIntoSelectionHandler.class, + IReverseStepIntoHandler.class, + IStepOverHandler.class, + IReverseStepOverHandler.class, + IStepReturnHandler.class, + IUncallHandler.class, + ISuspendHandler.class, + IResumeHandler.class, + IReverseResumeHandler.class, + IResumeWithoutSignalHandler.class, + IRestartHandler.class, + ITerminateHandler.class, + IDebugNewExecutableHandler.class, + IConnectHandler.class, + IDisconnectHandler.class, + IModelSelectionPolicyFactory.class, + IRefreshAllTarget.class, + IReverseToggleHandler.class, + IStartTracingHandler.class, + IStopTracingHandler.class, + ISaveTraceDataHandler.class, + ISelectNextTraceRecordHandler.class, + ISelectPrevTraceRecordHandler.class, + IPinProvider.class, + IDebugModelProvider.class, + ILaunch.class, + ICEditorTextHover.class)); + } + + /** + * Creates the adapter object for the given adapter type to register it with {@link ILaunch}. + * Clients can override this method to provide their own adapters. + */ + @SuppressWarnings("unchecked") + protected <T> T createLaunchAdapter(Class<T> adapterType, ILaunch launch, DsfSession session) { + if (adapterType.equals(IElementContentProvider.class) || + adapterType.equals(IModelProxyFactory.class) || + adapterType.equals(IColumnPresentationFactory.class)) { + return (T)getViewModelAdapter(); + } + + if (adapterType.equals(ISuspendTrigger.class)) { + return (T)new GdbSuspendTrigger(session, launch); + } + + return null; + } + + /** + * Creates the adapter object for the given adapter type to register it with the model. + * Clients can override this method to provide their own adapters. + */ + @SuppressWarnings("unchecked") + protected <T> T createModelAdapter(Class<T> adapterType, ILaunch launch, DsfSession session) { + if (SteppingController.class.equals(adapterType)) { + return (T)new SteppingController(session); + } + if (IViewerInputProvider.class.equals(adapterType)) { + return (T)new GdbViewModelAdapter(session, getSteppingController()); + } + if (ISteppingModeTarget.class.equals(adapterType)) { + return (T)new GdbSteppingModeTarget(session); + } + if (ISourceDisplay.class.equals(adapterType)) { + return launch.getSourceLocator() instanceof ISourceLookupDirector ? + (T)new DsfSourceDisplayAdapter( + session, + (ISourceLookupDirector)launch.getSourceLocator(), + getSteppingController() + ) : null; + } + if (IStepIntoHandler.class.equals(adapterType)) { + return (T)new DsfStepIntoCommand(session, getSteppingModeTarget()); + } + if (IStepIntoSelectionHandler.class.equals(adapterType)) { + return (T)new DsfStepIntoSelectionCommand(session); + } + if (IReverseStepIntoHandler.class.equals(adapterType)) { + return (T)new GdbReverseStepIntoCommand(session, getSteppingModeTarget()); + } + if (IStepOverHandler.class.equals(adapterType)) { + return (T)new DsfStepOverCommand(session, getSteppingModeTarget()); + } + if (IReverseStepOverHandler.class.equals(adapterType)) { + return (T)new GdbReverseStepOverCommand(session, getSteppingModeTarget()); + } + if (IStepReturnHandler.class.equals(adapterType)) { + return (T)new DsfStepReturnCommand(session); + } + if (IUncallHandler.class.equals(adapterType)) { + return (T)new GdbUncallCommand(session, getSteppingModeTarget()); + } + if (ISuspendHandler.class.equals(adapterType)) { + return (T)new DsfSuspendCommand(session); + } + if (IResumeHandler.class.equals(adapterType)) { + return (T)new DsfResumeCommand(session); + } + if (IReverseResumeHandler.class.equals(adapterType)) { + return (T)new GdbReverseResumeCommand(session); + } + if (IResumeWithoutSignalHandler.class.equals(adapterType)) { + return (T)new GdbResumeWithoutSignalCommand(session); + } + if (IRestartHandler.class.equals(adapterType)) { + return (T)new GdbRestartCommand(session, getLaunch()); + } + if (ITerminateHandler.class.equals(adapterType)) { + return (T)new DsfTerminateCommand(session); + } + if (IDebugNewExecutableHandler.class.equals(adapterType)) { + return (T)new GdbDebugNewExecutableCommand(session, launch); + } + if (IConnectHandler.class.equals(adapterType)) { + return (T)new GdbConnectCommand(session, launch); + } + if (IDisconnectHandler.class.equals(adapterType)) { + return (T)new GdbDisconnectCommand(session); + } + if (IModelSelectionPolicyFactory.class.equals(adapterType)) { + return (T)new DefaultDsfModelSelectionPolicyFactory(); + } + if (IRefreshAllTarget.class.equals(adapterType)) { + return (T)new DefaultRefreshAllTarget(); + } + if (IReverseToggleHandler.class.equals(adapterType)) { + return (T)new GdbReverseToggleCommand(session); + } + if (IStartTracingHandler.class.equals(adapterType)) { + return (T)new GdbStartTracingCommand(session); + } + if (IStopTracingHandler.class.equals(adapterType)) { + return (T)new GdbStopTracingCommand(session); + } + if (ISaveTraceDataHandler.class.equals(adapterType)) { + return (T)new GdbSaveTraceDataCommand(session); + } + if (ISelectNextTraceRecordHandler.class.equals(adapterType)) { + return (T)new GdbSelectNextTraceRecordCommand(session); + } + if (ISelectPrevTraceRecordHandler.class.equals(adapterType)) { + return (T)new GdbSelectPrevTraceRecordCommand(session); + } + if (IPinProvider.class.equals(adapterType)) { + return (T)new GdbPinProvider(session); + } + if (IDebugModelProvider.class.equals(adapterType)) { + return (T)new IDebugModelProvider() { + // @see org.eclipse.debug.core.model.IDebugModelProvider#getModelIdentifiers() + @Override + public String[] getModelIdentifiers() { + return new String[] { + GdbLaunchDelegate.GDB_DEBUG_MODEL_ID, + ICBreakpoint.C_BREAKPOINTS_DEBUG_MODEL_ID, + "org.eclipse.cdt.gdb" //$NON-NLS-1$ + }; + } + }; + } + + /* + * Registering the launch as an adapter, ensures that this launch, + * and debug model ID will be associated with all DMContexts from this + * session. + */ + if (ILaunch.class.equals(adapterType)) { + return (T)launch; + } + + /* + * Register debug hover adapter (bug 309001). + */ + if (ICEditorTextHover.class.equals(adapterType)) { + return (T)new GdbDebugTextHover(); + } + return null; + } + + /** + * Returns the method that will be called to dispose the given object. + * + * @param adapter the object to dispose + * @return "dispose()" method or null if the given object doesn't have "dispose()" method + * + * Clients can override this method to provide dispose methods different than "dispose()" + * for specific adapters. + */ + protected Method getDisposeMethod(Object adapter) { + if (adapter != null) { + try { + return adapter.getClass().getMethod("dispose"); //$NON-NLS-1$ + } + catch(NoSuchMethodException | SecurityException e) { + // ignore + } + } + return null; + } + + protected DsfSession getSession() { + return fSession; + } + + protected ILaunch getLaunch() { + return fLaunch; + } + + private void disposeAdapter(Object adapter) { + try { + Method dispose = getDisposeMethod(adapter); + if (dispose != null) { + dispose.invoke(adapter); + } + } + catch(SecurityException | IllegalAccessException | IllegalArgumentException e) { + // ignore + } + catch(InvocationTargetException e) { + GdbPlugin.log(e.getTargetException()); + } + } + + protected DsfSteppingModeTarget getSteppingModeTarget() { + ISteppingModeTarget target = (ISteppingModeTarget)fSession.getModelAdapter(ISteppingModeTarget.class); + if (target instanceof DsfSteppingModeTarget) { + return (DsfSteppingModeTarget)target; + } + return null; + } + + protected SteppingController getSteppingController() { + return (SteppingController)fSession.getModelAdapter(SteppingController.class); + } + + protected IVMAdapter getViewModelAdapter() { + IViewerInputProvider provider = (IViewerInputProvider)fSession.getModelAdapter(IViewerInputProvider.class); + if (provider instanceof IVMAdapter) { + return (IVMAdapter)provider; + } + return null; + } +} diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRestartCommand.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRestartCommand.java index 176ec5ca105..c4e866cf853 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRestartCommand.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRestartCommand.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2011 Wind River Systems and others. + * Copyright (c) 2006, 2015 Wind River Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -20,12 +20,12 @@ import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext; import org.eclipse.cdt.dsf.debug.ui.actions.DsfCommandRunnable; import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin; -import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch; import org.eclipse.cdt.dsf.gdb.service.IGDBProcesses; import org.eclipse.cdt.dsf.service.DsfServicesTracker; import org.eclipse.cdt.dsf.service.DsfSession; import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext; import org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.commands.IDebugCommandRequest; import org.eclipse.debug.core.commands.IEnabledStateRequest; import org.eclipse.debug.core.commands.IRestartHandler; @@ -33,9 +33,9 @@ import org.eclipse.debug.core.commands.IRestartHandler; public class GdbRestartCommand implements IRestartHandler { private final DsfExecutor fExecutor; private final DsfServicesTracker fTracker; - private final GdbLaunch fLaunch; + private final ILaunch fLaunch; - public GdbRestartCommand(DsfSession session, GdbLaunch launch) { + public GdbRestartCommand(DsfSession session, ILaunch launch) { fExecutor = session.getExecutor(); fLaunch = launch; fTracker = new DsfServicesTracker(GdbUIPlugin.getBundleContext(), session.getId()); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbConnectCommand.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbConnectCommand.java index 53f52f945ee..ac2e2b94558 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbConnectCommand.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbConnectCommand.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2011 Ericsson and others. + * Copyright (c) 2008, 2015 Ericsson and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -60,6 +60,7 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; +import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.IRequest; import org.eclipse.debug.core.commands.IDebugCommandRequest; import org.eclipse.debug.core.commands.IEnabledStateRequest; @@ -71,7 +72,7 @@ import org.eclipse.ui.progress.UIJob; public class GdbConnectCommand extends RefreshableDebugCommand implements IConnectHandler, IConnect { - private final GdbLaunch fLaunch; + private final ILaunch fLaunch; private final DsfExecutor fExecutor; private final DsfServicesTracker fTracker; @@ -85,7 +86,7 @@ public class GdbConnectCommand extends RefreshableDebugCommand implements IConne // the binary location for a local attach session. private Map<String, String> fProcessNameToBinaryMap = new HashMap<String, String>(); - public GdbConnectCommand(DsfSession session, GdbLaunch launch) { + public GdbConnectCommand(DsfSession session, ILaunch launch) { fLaunch = launch; fExecutor = session.getExecutor(); fTracker = new DsfServicesTracker(GdbUIPlugin.getBundleContext(), session.getId()); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbDebugNewExecutableCommand.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbDebugNewExecutableCommand.java index f58000a5e8b..73aa6e8164c 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbDebugNewExecutableCommand.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbDebugNewExecutableCommand.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012 Mentor Graphics and others. + * Copyright (c) 2012, 2015 Mentor Graphics and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -41,6 +41,7 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; +import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.IRequest; import org.eclipse.debug.core.commands.IEnabledStateRequest; @@ -81,11 +82,11 @@ public class GdbDebugNewExecutableCommand extends RefreshableDebugCommand implem } } - private final GdbLaunch fLaunch; + private final ILaunch fLaunch; private final DsfExecutor fExecutor; private final DsfServicesTracker fTracker; - public GdbDebugNewExecutableCommand( DsfSession session, GdbLaunch launch ) { + public GdbDebugNewExecutableCommand( DsfSession session, ILaunch launch ) { super(); fLaunch = launch; fExecutor = session.getExecutor(); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunch.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunch.java index 540519f07e8..97aba2e4ac1 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunch.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunch.java @@ -19,8 +19,6 @@ import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.RejectedExecutionException; -import org.eclipse.cdt.debug.core.model.IConnectHandler; -import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler; import org.eclipse.cdt.debug.internal.core.CRequest; import org.eclipse.cdt.dsf.concurrent.ConfinedToDsfExecutor; import org.eclipse.cdt.dsf.concurrent.DefaultDsfExecutor; @@ -239,7 +237,7 @@ public class GdbLaunch extends DsfLaunch // Execute asynchronously to avoid potential deadlocks // https://bugs.eclipse.org/bugs/show_bug.cgi?id=434645 - ITerminateHandler handler = (ITerminateHandler) getAdapter(ITerminateHandler.class); + ITerminateHandler handler = getAdapter(ITerminateHandler.class); if (handler == null) { super.terminate(); return; @@ -266,7 +264,7 @@ public class GdbLaunch extends DsfLaunch @Override public void disconnect() throws DebugException { - IDisconnectHandler handler = (IDisconnectHandler)getAdapter(IDisconnectHandler.class); + IDisconnectHandler handler = getAdapter(IDisconnectHandler.class); if (handler == null) { super.disconnect(); return; @@ -363,25 +361,16 @@ public class GdbLaunch extends DsfLaunch }); } - @SuppressWarnings("rawtypes") - @Override - public Object getAdapter(Class adapter) { - // We replace the standard terminate handler by DsfTerminateHandler - // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=377447. - if (adapter.equals(ITerminateHandler.class)) - return getSession().getModelAdapter(adapter); - if (adapter.equals(IDisconnectHandler.class)) - return getSession().getModelAdapter(adapter); - - // Allow to call the connect handler when the launch is selected - if (adapter.equals(IConnectHandler.class)) - return getSession().getModelAdapter(adapter); - - if (adapter.equals(IDebugNewExecutableHandler.class)) - return getSession().getModelAdapter(adapter); - - // Must force adapters to be loaded. - Platform.getAdapterManager().loadAdapter(this, adapter.getName()); + @Override + public <T> T getAdapter(Class<T> adapter) { + if (adapter.equals(ITerminateHandler.class) == false) { + // Must force adapters to be loaded. + // Except in the case of terminate. Terminate can be used + // when running headless (no UI) and therefore we should not + // force the loading of UI plugins in this case. + // This can happen when running JUnit tests for example. + Platform.getAdapterManager().loadAdapter(this, adapter.getName()); + } return super.getAdapter(adapter); } diff --git a/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedAdapterFactory.java b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedAdapterFactory.java index d509ad0704b..7aa3322336e 100644 --- a/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedAdapterFactory.java +++ b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedAdapterFactory.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2014 Ericsson and others. + * Copyright (c) 2014, 2015 Ericsson and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -10,425 +10,17 @@ *******************************************************************************/ package org.eclipse.cdt.examples.dsf.gdb; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.WeakHashMap; - -import org.eclipse.cdt.debug.core.model.ICBreakpoint; -import org.eclipse.cdt.debug.core.model.IConnectHandler; -import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler; -import org.eclipse.cdt.debug.core.model.IResumeWithoutSignalHandler; -import org.eclipse.cdt.debug.core.model.IReverseResumeHandler; -import org.eclipse.cdt.debug.core.model.IReverseStepIntoHandler; -import org.eclipse.cdt.debug.core.model.IReverseStepOverHandler; -import org.eclipse.cdt.debug.core.model.IReverseToggleHandler; -import org.eclipse.cdt.debug.core.model.ISaveTraceDataHandler; -import org.eclipse.cdt.debug.core.model.IStartTracingHandler; -import org.eclipse.cdt.debug.core.model.IStepIntoSelectionHandler; -import org.eclipse.cdt.debug.core.model.ISteppingModeTarget; -import org.eclipse.cdt.debug.core.model.IStopTracingHandler; -import org.eclipse.cdt.debug.core.model.IUncallHandler; -import org.eclipse.cdt.debug.ui.IPinProvider; -import org.eclipse.cdt.dsf.concurrent.Immutable; import org.eclipse.cdt.dsf.concurrent.ThreadSafe; -import org.eclipse.cdt.dsf.debug.ui.actions.DsfResumeCommand; -import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepIntoCommand; -import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepIntoSelectionCommand; -import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepOverCommand; -import org.eclipse.cdt.dsf.debug.ui.actions.DsfStepReturnCommand; -import org.eclipse.cdt.dsf.debug.ui.actions.DsfSuspendCommand; -import org.eclipse.cdt.dsf.debug.ui.actions.IDsfStepIntoSelection; -import org.eclipse.cdt.dsf.debug.ui.sourcelookup.DsfSourceDisplayAdapter; -import org.eclipse.cdt.dsf.debug.ui.viewmodel.SteppingController; -import org.eclipse.cdt.dsf.debug.ui.viewmodel.actions.DefaultRefreshAllTarget; -import org.eclipse.cdt.dsf.debug.ui.viewmodel.actions.IRefreshAllTarget; -import org.eclipse.cdt.dsf.debug.ui.viewmodel.launch.DefaultDsfModelSelectionPolicyFactory; -import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectNextTraceRecordHandler; -import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectPrevTraceRecordHandler; -import org.eclipse.cdt.dsf.gdb.internal.ui.GdbDebugTextHover; -import org.eclipse.cdt.dsf.gdb.internal.ui.GdbPinProvider; -import org.eclipse.cdt.dsf.gdb.internal.ui.GdbSuspendTrigger; -import org.eclipse.cdt.dsf.gdb.internal.ui.actions.DsfTerminateCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbDisconnectCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbRestartCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbSteppingModeTarget; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbConnectCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbDebugNewExecutableCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbResumeWithoutSignalCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseResumeCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepIntoCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepOverCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseToggleCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSaveTraceDataCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSelectNextTraceRecordCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbSelectPrevTraceRecordCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbStartTracingCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbStopTracingCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbUncallCommand; -import org.eclipse.cdt.dsf.gdb.internal.ui.viewmodel.GdbViewModelAdapter; -import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch; -import org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate; +import org.eclipse.cdt.dsf.gdb.internal.ui.GdbAdapterFactory; +import org.eclipse.cdt.dsf.gdb.internal.ui.GdbSessionAdapters; import org.eclipse.cdt.dsf.service.DsfSession; -import org.eclipse.cdt.examples.dsf.gdb.viewmodel.GdbExtendedViewModelAdapter; -import org.eclipse.cdt.ui.text.c.hover.ICEditorTextHover; -import org.eclipse.core.runtime.IAdapterFactory; -import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; -import org.eclipse.debug.core.ILaunchesListener2; -import org.eclipse.debug.core.commands.IDisconnectHandler; -import org.eclipse.debug.core.commands.IRestartHandler; -import org.eclipse.debug.core.commands.IResumeHandler; -import org.eclipse.debug.core.commands.IStepIntoHandler; -import org.eclipse.debug.core.commands.IStepOverHandler; -import org.eclipse.debug.core.commands.IStepReturnHandler; -import org.eclipse.debug.core.commands.ISuspendHandler; -import org.eclipse.debug.core.commands.ITerminateHandler; -import org.eclipse.debug.core.model.IDebugModelProvider; -import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputProvider; -import org.eclipse.debug.ui.contexts.ISuspendTrigger; -import org.eclipse.debug.ui.sourcelookup.ISourceDisplay; -/** - * This implementation of platform adapter factory only retrieves the adapters - * for the launch object. But it also manages the creation and destruction - * of the session-based adapters which are returned by the - * IDMContext.getAdapter() methods. - */ @SuppressWarnings("restriction") @ThreadSafe -public class GdbExtendedAdapterFactory - implements IAdapterFactory, ILaunchesListener2 -{ - @Immutable - class SessionAdapterSet { - final GdbLaunch fLaunch; - final GdbViewModelAdapter fViewModelAdapter; - final DsfSourceDisplayAdapter fSourceDisplayAdapter; - final DsfStepIntoCommand fStepIntoCommand; - final DsfStepIntoSelectionCommand fStepIntoSelectionCommand; - final GdbReverseStepIntoCommand fReverseStepIntoCommand; - final DsfStepOverCommand fStepOverCommand; - final GdbReverseStepOverCommand fReverseStepOverCommand; - final DsfStepReturnCommand fStepReturnCommand; - final GdbUncallCommand fUncallCommand; - final DsfSuspendCommand fSuspendCommand; - final DsfResumeCommand fResumeCommand; - final GdbReverseResumeCommand fReverseResumeCommand; - final GdbResumeWithoutSignalCommand fResumeWithoutSignalCommand; - final GdbRestartCommand fRestartCommand; - final DsfTerminateCommand fTerminateCommand; - final GdbDebugNewExecutableCommand fDebugNewExecutableCommand; - final GdbConnectCommand fConnectCommand; - final GdbDisconnectCommand fDisconnectCommand; - final IDebugModelProvider fDebugModelProvider; - final GdbSuspendTrigger fSuspendTrigger; - final GdbSteppingModeTarget fSteppingModeTarget; - final IModelSelectionPolicyFactory fModelSelectionPolicyFactory; - final SteppingController fSteppingController; - final DefaultRefreshAllTarget fRefreshAllTarget; - final GdbReverseToggleCommand fReverseToggleTarget; - final GdbStartTracingCommand fStartTracingTarget; - final GdbStopTracingCommand fStopTracingTarget; - final GdbSaveTraceDataCommand fSaveTraceDataTarget; - final GdbSelectNextTraceRecordCommand fSelectNextRecordTarget; - final GdbSelectPrevTraceRecordCommand fSelectPrevRecordTarget; - final GdbDebugTextHover fDebugTextHover; - final GdbPinProvider fPinProvider; - - SessionAdapterSet(GdbLaunch launch) { - fLaunch = launch; - DsfSession session = launch.getSession(); - - // register stepping controller - fSteppingController = new SteppingController(session); - session.registerModelAdapter(SteppingController.class, fSteppingController); - - fViewModelAdapter = new GdbExtendedViewModelAdapter(session, fSteppingController); - session.registerModelAdapter(IViewerInputProvider.class, fViewModelAdapter); - - if (launch.getSourceLocator() instanceof ISourceLookupDirector) { - fSourceDisplayAdapter = new DsfSourceDisplayAdapter(session, (ISourceLookupDirector)launch.getSourceLocator(), fSteppingController); - } else { - fSourceDisplayAdapter = null; - } - session.registerModelAdapter(ISourceDisplay.class, fSourceDisplayAdapter); - - fSteppingModeTarget = new GdbSteppingModeTarget(session); - fStepIntoCommand = new DsfStepIntoCommand(session, fSteppingModeTarget); - fStepIntoSelectionCommand = new DsfStepIntoSelectionCommand(session); - fReverseStepIntoCommand = new GdbReverseStepIntoCommand(session, fSteppingModeTarget); - fStepOverCommand = new DsfStepOverCommand(session, fSteppingModeTarget); - fReverseStepOverCommand = new GdbReverseStepOverCommand(session, fSteppingModeTarget); - fStepReturnCommand = new DsfStepReturnCommand(session); - fUncallCommand = new GdbUncallCommand(session, fSteppingModeTarget); - fSuspendCommand = new DsfSuspendCommand(session); - fResumeCommand = new DsfResumeCommand(session); - fReverseResumeCommand = new GdbReverseResumeCommand(session); - fResumeWithoutSignalCommand = new GdbResumeWithoutSignalCommand(session); - fRestartCommand = new GdbRestartCommand(session, fLaunch); - fTerminateCommand = new DsfTerminateCommand(session); - fDebugNewExecutableCommand = new GdbDebugNewExecutableCommand(session, fLaunch); - fConnectCommand = new GdbConnectCommand(session, fLaunch); - fDisconnectCommand = new GdbDisconnectCommand(session); - fSuspendTrigger = new GdbSuspendTrigger(session, fLaunch); - fModelSelectionPolicyFactory = new DefaultDsfModelSelectionPolicyFactory(); - fRefreshAllTarget = new DefaultRefreshAllTarget(); - fReverseToggleTarget = new GdbReverseToggleCommand(session); - fStartTracingTarget = new GdbStartTracingCommand(session); - fStopTracingTarget = new GdbStopTracingCommand(session); - fSaveTraceDataTarget = new GdbSaveTraceDataCommand(session); - fSelectNextRecordTarget = new GdbSelectNextTraceRecordCommand(session); - fSelectPrevRecordTarget = new GdbSelectPrevTraceRecordCommand(session); - fPinProvider = new GdbPinProvider(session); - - session.registerModelAdapter(ISteppingModeTarget.class, fSteppingModeTarget); - session.registerModelAdapter(IStepIntoHandler.class, fStepIntoCommand); - session.registerModelAdapter(IStepIntoSelectionHandler.class, fStepIntoSelectionCommand); - session.registerModelAdapter(IReverseStepIntoHandler.class, fReverseStepIntoCommand); - session.registerModelAdapter(IStepOverHandler.class, fStepOverCommand); - session.registerModelAdapter(IReverseStepOverHandler.class, fReverseStepOverCommand); - session.registerModelAdapter(IStepReturnHandler.class, fStepReturnCommand); - session.registerModelAdapter(IUncallHandler.class, fUncallCommand); - session.registerModelAdapter(ISuspendHandler.class, fSuspendCommand); - session.registerModelAdapter(IResumeHandler.class, fResumeCommand); - session.registerModelAdapter(IReverseResumeHandler.class, fReverseResumeCommand); - session.registerModelAdapter(IResumeWithoutSignalHandler.class, fResumeWithoutSignalCommand); - session.registerModelAdapter(IRestartHandler.class, fRestartCommand); - session.registerModelAdapter(ITerminateHandler.class, fTerminateCommand); - session.registerModelAdapter(IConnectHandler.class, fConnectCommand); - session.registerModelAdapter(IDebugNewExecutableHandler.class, fDebugNewExecutableCommand); - session.registerModelAdapter(IDisconnectHandler.class, fDisconnectCommand); - session.registerModelAdapter(IModelSelectionPolicyFactory.class, fModelSelectionPolicyFactory); - session.registerModelAdapter(IRefreshAllTarget.class, fRefreshAllTarget); - session.registerModelAdapter(IReverseToggleHandler.class, fReverseToggleTarget); - session.registerModelAdapter(IStartTracingHandler.class, fStartTracingTarget); - session.registerModelAdapter(IStopTracingHandler.class, fStopTracingTarget); - session.registerModelAdapter(ISaveTraceDataHandler.class, fSaveTraceDataTarget); - session.registerModelAdapter(ISelectNextTraceRecordHandler.class, fSelectNextRecordTarget); - session.registerModelAdapter(ISelectPrevTraceRecordHandler.class, fSelectPrevRecordTarget); - session.registerModelAdapter(IPinProvider.class, fPinProvider); - session.registerModelAdapter(IDsfStepIntoSelection.class, fStepIntoSelectionCommand); - - fDebugModelProvider = new IDebugModelProvider() { - // @see org.eclipse.debug.core.model.IDebugModelProvider#getModelIdentifiers() - @Override - public String[] getModelIdentifiers() { - return new String[] { GdbLaunchDelegate.GDB_DEBUG_MODEL_ID, ICBreakpoint.C_BREAKPOINTS_DEBUG_MODEL_ID, "org.eclipse.cdt.gdb" }; //$NON-NLS-1$ - } - }; - session.registerModelAdapter(IDebugModelProvider.class, fDebugModelProvider); - - /* - * Registering the launch as an adapter, ensures that this launch, - * and debug model ID will be associated with all DMContexts from this - * session. - */ - session.registerModelAdapter(ILaunch.class, fLaunch); - - /* - * Register debug hover adapter (bug 309001). - */ - fDebugTextHover = new GdbDebugTextHover(); - session.registerModelAdapter(ICEditorTextHover.class, fDebugTextHover); - } - - void dispose() { - DsfSession session = fLaunch.getSession(); - - fViewModelAdapter.dispose(); - session.unregisterModelAdapter(IViewerInputProvider.class); - - session.unregisterModelAdapter(ISourceDisplay.class); - if (fSourceDisplayAdapter != null) fSourceDisplayAdapter.dispose(); - - session.unregisterModelAdapter(SteppingController.class); - fSteppingController.dispose(); - - session.unregisterModelAdapter(ISteppingModeTarget.class); - session.unregisterModelAdapter(IStepIntoHandler.class); - session.unregisterModelAdapter(IStepIntoSelectionHandler.class); - session.unregisterModelAdapter(IReverseStepIntoHandler.class); - session.unregisterModelAdapter(IStepOverHandler.class); - session.unregisterModelAdapter(IReverseStepOverHandler.class); - session.unregisterModelAdapter(IStepReturnHandler.class); - session.unregisterModelAdapter(IUncallHandler.class); - session.unregisterModelAdapter(ISuspendHandler.class); - session.unregisterModelAdapter(IResumeHandler.class); - session.unregisterModelAdapter(IReverseResumeHandler.class); - session.unregisterModelAdapter(IResumeWithoutSignalHandler.class); - session.unregisterModelAdapter(IRestartHandler.class); - session.unregisterModelAdapter(ITerminateHandler.class); - session.unregisterModelAdapter(IConnectHandler.class); - session.unregisterModelAdapter(IDebugNewExecutableHandler.class); - session.unregisterModelAdapter(IDisconnectHandler.class); - session.unregisterModelAdapter(IModelSelectionPolicyFactory.class); - session.unregisterModelAdapter(IRefreshAllTarget.class); - session.unregisterModelAdapter(IReverseToggleHandler.class); - session.unregisterModelAdapter(IStartTracingHandler.class); - session.unregisterModelAdapter(IStopTracingHandler.class); - session.unregisterModelAdapter(ISaveTraceDataHandler.class); - session.unregisterModelAdapter(ISelectNextTraceRecordHandler.class); - session.unregisterModelAdapter(ISelectPrevTraceRecordHandler.class); - session.unregisterModelAdapter(IPinProvider.class); - - session.unregisterModelAdapter(IDebugModelProvider.class); - session.unregisterModelAdapter(ILaunch.class); - - session.unregisterModelAdapter(ICEditorTextHover.class); - - fSteppingModeTarget.dispose(); - fStepIntoCommand.dispose(); - fStepIntoSelectionCommand.dispose(); - fReverseStepIntoCommand.dispose(); - fStepOverCommand.dispose(); - fReverseStepOverCommand.dispose(); - fStepReturnCommand.dispose(); - fUncallCommand.dispose(); - fSuspendCommand.dispose(); - fResumeCommand.dispose(); - fReverseResumeCommand.dispose(); - fResumeWithoutSignalCommand.dispose(); - fRestartCommand.dispose(); - fTerminateCommand.dispose(); - fConnectCommand.dispose(); - fDebugNewExecutableCommand.dispose(); - fDisconnectCommand.dispose(); - fSuspendTrigger.dispose(); - fReverseToggleTarget.dispose(); - fStartTracingTarget.dispose(); - fStopTracingTarget.dispose(); - fSaveTraceDataTarget.dispose(); - fSelectNextRecordTarget.dispose(); - fSelectPrevRecordTarget.dispose(); - fPinProvider.dispose(); - } - } - - /** - * Active adapter sets. They are accessed using the launch instance - * which owns the debug services session. - */ - private static Map<GdbLaunch, SessionAdapterSet> fgLaunchAdapterSets = - Collections.synchronizedMap(new HashMap<GdbLaunch, SessionAdapterSet>()); - - /** - * Map of launches for which adapter sets have already been disposed. - * This map (used as a set) is maintained in order to avoid re-creating an - * adapter set after the launch was removed from the launch manager, but - * while the launch is still being held by other classes which may - * request its adapters. A weak map is used to avoid leaking - * memory once the launches are no longer referenced. - * <p> - * Access to this map is synchronized using the fgLaunchAdapterSets - * instance. - * </p> - */ - private static Map<ILaunch, SessionAdapterSet> fgDisposedLaunchAdapterSets = - new WeakHashMap<ILaunch, SessionAdapterSet>(); - - static void disposeAdapterSet(ILaunch launch) { - synchronized(fgLaunchAdapterSets) { - if ( fgLaunchAdapterSets.containsKey(launch) ) { - fgLaunchAdapterSets.remove(launch).dispose(); - fgDisposedLaunchAdapterSets.put(launch, null); - } - } - } - - public GdbExtendedAdapterFactory() { - DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this); - } - - /** - * This method only actually returns adapters for the launch object. - */ - @SuppressWarnings("rawtypes") - @Override - public Object getAdapter(Object adaptableObject, Class adapterType) { - if (!(adaptableObject instanceof GdbLaunch)) return null; - - GdbLaunch launch = (GdbLaunch)adaptableObject; - - // Check for valid session. - // Note: even if the session is no longer active, the adapter set - // should still be returned. This is because the view model may still - // need to show elements representing a terminated process/thread/etc. - DsfSession session = launch.getSession(); - if (session == null) return null; - - // Find the correct set of adapters based on the launch session-ID. If not found - // it means that we have a new launch and new session, and we have to create a - // new set of adapters. - - SessionAdapterSet adapterSet; - synchronized(fgLaunchAdapterSets) { - // The adapter set for the given launch was already disposed. - // Return a null adapter. - if (fgDisposedLaunchAdapterSets.containsKey(launch)) { - return null; - } - adapterSet = fgLaunchAdapterSets.get(launch); - if (adapterSet == null) { - // If the first time we attempt to create an adapterSet is once the session is - // already inactive, we should not create it and return null. - // This can happen, for example, when we run JUnit tests and we don't actually - // have a need for any adapters until the launch is actually being removed. - // Note that we must do this here because fgDisposedLaunchAdapterSets - // may not already know that the launch has been removed because of a race - // condition with the caller which is also processing a launchRemoved method. - // Bug 334687 - if (session.isActive() == false) { - return null; - } - adapterSet = new SessionAdapterSet(launch); - fgLaunchAdapterSets.put(launch, adapterSet); - } - } - - // Returns the adapter type for the launch object. - if (adapterType.equals(IElementContentProvider.class)) return adapterSet.fViewModelAdapter; - else if (adapterType.equals(IModelProxyFactory.class)) return adapterSet.fViewModelAdapter; - else if (adapterType.equals(IColumnPresentationFactory.class)) return adapterSet.fViewModelAdapter; - else if (adapterType.equals(ISuspendTrigger.class)) return adapterSet.fSuspendTrigger; - else return null; - } - - @SuppressWarnings("rawtypes") - @Override - public Class[] getAdapterList() { - return new Class[] { - IElementContentProvider.class, IModelProxyFactory.class, ISuspendTrigger.class, - IColumnPresentationFactory.class, - }; - } - - @Override - public void launchesRemoved(ILaunch[] launches) { - // Dispose the set of adapters for a launch only after the launch is - // removed. - for (ILaunch launch : launches) { - if (launch instanceof GdbLaunch) { - disposeAdapterSet(launch); - } - } - } - - @Override - public void launchesTerminated(ILaunch[] launches) { - } - - @Override - public void launchesAdded(ILaunch[] launches) { - } - +public class GdbExtendedAdapterFactory extends GdbAdapterFactory { @Override - public void launchesChanged(ILaunch[] launches) { + protected GdbSessionAdapters createGdbSessionAdapters(ILaunch launch, DsfSession session) { + return new GdbExtendedSessionAdapters(launch, session, getAdapterList()); } - } diff --git a/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedSessionAdapters.java b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedSessionAdapters.java new file mode 100644 index 00000000000..6b3a39e9a8a --- /dev/null +++ b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/GdbExtendedSessionAdapters.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2015 Ericsson and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Marc Khouzam (Ericsson) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.examples.dsf.gdb; + +import org.eclipse.cdt.dsf.gdb.internal.ui.GdbSessionAdapters; +import org.eclipse.cdt.dsf.service.DsfSession; +import org.eclipse.cdt.examples.dsf.gdb.actions.DsfExtendedTerminateCommand; +import org.eclipse.cdt.examples.dsf.gdb.viewmodel.GdbExtendedViewModelAdapter; +import org.eclipse.debug.core.ILaunch; +import org.eclipse.debug.core.commands.ITerminateHandler; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputProvider; + +@SuppressWarnings("restriction") +public class GdbExtendedSessionAdapters extends GdbSessionAdapters { + + public GdbExtendedSessionAdapters(ILaunch launch, DsfSession session, Class<?>[] launchAdapterTypes) { + super(launch, session, launchAdapterTypes); + } + + @SuppressWarnings("unchecked") + @Override + protected <T> T createModelAdapter(Class<T> adapterType, ILaunch launch, DsfSession session) { + if (ITerminateHandler.class.equals(adapterType)) { + return (T)new DsfExtendedTerminateCommand(session); + } + if (IViewerInputProvider.class.equals(adapterType)) { + return (T)new GdbExtendedViewModelAdapter(session, getSteppingController()); + } + + return super.createModelAdapter(adapterType, launch, session); + } +} diff --git a/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/ActionMessages.java b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/ActionMessages.java new file mode 100644 index 00000000000..4a609569763 --- /dev/null +++ b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/ActionMessages.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2015 Mentor Graphics and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Mentor Graphics - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.examples.dsf.gdb.actions; + +import org.eclipse.osgi.util.NLS; + +public class ActionMessages extends NLS { + static { + // initialize resource bundle + NLS.initializeMessages(ActionMessages.class.getName(), ActionMessages.class); + } + + private ActionMessages() { + } + + public static String DsfExtendedTerminateCommand_Confirm_Termination; + public static String DsfExtendedTerminateCommand_Terminate_the_session; +} diff --git a/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/ActionMessages.properties b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/ActionMessages.properties new file mode 100644 index 00000000000..f251f41b301 --- /dev/null +++ b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/ActionMessages.properties @@ -0,0 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Mentor Graphics and others. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +# +# Contributors: +# Mentor Graphics - Initial API and implementation +############################################################################### + +DsfExtendedTerminateCommand_Confirm_Termination=Confirm Termination +DsfExtendedTerminateCommand_Terminate_the_session=Terminate the session? diff --git a/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/DsfExtendedTerminateCommand.java b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/DsfExtendedTerminateCommand.java new file mode 100644 index 00000000000..2ca7feb21af --- /dev/null +++ b/dsf-gdb/org.eclipse.cdt.examples.dsf.gdb/src/org/eclipse/cdt/examples/dsf/gdb/actions/DsfExtendedTerminateCommand.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2015 Mentor Graphics and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Mentor Graphics - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.examples.dsf.gdb.actions; + +import org.eclipse.cdt.dsf.gdb.internal.ui.actions.DsfTerminateCommand; +import org.eclipse.cdt.dsf.service.DsfSession; +import org.eclipse.debug.core.commands.IDebugCommandRequest; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.PlatformUI; + +/** + * This class extends the existing "Terminate" command by adding a popup + * confirmation before terminating the session. + */ +public class DsfExtendedTerminateCommand extends DsfTerminateCommand { + + public DsfExtendedTerminateCommand(DsfSession session) { + super(session); + } + + @Override + public boolean execute(final IDebugCommandRequest request) { + final Display display = PlatformUI.isWorkbenchRunning() ? PlatformUI.getWorkbench().getDisplay() : null; + if (display != null) { + // Make sure we run on the UI thread. + // We may not already be on the UI thread, for example, when GdbLaunch.terminate() is called + // directly when closing a project. + display.syncExec(new Runnable() { + @Override + public void run() { + Shell shell = display.getActiveShell(); + if (shell != null) { + boolean confirmed = MessageDialog.openConfirm( + shell, + ActionMessages.DsfExtendedTerminateCommand_Confirm_Termination, + ActionMessages.DsfExtendedTerminateCommand_Terminate_the_session + ); + if (!confirmed) { + request.cancel(); + return; + } + } + DsfExtendedTerminateCommand.super.execute(request); + } + }); + } + return false; + } +} |