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

Bug 366578

Summary: [Workflow] LoadModel task produces NPE when a metamodel has not been registered
Product: [Modeling] Epsilon Reporter: Louis Rose <louis>
Component: CoreAssignee: Louis Rose <louis>
Status: CLOSED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: agarcdomi, dkolovos
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: Mac OS X - Carbon (unsup.)   
Whiteboard: interim

Description Louis Rose CLA 2011-12-13 11:43:16 EST
The following code:

<epsilon.loadModel name="iUML" type="EMF">
			<parameter name="modelFile" value="file:/${basedir}/../../models_generated/iUML_SIML_Iter1.model" /> 
			<parameter name="metamodelUri" value="http://iness.org/iUML_SIML"/>
			<parameter name="isMetamodelFileBased" value="false" /> 
			<parameter name="readOnLoad" value="true" />
			<parameter name="storeOnDisposal" value="false"/>
		</epsilon.loadModel>


Produces the following (fairly hard to understand) error message when the metamodel has not been registered:

[epsilon.loadModel] java.lang.NullPointerException
[epsilon.loadModel] 	at org.eclipse.epsilon.emc.emf.EmfUtil.collectDependencies(EmfUtil.java:114)
[epsilon.loadModel] 	at org.eclipse.epsilon.emc.emf.EmfModel.loadModelFromUri(EmfModel.java:234)
[epsilon.loadModel] 	at org.eclipse.epsilon.emc.emf.EmfModel.loadModel(EmfModel.java:161)
[epsilon.loadModel] 	at org.eclipse.epsilon.eol.models.CachedModel.load(CachedModel.java:147)
[epsilon.loadModel] 	at org.eclipse.epsilon.emc.emf.EmfModel.load(EmfModel.java:127)
[epsilon.loadModel] 	at org.eclipse.epsilon.workflow.tasks.LoadModelTask.executeImpl(LoadModelTask.java:50)
[epsilon.loadModel] 	at org.eclipse.epsilon.workflow.tasks.EpsilonTask.execute(EpsilonTask.java:40)
[epsilon.loadModel] 	at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
[epsilon.loadModel] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[epsilon.loadModel] 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[epsilon.loadModel] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[epsilon.loadModel] 	at java.lang.reflect.Method.invoke(Method.java:597)
[epsilon.loadModel] 	at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
[epsilon.loadModel] 	at org.apache.tools.ant.Task.perform(Task.java:348)
[epsilon.loadModel] 	at org.apache.tools.ant.Target.execute(Target.java:390)
[epsilon.loadModel] 	at org.apache.tools.ant.Target.performTasks(Target.java:411)
[epsilon.loadModel] 	at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
[epsilon.loadModel] 	at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
[epsilon.loadModel] 	at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
[epsilon.loadModel] 	at org.eclipse.ant.internal.core.ant.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[epsilon.loadModel] 	at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
[epsilon.loadModel] 	at org.eclipse.ant.internal.core.ant.InternalAntRunner.run(InternalAntRunner.java:663)
[epsilon.loadModel] 	at org.eclipse.ant.internal.core.ant.InternalAntRunner.run(InternalAntRunner.java:496)
[epsilon.loadModel] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[epsilon.loadModel] 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[epsilon.loadModel] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[epsilon.loadModel] 	at java.lang.reflect.Method.invoke(Method.java:597)
[epsilon.loadModel] 	at org.eclipse.ant.core.AntRunner.run(AntRunner.java:378)
[epsilon.loadModel] 	at org.eclipse.ant.internal.launching.launchConfigurations.AntLaunchDelegate$1.run(AntLaunchDelegate.java:298)
[epsilon.loadModel] 	at java.lang.Thread.run(Thread.java:680)
Comment 1 Louis Rose CLA 2011-12-13 11:44:13 EST
We should probably have EmfModel produce a more helpful error message when loading fails due to an unregistered metamodel.
Comment 2 Dimitris Kolovos CLA 2011-12-14 13:37:36 EST
+1 - Every time I come across this exception I promise I'll fix this but then I always forget :)
Comment 3 Antonio Garcia-Dominguez CLA 2011-12-14 15:29:22 EST
+1 Yes, this isn't a very friendly error message :-D.
Comment 4 Louis Rose CLA 2011-12-15 11:25:41 EST
I've also meant to fix this for a while!

Here's the patch I have right now:

            EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(metamodelUri);
            
+            if (ePackage == null)
+                throw new EolModelLoadingException(new IllegalArgumentException("Could not locate a metamodel with the URI '" + metamodelUri + "'. Please ensure that this metamodel has been registered with Epsilon."), this);
            
            packages.add(ePackage);
            EmfUtil.collectDependencies(ePackage, packages);


We possibly need to consider how to create an EolModelLoadingException (or EolInternalException) without an underlying exception (I'm using IllegalArgumentException as a placeholder for now). Dimitris, are you planning to do this as part of the EGL refactoring? If not, I'll take a stab at it for this patch.
Comment 5 Louis Rose CLA 2012-01-03 08:27:50 EST
I've committed the patch above.
Comment 6 Dimitris Kolovos CLA 2012-07-03 06:39:35 EDT
This has been fixed in the latest interim version.
Comment 7 Dimitris Kolovos CLA 2012-11-08 16:36:12 EST
Fixed in 1.0