Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian W. Damus2016-07-27 13:20:34 +0000
committerChristian W. Damus2016-07-27 16:20:55 +0000
commit0828025498003cd6ac9d86867288de3a54a09ac3 (patch)
tree2e9a59e6ca9f04d0b698cfc0154bd14989431eb2 /tests/junit/extraplugins
parent7a6013c69d563217cf59525207e4c97e668b92a6 (diff)
downloadorg.eclipse.papyrus-0828025498003cd6ac9d86867288de3a54a09ac3.tar.gz
org.eclipse.papyrus-0828025498003cd6ac9d86867288de3a54a09ac3.tar.xz
org.eclipse.papyrus-0828025498003cd6ac9d86867288de3a54a09ac3.zip
Bug 498282: [Model Import] Visualization of port conjugation does not work on imported structure diagrams
https://bugs.eclipse.org/bugs/show_bug.cgi?id=498282 Make the import tests independent of Papyrus-RT's transformation extension, which populates the UML 2.5 Port::isConjugated attribute from the RSA UML-RT profile's RTPort stereotype. Add a transformation extension that is active only during the tests, which looks for the AnyTypes of missing-schema RTPorts to transfer the 'isConjugate' property to the base port. When Papyrus-RT is installed, it will do this for us and the RTPort stereotype instances will not be AnyTypes, so our transformation extension will have no effect. Change-Id: I34c9a9740cad9beb890564b30b20eab16594a9cd (cherry picked from commit 2edee84d6f43e4ef05cfc74514522b8dd5e1cbe3)
Diffstat (limited to 'tests/junit/extraplugins')
-rw-r--r--tests/junit/extraplugins/migration/org.eclipse.papyrus.migration.rsa.tests/plugin.xml6
-rw-r--r--tests/junit/extraplugins/migration/org.eclipse.papyrus.migration.rsa.tests/src/org/eclipse/papyrus/migration/rsa/tests/UML25HandlerExtension.java153
-rw-r--r--tests/junit/extraplugins/migration/org.eclipse.papyrus.migration.rsa.tests/src/org/eclipse/papyrus/migration/rsa/tests/regression/StructureDiagramTest.java13
3 files changed, 172 insertions, 0 deletions
diff --git a/tests/junit/extraplugins/migration/org.eclipse.papyrus.migration.rsa.tests/plugin.xml b/tests/junit/extraplugins/migration/org.eclipse.papyrus.migration.rsa.tests/plugin.xml
index c58d04c2122..ab5c4ed8ea6 100644
--- a/tests/junit/extraplugins/migration/org.eclipse.papyrus.migration.rsa.tests/plugin.xml
+++ b/tests/junit/extraplugins/migration/org.eclipse.papyrus.migration.rsa.tests/plugin.xml
@@ -35,4 +35,10 @@
</resource>
</extension>
+ <extension
+ point="org.eclipse.papyrus.migration.rsa.extensions">
+ <transformation
+ className="org.eclipse.papyrus.migration.rsa.tests.UML25HandlerExtension">
+ </transformation>
+ </extension>
</plugin>
diff --git a/tests/junit/extraplugins/migration/org.eclipse.papyrus.migration.rsa.tests/src/org/eclipse/papyrus/migration/rsa/tests/UML25HandlerExtension.java b/tests/junit/extraplugins/migration/org.eclipse.papyrus.migration.rsa.tests/src/org/eclipse/papyrus/migration/rsa/tests/UML25HandlerExtension.java
new file mode 100644
index 00000000000..2225eb4f4af
--- /dev/null
+++ b/tests/junit/extraplugins/migration/org.eclipse.papyrus.migration.rsa.tests/src/org/eclipse/papyrus/migration/rsa/tests/UML25HandlerExtension.java
@@ -0,0 +1,153 @@
+/*****************************************************************************
+ * Copyright (c) 2016 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.migration.rsa.tests;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Predicate;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.FeatureMap;
+import org.eclipse.emf.ecore.util.FeatureMapUtil;
+import org.eclipse.m2m.qvt.oml.ExecutionContext;
+import org.eclipse.papyrus.migration.rsa.concurrent.ExecutorsPool;
+import org.eclipse.papyrus.migration.rsa.internal.extension.TransformationExtension;
+import org.eclipse.papyrus.migration.rsa.transformation.ImportTransformation;
+import org.eclipse.uml2.uml.Port;
+
+/**
+ * An extension for the tests only that fills in UML 2.2-to-2.5 gaps
+ * from RSA's UML-RT profile (especially for the Port conjugation semantics).
+ */
+public class UML25HandlerExtension implements TransformationExtension {
+ public static boolean isEnabled = false;
+
+ private List<EObject> umlContents = new ArrayList<>();
+
+ /**
+ * Initializes me.
+ */
+ public UML25HandlerExtension() {
+ super();
+ }
+
+ @Override
+ public Set<EPackage> getAdditionalSourceEPackages() {
+ return Collections.emptySet();
+ }
+
+ @Override
+ public int getNumberOfSteps() {
+ return isEnabled ? 1 : 0;
+ }
+
+ @Override
+ public void setTransformation(ImportTransformation importTransformation) {
+ if (isEnabled) {
+ umlContents.addAll(importTransformation.getInOutUMLModel().getContents());
+ }
+ }
+
+ @Override
+ public IStatus executeBefore(ExecutionContext context, IProgressMonitor monitor) {
+ if (isEnabled) {
+ monitor.beginTask("Populating UML 2.5 attributes", 1);
+
+ try {
+ Predicate<Object> isAnElement = EModelElement.class::isInstance;
+ Predicate<Object> isAnEObject = EObject.class::isInstance;
+ umlContents.stream()
+ .filter(isAnElement.negate().and(isAnEObject))
+ .map(EObject.class::cast)
+ .forEach(this::processStereotypeApplication);
+ } finally {
+ monitor.done();
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ public IStatus executeAfter(ExecutionContext context, IProgressMonitor monitor) {
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ public void setResourceSet(ResourceSet resourceSet) {
+ // Pass
+ }
+
+ @Override
+ public void setExecutorsPool(ExecutorsPool executorsPool) {
+ // Pass
+ }
+
+ //
+ // UML 2.5 conversion
+ //
+
+ private void processStereotypeApplication(EObject stereotypeApplication) {
+ EClass stereotype = stereotypeApplication.eClass();
+ EStructuralFeature anyAttribute = stereotype.getEStructuralFeature("anyAttribute");
+ if ((anyAttribute != null) && FeatureMapUtil.isFeatureMap(anyAttribute)) {
+ FeatureMap featureMap = (FeatureMap) stereotypeApplication.eGet(anyAttribute);
+ Port port = null;
+ Boolean isConjugated = null;
+
+ for (FeatureMap.Entry next : featureMap) {
+ switch (next.getEStructuralFeature().getName()) {
+ case "base_Port":
+ port = dereference(stereotypeApplication, next.getValue(), Port.class);
+ break;
+ case "isConjugate":
+ case "isConjugated":
+ isConjugated = asBoolean(next.getValue());
+ break;
+ }
+ }
+
+ if ((port != null) && (isConjugated != null)) {
+ port.setIsConjugated(isConjugated);
+ }
+ }
+ }
+
+ private <T extends EObject> T dereference(EObject owner, Object reference, Class<? extends T> type) {
+ T result = null;
+
+ if (reference instanceof String) {
+ String fragment = (String) reference;
+ EObject referenced = owner.eResource().getEObject(fragment);
+ if (type.isInstance(referenced)) {
+ result = type.cast(referenced);
+ }
+ }
+
+ return result;
+ }
+
+ private static Boolean asBoolean(Object value) {
+ return (value == null) ? Boolean.FALSE : Boolean.valueOf(value.toString());
+ }
+}
diff --git a/tests/junit/extraplugins/migration/org.eclipse.papyrus.migration.rsa.tests/src/org/eclipse/papyrus/migration/rsa/tests/regression/StructureDiagramTest.java b/tests/junit/extraplugins/migration/org.eclipse.papyrus.migration.rsa.tests/src/org/eclipse/papyrus/migration/rsa/tests/regression/StructureDiagramTest.java
index 23b2ce0c18b..9b2eceeeadd 100644
--- a/tests/junit/extraplugins/migration/org.eclipse.papyrus.migration.rsa.tests/src/org/eclipse/papyrus/migration/rsa/tests/regression/StructureDiagramTest.java
+++ b/tests/junit/extraplugins/migration/org.eclipse.papyrus.migration.rsa.tests/src/org/eclipse/papyrus/migration/rsa/tests/regression/StructureDiagramTest.java
@@ -31,13 +31,16 @@ import org.eclipse.gmf.runtime.notation.Size;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.papyrus.junit.utils.rules.AnnotationRule;
import org.eclipse.papyrus.junit.utils.rules.PluginResource;
+import org.eclipse.papyrus.migration.rsa.tests.UML25HandlerExtension;
import org.eclipse.papyrus.migration.rsa.tests.qvt.AbstractTransformationTest;
import org.eclipse.papyrus.uml.diagram.composite.edit.parts.ClassCompositeCompartmentEditPart;
import org.eclipse.papyrus.uml.diagram.composite.edit.parts.ClassCompositeEditPart;
import org.eclipse.papyrus.uml.diagram.composite.edit.parts.ClassCompositeNameEditPart;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Port;
+import org.junit.AfterClass;
import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
@@ -161,4 +164,14 @@ public class StructureDiagramTest extends AbstractTransformationTest {
openEditor();
}
+
+ @BeforeClass
+ public static void enableUML25Transformation() {
+ UML25HandlerExtension.isEnabled = true;
+ }
+
+ @AfterClass
+ public static void disableUML25Transformation() {
+ UML25HandlerExtension.isEnabled = false;
+ }
}

Back to the top