diff options
author | Christian W. Damus | 2016-07-27 13:20:34 +0000 |
---|---|---|
committer | Christian W. Damus | 2016-07-27 16:20:55 +0000 |
commit | 0828025498003cd6ac9d86867288de3a54a09ac3 (patch) | |
tree | 2e9a59e6ca9f04d0b698cfc0154bd14989431eb2 /tests/junit/extraplugins | |
parent | 7a6013c69d563217cf59525207e4c97e668b92a6 (diff) | |
download | org.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')
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; + } } |