Home » Modeling » EMF » Getting from an EPackage to the EPackage.Registry it was registered with
Getting from an EPackage to the EPackage.Registry it was registered with [message #1231898] |
Wed, 15 January 2014 17:38 |
Tassilo Horn Messages: 93 Registered: July 2009 |
Member |
|
|
Hi all,
I'm currently in the process of migrating a library using EMF from using the global EPackage.Registry to using the local registries of ResourceSets. I only use dynamic model instances.
What I do is when loading an instance model, the ecore model's Resource has to be given, too. I create a new ResourceSet, register the ecore model's packages with the ResourceSet's local package registry, and then I load the instance model and add its Resource to the ResourceSet. I do not add the ecore model's Resource to the ResourceSet.
That works, however I'm facing some issues.
Basically, some operations of my library require that I can get to the EClasses defined in the ecore model from (a) EObjects in a conforming instance model and from (b) other EClasses defined in the same ecore model.
I can handle point (a), because from any EObject in an instance model I can navigate up containments until I hit the containing Resource, then get the ResourceSet, and then using that ResourceSet's local package registry to get to the EClasses.
However, I can't handle point (b) right now. As said, I only register the ecore model's packages with the ResourceSet's local package registry, but I do not add the ecore model's resource to the ResourceSet. Of course, I could do that, and then point (b) would be easy, but it would break if I wanted to use the same ecore model Resource in many ResourceSets (because adding a Resource to a ResourceSet removes it from the ResourceSet it was previously in).
So how do I get from an EPackage to the registry it was registered with? Or do I really need to add the Resource with the ecore model to the ResourceSet, and then load it multiple times into new Resources if I want to have many instance models?
Thanks a lot,
Tassilo
|
|
|
Re: Getting from an EPackage to the EPackage.Registry it was registered with [message #1233265 is a reply to message #1231898] |
Sun, 19 January 2014 04:28 |
|
Am 15.01.2014 18:38, schrieb Tassilo Horn:
> Hi all,
>
> I'm currently in the process of migrating a library using EMF from using the global EPackage.Registry to using the
> local registries of ResourceSets. I only use dynamic model instances.
>
> What I do is when loading an instance model, the ecore model's Resource has to be given, too. I create a new
> ResourceSet, register the ecore model's packages with the ResourceSet's local package registry, and then I load the
> instance model and add its Resource to the ResourceSet.
This "load+add" should be done via:
resourceSet.getResource(URI, true);
> I do not add the ecore model's Resource to the ResourceSet.
Ok.
>
> That works, however I'm facing some issues.
>
> Basically, some operations of my library require that I can get to the EClasses defined in the ecore model from (a)
> EObjects in a conforming instance model and from
That is:
EClass eClass = instance.eClass();
> (b) other EClasses defined in the same ecore model.
That is:
for(EClassifier eClassifier : eClass.getEPackage().getEClassifiers())
{
if (eClassifier instanceof EClass)
...
>
> I can handle point (a), because from any EObject in an instance model I can navigate up containments until I hit the
> containing Resource, then get the ResourceSet, and then using that ResourceSet's local package registry to get to the
> EClasses.
>
> However, I can't handle point (b) right now. As said, I only register the ecore model's packages with the
> ResourceSet's local package registry, but I do not add the ecore model's resource to the ResourceSet. Of course, I
> could do that, and then point (b) would be easy, but it would break if I wanted to use the same ecore model Resource
> in many ResourceSets (because adding a Resource to a ResourceSet removes it from the ResourceSet it was previously in).
>
> So how do I get from an EPackage to the registry it was registered with?
That's not possible unless you put a custom Adapter on the EPackage at the time you register it:
ePackage.eAdapters().add(new MyPackageAdapter(registry));
registry.put(ePackage.getNSURI(), ePackage);
Note that an EPackage can be registered with multiple registries, so you'll have to iterate over the adapters later.
Cheers
/Eike
----
http://www.esc-net.de
http://thegordian.blogspot.com
http://twitter.com/eikestepper
> Or do I really need to add the Resource with the ecore model to the ResourceSet, and then load it multiple times into
> new Resources if I want to have many instance models?
>
> Thanks a lot,
> Tassilo
Cheers
/Eike
----
http://www.esc-net.de
http://thegordian.blogspot.com
http://twitter.com/eikestepper
|
|
| |
Goto Forum:
Current Time: Fri Apr 26 16:38:50 GMT 2024
Powered by FUDForum. Page generated in 0.03349 seconds
|