Create a view on a 'merged' feature maps [message #1021484] |
Wed, 20 March 2013 07:44 |
Leonid Ripeynih Messages: 150 Registered: February 2012 |
Senior Member |
|
|
Hi all!
What am I trying to achive is to create a 'view' on a 'merged' feature map, located in different resources. The basic idea is to implement an instance model inheritance, just like it's implemented in eCore itself.
I have implemented simple feature inheritance, like it's implemented in
org.eclipse.emf.ecore.impl.EClassImpl.getEAllAttributes()
org.eclipse.emf.ecore.impl.EClassImpl.getEAllOperations()
But, as my model is generated from XSD and order of elements is important in some places, there is a need to create a similar view on generated 'groups'. Basically what I want to achieve is to create 'allGroup' feature, which will walk a list of parent resources and create an appropriate view. Here is (a simple and naive) code which do work, but empties the 'real' feature map.
FeatureMap ret = new BasicFeatureMap((InternalEObject) context, inheritedFeature.getFeatureID(), inheritedFeature);
IInheritedResource<? extends IInheritedResource<?>> source = (IInheritedResource<? extends IInheritedResource<?>>) res;
try {
List<IInheritedResource<?>> parentRes = new ArrayList<IInheritedResource<?>>(source.getAllParentResources());
Collections.reverse(parentRes);
for (IInheritedResource<?> parent : parentRes) {
EObject matchee = Matcher.getMatching(context, parent);
if (matchee != null) {
ret.addAll((Collection<? extends FeatureMap.Entry>) matchee.eGet(nonInheritedFeature)); // just like result.addAll(eSuperType.getEAllOperations());
}
}
} catch (ParentResourceNotFoundException e) {
e.printStackTrace();
return context.eGet(nonInheritedFeature);
}
ret.addAll((Collection<? extends FeatureMap.Entry>) context.eGet(nonInheritedFeature)); // After that context.getGroup() is empty :(
return ret;
How appropriately create a 'view' on Feature Map?
[Updated on: Wed, 20 March 2013 07:48] Report message to a moderator
|
|
|
Re: Create a view on a 'merged' feature maps [message #1021491 is a reply to message #1021484] |
Wed, 20 March 2013 08:00 |
Ed Merks Messages: 33141 Registered: July 2009 |
Senior Member |
|
|
Leonid,
Comments below.
On 20/03/2013 8:44 AM, Leonid Ripeynih wrote:
> Hi all!
>
> What am I trying to achive is to create a 'view' on a 'merged' feature
> map, located in different resources. The basic idea is to implement an
> instance model inheritance, just like it's implemented in eCore itself.
>
> I have implemented simple feature inheritance, like it's implemented in
>
> org.eclipse.emf.ecore.impl.EClassImpl.getEAllAttributes()
> org.eclipse.emf.ecore.impl.EClassImpl.getEAllOperations()
>
>
> But, as my model is generated from XSD and order of elements is
> important in some places, there is a need to create a similar view on
> generated 'groups'. Basically what I want to achieve is to create
> 'allGroup' feature, which will walk a list of parent resources and
> create an appropriate view. Here is (a simple and naive) code which do
> work, but empties the 'real' feature map.
>
> FeatureMap ret = new BasicFeatureMap((InternalEObject) context,
> inheritedFeature.getFeatureID(), inheritedFeature);
> IInheritedResource<?> source = (IInheritedResource<?>) res;
> try {
> List<?> parentRes = new
> ArrayList<Object>(source.getAllParentResources());
> Collections.reverse(parentRes);
> for (Object parent : parentRes) {
> EObject matchee = Matcher.getMatching(context, (Resource) parent);
> if (matchee != null) {
> ret.addAll((Collection<? extends FeatureMap.Entry>)
> matchee.eGet(nonInheritedFeature)); // just like
> result.addAll(eSuperType.getEAllOperations());
This likely doesn't work because the feature map entries can be for
containment features so adding them to this feature map will remove them
from the feature map where they are currently contained.
> }
> }
> } catch (ParentResourceNotFoundException e) {
> e.printStackTrace();
> return context.eGet(nonInheritedFeature);
> }
> ret.addAll((Collection<? extends FeatureMap.Entry>)
> context.eGet(nonInheritedFeature)); // After that context.getGroup()
> is empty
> return ret;
>
>
> How appropriately create a 'view' on Feature Map?
I think the best you can achieve is if you make this not be a feature
map but simply a list whose contents happen to be feature map entries.
Ed Merks
Professional Support: https://www.macromodeling.com/
|
|
|
|
Re: Create a view on a 'merged' feature maps [message #1021561 is a reply to message #1021541] |
Wed, 20 March 2013 10:13 |
Ed Merks Messages: 33141 Registered: July 2009 |
Senior Member |
|
|
Leonid,
If you model it as a multi-valued attribute with EFeatureMapEntry as the
attribute type, I think the framework will recognize that they need
wrapping. Hopefully nothing else decides that because
FeatureMapUtil.isFeatureMap returns true that it can cast the list to a
FeatureMap. You'll need to try it out and hope for the best...
On 20/03/2013 10:42 AM, Leonid Ripeynih wrote:
> Thanks for you quick answer, Ed.
>
> Will the EMF.Edit framework correctly work with that approach and
> create correct Wrappers e.t.c for those entries?
Ed Merks
Professional Support: https://www.macromodeling.com/
|
|
|
Powered by
FUDForum. Page generated in 0.03030 seconds