Community
Participate
Working Groups
When existing Eclipse with a Sirius table editor open and has the focus, we get the following NPE, which seems to be coming from DTableTreeFocusListener::lostFocus trying to register handler for global actions when the LegacyHandlerService has been disposed at this point. This was tested in Eclipse 2018-12 on MacOS. java.lang.NullPointerException at org.eclipse.ui.internal.handlers.LegacyHandlerService.registerLegacyHandler(LegacyHandlerService.java:167) at org.eclipse.ui.internal.handlers.LegacyHandlerService.registerLegacyHandler(LegacyHandlerService.java:161) at org.eclipse.ui.internal.handlers.LegacyHandlerService.activateHandler(LegacyHandlerService.java:313) at org.eclipse.ui.internal.handlers.LegacyHandlerService.activateHandler(LegacyHandlerService.java:306) at org.eclipse.ui.SubActionBars.setGlobalActionHandler(SubActionBars.java:568) at org.eclipse.sirius.ui.tools.internal.editor.DTableTreeFocusListener.focusLost(DTableTreeFocusListener.java:82) at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:147) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4319) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1512) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1535) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1516) at org.eclipse.swt.widgets.Control.sendFocusEvent(Control.java:3426) at org.eclipse.swt.widgets.Display.checkFocus(Display.java:673) at org.eclipse.swt.widgets.Shell.makeFirstResponder(Shell.java:1306) at org.eclipse.swt.widgets.Display.windowProc(Display.java:6191) at org.eclipse.swt.internal.cocoa.OS.objc_msgSend(Native Method) at org.eclipse.swt.internal.cocoa.NSView.setHidden(NSView.java:303) at org.eclipse.swt.widgets.Control.setVisible(Control.java:4425) at org.eclipse.swt.custom.CTabItem.setControl(CTabItem.java:301) at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.hideChild(StackRenderer.java:987) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:896) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:886) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:881) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:865) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:920) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:886) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:881) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:865) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:920) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:886) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:881) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:865) at org.eclipse.e4.ui.workbench.renderers.swt.ElementReferenceRenderer.disposeWidget(ElementReferenceRenderer.java:115) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:958) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:886) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:881) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:865) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:920) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:886) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:881) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:865) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:920) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:886) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:881) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:865) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:920) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:886) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:881) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:865) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:920) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:886) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:881) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:865) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:920) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:886) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:881) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:865) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:920) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:886) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:881) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:865) at org.eclipse.ui.internal.WorkbenchWindow.hardClose(WorkbenchWindow.java:2025) at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1645) at org.eclipse.ui.internal.WorkbenchWindow.lambda$2(WorkbenchWindow.java:1670) at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:72) at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1670) at org.eclipse.ui.internal.Workbench$10.run(Workbench.java:1145) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45) at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1128) at org.eclipse.ui.internal.Workbench.lambda$4(Workbench.java:1410) at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:72) at org.eclipse.ui.internal.Workbench.close(Workbench.java:1410) at org.eclipse.ui.internal.Workbench.close(Workbench.java:1383) at org.eclipse.ui.internal.Workbench.lambda$17(Workbench.java:2789) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4319) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4308) at org.eclipse.swt.widgets.Display.close(Display.java:808) at org.eclipse.ui.internal.handlers.QuitHandler.execute(QuitHandler.java:44) at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:294) at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:96) 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.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:320) at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:254) at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:164) at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:156) at org.eclipse.core.commands.Command.executeWithChecks(Command.java:497) at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:490) at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:213) at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:195) at org.eclipse.e4.ui.workbench.renderers.swt.cocoa.CocoaUIHandler.runCommand(CocoaUIHandler.java:651) at org.eclipse.e4.ui.workbench.renderers.swt.cocoa.CocoaUIHandler.access$5(CocoaUIHandler.java:637) at org.eclipse.e4.ui.workbench.renderers.swt.cocoa.CocoaUIHandler$3.widgetSelected(CocoaUIHandler.java:509) at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:252) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4319) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1512) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1535) at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1585) at org.eclipse.swt.widgets.MenuItem.sendSelection(MenuItem.java:596) at org.eclipse.swt.widgets.Display.windowProc(Display.java:5751) at org.eclipse.swt.internal.cocoa.OS.objc_msgSendSuper(Native Method) at org.eclipse.swt.widgets.Display.applicationSendEvent(Display.java:5352) at org.eclipse.swt.widgets.Display.applicationProc(Display.java:5504) at org.eclipse.swt.internal.cocoa.OS.objc_msgSend(Native Method) at org.eclipse.swt.internal.cocoa.NSApplication.sendEvent(NSApplication.java:131) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3757) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1173) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1062) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:156) at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:636) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:563) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:151) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:155) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:137) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:107) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255) 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:659) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:595) at org.eclipse.equinox.launcher.Main.run(Main.java:1501) at org.eclipse.equinox.launcher.Main.main(Main.java:1474)
Thanks for raising this bug. I can't see how to reproduce this bug. Hopefuly, the NPE does not occur each time we lost the focus on the Table editor. Do you have a reproducible scenario else it will be difficult to go further.
Here are steps to reproduce the exception using this example project I attached to another bug: https://bugs.eclipse.org/bugs/attachment.cgi?id=279920&action=edit I wasn’t able to reproduce it on Windows so this may be specific to macOS. 1. Import the “Farm” project in the “FarmModel.zip” archive using Eclipse Modeling Tools 2019-09 on macOS. 2. Open “model/farm.arid” in the Aird Editor. 3. In the “Representations” list, double-click “Classes in a spreadsheet (0)” under “Design” to create a new table representation. 4. Select “farm” as the semantic element and click Finish to create the representation. 5. Click “Animal” in the table to ensure the table editor has focus. 6. Close the Eclipse window to exit the Eclipse IDE. After step 6, the reported NullPointerException should appear in the workspace log.
Reproduced on macOS 10.15.1 with Eclipse 2019-06, Sirius 6.3.0rc1 and the provided sample. From the code, it seems that we could get the same stack from: - org.eclipse.sirius.tree.ui...DTreeItemEditorFocusListener.focusLost(FocusEvent) - org.eclipse.sirius.table.ui...DTableCellEditorFocusListener.focusLost(FocusEvent) - org.eclipse.sirius.ui.tools.internal.editor.DTableTreeFocusListener.focusLost As we react to focus lost to reset the global actions cut/copy/paste, we could check the platform status and do nothing if we detect a shutdown/close.
New Gerrit change created: https://git.eclipse.org/r/158200
(In reply to Maxime Porhel from comment #3) > Reproduced on macOS 10.15.1 with Eclipse 2019-06, Sirius 6.3.0rc1 and the > provided sample. > > From the code, it seems that we could get the same stack from: > - > org.eclipse.sirius.tree.ui...DTreeItemEditorFocusListener. > focusLost(FocusEvent) > - > org.eclipse.sirius.table.ui...DTableCellEditorFocusListener. > focusLost(FocusEvent) > - > org.eclipse.sirius.ui.tools.internal.editor.DTableTreeFocusListener.focusLost > > As we react to focus lost to reset the global actions cut/copy/paste, we > could check the platform status and do nothing if we detect a shutdown/close. More likely, we should remove the focusListener when the editor is closed/disposed. Currently we install the listener in DTableViewerManager.createTreeViewer(Composite) but do not keep a reference to it, so can not remove it when the editor is closed. I guess this leaves it around to get notified *after* the editor has disappeared on close. I've submitted a patch (https://git.eclipse.org/r/158200) but am not under macOS so can not test it. Maxime, could you check if if fixes the issue?
Actually I can reproduce the NPE under Linux too. 1. Open a Sirius table and put the focus on an element inside (I'm not sure having the table editor opened is enough if there is not a selection *inside* of it). 2. Close Eclipse (File > Quit or close the window) 3. In the console/stdout: java.lang.NullPointerException at org.eclipse.ui.internal.handlers.LegacyHandlerService.registerLegacyHandler(LegacyHandlerService.java:164) at org.eclipse.ui.internal.handlers.LegacyHandlerService.registerLegacyHandler(LegacyHandlerService.java:158) at org.eclipse.ui.internal.handlers.LegacyHandlerService.activateHandler(LegacyHandlerService.java:306) at org.eclipse.ui.internal.handlers.LegacyHandlerService.activateHandler(LegacyHandlerService.java:299) at org.eclipse.ui.SubActionBars.setGlobalActionHandler(SubActionBars.java:549) at org.eclipse.sirius.ui.tools.internal.editor.DTableTreeFocusListener.focusLost(DTableTreeFocusListener.java:82) The patch at https://git.eclipse.org/r/158200 fixes the issue for me.
I do not reproduce the NPE with the provided patch on MacOS
Gerrit change https://git.eclipse.org/r/158200 was merged to [master]. Commit: http://git.eclipse.org/c/sirius/org.eclipse.sirius.git/commit/?id=fad8b268a7aea2a1d0a8e0a7333903729cd8cd20
Validated on Windows with ODCE11.3.1 IT2
Available in Sirius 6.3.1 (part of Eclipse 2020-06). See https://wiki.eclipse.org/Sirius/6.3.1 for details on the release.