Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcbrun2016-01-08 13:28:56 +0000
committercbrun2016-01-18 14:20:51 +0000
commitb67fefd9e3b1da0a1d7e1fa61629f8110950349a (patch)
treeb7071a6786c669ce538e548789d487718415aed1
parent97e94f0306b1ec1194f707d5bfd472e54d13f082 (diff)
downloadorg.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.java52
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.

Back to the top