diff options
| author | cbrun | 2016-01-08 13:28:56 +0000 |
|---|---|---|
| committer | cbrun | 2016-01-18 14:20:51 +0000 |
| commit | b67fefd9e3b1da0a1d7e1fa61629f8110950349a (patch) | |
| tree | b7071a6786c669ce538e548789d487718415aed1 | |
| parent | 97e94f0306b1ec1194f707d5bfd472e54d13f082 (diff) | |
| download | org.eclipse.sirius-b67fefd9e3b1da0a1d7e1fa61629f8110950349a.tar.gz org.eclipse.sirius-b67fefd9e3b1da0a1d7e1fa61629f8110950349a.tar.xz org.eclipse.sirius-b67fefd9e3b1da0a1d7e1fa61629f8110950349a.zip | |
[483577] Use the EPackageRegistry when the selection has no session
Declare all the EPackage instances which are found and resolved (not
instances of EPackageDescriptor) in the intepreter context if the
current selection is not currently managed by Sirius.
Bug: 483577
Change-Id: Ifd028768a353f88417ec984796ed017e76a6b70e
| -rw-r--r-- | plugins/org.eclipse.sirius.interpreter/src/org/eclipse/sirius/common/acceleo/interpreter/SiriusEvaluationTask.java | 52 |
1 files changed, 47 insertions, 5 deletions
diff --git a/plugins/org.eclipse.sirius.interpreter/src/org/eclipse/sirius/common/acceleo/interpreter/SiriusEvaluationTask.java b/plugins/org.eclipse.sirius.interpreter/src/org/eclipse/sirius/common/acceleo/interpreter/SiriusEvaluationTask.java index 97543062ea..0aa1e2d7da 100644 --- a/plugins/org.eclipse.sirius.interpreter/src/org/eclipse/sirius/common/acceleo/interpreter/SiriusEvaluationTask.java +++ b/plugins/org.eclipse.sirius.interpreter/src/org/eclipse/sirius/common/acceleo/interpreter/SiriusEvaluationTask.java @@ -27,6 +27,7 @@ import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.sirius.business.api.session.Session; import org.eclipse.sirius.business.api.session.SessionManager; import org.eclipse.sirius.common.tools.api.interpreter.CompoundInterpreter; @@ -38,6 +39,7 @@ import org.eclipse.sirius.ecore.extender.business.api.accessor.EcoreMetamodelDes import org.eclipse.sirius.ecore.extender.business.api.accessor.MetamodelDescriptor; import org.eclipse.sirius.viewpoint.DSemanticDecorator; +import com.google.common.collect.Iterables; import com.google.common.collect.Sets; /** @@ -97,12 +99,10 @@ public class SiriusEvaluationTask implements Callable<EvaluationResult> { * the current selection is known by the interpreter. */ Collection<MetamodelDescriptor> mmDescriptors = Sets.newLinkedHashSet(); - for (EObject targetEObject : context.getTargetEObjects()) { - EPackage ePackage = targetEObject.eClass().getEPackage(); - if (ePackage != null) { - mmDescriptors.add(new EcoreMetamodelDescriptor(ePackage)); - } + final Set<EPackage> knownEPackages = collectEPackagesToRegister(target); + for (EPackage ePackage : knownEPackages) { + mmDescriptors.add(new EcoreMetamodelDescriptor(ePackage)); } vpInterpreter.activateMetamodels(mmDescriptors); @@ -136,6 +136,48 @@ public class SiriusEvaluationTask implements Callable<EvaluationResult> { return evaluationResult; } + private Set<EPackage> collectEPackagesToRegister(final EObject target) { + final Set<EPackage.Registry> localEPackageRegistries = Sets.newLinkedHashSet(); + final Set<EPackage> knownEPackages = Sets.newLinkedHashSet(); + + for (EObject targetEObject : Iterables.filter(context.getTargetNotifiers(), EObject.class)) { + + EPackage ePackage = targetEObject.eClass().getEPackage(); + if (ePackage != null && ePackage.getNsURI() != null) { + knownEPackages.add(ePackage); + } + Resource targetEObjectResource = targetEObject.eResource(); + if (targetEObjectResource != null && targetEObjectResource.getResourceSet() != null) { + localEPackageRegistries.add(targetEObjectResource.getResourceSet().getPackageRegistry()); + } + } + Set<String> localyRegisteredNsURIs = Sets.newLinkedHashSet(); + for (EPackage.Registry registry : localEPackageRegistries) { + localyRegisteredNsURIs.addAll(registry.keySet()); + for (String nsURI : registry.keySet()) { + /* + * we get the instance by using Map.get() instead of + * getEPackage() in order to avoid resolving EPackages which + * would be registered but not used yet. + */ + Object value = registry.get(nsURI); + if (value instanceof EPackage) { + knownEPackages.add((EPackage) value); + } + } + } + + for (String nsURI : EPackage.Registry.INSTANCE.keySet()) { + if (localyRegisteredNsURIs.size() == 0 || !localyRegisteredNsURIs.contains(nsURI)) { + Object value = EPackage.Registry.INSTANCE.get(nsURI); + if (value instanceof EPackage) { + knownEPackages.add((EPackage) value); + } + } + } + return knownEPackages; + } + /** * This will create the status that allows the interpreter to display the * type and size of the result object for successful evaluations. |
