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

Bug 328814

Summary: [Compatibility] NPE while opening the model editor
Product: [Eclipse Project] e4 Reporter: Paul Webster <pwebster>
Component: UIAssignee: Remy Suen <remy.suen>
Status: VERIFIED FIXED QA Contact: Remy Suen <remy.suen>
Severity: critical    
Priority: P3 CC: emoffatt, ob1.eclipse, remy.suen
Version: 1.0   
Target Milestone: 4.1 M3   
Hardware: All   
OS: All   
Whiteboard:
Attachments:
Description Flags
get(IEclipseContext.class) returns this
none
ServiceLocator patch v1 none

Description Paul Webster CLA 2010-10-27 08:22:54 EDT
I tried to open /org.eclipse.e4.demo.simpleide.navigator/xmi/contextViewMenuFragment.e4xmi from the Package Explorer, and I got the following error:


eclipse.buildId=I20101026-0203
java.fullversion=JRE 1.6.0 IBM J9 2.4 Linux x86-32 jvmxi3260sr8-20100401_55940 (JIT enabled, AOT enabled)
J9VM - 20100401_055940
JIT  - r9_20100401_15339
GC   - 20100308_AA
BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=en_US
Command-line arguments:  -os linux -ws gtk -arch x86 -data /opt/pwebster/workspaces/e4


Error
Wed Oct 27 08:25:57 EDT 2010
Problems occurred when invoking code from plug-in: "org.eclipse.jface".

java.lang.NullPointerException
at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:2219)
at org.eclipse.ui.internal.WorkbenchPage.access$14(WorkbenchPage.java:2177)
at org.eclipse.ui.internal.WorkbenchPage$6.run(WorkbenchPage.java:2159)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2155)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2139)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2130)
at org.eclipse.ui.ide.IDE.openEditor(IDE.java:651)
at org.eclipse.ui.ide.IDE.openEditor(IDE.java:610)
at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:354)
at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:164)
at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:219)
at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:198)
at org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun(SelectionDispatchAction.java:274)
at org.eclipse.jdt.ui.actions.SelectionDispatchAction.run(SelectionDispatchAction.java:250)
at org.eclipse.jdt.internal.ui.packageview.PackageExplorerActionGroup.handleOpen(PackageExplorerActionGroup.java:373)
at org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart$4.open(PackageExplorerPart.java:526)
at org.eclipse.ui.OpenAndLinkWithEditorHelper$InternalListener.open(OpenAndLinkWithEditorHelper.java:48)
at org.eclipse.jface.viewers.StructuredViewer$2.run(StructuredViewer.java:845)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:49)
at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
at org.eclipse.jface.viewers.StructuredViewer.fireOpen(StructuredViewer.java:843)
at org.eclipse.jface.viewers.StructuredViewer.handleOpen(StructuredViewer.java:1131)
at org.eclipse.jface.viewers.StructuredViewer$6.handleOpen(StructuredViewer.java:1235)
at org.eclipse.jface.util.OpenStrategy.fireOpenEvent(OpenStrategy.java:264)
at org.eclipse.jface.util.OpenStrategy.access$2(OpenStrategy.java:258)
at org.eclipse.jface.util.OpenStrategy$1.handleEvent(OpenStrategy.java:298)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1258)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3538)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3159)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$6.run(PartRenderingEngine.java:783)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:692)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:104)
at org.eclipse.ui.internal.Workbench$3.run(Workbench.java:545)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:527)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:600)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:621)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:576)
at org.eclipse.equinox.launcher.Main.run(Main.java:1409)
Comment 1 Paul Webster CLA 2010-10-27 08:24:57 EDT
A console exception from the same time:



ERROR: Unable to create class 'org.eclipse.ui.internal.e4.compatibility.CompatibilityEditor' from bundle '204'
org.eclipse.e4.core.di.InjectionException: java.lang.NullPointerException
        at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:59)
        at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:796)
        at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:776)
        at org.eclipse.e4.core.internal.di.InjectorImpl.inject(InjectorImpl.java:104)
        at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:292)
        at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:219)
        at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:152)
        at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:90)
        at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:64)
        at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:53)
        at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer.createWidget(ContributedPartRenderer.java:56)
        at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:671)
        at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:478)
        at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:554)
        at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.showTab(StackRenderer.java:515)
        at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer$1.handleEvent(LazyStackRenderer.java:74)
        at org.eclipse.e4.ui.services.internal.events.UIEventHandler.handleEvent(UIEventHandler.java:41)
        at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:197)
        at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:197)
        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:67)
        at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:58)
        at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:380)
        at org.eclipse.e4.ui.model.application.ui.impl.ElementContainerImpl.setSelectedElement(ElementContainerImpl.java:171)
        at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.showElementInWindow(ModelServiceImpl.java:236)
        at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.bringToTop(ModelServiceImpl.java:204)
        at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.bringToTop(PartServiceImpl.java:247)
        at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.showPart(PartServiceImpl.java:775)
        at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.showPart(PartServiceImpl.java:826)
        at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:2210)
        at org.eclipse.ui.internal.WorkbenchPage.access$14(WorkbenchPage.java:2177)
        at org.eclipse.ui.internal.WorkbenchPage$6.run(WorkbenchPage.java:2159)
        at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
        at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2155)
        at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2139)
        at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2130)
        at org.eclipse.ui.ide.IDE.openEditor(IDE.java:651)
        at org.eclipse.ui.ide.IDE.openEditor(IDE.java:610)
        at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:354)
        at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:164)
        at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:219)
        at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:198)
        at org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun(SelectionDispatchAction.java:274)
        at org.eclipse.jdt.ui.actions.SelectionDispatchAction.run(SelectionDispatchAction.java:250)
        at org.eclipse.jdt.internal.ui.packageview.PackageExplorerActionGroup.handleOpen(PackageExplorerActionGroup.java:373)
        at org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart$4.open(PackageExplorerPart.java:526)
        at org.eclipse.ui.OpenAndLinkWithEditorHelper$InternalListener.open(OpenAndLinkWithEditorHelper.java:48)
        at org.eclipse.jface.viewers.StructuredViewer$2.run(StructuredViewer.java:845)
        at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
        at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:49)
        at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
        at org.eclipse.jface.viewers.StructuredViewer.fireOpen(StructuredViewer.java:843)
        at org.eclipse.jface.viewers.StructuredViewer.handleOpen(StructuredViewer.java:1131)
        at org.eclipse.jface.viewers.StructuredViewer$6.handleOpen(StructuredViewer.java:1235)
        at org.eclipse.jface.util.OpenStrategy.fireOpenEvent(OpenStrategy.java:264)
        at org.eclipse.jface.util.OpenStrategy.access$2(OpenStrategy.java:258)
        at org.eclipse.jface.util.OpenStrategy$1.handleEvent(OpenStrategy.java:298)
        at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
        at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1258)
        at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3538)
        at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3159)
        at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$6.run(PartRenderingEngine.java:783)
        at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
        at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:692)
        at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:104)
        at org.eclipse.ui.internal.Workbench$3.run(Workbench.java:545)
        at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
        at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:527)
        at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
        at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115)
        at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:600)
        at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:621)
        at org.eclipse.equinox.launcher.Main.basicRun(Main.java:576)
        at org.eclipse.equinox.launcher.Main.run(Main.java:1409)
Caused by: java.lang.NullPointerException
        at org.eclipse.e4.tools.compat.internal.PartHelper.createPartContext(PartHelper.java:38)
        at org.eclipse.e4.tools.compat.parts.DIEditorPart.init(DIEditorPart.java:79)
        at org.eclipse.ui.internal.EditorReference.initialize(EditorReference.java:295)
        at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.create(CompatibilityPart.java:165)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:600)
        at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:52)
        ... 86 more
Comment 2 Paul Webster CLA 2010-10-27 08:30:32 EDT
It's because we removed the step where we add IEclipseContext.class to the contexts.  We need get(IEclipseContext.class) to return the same thing as the inject.

PW
Comment 3 Remy Suen CLA 2010-10-27 08:32:15 EDT
(In reply to comment #2)
> It's because we removed the step where we add IEclipseContext.class to the
> contexts.

That was me (bug 327592).
Comment 4 Paul Webster CLA 2010-10-27 09:40:36 EDT
Created attachment 181834 [details]
get(IEclipseContext.class) returns this

Since injecting the IEclipseContext injects this, get(IEclipseContext.class) should as well.

I added it before the track access, since there's no practical value in tracking access to "this" :-)


Oleg, could you please have a look at this?  The change is trivial, but I want to make sure that there's implications.

PW
Comment 5 Oleg Besedin CLA 2010-10-27 11:05:51 EDT
(In reply to comment #4)
> Created an attachment (id=181834) [details]

Then IEclipseContext.get(IEclipseContext.class) always evaluates to the object itself? Then the call itself is not needed. It seems that the simpler and more straightforward change would be adding two lines to the ServiceLocator:

	public final Object getService(final Class key) {
		if (disposed) {
			return null;
		}
+		if (IEclipseContext.class.equals(key))
+			return e4Context;
		return e4Context.get(key.getName());
	}
Comment 6 Remy Suen CLA 2010-10-27 11:07:43 EDT
(In reply to comment #5)
> It seems that the simpler and more
> straightforward change would be adding two lines to the ServiceLocator:
> 
>     public final Object getService(final Class key) {
>         if (disposed) {
>             return null;
>         }
> +        if (IEclipseContext.class.equals(key))
> +            return e4Context;
>         return e4Context.get(key.getName());
>     }

I don't mind adding more "weird" code in the compatibility layer myself.
Comment 7 Paul Webster CLA 2010-10-27 21:41:43 EDT
(In reply to comment #5)
            return e4Context;
>         return e4Context.get(key.getName());
>     }

+1

PW
Comment 8 Remy Suen CLA 2010-10-27 21:47:46 EDT
Created attachment 181902 [details]
ServiceLocator patch v1
Comment 9 Remy Suen CLA 2010-10-27 21:50:04 EDT
(In reply to comment #8)
> Created an attachment (id=181902) [details]
> ServiceLocator patch v1

Patch released to CVS HEAD.
Comment 10 Remy Suen CLA 2010-10-29 08:52:01 EDT
(In reply to comment #9)
> (In reply to comment #8)
> > Created an attachment (id=181902) [details] [details]
> > ServiceLocator patch v1
> 
> Patch released to CVS HEAD.

It made it into the build.
Comment 11 Remy Suen CLA 2010-10-29 08:52:22 EDT
Verified with I20101029-0251 on Windows XP.