Cross-references to external EMF models [message #542733] |
Fri, 25 June 2010 14:25  |
Eclipse User |
|
|
|
I would like to define cross-references to elements in external EMF model files. The external EMF models there are defined by external ecore metamodels (here using 'mydsl.ecore' as example).
In Xtext 0.7.2 this worked fine but I don't get it run with Xtext 1.0. In Xtext 1.0 I'm using the ImportURIScopingFragment and the SimpleNamesFragment (as proposed in previous postings like message #521601) but it still does not work.
In the xtext file:
import "platform:/resource/mydsl/model/mydsl.ecore" as myDSL
[...]
Import :
'import' importURI=STRING ';'
;
Ref:
'ref' referencedObject=[myDSL::MyClass]
;
In the mwe2 file:
// generates Java API for the generated EPackages
fragment = ecore.EcoreGeneratorFragment {
referencedGenModels = "platform:/resource/mydsl/model/mydsl.genmodel"
}
...
// scoping and exporting API
fragment = scoping.ImportURIScopingFragment {}
fragment = exporting.SimpleNamesFragment {}
// scoping and exporting API
//fragment = scoping.ImportNamespacesScopingFragment {}
//fragment = exporting.QualifiedNamesFragment {}
On runtime I use the 'import' statement in my xtext model to refer to the external EMF model file (here: "test1.mydsl") and I then get the following error:
java.lang.IllegalStateException: No IResourceServiceProvider found in registry for uri test1.mydsl
The analogous steps worked fine in xtext 0.7.2. Do you have any hint what could be missing for xtext 1.0?
|
|
|
|
|
Re: Cross-references to external EMF models [message #555958 is a reply to message #542733] |
Mon, 30 August 2010 07:43   |
Eclipse User |
|
|
|
Hi,
I want to use an owl ecore model which resides in a directory "ressources/" in my project. Thus I've wrote in my xtext file:
import "platform:/ressources/owl.ecore" as myDSL
But the editor says "couldn't resolve reference to EPackage 'platform:/ressources/owl.ecore'".
I've followed the instructions in this posting. So far, I added to the UI Plugin.xml
<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
<resourceServiceProvider
class="de.hs_rm.cs.vs.dsm.ui.FlowExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
uriExtension="flow">
</resourceServiceProvider>
<!-- Not sure if that's working, text below is new -->
<resourceServiceProvider
class="de.hs_rm.cs.vs.dsm.ui.FlowExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
uriExtension="owl">
</resourceServiceProvider>
</extension>
and added in <Lang>StandAloneSetup.java
import com.google.inject.Injector;
/**
* Initialization support for running Xtext languages
* without equinox extension registry
*/
public class FlowStandaloneSetup extends FlowStandaloneSetupGenerated{
public static void doSetup() {
new FlowStandaloneSetup().createInjectorAndDoEMFRegistration();
}
@Override
public void register(Injector injector) {
super.register(injector);
org.eclipse.xtext.resource.IResourceServiceProvider serviceProvider = injector.getInstance(org.eclipse.xtext.resource.IResourceServiceProvider.class);
org.eclipse.xtext.resource.IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("owl", serviceProvider);
}
}
I've also created a ressource provider
import org.eclipse.emf.common.util.URI;
import org.eclipse.xtext.resource.impl.DefaultResourceServiceProvider;
public class FlowRessourceProvider extends DefaultResourceServiceProvider {
@Override
public boolean canHandle(URI uri) {
if (uri.toPlatformString(true).endsWith("owl")) {
return true;
}
return super.canHandle(uri);
}
}
and finally added that information to the runtime module
import org.eclipse.xtext.resource.IResourceServiceProvider;
/**
* Use this class to register components to be used at runtime / without the Equinox extension registry.
*/
public class FlowRuntimeModule extends de.hs_rm.cs.vs.dsm.AbstractFlowRuntimeModule {
public Class<? extends IResourceServiceProvider> bindIResourceServiceProvider() {
return FlowRessourceProvider.class;
}
}
I've also added to the *.mwe2 file
// Added
fragment = org.eclipse.xtext.generator.ecore.EcoreGeneratorFragment {
genModels = "platform:/resource/owl.genmodel"
}
It's not working. So probably somebody has an idea?
Regards,
Michael
P.S.: I've created an genmodel from the ecore model and removed the import statement from the xtext file and I'm getting the following exception.
0 [main] INFO lipse.emf.mwe.utils.StandaloneSetup - Registering platform uri '/home/michael/Desktop/Projekte'
3100 [main] WARN erator.ecore.EcoreGeneratorFragment - The property 'genModels' is deprecated. Please use 'referencedGenModels' instead.
3122 [main] INFO ipse.emf.mwe.utils.DirectoryCleaner - Cleaning /home/michael/Desktop/Projekte/de.hs_rm.cs.vs.dsm.flow/../de.hs_rm.cs.vs.dsm.flow/src-gen
3150 [main] INFO ipse.emf.mwe.utils.DirectoryCleaner - Cleaning /home/michael/Desktop/Projekte/de.hs_rm.cs.vs.dsm.flow/../de.hs_rm.cs.vs.dsm.flow.ui/src-gen
3587 [main] INFO ipse.xtext.generator.LanguageConfig - generating infrastructure for de.hs_rm.cs.vs.dsm.Flow with fragments : ImplicitRuntimeFragment, ImplicitUiFragment, GrammarAccessFragment, EcoreGeneratorFragment, ParseTreeConstructorFragment, ResourceFactoryFragment, XtextAntlrGeneratorFragment, JavaValidatorFragment, ImportNamespacesScopingFragment, QualifiedNamesFragment, BuilderIntegrationFragment, FormatterFragment, LabelProviderFragment, TransformerFragment, OutlineNodeAdapterFactoryFragment, QuickOutlineFragment, QuickfixProviderFragment, JavaBasedContentAssistFragment, XtextAntlrUiGeneratorFragment, EcoreGeneratorFragment
48148 [main] INFO or.validation.JavaValidatorFragment - executing generate for org.eclipse.xtext.generator.validation.JavaValidatorFragment
59058 [main] ERROR erator.ecore.EcoreGeneratorFragment - Couldn't find genmodel for uri 'platform:/resource/owl.genmodel'
java.lang.RuntimeException: java.lang.StringIndexOutOfBoundsException: String index out of range: -2
at org.eclipse.xtext.generator.ecore.EcoreGeneratorFragment.loadReferencedGenModels(EcoreGeneratorFragment.java:191)
at org.eclipse.xtext.generator.ecore.EcoreGeneratorFragment.generate(EcoreGeneratorFragment.java:160)
at org.eclipse.xtext.generator.CompositeGeneratorFragment.generate(CompositeGeneratorFragment.java:81)
at org.eclipse.xtext.generator.LanguageConfig.generate(LanguageConfig.java:69)
at org.eclipse.xtext.generator.Generator.generate(Generator.java:296)
at org.eclipse.xtext.generator.Generator.invokeInternal(Generator.java:106)
at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:126)
at org.eclipse.emf.mwe.core.lib.Mwe2Bridge.invoke(Mwe2Bridge.java:34)
at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:201)
at org.eclipse.emf.mwe2.runtime.workflow.AbstractCompositeWorkflowComponent.invoke(AbstractCompositeWorkflowComponent.java:31)
at org.eclipse.emf.mwe2.runtime.workflow.Workflow.run(Workflow.java:19)
at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:80)
at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:52)
at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.run(Mwe2Launcher.java:74)
at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.main(Mwe2Launcher.java:35)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -2
at java.lang.String.substring(String.java:1937)
at org.eclipse.emf.ecore.plugin.EcorePlugin.resolvePlatformResourcePath(EcorePlugin.java:133)
at org.eclipse.emf.ecore.resource.impl.PlatformResourceURIHandlerImpl.createInputStream(PlatformResourceURIHandlerImpl.java:452)
at org.eclipse.emf.ecore.resource.impl.ExtensibleURIConverterImpl.createInputStream(ExtensibleURIConverterImpl.java:301)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.load(ResourceImpl.java:1254)
at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoad(ResourceSetImpl.java:255)
at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoadHelper(ResourceSetImpl.java:270)
at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.getResource(ResourceSetImpl.java:397)
at org.eclipse.xtext.generator.ecore.EcoreGeneratorFragment$1.getResource(EcoreGeneratorFragment.java:432)
at org.eclipse.xtext.generator.ecore.EcoreGeneratorFragment.loadReferencedGenModels(EcoreGeneratorFragment.java:182)
... 14 more
59517 [main] INFO .emf.mwe2.runtime.workflow.Workflow - D
[Updated on: Mon, 30 August 2010 08:18] by Moderator
|
|
|
|
|
|
Re: Cross-references to external EMF models [message #556420 is a reply to message #556419] |
Wed, 01 September 2010 05:22  |
Eclipse User |
|
|
|
Hi,
just add your.external.emf.metamodel.modelclasses plugin to the plugin dependencies of your xtext plugin project. (you have to generate model code from the gemodel)
Regards
Christian
[Updated on: Wed, 01 September 2010 05:23] by Moderator
|
|
|
Powered by
FUDForum. Page generated in 0.28801 seconds