Bug 575279

Summary: Data loss due to exception during SaveablesList.preCloseParts
Product: [Eclipse Project] Platform Reporter: Paul Reuter <pr>
Component: UIAssignee: Platform-UI-Inbox <Platform-UI-Inbox>
Status: REOPENED --- QA Contact:
Severity: normal    
Priority: P3 CC: rolf.theunissen
Version: 4.8   
Target Milestone: ---   
Hardware: PC   
OS: Windows 10   
Whiteboard:

Description Paul Reuter CLA 2021-08-06 08:52:10 EDT
User was reporting complete loss of progress of his last session. The last log entry of that session indicates that the user closed the workbench with multiple unsaved editors, and an unhandled exception occurred while the SaveablesList.promptForSaving dialog was open. 

Exact version of the org.eclipse.swt plugins is 3.107.0v20180611-0422


!ENTRY org.eclipse.ui 4 0 2021-07-09 14:41:26.392
!MESSAGE Unhandled event loop exception
!STACK 0
java.lang.NullPointerException
	at org.eclipse.ui.internal.NavigationHistory.getDisplay(NavigationHistory.java:176)
	at org.eclipse.ui.internal.NavigationHistory.markEditor(NavigationHistory.java:193)
	at org.eclipse.ui.internal.WorkbenchPage.updateActiveEditorSources(WorkbenchPage.java:433)
	at org.eclipse.ui.internal.WorkbenchPage.firePartClosed(WorkbenchPage.java:5256)
	at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.lambda$0(CompatibilityPart.java:106)
	at org.eclipse.e4.ui.services.internal.events.UIEventHandler$1.run(UIEventHandler.java:40)
	at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:233)
	at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:144)
	at org.eclipse.swt.widgets.Display.syncExec(Display.java:4567)
	at org.eclipse.e4.ui.internal.workbench.swt.E4Application$1.syncExec(E4Application.java:212)
	at org.eclipse.e4.ui.services.internal.events.UIEventHandler.handleEvent(UIEventHandler.java:36)
	at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:201)
	at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:196)
	at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
	at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135)
	at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78)
	at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39)
	at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:52)
	at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:60)
	at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374)
	at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setWidget(UIElementImpl.java:262)
	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.unbindWidget(SWTPartRenderer.java:148)
	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.lambda$0(SWTPartRenderer.java:137)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:124)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4118)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1052)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1076)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1057)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:809)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:929)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:812)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:929)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:812)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:929)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:812)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:929)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:812)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:929)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:812)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:929)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:812)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:929)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:812)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:929)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:812)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:929)
	at org.eclipse.swt.widgets.Canvas.releaseChildren(Canvas.java:171)
	at org.eclipse.swt.widgets.Decorations.releaseChildren(Decorations.java:728)
	at org.eclipse.swt.widgets.Shell.releaseChildren(Shell.java:1340)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:812)
	at org.eclipse.swt.widgets.Widget.dispose(Widget.java:426)
	at org.eclipse.swt.widgets.Decorations.dispose(Decorations.java:405)
	at org.eclipse.swt.widgets.Shell.dispose(Shell.java:729)
	at org.eclipse.swt.widgets.Display.release(Display.java:3585)
	at org.eclipse.swt.graphics.Device.dispose(Device.java:297)
	at org.eclipse.swt.widgets.Display.messageProc(Display.java:3120)
	at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
	at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2298)
	at org.eclipse.swt.widgets.Shell.callWindowProc(Shell.java:505)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:4863)
	at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:345)
	at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1499)
	at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:2159)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:4765)
	at org.eclipse.swt.internal.win32.OS.PeekMessageW(Native Method)
	at org.eclipse.swt.internal.win32.OS.PeekMessage(OS.java:2787)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3529)
	at org.eclipse.jface.window.Window.runEventLoop(Window.java:818)
	at org.eclipse.jface.window.Window.open(Window.java:794)
	at org.eclipse.ui.internal.SaveablesList.promptForSaving(SaveablesList.java:674)
	at org.eclipse.ui.internal.SaveablesList.promptForSavingIfNecessary(SaveablesList.java:569)
	at org.eclipse.ui.internal.SaveablesList.preCloseParts(SaveablesList.java:525)
	at org.eclipse.ui.internal.WorkbenchPage.saveAll(WorkbenchPage.java:3705)
	at org.eclipse.ui.internal.Workbench.saveAllEditors(Workbench.java:1397)
	at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1108)
	at org.eclipse.ui.internal.Workbench.lambda$4(Workbench.java:1430)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:71)
	at org.eclipse.ui.internal.Workbench.close(Workbench.java:1430)
	at org.eclipse.ui.internal.Workbench.close(Workbench.java:1403)
	at org.eclipse.ui.internal.Workbench.lambda$17(Workbench.java:2844)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4118)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4110)
	at org.eclipse.swt.widgets.Display.messageProc(Display.java:3133)
	at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
	at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2298)
	at org.eclipse.swt.widgets.Shell.callWindowProc(Shell.java:505)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:4863)
	at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:345)
	at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1499)
	at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:2159)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:4757)
	at org.eclipse.swt.internal.win32.OS.PeekMessageW(Native Method)
	at org.eclipse.swt.internal.win32.OS.PeekMessage(OS.java:2787)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3529)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1170)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1059)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:667)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:597)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
	at com.helinks.sts.app.STSApplication.start(STSApplication.java:112)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:656)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:592)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1498)
Comment 1 Rolf Theunissen CLA 2021-08-06 12:02:32 EDT

*** This bug has been marked as a duplicate of bug 532317 ***
Comment 2 Paul Reuter CLA 2021-08-06 17:50:46 EDT
I don't think this bug should be marked as duplicate. The observed behaviour is due to two bugs:

- the NullpointerException that is indeed fixed in bug 532317
- the data loss due to the unhandled NullpointerException during the save on close process

Unless the save on close is made more robust, the next untimely Exception will still cause data loss.