Bug 543916 - NPE when existing Eclipse with a Sirius table editor has focus
Summary: NPE when existing Eclipse with a Sirius table editor has focus
Status: CLOSED FIXED
Alias: None
Product: Sirius
Classification: Modeling
Component: Table (show other bugs)
Version: 6.1.1   Edit
Hardware: PC Mac OS X
: P3 normal (vote)
Target Milestone: 6.3.1   Edit
Assignee: Pierre-Charles David CLA
QA Contact: Laurent Fasani CLA
URL:
Whiteboard:
Keywords: triaged
Depends on:
Blocks:
 
Reported: 2019-01-28 18:50 EST by Maged Elaasar CLA
Modified: 2020-06-19 10:22 EDT (History)
6 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Maged Elaasar CLA 2019-01-28 18:50:46 EST
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)
Comment 1 Laurent Fasani CLA 2019-02-07 03:36:42 EST
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.
Comment 2 Paul Gaspardo CLA 2019-10-14 15:00:57 EDT
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.
Comment 3 Maxime Porhel CLA 2019-11-12 08:25:31 EST
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.
Comment 4 Eclipse Genie CLA 2020-02-24 03:43:36 EST
New Gerrit change created: https://git.eclipse.org/r/158200
Comment 5 Pierre-Charles David CLA 2020-02-24 03:44:08 EST
(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?
Comment 6 Pierre-Charles David CLA 2020-04-24 03:25:10 EDT
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.
Comment 7 Maxime Porhel CLA 2020-04-24 03:27:50 EDT
I do not reproduce the NPE with the provided patch on MacOS
Comment 9 Laurent Fasani CLA 2020-05-11 04:54:26 EDT
Validated on Windows with ODCE11.3.1 IT2
Comment 10 Pierre-Charles David CLA 2020-06-19 10:22:31 EDT
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.