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

Bug 317156

Summary: [Wizard] NPE while creating a new Papyrus Model from an existing .uml file
Product: [Modeling] Papyrus Reporter: Tatiana Fesenko <tatiana.fesenko>
Component: CoreAssignee: Project Inbox <mdt-papyrus-inbox>
Status: RESOLVED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: andreas.brieg
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: Windows XP   
Whiteboard:
Bug Depends on:    
Bug Blocks: 314834    
Attachments:
Description Flags
UML file
none
proposed patch for ModelSet none

Description Tatiana Fesenko CLA 2010-06-17 05:28:55 EDT
1. Create a UML model, e.g. using New UML Model wizard. Add a root element, say, a Model and name it.
2. Select the newly created UML file. Invoke 'New Papyrus Model' wizard.

NPE is thrown. It didn’t happen before.  

The code which causes NPE looks like

      IPath path = file.getFullPath().removeFileExtension();

…     for(String modelId : modelIdentifiers) {

…                 model.changeModelPath(filenameWithoutExtension);

      }

The filenameWithoutException field is not initialized, it is null, and it ends up with an exception.

This problem is related to changes caused by the bug 315083: ModelSet: Allow to create .di and .notation models only, and do not create a domain model
Comment 1 John M. CLA 2012-08-20 10:51:25 EDT
Created attachment 220052 [details]
UML file

Generated uml from ecore model, reproduce the npe.

Stack Trace:
java.lang.NullPointerException
	at org.eclipse.papyrus.infra.gmfdiag.common.AbstractPapyrusGmfCreateDiagramCommandHandler.getCreateDiagramCommand(AbstractPapyrusGmfCreateDiagramCommandHandler.java:295)
	at org.eclipse.papyrus.infra.gmfdiag.common.AbstractPapyrusGmfCreateDiagramCommandHandler.runAsTransaction(AbstractPapyrusGmfCreateDiagramCommandHandler.java:121)
	at org.eclipse.papyrus.infra.gmfdiag.common.AbstractPapyrusGmfCreateDiagramCommandHandler$1.doExecute(AbstractPapyrusGmfCreateDiagramCommandHandler.java:279)
	at org.eclipse.emf.transaction.RecordingCommand.execute(RecordingCommand.java:135)
	at org.eclipse.emf.workspace.EMFCommandOperation.doExecute(EMFCommandOperation.java:119)
	at org.eclipse.emf.workspace.AbstractEMFOperation.execute(AbstractEMFOperation.java:150)
	at org.eclipse.core.commands.operations.DefaultOperationHistory.execute(DefaultOperationHistory.java:513)
	at org.eclipse.papyrus.commands.CheckedOperationHistory.execute(CheckedOperationHistory.java:182)
	at org.eclipse.papyrus.commands.NotifyingWorkspaceCommandStack.doExecute(NotifyingWorkspaceCommandStack.java:252)
	at org.eclipse.emf.transaction.impl.AbstractTransactionalCommandStack.execute(AbstractTransactionalCommandStack.java:165)
	at org.eclipse.emf.transaction.impl.AbstractTransactionalCommandStack.execute(AbstractTransactionalCommandStack.java:219)
	at org.eclipse.papyrus.infra.gmfdiag.common.AbstractPapyrusGmfCreateDiagramCommandHandler.createDiagram(AbstractPapyrusGmfCreateDiagramCommandHandler.java:282)
	at org.eclipse.papyrus.uml.diagram.wizards.CreateModelWizard.initDiagrams(CreateModelWizard.java:440)
	at org.eclipse.papyrus.uml.diagram.wizards.InitModelWizard.initDiagrams(InitModelWizard.java:192)
	at org.eclipse.papyrus.uml.diagram.wizards.CreateModelWizard.initDiagramModel(CreateModelWizard.java:398)
	at org.eclipse.papyrus.uml.diagram.wizards.CreateModelWizard.createAndOpenPapyrusModel(CreateModelWizard.java:179)
	at org.eclipse.papyrus.uml.diagram.wizards.CreateModelWizard.performFinish(CreateModelWizard.java:156)
...
Comment 2 Andreas Brieg CLA 2013-03-07 14:42:31 EST
The stack trace has changed a bit in 0.9.2. Currently it is:

java.lang.NullPointerException
	at org.eclipse.papyrus.infra.gmfdiag.common.AbstractPapyrusGmfCreateDiagramCommandHandler.getCreateDiagramCommand(AbstractPapyrusGmfCreateDiagramCommandHandler.java:294)
	at org.eclipse.papyrus.infra.gmfdiag.common.AbstractPapyrusGmfCreateDiagramCommandHandler.runAsTransaction(AbstractPapyrusGmfCreateDiagramCommandHandler.java:120)
	at org.eclipse.papyrus.infra.gmfdiag.common.AbstractPapyrusGmfCreateDiagramCommandHandler$1.doExecute(AbstractPapyrusGmfCreateDiagramCommandHandler.java:278)
	at org.eclipse.emf.transaction.RecordingCommand.execute(RecordingCommand.java:135)
	at org.eclipse.emf.workspace.EMFCommandOperation.doExecute(EMFCommandOperation.java:119)
	at org.eclipse.emf.workspace.AbstractEMFOperation.execute(AbstractEMFOperation.java:150)
	at org.eclipse.core.commands.operations.DefaultOperationHistory.execute(DefaultOperationHistory.java:513)
	at org.eclipse.papyrus.commands.CheckedOperationHistory.execute(CheckedOperationHistory.java:182)
	at org.eclipse.papyrus.commands.NotifyingWorkspaceCommandStack.doExecute(NotifyingWorkspaceCommandStack.java:252)
	at org.eclipse.emf.transaction.impl.AbstractTransactionalCommandStack.execute(AbstractTransactionalCommandStack.java:165)
	at org.eclipse.emf.transaction.impl.AbstractTransactionalCommandStack.execute(AbstractTransactionalCommandStack.java:219)
	at org.eclipse.papyrus.infra.gmfdiag.common.AbstractPapyrusGmfCreateDiagramCommandHandler.createDiagram(AbstractPapyrusGmfCreateDiagramCommandHandler.java:281)
	at org.eclipse.papyrus.uml.diagram.wizards.CreateModelWizard.initDiagrams(CreateModelWizard.java:440)
	at org.eclipse.papyrus.uml.diagram.wizards.InitModelWizard.initDiagrams(InitModelWizard.java:192)
	at org.eclipse.papyrus.uml.diagram.wizards.CreateModelWizard.initDiagramModel(CreateModelWizard.java:398)
	at org.eclipse.papyrus.uml.diagram.wizards.CreateModelWizard.createAndOpenPapyrusModel(CreateModelWizard.java:179)
	at org.eclipse.papyrus.uml.diagram.wizards.CreateModelWizard.performFinish(CreateModelWizard.java:156)
	at org.eclipse.jface.wizard.WizardDialog.finishPressed(WizardDialog.java:827)
	at org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java:432)
	at org.eclipse.jface.dialogs.Dialog$2.widgetSelected(Dialog.java:624)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4169)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3758)
	at org.eclipse.jface.window.Window.runEventLoop(Window.java:825)
	at org.eclipse.jface.window.Window.open(Window.java:801)
	at org.eclipse.ui.internal.handlers.WizardHandler$New.executeHandler(WizardHandler.java:259)
	at org.eclipse.ui.internal.handlers.WizardHandler.execute(WizardHandler.java:279)
	at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:290)
	at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:76)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56)
	at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:231)
	at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:212)
	at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:131)
	at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:171)
	at org.eclipse.ui.internal.handlers.LegacyHandlerService.executeCommand(LegacyHandlerService.java:515)
	at org.eclipse.ui.internal.actions.CommandAction.runWithEvent(CommandAction.java:157)
	at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
	at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)
	at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4169)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3758)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1053)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:942)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:86)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:588)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:543)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
	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:353)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1438)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1414)

The problem is that the *.notation resource doesn't exist at that point.
Comment 3 Andreas Brieg CLA 2013-03-09 11:47:37 EST
I further investigated the problem in 0.9.2.

The cause of the problem is located in org.eclipse.papyrus.infra.core.resource.ModelSet.getAssociatedResource(Resource, String). It retrieves the notation resource with a load on demand. But the notation resource itself isn't stored on disk at that point. So the load on demand will fail.

The documentation of ModelSet states that after "call load() or create() then, it is possible to get associated models". But that contract is not correctly implemented. 

Maybe the associated resource should be retrieved without specifying a load on demand. If the resource has been retrieved it can be checked, if it exists and then loaded.
Comment 4 Andreas Brieg CLA 2013-03-14 17:01:13 EDT
Created attachment 228450 [details]
proposed patch for ModelSet

This is an implementation for my suggestion. It retrieves the resource with no load on demand and if the retrieved resource exists, it is then loaded.

However I don't see an initialized diagram when this patch is applied. So there is probably further investigation necessary.
Comment 5 Camille Letavernier CLA 2013-05-03 10:41:56 EDT
Works as expected in 0.10. I close this task