| Summary: | [Workflow] LoadModel task produces NPE when a metamodel has not been registered | ||
|---|---|---|---|
| Product: | [Modeling] Epsilon | Reporter: | Louis Rose <louis> |
| Component: | Core | Assignee: | 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 | ||
We should probably have EmfModel produce a more helpful error message when loading fails due to an unregistered metamodel. +1 - Every time I come across this exception I promise I'll fix this but then I always forget :) +1 Yes, this isn't a very friendly error message :-D. 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.
I've committed the patch above. This has been fixed in the latest interim version. Fixed in 1.0 |
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)