Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 321140

Summary: NPE when closing TS Explorer
Product: [Technology] Tigerstripe Reporter: Navid Mehregani <nmehrega>
Component: UIAssignee: Daniel Johnson <danijoh2>
Status: RESOLVED WONTFIX QA Contact:
Severity: normal    
Priority: P3    
Version: unspecified   
Target Milestone: 0.5M0   
Hardware: PC   
OS: Mac OS X - Carbon (unsup.)   
Whiteboard:
Attachments:
Description Flags
patch_321140.txt none

Description Navid Mehregani CLA 2010-07-28 11:20:40 EDT
Build Identifier: 

Closing TS Explorer will result in the following NPE:

Daemon Thread [Thread-0] (Suspended (exception java.lang.NullPointerException))	
	org.eclipse.tigerstripe.workbench.ui.internal.views.explorerview.TigerstripeContentProvider(org.eclipse.jdt.internal.ui.navigator.JavaNavigatorContentProvider).dispose() line: 97	
	org.eclipse.tigerstripe.workbench.ui.internal.views.explorerview.TigerstripeContentProvider.dispose() line: 108	
	org.eclipse.ui.internal.navigator.extensions.SafeDelegateTreeContentProvider$1.run() line: 62	
	org.eclipse.core.runtime.SafeRunner.run(org.eclipse.core.runtime.ISafeRunnable) line: 42	
	org.eclipse.ui.internal.navigator.extensions.SafeDelegateTreeContentProvider.dispose() line: 53	
	org.eclipse.ui.internal.navigator.extensions.NavigatorContentExtension$1.run() line: 225	
	org.eclipse.core.runtime.SafeRunner.run(org.eclipse.core.runtime.ISafeRunnable) line: 42	
	org.eclipse.ui.internal.navigator.extensions.NavigatorContentExtension.dispose() line: 214	
	org.eclipse.ui.internal.navigator.NavigatorContentService.dispose() line: 353	
	org.eclipse.ui.navigator.CommonViewer.dispose() line: 251	
	org.eclipse.ui.navigator.CommonViewer.handleDispose(org.eclipse.swt.events.DisposeEvent) line: 239	
	org.eclipse.jface.viewers.ContentViewer$2.widgetDisposed(org.eclipse.swt.events.DisposeEvent) line: 214	
	org.eclipse.swt.widgets.TypedListener.handleEvent(org.eclipse.swt.widgets.Event) line: 117	
	org.eclipse.swt.widgets.EventTable.sendEvent(org.eclipse.swt.widgets.Event) line: 84	
	org.eclipse.swt.widgets.Display.sendEvent(org.eclipse.swt.widgets.EventTable, org.eclipse.swt.widgets.Event) line: 3543	
	org.eclipse.swt.widgets.Tree(org.eclipse.swt.widgets.Widget).sendEvent(org.eclipse.swt.widgets.Event) line: 1250	
	org.eclipse.swt.widgets.Tree(org.eclipse.swt.widgets.Widget).sendEvent(int, org.eclipse.swt.widgets.Event, boolean) line: 1273	
	org.eclipse.swt.widgets.Tree(org.eclipse.swt.widgets.Widget).sendEvent(int) line: 1254	
	org.eclipse.swt.widgets.Tree(org.eclipse.swt.widgets.Widget).release(boolean) line: 1108	
	org.eclipse.swt.widgets.Tree(org.eclipse.swt.widgets.Control).release(boolean) line: 2458	
	org.eclipse.swt.widgets.Composite.releaseChildren(boolean) line: 754	
	org.eclipse.swt.widgets.Composite(org.eclipse.swt.widgets.Widget).release(boolean) line: 1111	
	org.eclipse.swt.widgets.Composite(org.eclipse.swt.widgets.Control).release(boolean) line: 2458	
	org.eclipse.swt.widgets.Composite.releaseChildren(boolean) line: 754	
	org.eclipse.swt.widgets.Composite(org.eclipse.swt.widgets.Widget).release(boolean) line: 1111	
	org.eclipse.swt.widgets.Composite(org.eclipse.swt.widgets.Control).release(boolean) line: 2458	
	org.eclipse.swt.widgets.Composite(org.eclipse.swt.widgets.Widget).dispose() line: 544	
	org.eclipse.ui.internal.ViewPane(org.eclipse.ui.internal.PartPane).dispose() line: 180	
	org.eclipse.ui.internal.ViewPane.dispose() line: 193	
	org.eclipse.ui.internal.ViewReference(org.eclipse.ui.internal.WorkbenchPartReference).dispose() line: 681	
	org.eclipse.ui.internal.WorkbenchPage.disposePart(org.eclipse.ui.internal.WorkbenchPartReference) line: 1715	
	org.eclipse.ui.internal.WorkbenchPage.partRemoved(org.eclipse.ui.internal.WorkbenchPartReference) line: 1707	
	org.eclipse.ui.internal.ViewFactory.releaseView(org.eclipse.ui.IViewReference) line: 257	
	org.eclipse.ui.internal.Perspective.hideView(org.eclipse.ui.IViewReference) line: 607	
	org.eclipse.ui.internal.WorkbenchPage.hideView(org.eclipse.ui.IViewReference) line: 2381	
	org.eclipse.ui.internal.ViewPane.doHide() line: 213	
	org.eclipse.ui.internal.ViewStack(org.eclipse.ui.internal.PartStack).close(org.eclipse.ui.presentations.IPresentablePart) line: 543	
	org.eclipse.ui.internal.ViewStack(org.eclipse.ui.internal.PartStack).close(org.eclipse.ui.presentations.IPresentablePart[]) line: 526	
	org.eclipse.ui.internal.PartStack$1.close(org.eclipse.ui.presentations.IPresentablePart[]) line: 122	
	org.eclipse.ui.internal.presentations.util.TabbedStackPresentation$1.handleEvent(org.eclipse.ui.internal.presentations.util.TabFolderEvent) line: 83	
	org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder(org.eclipse.ui.internal.presentations.util.AbstractTabFolder).fireEvent(org.eclipse.ui.internal.presentations.util.TabFolderEvent) line: 270	
	org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder(org.eclipse.ui.internal.presentations.util.AbstractTabFolder).fireEvent(int, org.eclipse.ui.internal.presentations.util.AbstractTabItem) line: 279	
	org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder.access$1(org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder, int, org.eclipse.ui.internal.presentations.util.AbstractTabItem) line: 1	
	org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder$1.closeButtonPressed(org.eclipse.swt.custom.CTabItem) line: 70	
	org.eclipse.ui.internal.presentations.PaneFolder.notifyCloseListeners(org.eclipse.swt.custom.CTabItem) line: 626	
	org.eclipse.ui.internal.presentations.PaneFolder$3.close(org.eclipse.swt.custom.CTabFolderEvent) line: 206	
	org.eclipse.swt.custom.CTabFolder.onMouse(org.eclipse.swt.widgets.Event) line: 2199	
	org.eclipse.swt.custom.CTabFolder$1.handleEvent(org.eclipse.swt.widgets.Event) line: 327	
	org.eclipse.swt.widgets.EventTable.sendEvent(org.eclipse.swt.widgets.Event) line: 84	
	org.eclipse.swt.widgets.Display.sendEvent(org.eclipse.swt.widgets.EventTable, org.eclipse.swt.widgets.Event) line: 3543	
	org.eclipse.swt.custom.CTabFolder(org.eclipse.swt.widgets.Widget).sendEvent(org.eclipse.swt.widgets.Event) line: 1250	
	org.eclipse.swt.custom.CTabFolder(org.eclipse.swt.widgets.Widget).sendEvent(int, org.eclipse.swt.widgets.Event, boolean) line: 1273	
	org.eclipse.swt.custom.CTabFolder(org.eclipse.swt.widgets.Widget).sendEvent(int, org.eclipse.swt.widgets.Event) line: 1258	
	org.eclipse.swt.custom.CTabFolder(org.eclipse.swt.widgets.Widget).notifyListeners(int, org.eclipse.swt.widgets.Event) line: 1079	
	org.eclipse.swt.widgets.Display.runDeferredEvents() line: 3441	
	org.eclipse.swt.widgets.Display.readAndDispatch() line: 3100	
	org.eclipse.ui.internal.Workbench.runEventLoop(org.eclipse.jface.window.Window$IExceptionHandler, org.eclipse.swt.widgets.Display) line: 2405	
	org.eclipse.ui.internal.Workbench.runUI() line: 2369	
	org.eclipse.ui.internal.Workbench.access$4(org.eclipse.ui.internal.Workbench) line: 2221	
	org.eclipse.ui.internal.Workbench$5.run() line: 500	
	org.eclipse.core.databinding.observable.Realm.runWithDefault(org.eclipse.core.databinding.observable.Realm, java.lang.Runnable) line: 332	
	org.eclipse.ui.internal.Workbench.createAndRunWorkbench(org.eclipse.swt.widgets.Display, org.eclipse.ui.application.WorkbenchAdvisor) line: 493	
	org.eclipse.ui.PlatformUI.createAndRunWorkbench(org.eclipse.swt.widgets.Display, org.eclipse.ui.application.WorkbenchAdvisor) line: 149	
	org.eclipse.ui.internal.ide.application.IDEApplication.start(org.eclipse.equinox.app.IApplicationContext) line: 113	
	org.eclipse.equinox.internal.app.EclipseAppHandle.run(java.lang.Object) line: 194	
	org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(java.lang.Object) line: 110	
	org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(java.lang.Object) line: 79	
	org.eclipse.core.runtime.adaptor.EclipseStarter.run(java.lang.Object) line: 368	
	org.eclipse.core.runtime.adaptor.EclipseStarter.run(java.lang.String[], java.lang.Runnable) line: 179	
	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	
	sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) line: 25	
	java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object...) line: 597	
	org.eclipse.equinox.launcher.Main.invokeFramework(java.lang.String[], java.net.URL[]) line: 559	
	org.eclipse.equinox.launcher.Main.basicRun(java.lang.String[]) line: 514	
	org.eclipse.equinox.launcher.Main.run(java.lang.String[]) line: 1311	
	org.eclipse.equinox.launcher.Main.main(java.lang.String[]) line: 1287	


Reproducible: Always
Comment 1 Navid Mehregani CLA 2010-08-23 21:07:57 EDT
Dan, can you please take a look whenever you get a chance?
Thanks!
Comment 2 Daniel Johnson CLA 2010-08-25 19:31:52 EDT
Created attachment 177481 [details]
patch_321140.txt

My fix is to not call a super.dispose method. Is this safe? After tracking down the instances I believe that another object was calling the dispose method of the parent class, so not calling it in the child should be ok. I really don't know the details enough to know if this is the correct solution, but it does seem to work.
Variables I watched to come to this conclusion:
JavaNavigatorContentProvider.java: fStateModel
PackageExplorerLabelProvider.java: fContentProvider

Class Changed: TigerstripeContentProvider
Comment 3 Navid Mehregani CLA 2010-08-27 13:17:36 EDT
Thanks Dan!
Sorry, but I'm a bit hesitant to apply your patch.  JavaNavigatorContentProvider is an internal class that we shouldn't be sub-classing in the first place.  I suspect that this will go away when bug#317761 is completed.  

Having the NPE there causes a bit of annoyance when debugging TS code (with an exception breakpoint enabled), but other than that, I don't think it causes any major problems on our side.  I'm going to mark this defect as WONTFIX.  It'll be resolved once bug#317761 is completed.