Bug 29770 - [Contributions] Contributed action delegate instantiated early
Summary: [Contributions] Contributed action delegate instantiated early
Status: RESOLVED INVALID
Alias: None
Product: Platform
Classification: Eclipse Project
Component: UI (show other bugs)
Version: 2.1   Edit
Hardware: PC Windows 2000
: P3 major (vote)
Target Milestone: ---   Edit
Assignee: Simon Arsenault CLA
QA Contact:
URL:
Whiteboard:
Keywords: performance
Depends on:
Blocks:
 
Reported: 2003-01-19 12:11 EST by Darin Wright CLA
Modified: 2003-01-20 15:23 EST (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Darin Wright CLA 2003-01-19 12:11:34 EST
The Java Debugger contributes toggle actions to view toolbars to show/hide 
qualified names of Java elements. It seems these actions are being instantiated 
immediately when the associated view is created, as the proxy/plugin action is 
registered as a selection changed listener. This, of course, causes the 
associated plug-in to be loaded early than required.

Looking at the code in PartPluginAction#registerSelectionListener(..) fires a 
selection change event to the listener being registered, which causes the 
delegate to be instantiated:

protected void registerSelectionListener(IWorkbenchPart aPart) {
	ISelectionProvider selectionProvider = aPart.getSite
().getSelectionProvider();
	if (selectionProvider != null) {
		selectionProvider.addSelectionChangedListener(this);
		selectionChanged(selectionProvider.getSelection());
	}
}

Here's an example stack trace where the delegate gets instantiated:

Thread [main] (Suspended (breakpoint at line 79 in 
org.eclipse.jdt.internal.debug.ui.actions.ToggleDelegateAction))
	org.eclipse.jdt.internal.debug.ui.actions.ShowQualifiedAction
(org.eclipse.jdt.internal.debug.ui.actions.ToggleDelegateAction).selectionChange
d(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection) line: 
79
	org.eclipse.ui.internal.ViewPluginAction
(org.eclipse.ui.internal.PluginAction).refreshEnablement() line: 204
	org.eclipse.ui.internal.ViewPluginAction
(org.eclipse.ui.internal.PluginAction).createDelegate() line: 106
	org.eclipse.ui.internal.ViewPluginAction
(org.eclipse.ui.internal.PluginAction).selectionChanged
(org.eclipse.jface.viewers.ISelection) line: 269
	org.eclipse.ui.internal.ViewPluginAction
(org.eclipse.ui.internal.PartPluginAction).registerSelectionListener
(org.eclipse.ui.IWorkbenchPart) line: 39
	org.eclipse.ui.internal.ViewPluginAction.<init>
(org.eclipse.core.runtime.IConfigurationElement, java.lang.String, 
org.eclipse.ui.IViewPart, java.lang.String, int) line: 35
	org.eclipse.ui.internal.ActionDescriptor.createAction(int, 
org.eclipse.core.runtime.IConfigurationElement, java.lang.Object, 
java.lang.String, java.lang.String) line: 182
	org.eclipse.ui.internal.ActionDescriptor.<init>
(org.eclipse.core.runtime.IConfigurationElement, int, java.lang.Object) line: 
120
	org.eclipse.ui.internal.ViewerActionBuilder.createActionDescriptor
(org.eclipse.core.runtime.IConfigurationElement) line: 30
	org.eclipse.ui.internal.ViewerActionBuilder
(org.eclipse.ui.internal.PluginActionBuilder).readElement
(org.eclipse.core.runtime.IConfigurationElement) line: 323
	org.eclipse.ui.internal.ViewerActionBuilder
(org.eclipse.ui.internal.registry.RegistryReader).readElements
(org.eclipse.core.runtime.IConfigurationElement[]) line: 127
	org.eclipse.ui.internal.ViewerActionBuilder
(org.eclipse.ui.internal.registry.RegistryReader).readElementChildren
(org.eclipse.core.runtime.IConfigurationElement) line: 117
	org.eclipse.ui.internal.ViewerActionBuilder
(org.eclipse.ui.internal.PluginActionBuilder).readElement
(org.eclipse.core.runtime.IConfigurationElement) line: 329
	org.eclipse.ui.internal.ViewerActionBuilder
(org.eclipse.ui.internal.registry.RegistryReader).readElements
(org.eclipse.core.runtime.IConfigurationElement[]) line: 127
	org.eclipse.ui.internal.ViewerActionBuilder
(org.eclipse.ui.internal.registry.RegistryReader).readExtension
(org.eclipse.core.runtime.IExtension) line: 136
	org.eclipse.ui.internal.ViewerActionBuilder
(org.eclipse.ui.internal.registry.RegistryReader).readRegistry
(org.eclipse.core.runtime.IPluginRegistry, java.lang.String, java.lang.String) 
line: 148
	org.eclipse.ui.internal.ViewerActionBuilder
(org.eclipse.ui.internal.PluginActionBuilder).readContributions
(java.lang.String, java.lang.String, java.lang.String) line: 296
	org.eclipse.ui.internal.ViewerActionBuilder.readViewerContributions
(java.lang.String, org.eclipse.jface.viewers.ISelectionProvider, 
org.eclipse.ui.IWorkbenchPart) line: 52
	org.eclipse.ui.internal.PopupMenuExtender.readStaticActions() line: 76
	org.eclipse.ui.internal.PopupMenuExtender.<init>(java.lang.String, 
org.eclipse.jface.action.MenuManager, 
org.eclipse.jface.viewers.ISelectionProvider, org.eclipse.ui.IWorkbenchPart) 
line: 39
	org.eclipse.ui.internal.ViewSite
(org.eclipse.ui.internal.PartSite).registerContextMenu(java.lang.String, 
org.eclipse.jface.action.MenuManager, 
org.eclipse.jface.viewers.ISelectionProvider) line: 151
	org.eclipse.ui.internal.ViewSite
(org.eclipse.ui.internal.PartSite).registerContextMenu
(org.eclipse.jface.action.MenuManager, 
org.eclipse.jface.viewers.ISelectionProvider) line: 157
	org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView
(org.eclipse.debug.ui.AbstractDebugView).createContextMenu
(org.eclipse.swt.widgets.Control) line: 434
	org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView
(org.eclipse.debug.ui.AbstractDebugView).createPartControl
(org.eclipse.swt.widgets.Composite) line: 281
	org.eclipse.ui.internal.PartPane$4.run() line: 135
	org.eclipse.core.internal.runtime.InternalPlatform.run
(org.eclipse.core.runtime.ISafeRunnable) line: 852
	org.eclipse.core.runtime.Platform.run
(org.eclipse.core.runtime.ISafeRunnable) line: 413
	org.eclipse.ui.internal.ViewPane
(org.eclipse.ui.internal.PartPane).createChildControl() line: 133
	org.eclipse.ui.internal.ViewPane.createChildControl() line: 202
	org.eclipse.ui.internal.ViewPane
(org.eclipse.ui.internal.PartPane).createControl
(org.eclipse.swt.widgets.Composite) line: 177
	org.eclipse.ui.internal.ViewPane.createControl
(org.eclipse.swt.widgets.Composite) line: 181
	org.eclipse.ui.internal.PartTabFolder.createPartTab
(org.eclipse.ui.internal.LayoutPart, java.lang.String, int) line: 251
	org.eclipse.ui.internal.PartTabFolder.createControl
(org.eclipse.swt.widgets.Composite) line: 223
	org.eclipse.ui.internal.RootLayoutContainer
(org.eclipse.ui.internal.PartSashContainer).createControl
(org.eclipse.swt.widgets.Composite) line: 191
	org.eclipse.ui.internal.PerspectivePresentation.activate
(org.eclipse.swt.widgets.Composite) line: 94
	org.eclipse.ui.internal.Perspective.onActivate() line: 665
	org.eclipse.ui.internal.WorkbenchPage.setPerspective
(org.eclipse.ui.internal.Perspective) line: 2344
	org.eclipse.ui.internal.WorkbenchPage.busySetPerspective
(org.eclipse.ui.IPerspectiveDescriptor) line: 550
	org.eclipse.ui.internal.WorkbenchPage.access$7
(org.eclipse.ui.internal.WorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor) 
line: 538
	org.eclipse.ui.internal.WorkbenchPage$10.run() line: 2464
	org.eclipse.swt.custom.BusyIndicator.showWhile
(org.eclipse.swt.widgets.Display, java.lang.Runnable) line: 65
	org.eclipse.ui.internal.WorkbenchPage.setPerspective
(org.eclipse.ui.IPerspectiveDescriptor) line: 2462
	org.eclipse.ui.internal.SetPagePerspectiveAction.run() line: 66
	org.eclipse.ui.internal.SetPagePerspectiveAction
(org.eclipse.jface.action.Action).runWithEvent(org.eclipse.swt.widgets.Event) 
line: 804
	org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection
(org.eclipse.swt.widgets.Event) line: 422
	org.eclipse.jface.action.ActionContributionItem.handleWidgetEvent
(org.eclipse.swt.widgets.Event) line: 374
	org.eclipse.jface.action.ActionContributionItem.access$0
(org.eclipse.jface.action.ActionContributionItem, 
org.eclipse.swt.widgets.Event) line: 368
	org.eclipse.jface.action.ActionContributionItem$ActionListener.handleEve
nt(org.eclipse.swt.widgets.Event) line: 69
	org.eclipse.swt.widgets.EventTable.sendEvent
(org.eclipse.swt.widgets.Event) line: 77
	org.eclipse.swt.widgets.ToolItem
(org.eclipse.swt.widgets.Widget).sendEvent(org.eclipse.swt.widgets.Event) line: 
836
	org.eclipse.swt.widgets.Display.runDeferredEvents() line: 1692
	org.eclipse.swt.widgets.Display.readAndDispatch() line: 1410
	org.eclipse.ui.internal.Workbench.runEventLoop() line: 1467
	org.eclipse.ui.internal.Workbench.run(java.lang.Object) line: 1450
	org.eclipse.core.internal.boot.InternalBootLoader.run(java.lang.String, 
java.net.URL, java.lang.String, java.lang.String[], java.lang.Runnable) line: 
845
	org.eclipse.core.boot.BootLoader.run(java.lang.String, java.net.URL, 
java.lang.String, java.lang.String[], java.lang.Runnable) line: 462
	sun.reflect.NativeMethodAccessorImpl.invoke0(java.lang.reflect.Method, 
java.lang.Object, java.lang.Object[]) line: not available [native method]
	sun.reflect.NativeMethodAccessorImpl.invoke(java.lang.Object, 
java.lang.Object[]) line: 39 [local variables unavailable]
	sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, 
java.lang.Object[]) line: 25 [local variables unavailable]
	java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) 
line: 324 [local variables unavailable]
	org.eclipse.core.launcher.Main.basicRun(java.lang.String[]) line: 247
	org.eclipse.core.launcher.Main.run(java.lang.String[]) line: 703
	org.eclipse.core.launcher.Main.main(java.lang.String[]) line: 539
Comment 1 Simon Arsenault CLA 2003-01-20 11:33:27 EST
In the selectionChanged method, the delegate will only be instantiated if it's 
plugin is already activated. Somehow the java debugger plugin must have been 
activated somewhere else. That's is why the delegate was instantiated.

Changes were done for the 2.0 release to instantiate all delegates when a 
plugin becomes activated. I do not recall all the details behind why this was 
done (since I was not involved in that area at the time).

Are you sure the java debug plugin was not already activated when the delegate 
was instantiated?
Comment 2 Darin Wright CLA 2003-01-20 15:23:57 EST
You're correct. The plug-in was already loaded.