Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandra Buzila2016-01-22 04:40:18 -0500
committerLaurent Delaigue2016-06-10 04:34:40 -0400
commit6dfd995b7164e7a69aee10eaaf9858c5fb7c485e (patch)
tree6fde210d867b7c4bef4f6e1ee54a2daa7280baaf
parent814919e9de93aacc099b18fd76dac201e115b465 (diff)
downloadorg.eclipse.emf.compare-6dfd995b7164e7a69aee10eaaf9858c5fb7c485e.tar.gz
org.eclipse.emf.compare-6dfd995b7164e7a69aee10eaaf9858c5fb7c485e.tar.xz
org.eclipse.emf.compare-6dfd995b7164e7a69aee10eaaf9858c5fb7c485e.zip
[479449] Introduce MultiplicityElementChanges
Created new UMLDiff type for changes of MultiplicityElements. Contribution also contains PostProcessor that ensures that the conflicts between MultiplicityElements are correct with respect to their type. Includes tests. Bug: 479449 CQ: 11548 Change-Id: I9faefd2dc948b1d2ea8e45ef232e9c82a9285f74 Also-by: Laurent Delaigue <laurent.delaigue@obeo.fr> Signed-off-by: Alexandra Buzila <abuzila@eclipsesource.com> Signed-off-by: Laurent Delaigue <laurent.delaigue@obeo.fr>
-rw-r--r--plugins/org.eclipse.emf.compare.diagram.papyrus.tests/META-INF/MANIFEST.MF8
-rw-r--r--plugins/org.eclipse.emf.compare.diagram.papyrus.tests/pom.xml2
-rw-r--r--plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/EdgeMergeTest.java25
-rw-r--r--plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/NodeMergeTest.java20
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.edit/META-INF/MANIFEST.MF14
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.edit/icons/full/obj16/MultiplicityElementChange.gifbin0 -> 129 bytes
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.edit/icons/full/obj16/MultiplicityReferenceChange.gifbin0 -> 129 bytes
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.edit/plugin.properties6
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.edit/pom.xml2
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/MultiplicityElementChangeItemProvider.java107
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/UMLCompareItemProviderAdapterFactory.java23
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/MultiplicityElementCustomItemProvider.java96
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/UMLCompareCustomItemProviderAdapterFactory.java8
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.rcp.ui/META-INF/MANIFEST.MF8
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.rcp.ui/plugin.xml4
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.rcp.ui/pom.xml2
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.rcp.ui/src/org/eclipse/emf/compare/uml2/rcp/ui/internal/accessor/MultiplicityElementAttributeChangeAccessor.java70
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.rcp.ui/src/org/eclipse/emf/compare/uml2/rcp/ui/internal/accessor/factory/MultiplicityElementAttributeChangeAccessorFactory.java62
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/META-INF/MANIFEST.MF2
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/pom.xml2
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation2Test.java37
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation3Test.java37
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociationTest.java38
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/ChangeAssociationTest.java6
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/implications/ImplicationsAssociationTest.java33
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/MultiplicityElementChangesTest.java600
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/left.uml9
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/origin.uml8
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/right.uml9
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/left.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/origin.uml8
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/right.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/left.uml9
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/origin.uml9
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/right.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/left.uml9
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/origin.uml8
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/right.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/left.uml9
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/origin.uml8
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/right.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/left.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/origin.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/right.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/left.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/origin.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/right.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/left.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/origin.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/right.uml8
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/left.uml9
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/origin.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/right.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/left.uml9
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/origin.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/right.uml9
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/left.uml8
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/origin.uml9
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/right.uml10
-rw-r--r--plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/suite/AllTests.java12
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/META-INF/MANIFEST.MF8
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/model/uml2compare.ecore1
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/plugin.xml9
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/pom.xml2
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/MultiplicityElementChange.java23
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLCompareFactory.java9
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLComparePackage.java204
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/MultiplicityElementChangeImpl.java61
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLCompareFactoryImpl.java12
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLComparePackageImpl.java134
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareAdapterFactory.java19
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareSwitch.java26
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/MultiplicityElementChangePostProcessor.java303
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/MultiplicityElementChangeFactory.java156
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/UMLExtensionFactoryRegistry.java3
75 files changed, 2375 insertions, 127 deletions
diff --git a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/META-INF/MANIFEST.MF
index 4b04a1947..226144562 100644
--- a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.emf.compare.diagram.papyrus.tests;singleton:=true
-Bundle-Version: 2.5.0.qualifier
+Bundle-Version: 2.5.1.qualifier
Require-Bundle: org.eclipse.core.runtime,
org.junit,
org.eclipse.osgi,
@@ -26,9 +26,9 @@ Require-Bundle: org.eclipse.core.runtime,
org.eclipse.emf.compare.rcp.ui;bundle-version="4.0.0",
org.eclipse.emf.compare.ide;bundle-version="3.2.0",
org.eclipse.emf.compare.ide.ui,
- org.eclipse.emf.compare.uml2;bundle-version="2.1.0",
- org.eclipse.emf.compare.uml2.edit;bundle-version="2.2.0",
- org.eclipse.emf.compare.uml2.rcp.ui;bundle-version="2.2.0",
+ org.eclipse.emf.compare.uml2;bundle-version="2.5.0",
+ org.eclipse.emf.compare.uml2.edit;bundle-version="2.5.0",
+ org.eclipse.emf.compare.uml2.rcp.ui;bundle-version="2.5.0",
org.eclipse.emf.compare.diagram,
org.eclipse.emf.compare.diagram.edit;bundle-version="2.3.0",
org.eclipse.emf.compare.diagram.ide.ui;bundle-version="3.1.0",
diff --git a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/pom.xml b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/pom.xml
index f877b2b2e..1803a3983 100644
--- a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/pom.xml
+++ b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/pom.xml
@@ -10,7 +10,7 @@
</parent>
<groupId>org.eclipse.emf.compare</groupId>
<artifactId>org.eclipse.emf.compare.diagram.papyrus.tests</artifactId>
- <version>2.5.0-SNAPSHOT</version>
+ <version>2.5.1-SNAPSHOT</version>
<packaging>eclipse-test-plugin</packaging>
<build>
diff --git a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/EdgeMergeTest.java b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/EdgeMergeTest.java
index 0bd21ee1a..f573264c2 100644
--- a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/EdgeMergeTest.java
+++ b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/EdgeMergeTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2013 Obeo.
+ * Copyright (c) 2013, 2016 Obeo 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
@@ -19,6 +19,7 @@ import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import java.io.IOException;
+import java.util.regex.Pattern;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.emf.compare.Comparison;
@@ -30,8 +31,10 @@ import org.eclipse.emf.compare.diagram.internal.extensions.NodeChange;
import org.eclipse.emf.compare.diagram.papyrus.tests.AbstractTest;
import org.eclipse.emf.compare.diagram.papyrus.tests.DiagramInputData;
import org.eclipse.emf.compare.diagram.papyrus.tests.merge.data.EdgeMergeInputData;
+import org.eclipse.emf.compare.tests.postprocess.data.TestPostProcessor;
import org.eclipse.emf.compare.uml2.internal.AssociationChange;
import org.eclipse.emf.compare.uml2.internal.DirectedRelationshipChange;
+import org.eclipse.emf.compare.uml2.internal.postprocessor.MultiplicityElementChangePostProcessor;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.uml2.uml.UMLPackage;
@@ -42,12 +45,12 @@ public class EdgeMergeTest extends AbstractTest {
private EdgeMergeInputData input = new EdgeMergeInputData();
private static final int A1_EDGECHANGE_NB = 19;
- private static final int A1_ASSOCHANGE_NB = 14;
+ private static final int A1_ASSOCHANGE_NB = 18;
private static final int A1_DIFFS_NB = A1_EDGECHANGE_NB + A1_ASSOCHANGE_NB;
private static final int A2_EDGECHANGE_NB = 19;
private static final int A2_NODECHANGE_NB = 26;
- private static final int A2_ASSOCHANGE_NB = 14;
+ private static final int A2_ASSOCHANGE_NB = 18;
private static final int A2_CLASSCHANGE_NB = 1;
private static final int A2_DIFFS_NB = A2_EDGECHANGE_NB + A2_NODECHANGE_NB + A2_ASSOCHANGE_NB + A2_CLASSCHANGE_NB;
@@ -107,7 +110,7 @@ public class EdgeMergeTest extends AbstractTest {
private static final int A6_SUBSTITUTION_CHANGE1_NB = 6;
private static final int A6_IREAL_CHANGE1_NB = 6;
private static final int A6_DEPENDENCY_CHANGES_NB = 8 * A6_DEPENDENCY_CHANGE1_NB + 2 * A6_SUBSTITUTION_CHANGE1_NB + A6_IREAL_CHANGE1_NB;
- private static final int A6_ASSO_CHANGE1_NB = 14;
+ private static final int A6_ASSO_CHANGE1_NB = 18;
private static final int A6_ASSO_CHANGES_NB = 2 * A6_ASSO_CHANGE1_NB;
private static final int A6_IMPORT_CHANGE1_NB = 3;
private static final int A6_IMPORT_CHANGES_NB = 2 * A6_IMPORT_CHANGE1_NB;
@@ -1739,5 +1742,17 @@ public class EdgeMergeTest extends AbstractTest {
protected DiagramInputData getInput() {
return input;
}
-
+
+ @Override
+ protected void registerPostProcessors() {
+ super.registerPostProcessors();
+ getPostProcessorRegistry()
+ .put(MultiplicityElementChangePostProcessor.class.getName(),
+ new TestPostProcessor.TestPostProcessorDescriptor(
+ Pattern.compile("http://www.eclipse.org/uml2/\\d\\.0\\.0/UML"),
+ null,
+ new MultiplicityElementChangePostProcessor(),
+ 25));
+ }
+
}
diff --git a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/NodeMergeTest.java b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/NodeMergeTest.java
index 03365c541..9169f7800 100644
--- a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/NodeMergeTest.java
+++ b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/merge/NodeMergeTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2013, 2015 Obeo and others.
+ * Copyright (c) 2013, 2016 Obeo 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
@@ -8,6 +8,7 @@
* Contributors:
* Obeo - initial API and implementation
* Philip Langer - bug 482404
+ * Alexandra Buzila - Bug 479449
*******************************************************************************/
package org.eclipse.emf.compare.diagram.papyrus.tests.merge;
@@ -23,6 +24,7 @@ import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import java.io.IOException;
+import java.util.regex.Pattern;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.emf.compare.AttributeChange;
@@ -38,7 +40,9 @@ import org.eclipse.emf.compare.diagram.internal.extensions.NodeChange;
import org.eclipse.emf.compare.diagram.papyrus.tests.AbstractTest;
import org.eclipse.emf.compare.diagram.papyrus.tests.DiagramInputData;
import org.eclipse.emf.compare.diagram.papyrus.tests.merge.data.NodeMergeInputData;
+import org.eclipse.emf.compare.tests.postprocess.data.TestPostProcessor;
import org.eclipse.emf.compare.uml2.internal.AssociationChange;
+import org.eclipse.emf.compare.uml2.internal.postprocessor.MultiplicityElementChangePostProcessor;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.uml2.uml.UMLPackage;
@@ -68,7 +72,7 @@ public class NodeMergeTest extends AbstractTest {
private static final int A1_ELTCHANGES_NB = 8 * A1_ELTCHANGE1_NB;
- private static final int A1_ASSOCHANGE1_NB = 14;
+ private static final int A1_ASSOCHANGE1_NB = 18;
private static final int A1_ASSOCHANGES_NB = 3 * A1_ASSOCHANGE1_NB;
@@ -1509,4 +1513,16 @@ public class NodeMergeTest extends AbstractTest {
};
}
+ @Override
+ protected void registerPostProcessors() {
+ super.registerPostProcessors();
+ getPostProcessorRegistry()
+ .put(MultiplicityElementChangePostProcessor.class.getName(),
+ new TestPostProcessor.TestPostProcessorDescriptor(
+ Pattern.compile("http://www.eclipse.org/uml2/\\d\\.0\\.0/UML"),
+ null,
+ new MultiplicityElementChangePostProcessor(),
+ 25));
+ }
+
}
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare.uml2.edit/META-INF/MANIFEST.MF
index 34d915077..d917dcba7 100644
--- a/plugins/org.eclipse.emf.compare.uml2.edit/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/META-INF/MANIFEST.MF
@@ -2,22 +2,22 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.emf.compare.uml2.edit;singleton:=true
-Bundle-Version: 2.4.0.qualifier
+Bundle-Version: 2.5.0.qualifier
Bundle-ClassPath: .
Bundle-Activator: org.eclipse.emf.compare.uml2.internal.provider.UMLCompareEditPlugin$Implementation
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.emf.compare.uml2;visibility:=reexport,
+ org.eclipse.emf.compare.uml2;bundle-version="2.5.0";visibility:=reexport,
org.eclipse.emf.edit;visibility:=reexport,
org.eclipse.emf.ecore;visibility:=reexport,
org.eclipse.emf.ecore.edit;visibility:=reexport,
- org.eclipse.uml2.uml;bundle-version="5.0.0",
- org.eclipse.emf.compare,
- org.eclipse.uml2.uml.edit;bundle-version="5.0.0",
- org.eclipse.uml2.types,
- org.eclipse.emf.compare.edit
+ org.eclipse.uml2.uml;bundle-version="5.0.0";visibility:=reexport,
+ org.eclipse.emf.compare;bundle-version="3.4.0";visibility:=reexport,
+ org.eclipse.uml2.uml.edit;bundle-version="5.0.0";visibility:=reexport,
+ org.eclipse.uml2.types;visibility:=reexport,
+ org.eclipse.emf.compare.edit;bundle-version="4.2.0";visibility:=reexport
Bundle-ActivationPolicy: lazy
Import-Package: com.google.common.base;version="[11.0.0,16.0.0)",
com.google.common.collect;version="[11.0.0,16.0.0)",
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/icons/full/obj16/MultiplicityElementChange.gif b/plugins/org.eclipse.emf.compare.uml2.edit/icons/full/obj16/MultiplicityElementChange.gif
new file mode 100644
index 000000000..98b351f1c
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/icons/full/obj16/MultiplicityElementChange.gif
Binary files differ
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/icons/full/obj16/MultiplicityReferenceChange.gif b/plugins/org.eclipse.emf.compare.uml2.edit/icons/full/obj16/MultiplicityReferenceChange.gif
new file mode 100644
index 000000000..1e5345fb3
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/icons/full/obj16/MultiplicityReferenceChange.gif
Binary files differ
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/plugin.properties b/plugins/org.eclipse.emf.compare.uml2.edit/plugin.properties
index 6270b66ba..ff5fe7a53 100644
--- a/plugins/org.eclipse.emf.compare.uml2.edit/plugin.properties
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/plugin.properties
@@ -166,7 +166,9 @@ _UI_StereotypedElementChange_type = Stereotyped Element Change
_UI_StereotypedElementChange_stereotypeApplications_feature = Stereotype Applications
_UI_OpaqueElementBodyChange_type = Opaque Element Body Change
_UI_OpaqueElementBodyChange_language_feature = Language
+_UI_DanglingStereotypeApplication_type = Dangling Stereotype Application
+_UI_MultiplicityReferenceChange_type = Multiplicity Reference Change
-#Error messaged
+#Error messages
Unable_To_Retreive_Icon_Error_Message = "Unable to retrieve the icon at location {0}
-_UI_DanglingStereotypeApplication_type = Dangling Stereotype Application
+_UI_MultiplicityElementChange_type = Multiplicity Element Change
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/pom.xml b/plugins/org.eclipse.emf.compare.uml2.edit/pom.xml
index c67ead258..efbaa1c29 100644
--- a/plugins/org.eclipse.emf.compare.uml2.edit/pom.xml
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/pom.xml
@@ -10,6 +10,6 @@
</parent>
<groupId>org.eclipse.emf.compare</groupId>
<artifactId>org.eclipse.emf.compare.uml2.edit</artifactId>
- <version>2.4.0-SNAPSHOT</version>
+ <version>2.5.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/MultiplicityElementChangeItemProvider.java b/plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/MultiplicityElementChangeItemProvider.java
new file mode 100644
index 000000000..684a9b634
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/MultiplicityElementChangeItemProvider.java
@@ -0,0 +1,107 @@
+/**
+ * Copyright (c) 2012 Obeo.
+ * 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:
+ * Obeo - initial API and implementation
+ */
+package org.eclipse.emf.compare.uml2.internal.provider;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.compare.DifferenceKind;
+
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class MultiplicityElementChangeItemProvider extends UMLDiffItemProvider {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public MultiplicityElementChangeItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This returns MultiplicityElementChange.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/MultiplicityElementChange")); //$NON-NLS-1$
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ DifferenceKind labelValue = ((MultiplicityElementChange)object).getKind();
+ String label = labelValue == null ? null : labelValue.toString();
+ return label == null || label.length() == 0 ? getString("_UI_MultiplicityElementChange_type") : //$NON-NLS-1$
+ getString("_UI_MultiplicityElementChange_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+ }
+
+}
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/UMLCompareItemProviderAdapterFactory.java b/plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/UMLCompareItemProviderAdapterFactory.java
index 24e9feecc..fa29b773d 100644
--- a/plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/UMLCompareItemProviderAdapterFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/src-gen/org/eclipse/emf/compare/uml2/internal/provider/UMLCompareItemProviderAdapterFactory.java
@@ -261,6 +261,29 @@ public class UMLCompareItemProviderAdapterFactory extends UMLCompareAdapterFacto
}
/**
+ * This keeps track of the one adapter used for all {@link org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected MultiplicityElementChangeItemProvider multiplicityElementChangeItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createMultiplicityElementChangeAdapter() {
+ if (multiplicityElementChangeItemProvider == null) {
+ multiplicityElementChangeItemProvider = new MultiplicityElementChangeItemProvider(this);
+ }
+
+ return multiplicityElementChangeItemProvider;
+ }
+
+ /**
* This returns the root adapter factory that contains this factory.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/MultiplicityElementCustomItemProvider.java b/plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/MultiplicityElementCustomItemProvider.java
new file mode 100644
index 000000000..bbc183ce2
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/MultiplicityElementCustomItemProvider.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource Muenchen GmbH 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:
+ * Alexandra Buzila - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.uml2.internal.provider.custom;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.provider.ExtendedAdapterFactoryItemDelegator;
+import org.eclipse.emf.compare.provider.utils.ComposedStyledString;
+import org.eclipse.emf.compare.provider.utils.IStyledString.IComposedStyledString;
+import org.eclipse.emf.compare.provider.utils.IStyledString.Style;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * Custom {@link UMLDiffCustomItemProvider} for {@link MultiplicityElementChange MultiplicityElementChanges}
+ * that handles {@link org.eclipse.emf.compare.provider.IItemStyledLabelProvider} .
+ *
+ * @author Alexandra Buzila
+ */
+public class MultiplicityElementCustomItemProvider extends UMLDiffCustomItemProvider {
+
+ /** Item delegator that reuses the root adapter factory (if any). */
+ private ExtendedAdapterFactoryItemDelegator itemDelegator;
+
+ /**
+ * Constructs a new instance of the item provider.
+ *
+ * @param adapterFactory
+ * the adapter factory to use.
+ */
+ public MultiplicityElementCustomItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ itemDelegator = new ExtendedAdapterFactoryItemDelegator(getRootAdapterFactory());
+ }
+
+ @Override
+ public IComposedStyledString getStyledText(Object object) {
+ MultiplicityElementChange diff = (MultiplicityElementChange)object;
+ IComposedStyledString styledText = new ComposedStyledString(getInternalText(diff));
+ String changedFeature = getChangedFeatureText(diff);
+ styledText.append(" [" + changedFeature, Style.DECORATIONS_STYLER); //$NON-NLS-1$
+ switch (diff.getKind()) {
+ case ADD:
+ styledText.append(" add", Style.DECORATIONS_STYLER); //$NON-NLS-1$
+ break;
+ case DELETE:
+ styledText.append(" delete", Style.DECORATIONS_STYLER); //$NON-NLS-1$
+ break;
+ case CHANGE:
+ styledText.append(" change", Style.DECORATIONS_STYLER); //$NON-NLS-1$
+ break;
+ default:
+ throw new IllegalStateException("Unsupported " + DifferenceKind.class.getSimpleName() //$NON-NLS-1$
+ + " value: " + diff.getKind()); //$NON-NLS-1$
+ }
+ styledText.append("]", Style.DECORATIONS_STYLER); //$NON-NLS-1$
+ return styledText;
+
+ }
+
+ /**
+ * Provides the name of the MultiplicityElement's structural feature affected by this diff. This will be
+ * either the <code>lowerValue</code> or <code>upperValue</code>.
+ *
+ * @param diff
+ * the {@link MultiplicityElementChange}
+ * @return the name of the feature
+ */
+ private String getChangedFeatureText(MultiplicityElementChange diff) {
+ return diff.getDiscriminant().eContainmentFeature().getName();
+ }
+
+ /**
+ * Provides the default label of the given diff.
+ *
+ * @param diff
+ * the {@link MultiplicityElementChange} for which the label is returned
+ * @return the label
+ */
+ private String getInternalText(MultiplicityElementChange diff) {
+ EObject discriminant = diff.getDiscriminant();
+ String text = itemDelegator.getText(discriminant);
+ if (text == null) {
+ text = "<null>"; //$NON-NLS-1$
+ }
+ return text;
+ }
+}
diff --git a/plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/UMLCompareCustomItemProviderAdapterFactory.java b/plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/UMLCompareCustomItemProviderAdapterFactory.java
index 8238ba659..db59d5d72 100644
--- a/plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/UMLCompareCustomItemProviderAdapterFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2.edit/src/org/eclipse/emf/compare/uml2/internal/provider/custom/UMLCompareCustomItemProviderAdapterFactory.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2012, 2015 Obeo and others.
+ * Copyright (c) 2012, 2016 Obeo 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
@@ -8,6 +8,7 @@
* Contributors:
* Obeo - initial API and implementation
* Philip Langer - added OpaqueElementBodyChange adapter
+ * Alexandra Buzila - MultiplicityElementChange adapter
*/
package org.eclipse.emf.compare.uml2.internal.provider.custom;
@@ -128,6 +129,11 @@ public class UMLCompareCustomItemProviderAdapterFactory extends UMLCompareAdapte
return new DanglingStereotypeApplicationCustomItemProvider(this);
}
+ @Override
+ public Adapter createMultiplicityElementChangeAdapter() {
+ return new MultiplicityElementCustomItemProvider(this);
+ }
+
/**
* {@inheritDoc}
*
diff --git a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/META-INF/MANIFEST.MF
index 46ddd4656..714f308ed 100644
--- a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/META-INF/MANIFEST.MF
@@ -2,14 +2,14 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.emf.compare.uml2.rcp.ui;singleton:=true
-Bundle-Version: 2.4.0.qualifier
+Bundle-Version: 2.5.0.qualifier
Bundle-Vendor: %providerName
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Require-Bundle: org.eclipse.emf.edit.ui;bundle-version="2.5.0",
- org.eclipse.emf.compare.uml2.edit;bundle-version="2.0.1",
- org.eclipse.emf.compare;bundle-version="2.0.1",
+ org.eclipse.emf.compare.uml2.edit;bundle-version="2.5.0",
+ org.eclipse.emf.compare;bundle-version="3.4.0",
org.eclipse.swt;bundle-version="3.5.0",
- org.eclipse.emf.compare.rcp.ui;bundle-version="2.0.1",
+ org.eclipse.emf.compare.rcp.ui;bundle-version="4.3.0",
org.eclipse.core.runtime;bundle-version="3.5.0",
org.eclipse.uml2.uml;bundle-version="5.0.0",
org.eclipse.emf.compare.edit;bundle-version="3.0.0"
diff --git a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/plugin.xml b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/plugin.xml
index 0705d28a3..3cad92600 100644
--- a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/plugin.xml
+++ b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/plugin.xml
@@ -35,6 +35,10 @@
class="org.eclipse.emf.compare.uml2.rcp.ui.internal.accessor.factory.UMLDanglingStereotypeApplicationAccessorFactory"
ranking="25">
</factory>
+ <factory
+ class="org.eclipse.emf.compare.uml2.rcp.ui.internal.accessor.factory.MultiplicityElementAttributeChangeAccessorFactory"
+ ranking="25">
+ </factory>
</extension>
<extension
point="org.eclipse.emf.compare.rcp.ui.filters">
diff --git a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/pom.xml b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/pom.xml
index 1d49393a2..2c6abad95 100644
--- a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/pom.xml
+++ b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/pom.xml
@@ -10,6 +10,6 @@
</parent>
<groupId>org.eclipse.emf.compare</groupId>
<artifactId>org.eclipse.emf.compare.uml2.rcp.ui</artifactId>
- <version>2.4.0-SNAPSHOT</version>
+ <version>2.5.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/src/org/eclipse/emf/compare/uml2/rcp/ui/internal/accessor/MultiplicityElementAttributeChangeAccessor.java b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/src/org/eclipse/emf/compare/uml2/rcp/ui/internal/accessor/MultiplicityElementAttributeChangeAccessor.java
new file mode 100644
index 000000000..07b44dfc3
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/src/org/eclipse/emf/compare/uml2/rcp/ui/internal/accessor/MultiplicityElementAttributeChangeAccessor.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource Muenchen GmbH 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:
+ * Alexandra Buzila - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.uml2.rcp.ui.internal.accessor;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.compare.AttributeChange;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.impl.SingleStructuralFeatureAccessorImpl;
+import org.eclipse.emf.compare.rcp.ui.internal.util.MergeViewerUtil;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.utils.ReferenceUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+/**
+ * Change accessor for {@link MultiplicityElementChange MultiplicityElementChanges} whose prime refining is an
+ * {@link AttributeChange}.
+ *
+ * @author Alexandra Buzila
+ */
+@SuppressWarnings("restriction")
+public class MultiplicityElementAttributeChangeAccessor extends SingleStructuralFeatureAccessorImpl {
+
+ /**
+ * A specific {@link SingleStructuralFeatureAccessorImpl} for {@link MultiplicityElementChange
+ * MultiplicityElementChanges}.
+ *
+ * @param adapterFactory
+ * the adapter factory used to create the accessor
+ * @param diff
+ * the diff associated with this accessor
+ * @param side
+ * the side of the accessor
+ */
+ public MultiplicityElementAttributeChangeAccessor(AdapterFactory adapterFactory, Diff diff,
+ MergeViewerSide side) {
+ super(adapterFactory, diff, side);
+ }
+
+ @Override
+ protected EStructuralFeature getAffectedFeature(Diff diff) {
+ Diff primeRefining = diff.getPrimeRefining();
+ return MergeViewerUtil.getAffectedFeature(primeRefining);
+ }
+
+ @Override
+ public EObject getEObject(MergeViewerSide side) {
+ Match match = getInitialDiff().getMatch();
+ EObject multiplicityElement = MergeViewerUtil.getEObject(match, side);
+ if (multiplicityElement == null) {
+ return null;
+ }
+ MultiplicityElementChange change = (MultiplicityElementChange)getInitialDiff();
+ // the lowerValue/upperValue feature affected by the diff
+ EReference multiplicityElementFeature = change.getDiscriminant().eContainmentFeature();
+ return (EObject)ReferenceUtil.safeEGet(multiplicityElement, multiplicityElementFeature);
+ }
+
+}
diff --git a/plugins/org.eclipse.emf.compare.uml2.rcp.ui/src/org/eclipse/emf/compare/uml2/rcp/ui/internal/accessor/factory/MultiplicityElementAttributeChangeAccessorFactory.java b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/src/org/eclipse/emf/compare/uml2/rcp/ui/internal/accessor/factory/MultiplicityElementAttributeChangeAccessorFactory.java
new file mode 100644
index 000000000..873cacb09
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.rcp.ui/src/org/eclipse/emf/compare/uml2/rcp/ui/internal/accessor/factory/MultiplicityElementAttributeChangeAccessorFactory.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource Muenchen GmbH 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:
+ * Alexandra Buzila - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.uml2.rcp.ui.internal.accessor.factory;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.compare.AttributeChange;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.legacy.ITypedElement;
+import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.factory.impl.AbstractAccessorFactory;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.uml2.rcp.ui.internal.accessor.MultiplicityElementAttributeChangeAccessor;
+
+/**
+ * Custom {@link AbstractAccessorFactory} for {@link MultiplicityElementChange} elements.
+ *
+ * @author Alexandra Buzila
+ */
+@SuppressWarnings("restriction")
+public class MultiplicityElementAttributeChangeAccessorFactory extends AbstractAccessorFactory {
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isFactoryFor(Object target) {
+ return target instanceof MultiplicityElementChange && ((MultiplicityElementChange)target)
+ .getPrimeRefining() instanceof AttributeChange;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public ITypedElement createAncestor(AdapterFactory adapterFactory, Object target) {
+ return new MultiplicityElementAttributeChangeAccessor(adapterFactory, (Diff)target,
+ MergeViewerSide.ANCESTOR);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public ITypedElement createLeft(AdapterFactory adapterFactory, Object target) {
+ return new MultiplicityElementAttributeChangeAccessor(adapterFactory, (Diff)target,
+ MergeViewerSide.LEFT);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public ITypedElement createRight(AdapterFactory adapterFactory, Object target) {
+ return new MultiplicityElementAttributeChangeAccessor(adapterFactory, (Diff)target,
+ MergeViewerSide.RIGHT);
+ }
+
+}
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare.uml2.tests/META-INF/MANIFEST.MF
index 61b3200bf..4ece10f39 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.emf.compare.uml2.tests;singleton:=true
-Bundle-Version: 2.4.0.qualifier
+Bundle-Version: 2.5.0.qualifier
Bundle-ClassPath: .
Bundle-Vendor: %providerName
Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/pom.xml b/plugins/org.eclipse.emf.compare.uml2.tests/pom.xml
index 93d597e19..01ef916f0 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/pom.xml
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/pom.xml
@@ -10,7 +10,7 @@
</parent>
<groupId>org.eclipse.emf.compare</groupId>
<artifactId>org.eclipse.emf.compare.uml2.tests</artifactId>
- <version>2.4.0-SNAPSHOT</version>
+ <version>2.5.0-SNAPSHOT</version>
<packaging>eclipse-test-plugin</packaging>
<build>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation2Test.java b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation2Test.java
index 3fb9e82b0..96c07f7b5 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation2Test.java
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation2Test.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2012, 2014 Obeo.
+ * Copyright (c) 2012, 2016 Obeo 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
@@ -29,11 +29,16 @@ import com.google.common.collect.Iterators;
import java.io.IOException;
import java.util.List;
+import java.util.regex.Pattern;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.postprocessor.IPostProcessor.Descriptor.Registry;
+import org.eclipse.emf.compare.tests.postprocess.data.TestPostProcessor;
import org.eclipse.emf.compare.uml2.internal.AssociationChange;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.uml2.internal.postprocessor.MultiplicityElementChangePostProcessor;
import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData;
import org.eclipse.emf.compare.uml2.tests.AbstractUMLTest;
import org.eclipse.emf.compare.uml2.tests.association.data.AssociationInputData;
@@ -159,7 +164,7 @@ public class AddAssociation2Test extends AbstractUMLTest {
private void testAB1(TestKind kind, final Comparison comparison) {
final List<Diff> differences = comparison.getDifferences();
- assertEquals(14, differences.size());
+ assertEquals(18, differences.size());
Predicate<? super Diff> addAssociationDescription = null;
Predicate<? super Diff> addPropertyClass1Description = null;
@@ -281,10 +286,20 @@ public class AddAssociation2Test extends AbstractUMLTest {
assertTrue(addUMLAssociation.getRefinedBy().contains(addRefTypeInPropertyClass1));
assertTrue(addUMLAssociation.getRefinedBy().contains(addRefAssociationInPropertyClass0));
assertTrue(addUMLAssociation.getRefinedBy().contains(addRefTypeInPropertyClass0));
- assertTrue(addUMLAssociation.getRefinedBy().contains(addLiteralIntegerInClass1));
- assertTrue(addUMLAssociation.getRefinedBy().contains(addUnlimitedNaturalInClass1));
- assertTrue(addUMLAssociation.getRefinedBy().contains(addLiteralIntegerInClass0));
- assertTrue(addUMLAssociation.getRefinedBy().contains(addUnlimitedNaturalInClass0));
+
+ // MultiplicityElementChanges
+ assertTrue(addUMLAssociation.getRefinedBy().contains(
+ Iterators.find(addLiteralIntegerInClass1.getRefines().iterator(),
+ instanceOf(MultiplicityElementChange.class))));
+ assertTrue(addUMLAssociation.getRefinedBy().contains(
+ Iterators.find(addUnlimitedNaturalInClass1.getRefines().iterator(),
+ instanceOf(MultiplicityElementChange.class))));
+ assertTrue(addUMLAssociation.getRefinedBy().contains(
+ Iterators.find(addLiteralIntegerInClass0.getRefines().iterator(),
+ instanceOf(MultiplicityElementChange.class))));
+ assertTrue(addUMLAssociation.getRefinedBy().contains(
+ Iterators.find(addUnlimitedNaturalInClass0.getRefines().iterator(),
+ instanceOf(MultiplicityElementChange.class))));
// CHECK REQUIREMENT
if (kind.equals(TestKind.ADD)) {
@@ -353,7 +368,6 @@ public class AddAssociation2Test extends AbstractUMLTest {
assertTrue(addAssociation.getRequires().contains(addPropertyClass1InAssociation));
assertEquals(0, addUMLAssociation.getRequires().size());
-
assertEquals(0, addLiteralIntegerInClass1.getRequires().size());
assertEquals(0, addUnlimitedNaturalInClass1.getRequires().size());
assertEquals(0, addLiteralIntegerInClass0.getRequires().size());
@@ -389,4 +403,13 @@ public class AddAssociation2Test extends AbstractUMLTest {
return input;
}
+ @Override
+ protected void registerPostProcessors(Registry<String> postProcessorRegistry) {
+ super.registerPostProcessors(postProcessorRegistry);
+ postProcessorRegistry.put(MultiplicityElementChangePostProcessor.class.getName(),
+ new TestPostProcessor.TestPostProcessorDescriptor(Pattern
+ .compile("http://www.eclipse.org/uml2/\\d\\.0\\.0/UML"), null,
+ new MultiplicityElementChangePostProcessor(), 25));
+ }
+
}
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation3Test.java b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation3Test.java
index 0ce97f232..b54f65296 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation3Test.java
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociation3Test.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2012, 2014 Obeo.
+ * Copyright (c) 2012, 2016 Obeo 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
@@ -29,11 +29,16 @@ import com.google.common.collect.Iterators;
import java.io.IOException;
import java.util.List;
+import java.util.regex.Pattern;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.postprocessor.IPostProcessor.Descriptor.Registry;
+import org.eclipse.emf.compare.tests.postprocess.data.TestPostProcessor;
import org.eclipse.emf.compare.uml2.internal.AssociationChange;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.uml2.internal.postprocessor.MultiplicityElementChangePostProcessor;
import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData;
import org.eclipse.emf.compare.uml2.tests.AbstractUMLTest;
import org.eclipse.emf.compare.uml2.tests.association.data.AssociationInputData;
@@ -160,7 +165,7 @@ public class AddAssociation3Test extends AbstractUMLTest {
private void testAB1(TestKind kind, final Comparison comparison) {
final List<Diff> differences = comparison.getDifferences();
- assertEquals(14, differences.size());
+ assertEquals(18, differences.size());
Predicate<? super Diff> addAssociationDescription = null;
Predicate<? super Diff> addPropertyClass1Description = null;
@@ -274,12 +279,8 @@ public class AddAssociation3Test extends AbstractUMLTest {
assertNotNull(addUMLAssociation);
assertEquals(13, addUMLAssociation.getRefinedBy().size());
assertTrue(addUMLAssociation.getRefinedBy().contains(addRefTypeInPropertyClass1));
- assertTrue(addUMLAssociation.getRefinedBy().contains(addLiteralIntegerInClass1));
- assertTrue(addUMLAssociation.getRefinedBy().contains(addUnlimitedNaturalInClass1));
assertTrue(addUMLAssociation.getRefinedBy().contains(addRefAssociationInPropertyClass1));
assertTrue(addUMLAssociation.getRefinedBy().contains(addRefTypeInPropertyClass0));
- assertTrue(addUMLAssociation.getRefinedBy().contains(addLiteralIntegerInClass0));
- assertTrue(addUMLAssociation.getRefinedBy().contains(addUnlimitedNaturalInClass0));
assertTrue(addUMLAssociation.getRefinedBy().contains(addRefAssociationInPropertyClass0));
assertTrue(addUMLAssociation.getRefinedBy().contains(addAssociation));
assertTrue(addUMLAssociation.getRefinedBy().contains(addPropertyClass0));
@@ -287,6 +288,20 @@ public class AddAssociation3Test extends AbstractUMLTest {
assertTrue(addUMLAssociation.getRefinedBy().contains(addPropertyClass1InAssociation));
assertTrue(addUMLAssociation.getRefinedBy().contains(addPropertyClass0InAssociation));
+ // MultiplicityElementChanges
+ assertTrue(addUMLAssociation.getRefinedBy().contains(
+ Iterators.find(addLiteralIntegerInClass1.getRefines().iterator(),
+ instanceOf(MultiplicityElementChange.class))));
+ assertTrue(addUMLAssociation.getRefinedBy().contains(
+ Iterators.find(addUnlimitedNaturalInClass1.getRefines().iterator(),
+ instanceOf(MultiplicityElementChange.class))));
+ assertTrue(addUMLAssociation.getRefinedBy().contains(
+ Iterators.find(addLiteralIntegerInClass0.getRefines().iterator(),
+ instanceOf(MultiplicityElementChange.class))));
+ assertTrue(addUMLAssociation.getRefinedBy().contains(
+ Iterators.find(addUnlimitedNaturalInClass0.getRefines().iterator(),
+ instanceOf(MultiplicityElementChange.class))));
+
// CHECK REQUIREMENT
if (kind.equals(TestKind.ADD)) {
assertEquals(1, addPropertyClass0.getRequires().size());
@@ -354,7 +369,6 @@ public class AddAssociation3Test extends AbstractUMLTest {
assertTrue(addAssociation.getRequires().contains(addPropertyClass0InAssociation));
assertEquals(0, addUMLAssociation.getRequires().size());
-
assertEquals(0, addLiteralIntegerInClass1.getRequires().size());
assertEquals(0, addUnlimitedNaturalInClass1.getRequires().size());
assertEquals(0, addLiteralIntegerInClass0.getRequires().size());
@@ -388,4 +402,13 @@ public class AddAssociation3Test extends AbstractUMLTest {
protected AbstractUMLInputData getInput() {
return input;
}
+
+ @Override
+ protected void registerPostProcessors(Registry<String> postProcessorRegistry) {
+ super.registerPostProcessors(postProcessorRegistry);
+ postProcessorRegistry.put(MultiplicityElementChangePostProcessor.class.getName(),
+ new TestPostProcessor.TestPostProcessorDescriptor(Pattern
+ .compile("http://www.eclipse.org/uml2/\\d\\.0\\.0/UML"), null,
+ new MultiplicityElementChangePostProcessor(), 25));
+ }
}
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociationTest.java b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociationTest.java
index ec43a5d68..504faee99 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociationTest.java
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/AddAssociationTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2012, 2014 Obeo.
+ * Copyright (c) 2012, 2016 Obeo 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
@@ -29,11 +29,16 @@ import com.google.common.collect.Iterators;
import java.io.IOException;
import java.util.List;
+import java.util.regex.Pattern;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.postprocessor.IPostProcessor.Descriptor.Registry;
+import org.eclipse.emf.compare.tests.postprocess.data.TestPostProcessor;
import org.eclipse.emf.compare.uml2.internal.AssociationChange;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.uml2.internal.postprocessor.MultiplicityElementChangePostProcessor;
import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData;
import org.eclipse.emf.compare.uml2.tests.AbstractUMLTest;
import org.eclipse.emf.compare.uml2.tests.association.data.AssociationInputData;
@@ -160,8 +165,8 @@ public class AddAssociationTest extends AbstractUMLTest {
private void testAB1(TestKind kind, final Comparison comparison) {
final List<Diff> differences = comparison.getDifferences();
- // We should have no less and no more than 16 differences
- assertEquals(16, differences.size());
+ // We should have no less and no more than 20 differences
+ assertEquals(20, differences.size());
Predicate<? super Diff> addAssociationDescription = null;
Predicate<? super Diff> addNavigableOwnedEndClass1InAssociationDescription = null;
@@ -298,14 +303,23 @@ public class AddAssociationTest extends AbstractUMLTest {
assertTrue(addUMLAssociation.getRefinedBy().contains(addRefTypeInPropertyClass1));
assertTrue(addUMLAssociation.getRefinedBy().contains(addRefAssociationInPropertyClass2));
assertTrue(addUMLAssociation.getRefinedBy().contains(addRefTypeInPropertyClass2));
- assertTrue(addUMLAssociation.getRefinedBy().contains(addLiteralIntegerInClass1));
- assertTrue(addUMLAssociation.getRefinedBy().contains(addUnlimitedNaturalInClass1));
- assertTrue(addUMLAssociation.getRefinedBy().contains(addLiteralIntegerInClass2));
- assertTrue(addUMLAssociation.getRefinedBy().contains(addUnlimitedNaturalInClass2));
assertTrue(addUMLAssociation.getRefinedBy().contains(addMemberEndClass1InAssociation));
assertTrue(addUMLAssociation.getRefinedBy().contains(addMemberEndClass2InAssociation));
assertTrue(addUMLAssociation.getRefinedBy().contains(addOwnedEndClass1InAssociation));
assertTrue(addUMLAssociation.getRefinedBy().contains(addOwnedEndClass2InAssociation));
+ // MultiplicityElementChanges
+ assertTrue(addUMLAssociation.getRefinedBy().contains(
+ Iterators.find(addLiteralIntegerInClass1.getRefines().iterator(),
+ instanceOf(MultiplicityElementChange.class))));
+ assertTrue(addUMLAssociation.getRefinedBy().contains(
+ Iterators.find(addUnlimitedNaturalInClass1.getRefines().iterator(),
+ instanceOf(MultiplicityElementChange.class))));
+ assertTrue(addUMLAssociation.getRefinedBy().contains(
+ Iterators.find(addLiteralIntegerInClass2.getRefines().iterator(),
+ instanceOf(MultiplicityElementChange.class))));
+ assertTrue(addUMLAssociation.getRefinedBy().contains(
+ Iterators.find(addUnlimitedNaturalInClass2.getRefines().iterator(),
+ instanceOf(MultiplicityElementChange.class))));
// CHECK REQUIREMENT
if (kind.equals(TestKind.ADD)) {
@@ -370,7 +384,6 @@ public class AddAssociationTest extends AbstractUMLTest {
assertTrue(addAssociation.getRequires().contains(addMemberEndClass2InAssociation));
assertEquals(0, addUMLAssociation.getRequires().size());
-
assertEquals(0, addLiteralIntegerInClass1.getRequires().size());
assertEquals(0, addUnlimitedNaturalInClass1.getRequires().size());
assertEquals(0, addLiteralIntegerInClass2.getRequires().size());
@@ -400,4 +413,13 @@ public class AddAssociationTest extends AbstractUMLTest {
protected AbstractUMLInputData getInput() {
return input;
}
+
+ @Override
+ protected void registerPostProcessors(Registry<String> postProcessorRegistry) {
+ super.registerPostProcessors(postProcessorRegistry);
+ postProcessorRegistry.put(MultiplicityElementChangePostProcessor.class.getName(),
+ new TestPostProcessor.TestPostProcessorDescriptor(Pattern
+ .compile("http://www.eclipse.org/uml2/\\d\\.0\\.0/UML"), null,
+ new MultiplicityElementChangePostProcessor(), 25));
+ }
}
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/ChangeAssociationTest.java b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/ChangeAssociationTest.java
index 705e07ed3..c638cd3a3 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/ChangeAssociationTest.java
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/association/ChangeAssociationTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2012, 2014 Obeo.
+ * Copyright (c) 2012, 2016 Obeo 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
@@ -159,8 +159,8 @@ public class ChangeAssociationTest extends AbstractUMLTest {
private void testAB1(TestKind kind, final Comparison comparison) {
final List<Diff> differences = comparison.getDifferences();
- // We should have no less and no more than 5 differences
- assertEquals(6, differences.size());
+ // We should have no less and no more than 7 differences
+ assertEquals(8, differences.size());
Predicate<? super Diff> addPropertyClass2Description = null;
Predicate<? super Diff> addRefAssociationInPropertyClass2Description = null;
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/implications/ImplicationsAssociationTest.java b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/implications/ImplicationsAssociationTest.java
index 603fdeba3..09be485d8 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/implications/ImplicationsAssociationTest.java
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/implications/ImplicationsAssociationTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2012, 2014 Obeo.
+ * Copyright (c) 2012, 2016 Obeo 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
@@ -35,6 +35,7 @@ import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.DifferenceKind;
import org.eclipse.emf.compare.uml2.internal.AssociationChange;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData;
import org.eclipse.emf.compare.uml2.tests.AbstractUMLTest;
import org.eclipse.emf.compare.uml2.tests.implications.data.ImplicationsInputData;
@@ -46,7 +47,8 @@ import org.junit.Test;
@SuppressWarnings("nls")
public class ImplicationsAssociationTest extends AbstractUMLTest {
- private static final int NB_DIFFS = 16;
+ // 16 diffs of interest and 4 MultiplicityElementChanges
+ private static final int NB_DIFFS = 20;
private ImplicationsInputData input = new ImplicationsInputData();
@@ -265,7 +267,8 @@ public class ImplicationsAssociationTest extends AbstractUMLTest {
}
private void checkMergeDeleteNavigableOwnedEnd(Comparison comparison, DiffsOfInterest diffs) {
- assertEquals(NB_DIFFS - 7, comparison.getDifferences().size());
+ // 7 diffs of interest + 2 MultiplicityElementChanges
+ assertEquals(NB_DIFFS - 9, comparison.getDifferences().size());
assertNull(diffs.addNavigableOwnedEndClass1InAssociation);
assertNull(diffs.addOwnedEndClass1InAssociation);
assertNull(diffs.addMemberEndClass1InAssociation);
@@ -343,7 +346,8 @@ public class ImplicationsAssociationTest extends AbstractUMLTest {
}
private void checkMergeDeleteOwnedEnd(Comparison comparison, DiffsOfInterest diffs) {
- assertEquals(NB_DIFFS - 7, comparison.getDifferences().size());
+ // 7 diffs of interest+ 2 MultiplicityElementChanges
+ assertEquals(NB_DIFFS - 9, comparison.getDifferences().size());
assertNull(diffs.addOwnedEndClass1InAssociation);
assertNull(diffs.addMemberEndClass1InAssociation);
assertNull(diffs.addRefAssociationInPropertyClass1);
@@ -1018,19 +1022,32 @@ public class ImplicationsAssociationTest extends AbstractUMLTest {
}
private static Predicate<? super Diff> addedLowerValueIn(final String qualifiedName) {
- return and(ofKind(DifferenceKind.ADD), onEObject(qualifiedName), onFeature("lowerValue"));
+ return and(ofKind(DifferenceKind.ADD), onEObject(qualifiedName), onFeature("lowerValue"),
+ refinesMultiplicityElementChange());
}
private static Predicate<? super Diff> addedUpperValueIn(final String qualifiedName) {
- return and(ofKind(DifferenceKind.ADD), onEObject(qualifiedName), onFeature("upperValue"));
+ return and(ofKind(DifferenceKind.ADD), onEObject(qualifiedName), onFeature("upperValue"),
+ refinesMultiplicityElementChange());
}
private static Predicate<? super Diff> removedLowerValueIn(final String qualifiedName) {
- return and(ofKind(DifferenceKind.DELETE), onEObject(qualifiedName), onFeature("lowerValue"));
+ return and(ofKind(DifferenceKind.DELETE), onEObject(qualifiedName), onFeature("lowerValue"),
+ refinesMultiplicityElementChange());
}
private static Predicate<? super Diff> removedUpperValueIn(final String qualifiedName) {
- return and(ofKind(DifferenceKind.DELETE), onEObject(qualifiedName), onFeature("upperValue"));
+ return and(ofKind(DifferenceKind.DELETE), onEObject(qualifiedName), onFeature("upperValue"),
+ refinesMultiplicityElementChange());
+ }
+
+ private static Predicate<? super Diff> refinesMultiplicityElementChange() {
+ return new Predicate<Diff>() {
+ public boolean apply(Diff input) {
+ return Iterators.any(input.getRefines().iterator(), instanceOf(
+ MultiplicityElementChange.class));
+ }
+ };
}
private class DiffsOfInterest {
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/MultiplicityElementChangesTest.java b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/MultiplicityElementChangesTest.java
new file mode 100644
index 000000000..fd13628fd
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/MultiplicityElementChangesTest.java
@@ -0,0 +1,600 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource Muenchen GmbH 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:
+ * Alexandra Buzila - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.uml2.tests.multiplicitychanges;
+
+import static com.google.common.base.Predicates.and;
+import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.size;
+import static org.eclipse.emf.compare.DifferenceSource.LEFT;
+import static org.eclipse.emf.compare.DifferenceSource.RIGHT;
+import static org.eclipse.emf.compare.utils.EMFComparePredicates.fromSide;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Lists;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.compare.AttributeChange;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Conflict;
+import org.eclipse.emf.compare.ConflictKind;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.ReferenceChange;
+import org.eclipse.emf.compare.ide.ui.tests.framework.ResolutionStrategyID;
+import org.eclipse.emf.compare.ide.ui.tests.framework.RuntimeTestRunner;
+import org.eclipse.emf.compare.ide.ui.tests.framework.annotations.Compare;
+import org.eclipse.emf.compare.ide.ui.tests.framework.annotations.ResolutionStrategies;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.utils.MatchUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.uml2.uml.LiteralInteger;
+import org.eclipse.uml2.uml.LiteralUnlimitedNatural;
+import org.eclipse.uml2.uml.UMLPackage;
+import org.junit.runner.RunWith;
+
+@RunWith(RuntimeTestRunner.class)
+@ResolutionStrategies(ResolutionStrategyID.PROJECT)
+public class MultiplicityElementChangesTest {
+
+ private static final Predicate<Diff> IS_MULTIPLICITY_CHANGE = new Predicate<Diff>() {
+ public boolean apply(Diff diff) {
+ return diff instanceof MultiplicityElementChange;
+ }
+ };
+
+ private static final Predicate<Diff> IS_LOWER_VALUE_REFERENCE_CHANGE = new Predicate<Diff>() {
+ public boolean apply(Diff diff) {
+ if (!(diff instanceof ReferenceChange)) {
+ return false;
+ }
+ ReferenceChange refChange = (ReferenceChange)diff;
+ return refChange.getReference() == UMLPackage.eINSTANCE.getMultiplicityElement_LowerValue();
+ }
+ };
+
+ private static final Predicate<Diff> IS_LOWER_VALUE_ATTRIBUTE_CHANGE = new Predicate<Diff>() {
+ public boolean apply(Diff diff) {
+ if (!(diff instanceof AttributeChange)) {
+ return false;
+ }
+ EObject container = MatchUtil.getContainer(diff.getMatch().getComparison(), diff);
+ if (container instanceof LiteralInteger || container instanceof LiteralUnlimitedNatural) {
+ EStructuralFeature eContainingFeature = container.eContainingFeature();
+ return eContainingFeature == UMLPackage.eINSTANCE.getMultiplicityElement_LowerValue();
+ }
+ return false;
+ }
+ };
+
+ private static final Predicate<Diff> IS_UPPER_VALUE_REFERENCE_CHANGE = new Predicate<Diff>() {
+ public boolean apply(Diff diff) {
+ if (!(diff instanceof ReferenceChange)) {
+ return false;
+ }
+ ReferenceChange refChange = (ReferenceChange)diff;
+ return refChange.getReference() == UMLPackage.eINSTANCE.getMultiplicityElement_UpperValue();
+ }
+ };
+
+ private static final Predicate<Diff> IS_UPPER_VALUE_ATTRIBUTE_CHANGE = new Predicate<Diff>() {
+ public boolean apply(Diff diff) {
+ if (!(diff instanceof AttributeChange)) {
+ return false;
+ }
+ EObject container = MatchUtil.getContainer(diff.getMatch().getComparison(), diff);
+ if (container instanceof LiteralInteger || container instanceof LiteralUnlimitedNatural) {
+ EStructuralFeature eContainingFeature = container.eContainingFeature();
+ return eContainingFeature == UMLPackage.eINSTANCE.getMultiplicityElement_UpperValue();
+ }
+ return false;
+ }
+ };
+
+ private static final Predicate<Diff> IS_UPPER_VALUE_CHANGE = new Predicate<Diff>() {
+ public boolean apply(Diff diff) {
+ return IS_UPPER_VALUE_REFERENCE_CHANGE.apply(diff) || IS_UPPER_VALUE_ATTRIBUTE_CHANGE.apply(diff);
+ }
+ };
+
+ private static final Predicate<Diff> IS_LOWER_VALUE_CHANGE = new Predicate<Diff>() {
+ public boolean apply(Diff diff) {
+ return IS_LOWER_VALUE_REFERENCE_CHANGE.apply(diff) || IS_LOWER_VALUE_ATTRIBUTE_CHANGE.apply(diff);
+ }
+ };
+
+ /**
+ * <b>origin:</b> an activity with an input pin <br>
+ * <b>left:</b> multiplicity lower value is added to the input pin <br>
+ * <b>right:</b> multiplicity upper value is added to the input pin
+ */
+ @Compare(left = "a1/left.uml", right = "a1/right.uml", ancestor = "a1/origin.uml")
+ public void testNonConflictingAddition(Comparison comparison) throws IOException {
+ EList<Diff> diffs = comparison.getDifferences();
+ Iterable<Diff> leftChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(LEFT)));
+ Iterable<Diff> rightChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(RIGHT)));
+
+ assertEquals(1, size(leftChanges));
+ assertEquals(1, size(rightChanges));
+
+ MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.iterator().next();
+ assertEquals(1, leftChange.getRefinedBy().size());
+ assertTrue(leftChange.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, leftChange.getKind());
+
+ MultiplicityElementChange rightChange = (MultiplicityElementChange)rightChanges.iterator().next();
+ assertEquals(1, rightChange.getRefinedBy().size());
+ assertTrue(rightChange.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, rightChange.getKind());
+
+ assertEquals(0, comparison.getConflicts().size());
+ }
+
+ /**
+ * <b>origin:</b> an activity with an input pin <br>
+ * <b>left:</b> multiplicity lower value is added to the input pin <br>
+ * <b>right:</b> multiplicity lower and upper values are added to the input pin, but the lower value is
+ * the same value as in the left change
+ */
+ @Compare(left = "a2/left.uml", right = "a2/right.uml", ancestor = "a2/origin.uml")
+ public void testAdditionsWithPseudoconflict(Comparison comparison) throws IOException {
+ EList<Diff> diffs = comparison.getDifferences();
+ ArrayList<Diff> leftChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+ fromSide(LEFT))));
+ ArrayList<Diff> rightChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+ fromSide(RIGHT))));
+
+ assertEquals(1, size(leftChanges));
+ assertEquals(2, size(rightChanges));
+
+ MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.get(0);
+ assertEquals(1, leftChange.getRefinedBy().size());
+ assertTrue(leftChange.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, leftChange.getKind());
+
+ MultiplicityElementChange rightChange1 = (MultiplicityElementChange)rightChanges.get(0);
+ assertEquals(1, rightChange1.getRefinedBy().size());
+ assertTrue(rightChange1.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, rightChange1.getKind());
+
+ MultiplicityElementChange rightChange2 = (MultiplicityElementChange)rightChanges.get(1);
+ assertEquals(1, rightChange2.getRefinedBy().size());
+ assertTrue(rightChange2.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, rightChange2.getKind());
+
+ assertEquals(1, comparison.getConflicts().size());
+ Conflict conflict = comparison.getConflicts().get(0);
+ assertEquals(ConflictKind.PSEUDO, conflict.getKind());
+ assertTrue(conflict.getDifferences().contains(leftChange));
+
+ if (isLowerValueChange(rightChange1)) {
+ assertEquals(conflict, rightChange1.getConflict());
+ } else {
+ assertTrue(isLowerValueChange(rightChange2));
+ assertEquals(conflict, rightChange2.getConflict());
+ }
+ }
+
+ /**
+ * <b>origin:</b> an activity with an input pin <br>
+ * <b>left:</b> multiplicity lower value is added to the input pin <br>
+ * <b>right:</b> multiplicity lower and upper values are added to the input pin, but the lower value is
+ * different than the one in the left change
+ */
+ @Compare(left = "a3/left.uml", right = "a3/right.uml", ancestor = "a3/origin.uml")
+ public void testAdditionsWithConflict(Comparison comparison) throws IOException {
+ EList<Diff> diffs = comparison.getDifferences();
+ ArrayList<Diff> leftChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+ fromSide(LEFT))));
+ ArrayList<Diff> rightChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+ fromSide(RIGHT))));
+
+ assertEquals(1, size(leftChanges));
+ assertEquals(2, size(rightChanges));
+
+ MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.get(0);
+ assertEquals(1, leftChange.getRefinedBy().size());
+ assertTrue(leftChange.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, leftChange.getKind());
+
+ MultiplicityElementChange rightChange1 = (MultiplicityElementChange)rightChanges.get(0);
+ assertEquals(1, rightChange1.getRefinedBy().size());
+ assertTrue(rightChange1.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, rightChange1.getKind());
+
+ MultiplicityElementChange rightChange2 = (MultiplicityElementChange)rightChanges.get(1);
+ assertEquals(1, rightChange2.getRefinedBy().size());
+ assertTrue(rightChange2.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, rightChange2.getKind());
+
+ assertEquals(1, comparison.getConflicts().size());
+ Conflict conflict = comparison.getConflicts().get(0);
+ assertEquals(ConflictKind.REAL, conflict.getKind());
+
+ if (isLowerValueChange(rightChange1)) {
+ assertEquals(conflict, rightChange1.getConflict());
+ } else {
+ assertTrue(isLowerValueChange(rightChange2));
+ assertEquals(conflict, rightChange2.getConflict());
+ }
+ }
+
+ /**
+ * <b>origin:</b> an activity with an input pin, with a lower and upper value <br>
+ * <b>left:</b> multiplicity lower value is changed to 1 <br>
+ * <b>right:</b> multiplicity lower value is changed to 2 <br>
+ * A real conflict should be produced.
+ */
+ @Compare(left = "a4/left.uml", right = "a4/right.uml", ancestor = "a4/origin.uml")
+ public void testChangesWithConflict(Comparison comparison) throws IOException {
+ EList<Diff> diffs = comparison.getDifferences();
+ Iterable<Diff> leftChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(LEFT)));
+ Iterable<Diff> rightChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(RIGHT)));
+
+ assertEquals(1, size(leftChanges));
+ MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.iterator().next();
+ assertEquals(1, leftChange.getRefinedBy().size());
+ assertTrue(leftChange.getRefinedBy().get(0) instanceof AttributeChange);
+ assertEquals(DifferenceKind.CHANGE, leftChange.getKind());
+
+ assertEquals(1, size(rightChanges));
+ MultiplicityElementChange rightChange = (MultiplicityElementChange)rightChanges.iterator().next();
+ assertEquals(1, rightChange.getRefinedBy().size());
+ assertTrue(rightChange.getRefinedBy().get(0) instanceof AttributeChange);
+ assertEquals(DifferenceKind.CHANGE, rightChange.getKind());
+
+ assertEquals(1, comparison.getConflicts().size());
+ Conflict conflict = comparison.getConflicts().get(0);
+ assertEquals(ConflictKind.REAL, conflict.getKind());
+ assertEquals(conflict, rightChange.getConflict());
+ }
+
+ /**
+ * <b>origin:</b> an activity with an input pin, with a lower and upper value <br>
+ * <b>left:</b> multiplicity lower value is changed to 1 <br>
+ * <b>right:</b> multiplicity lower value is changed to 1 <br>
+ * A pseudo conflict should be produced.
+ */
+ @Compare(left = "a5/left.uml", right = "a5/right.uml", ancestor = "a5/origin.uml")
+ public void testChangesWithPseudoconflict(Comparison comparison) throws IOException {
+ EList<Diff> diffs = comparison.getDifferences();
+ Iterable<Diff> leftChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(LEFT)));
+ Iterable<Diff> rightChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(RIGHT)));
+
+ assertEquals(1, size(leftChanges));
+ Diff leftChange = leftChanges.iterator().next();
+ assertEquals(1, leftChange.getRefinedBy().size());
+ assertTrue(leftChange.getRefinedBy().get(0) instanceof AttributeChange);
+ assertEquals(DifferenceKind.CHANGE, leftChange.getKind());
+
+ assertEquals(1, size(rightChanges));
+ Diff rightChange = rightChanges.iterator().next();
+ assertEquals(1, rightChange.getRefinedBy().size());
+ assertTrue(rightChange.getRefinedBy().get(0) instanceof AttributeChange);
+ assertEquals(DifferenceKind.CHANGE, rightChange.getKind());
+
+ assertEquals(1, comparison.getConflicts().size());
+ Conflict conflict = comparison.getConflicts().get(0);
+ assertEquals(ConflictKind.PSEUDO, conflict.getKind());
+ assertEquals(conflict, rightChange.getConflict());
+
+ }
+
+ /**
+ * <b>origin:</b> an activity with an input pin, with a lower and upper value <br>
+ * <b>left:</b> multiplicity lower value is changed to 1 <br>
+ * <b>right:</b> multiplicity lower and upper values are removed <br>
+ */
+ @Compare(left = "a6/left.uml", right = "a6/right.uml", ancestor = "a6/origin.uml")
+ public void testRemoveConflict(Comparison comparison) throws IOException {
+ EList<Diff> diffs = comparison.getDifferences();
+ ArrayList<Diff> leftChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+ fromSide(LEFT))));
+ ArrayList<Diff> rightChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+ fromSide(RIGHT))));
+
+ assertEquals(1, size(leftChanges));
+ MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.iterator().next();
+ assertEquals(1, leftChange.getRefinedBy().size());
+ assertTrue(leftChange.getRefinedBy().get(0) instanceof AttributeChange);
+ assertEquals(DifferenceKind.CHANGE, leftChange.getKind());
+
+ assertEquals(2, size(rightChanges));
+
+ MultiplicityElementChange rightChange1 = (MultiplicityElementChange)rightChanges.get(0);
+ assertEquals(1, rightChange1.getRefinedBy().size());
+ assertTrue(rightChange1.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.DELETE, rightChange1.getKind());
+
+ MultiplicityElementChange rightChange2 = (MultiplicityElementChange)rightChanges.get(1);
+ assertEquals(1, rightChange2.getRefinedBy().size());
+ assertTrue(rightChange2.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.DELETE, rightChange2.getKind());
+
+ assertEquals(1, comparison.getConflicts().size());
+ Conflict conflict = comparison.getConflicts().get(0);
+ assertEquals(ConflictKind.REAL, conflict.getKind());
+
+ if (isLowerValueChange(rightChange1)) {
+ assertTrue(isUpperValueChange(rightChange2));
+ assertEquals(conflict, rightChange1.getConflict());
+ } else {
+ assertTrue(isUpperValueChange(rightChange1));
+ assertTrue(isLowerValueChange(rightChange2));
+ assertEquals(conflict, rightChange2.getConflict());
+ }
+ }
+
+ /**
+ * <b>origin:</b> an activity with an input pin, with a lower and upper value <br>
+ * <b>left:</b> multiplicity upper value is removed <br>
+ * <b>right:</b> multiplicity lower value is changed to 1 <br>
+ */
+ @Compare(left = "a7/left.uml", right = "a7/right.uml", ancestor = "a7/origin.uml")
+ public void testRemoveNoConflict(Comparison comparison) throws IOException {
+ EList<Diff> diffs = comparison.getDifferences();
+ Iterable<Diff> leftChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(LEFT)));
+ Iterable<Diff> rightChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(RIGHT)));
+
+ assertEquals(1, size(leftChanges));
+ MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.iterator().next();
+ assertEquals(1, leftChange.getRefinedBy().size());
+ assertTrue(leftChange.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.DELETE, leftChange.getKind());
+
+ assertEquals(1, size(rightChanges));
+ MultiplicityElementChange rightChange = (MultiplicityElementChange)rightChanges.iterator().next();
+ assertEquals(1, rightChange.getRefinedBy().size());
+ assertTrue(rightChange.getRefinedBy().get(0) instanceof AttributeChange);
+ assertEquals(DifferenceKind.CHANGE, rightChange.getKind());
+
+ assertEquals(0, comparison.getConflicts().size());
+
+ }
+
+ /**
+ * <b>origin:</b> an activity with an input pin, with a lower and upper value <br>
+ * <b>left:</b> multiplicity upper value is removed <br>
+ * <b>right:</b> multiplicity upper value is removed <br>
+ */
+ @Compare(left = "a8/left.uml", right = "a8/right.uml", ancestor = "a8/origin.uml")
+ public void testRemovePseudoConflict(Comparison comparison) throws IOException {
+ EList<Diff> diffs = comparison.getDifferences();
+ Iterable<Diff> leftChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(LEFT)));
+ Iterable<Diff> rightChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(RIGHT)));
+
+ assertEquals(1, size(leftChanges));
+ assertEquals(1, size(rightChanges));
+
+ MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.iterator().next();
+ assertEquals(1, leftChange.getRefinedBy().size());
+ assertTrue(leftChange.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.DELETE, leftChange.getKind());
+
+ MultiplicityElementChange rightChange = (MultiplicityElementChange)rightChanges.iterator().next();
+ assertEquals(1, rightChange.getRefinedBy().size());
+ assertTrue(rightChange.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.DELETE, rightChange.getKind());
+
+ assertEquals(1, comparison.getConflicts().size());
+ Conflict conflict = comparison.getConflicts().get(0);
+ assertEquals(ConflictKind.PSEUDO, conflict.getKind());
+
+ }
+
+ /**
+ * <b>origin:</b> an activity with an input pin, with an upper value <br>
+ * <b>left:</b> multiplicity upper value is removed <br>
+ * <b>right:</b> multiplicity lower value is added <br>
+ */
+ @Compare(left = "a9/left.uml", right = "a9/right.uml", ancestor = "a9/origin.uml")
+ public void testRemoveAndAddNoConflict(Comparison comparison) throws IOException {
+ EList<Diff> diffs = comparison.getDifferences();
+ Iterable<Diff> leftChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(LEFT)));
+ Iterable<Diff> rightChanges = filter(diffs, and(IS_MULTIPLICITY_CHANGE, fromSide(RIGHT)));
+
+ assertEquals(1, size(leftChanges));
+ assertEquals(1, size(rightChanges));
+
+ MultiplicityElementChange leftChange = (MultiplicityElementChange)leftChanges.iterator().next();
+ assertEquals(1, leftChange.getRefinedBy().size());
+ assertTrue(leftChange.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.DELETE, leftChange.getKind());
+
+ MultiplicityElementChange rightChange = (MultiplicityElementChange)rightChanges.iterator().next();
+ assertEquals(1, rightChange.getRefinedBy().size());
+ assertTrue(rightChange.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, rightChange.getKind());
+
+ assertEquals(0, comparison.getConflicts().size());
+ }
+
+ /**
+ * <b>origin:</b> an activity with an input pin, with an upper value <br>
+ * <b>left:</b> multiplicity upper (0) and lower (1) value are added<br>
+ * <b>right:</b> multiplicity upper (1) and lower (1) value are added<br>
+ * These changes should produce a real and a pseudo conflict for the same multiplicity change
+ */
+ @Compare(left = "a10/left.uml", right = "a10/right.uml", ancestor = "a10/origin.uml")
+ public void testRealAndPseudoConflict(Comparison comparison) throws IOException {
+ EList<Diff> diffs = comparison.getDifferences();
+ ArrayList<Diff> leftChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+ fromSide(LEFT))));
+ ArrayList<Diff> rightChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+ fromSide(RIGHT))));
+
+ assertEquals(2, size(leftChanges));
+ assertEquals(2, size(rightChanges));
+
+ MultiplicityElementChange leftChange1 = (MultiplicityElementChange)leftChanges.get(0);
+ assertEquals(1, leftChange1.getRefinedBy().size());
+ assertTrue(leftChange1.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, leftChange1.getKind());
+
+ MultiplicityElementChange leftChange2 = (MultiplicityElementChange)leftChanges.get(1);
+ assertEquals(1, leftChange2.getRefinedBy().size());
+ assertTrue(leftChange2.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, leftChange2.getKind());
+
+ MultiplicityElementChange rightChange1 = (MultiplicityElementChange)rightChanges.get(0);
+ assertEquals(1, rightChange1.getRefinedBy().size());
+ assertTrue(rightChange1.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, rightChange1.getKind());
+
+ MultiplicityElementChange rightChange2 = (MultiplicityElementChange)rightChanges.get(1);
+ assertEquals(1, rightChange2.getRefinedBy().size());
+ assertTrue(rightChange2.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, rightChange2.getKind());
+
+ assertEquals(2, comparison.getConflicts().size());
+ Conflict conflict1 = comparison.getConflicts().get(0);
+ Conflict conflict2 = comparison.getConflicts().get(1);
+
+ if (conflict1.getKind() == ConflictKind.PSEUDO) {
+ assertEquals(ConflictKind.REAL, conflict2.getKind());
+ } else {
+ assertEquals(ConflictKind.PSEUDO, conflict2.getKind());
+ }
+
+ if (isUpperValueChange(leftChange1)) {
+ assertTrue(isLowerValueChange(leftChange2));
+ assertNotNull(leftChange1.getConflict());
+ assertEquals(ConflictKind.REAL, leftChange1.getConflict().getKind());
+ assertNotNull(leftChange2.getConflict());
+ assertEquals(ConflictKind.PSEUDO, leftChange2.getConflict().getKind());
+ } else {
+ assertTrue(isLowerValueChange(leftChange1));
+ assertTrue(isUpperValueChange(leftChange2));
+ assertNotNull(leftChange1.getConflict());
+ assertEquals(ConflictKind.PSEUDO, leftChange1.getConflict().getKind());
+ assertNotNull(leftChange2.getConflict());
+ assertEquals(ConflictKind.REAL, leftChange2.getConflict().getKind());
+ }
+
+ if (isUpperValueChange(rightChange1)) {
+ assertTrue(isLowerValueChange(rightChange2));
+ assertNotNull(rightChange1.getConflict());
+ assertEquals(ConflictKind.REAL, rightChange1.getConflict().getKind());
+ assertNotNull(rightChange2.getConflict());
+ assertEquals(ConflictKind.PSEUDO, rightChange2.getConflict().getKind());
+ } else {
+ assertTrue(isLowerValueChange(rightChange1));
+ assertTrue(isUpperValueChange(rightChange2));
+ assertNotNull(rightChange1.getConflict());
+ assertEquals(ConflictKind.PSEUDO, rightChange1.getConflict().getKind());
+ assertNotNull(rightChange2.getConflict());
+ assertEquals(ConflictKind.REAL, rightChange2.getConflict().getKind());
+ }
+
+ }
+
+ private boolean isLowerValueChange(MultiplicityElementChange multiplicityElementChange) {
+ if (multiplicityElementChange.getRefinedBy().size() != 1) {
+ return false;
+ }
+ return IS_LOWER_VALUE_CHANGE.apply(multiplicityElementChange.getRefinedBy().get(0));
+ }
+
+ private boolean isUpperValueChange(MultiplicityElementChange multiplicityElementChange) {
+ if (multiplicityElementChange.getRefinedBy().size() != 1) {
+ return false;
+ }
+ return IS_UPPER_VALUE_CHANGE.apply(multiplicityElementChange.getRefinedBy().get(0));
+ }
+
+ /**
+ * <b>origin:</b> an activity with an input pin, with a lower value <br>
+ * <b>left:</b> multiplicity lower value is deleted and upper value is added (0)<br>
+ * <b>right:</b> multiplicity upper value is added, with the same value as in the left change and the
+ * lower value is changed to a different value than the one in the left change<br>
+ * These changes should produce a real and a pseudo conflict for the same multiplicity change
+ */
+ @Compare(left = "a11/left.uml", right = "a11/right.uml", ancestor = "a11/origin.uml")
+ public void testRealAndPseudoConflictWithChangeAndDelete(Comparison comparison) throws IOException {
+ EList<Diff> diffs = comparison.getDifferences();
+ ArrayList<Diff> leftChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+ fromSide(LEFT))));
+ ArrayList<Diff> rightChanges = Lists.newArrayList(filter(diffs, and(IS_MULTIPLICITY_CHANGE,
+ fromSide(RIGHT))));
+
+ assertEquals(2, size(leftChanges));
+ assertEquals(2, size(rightChanges));
+
+ MultiplicityElementChange leftAddChange;
+ MultiplicityElementChange leftDeleteChange;
+
+ if (leftChanges.get(0).getKind() == DifferenceKind.ADD) {
+ leftAddChange = (MultiplicityElementChange)leftChanges.get(0);
+ leftDeleteChange = (MultiplicityElementChange)leftChanges.get(1);
+ } else {
+ leftAddChange = (MultiplicityElementChange)leftChanges.get(1);
+ leftDeleteChange = (MultiplicityElementChange)leftChanges.get(0);
+ }
+
+ assertEquals(1, leftAddChange.getRefinedBy().size());
+ assertTrue(leftAddChange.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, leftAddChange.getKind());
+
+ assertEquals(1, leftDeleteChange.getRefinedBy().size());
+ assertTrue(leftDeleteChange.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.DELETE, leftDeleteChange.getKind());
+
+ MultiplicityElementChange rightChange;
+ MultiplicityElementChange rightAddChange;
+
+ if (rightChanges.get(0).getKind() == DifferenceKind.ADD) {
+ rightAddChange = (MultiplicityElementChange)rightChanges.get(0);
+ rightChange = (MultiplicityElementChange)rightChanges.get(1);
+ } else {
+ rightAddChange = (MultiplicityElementChange)rightChanges.get(1);
+ rightChange = (MultiplicityElementChange)rightChanges.get(0);
+ }
+
+ assertEquals(1, rightAddChange.getRefinedBy().size());
+ assertTrue(rightAddChange.getRefinedBy().get(0) instanceof ReferenceChange);
+ assertEquals(DifferenceKind.ADD, rightAddChange.getKind());
+
+ assertEquals(1, rightChange.getRefinedBy().size());
+ assertTrue(rightChange.getRefinedBy().get(0) instanceof AttributeChange);
+ assertEquals(DifferenceKind.CHANGE, rightChange.getKind());
+
+ assertEquals(2, comparison.getConflicts().size());
+ Conflict conflict1 = comparison.getConflicts().get(0);
+ Conflict conflict2 = comparison.getConflicts().get(1);
+
+ if (conflict1.getKind() == ConflictKind.PSEUDO) {
+ assertEquals(ConflictKind.REAL, conflict2.getKind());
+ } else {
+ assertEquals(ConflictKind.PSEUDO, conflict2.getKind());
+ }
+ assertEquals(ConflictKind.REAL, leftDeleteChange.getConflict().getKind());
+ assertEquals(leftDeleteChange.getConflict(), rightChange.getConflict());
+ assertEquals(ConflictKind.PSEUDO, leftAddChange.getConflict().getKind());
+ assertEquals(leftAddChange.getConflict(), rightAddChange.getConflict());
+ }
+
+ // @Override
+ // protected void registerPostProcessors(
+ // org.eclipse.emf.compare.postprocessor.IPostProcessor.Descriptor.Registry<String> postProcessorRegistry)
+ // {
+ // super.registerPostProcessors(postProcessorRegistry);
+ // postProcessorRegistry.put(MultiplicityElementChangePostProcessor.class.getName(),
+ // new TestPostProcessor.TestPostProcessorDescriptor(Pattern
+ // .compile("http://www.eclipse.org/uml2/\\d\\.0\\.0/UML"), null, //$NON-NLS-1$
+ // new MultiplicityElementChangePostProcessor(), 25));
+ // }
+}
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/left.uml
new file mode 100644
index 000000000..8750ba0ac
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/left.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/origin.uml
new file mode 100644
index 000000000..530742ca6
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/origin.uml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/right.uml
new file mode 100644
index 000000000..3de259bc5
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a1/right.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_y4nCEL6MEeWfFPKKpMWCyw" value="2"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/left.uml
new file mode 100644
index 000000000..6da8962cd
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/left.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/origin.uml
new file mode 100644
index 000000000..530742ca6
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/origin.uml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/right.uml
new file mode 100644
index 000000000..44a0d8e47
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a10/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_bXa-MWYwEeWdseMo2ly0ug" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jPlpwGYvEeWdseMo2ly0ug" value="1"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/left.uml
new file mode 100644
index 000000000..fd39ace1f
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/left.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/origin.uml
new file mode 100644
index 000000000..8750ba0ac
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/origin.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/right.uml
new file mode 100644
index 000000000..9f1166561
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a11/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="2"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_1234L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/left.uml
new file mode 100644
index 000000000..ad48eeefa
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/left.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Fic2AWYwEeWdseMo2ly0ug" value="1"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/origin.uml
new file mode 100644
index 000000000..530742ca6
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/origin.uml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/right.uml
new file mode 100644
index 000000000..171c268e6
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a2/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="2"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/left.uml
new file mode 100644
index 000000000..7e3fc4c56
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/left.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="2"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/origin.uml
new file mode 100644
index 000000000..530742ca6
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/origin.uml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/right.uml
new file mode 100644
index 000000000..7e95aa91d
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a3/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Fic2AWYwEeWdseMo2ly0ug" value="1"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="1"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/left.uml
new file mode 100644
index 000000000..b9fd37539
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/left.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/origin.uml
new file mode 100644
index 000000000..42239eabf
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/origin.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/right.uml
new file mode 100644
index 000000000..76f3de022
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a4/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="2"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/left.uml
new file mode 100644
index 000000000..b9fd37539
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/left.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/origin.uml
new file mode 100644
index 000000000..42239eabf
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/origin.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/right.uml
new file mode 100644
index 000000000..b9fd37539
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a5/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/left.uml
new file mode 100644
index 000000000..b9fd37539
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/left.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/origin.uml
new file mode 100644
index 000000000..42239eabf
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/origin.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/right.uml
new file mode 100644
index 000000000..530742ca6
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a6/right.uml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/left.uml
new file mode 100644
index 000000000..bea951449
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/left.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/origin.uml
new file mode 100644
index 000000000..42239eabf
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/origin.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/right.uml
new file mode 100644
index 000000000..b9fd37539
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a7/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="1"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/left.uml
new file mode 100644
index 000000000..bea951449
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/left.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/origin.uml
new file mode 100644
index 000000000..42239eabf
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/origin.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/right.uml
new file mode 100644
index 000000000..bea951449
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a8/right.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/left.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/left.uml
new file mode 100644
index 000000000..530742ca6
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/left.uml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/origin.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/origin.uml
new file mode 100644
index 000000000..fd39ace1f
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/origin.uml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/right.uml b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/right.uml
new file mode 100644
index 000000000..76f3de022
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/multiplicitychanges/a9/right.uml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_M2-I4L6KEeWfFPKKpMWCyw" name="RootElement">
+ <packagedElement xmi:type="uml:Activity" xmi:id="_Qrq3oL6MEeWfFPKKpMWCyw" name="Activity1" node="_SgUFEL6MEeWfFPKKpMWCyw">
+ <node xmi:type="uml:ActionInputPin" xmi:id="_SgUFEL6MEeWfFPKKpMWCyw" name="ActionInputPin1">
+ <upperBound xmi:type="uml:LiteralInteger" xmi:id="_SgdPAL6MEeWfFPKKpMWCyw" value="1"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_g7jmoL6MEeWfFPKKpMWCyw" value="2"/>
+ <upperValue xmi:type="uml:LiteralInteger" xmi:id="_WPbo4L6REeWfFPKKpMWCyw" value="0"/>
+ </node>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/suite/AllTests.java b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/suite/AllTests.java
index 0b92adb86..e00e2bca8 100644
--- a/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/suite/AllTests.java
+++ b/plugins/org.eclipse.emf.compare.uml2.tests/src/org/eclipse/emf/compare/uml2/tests/suite/AllTests.java
@@ -13,6 +13,10 @@
*******************************************************************************/
package org.eclipse.emf.compare.uml2.tests.suite;
+import junit.framework.JUnit4TestAdapter;
+import junit.framework.Test;
+import junit.textui.TestRunner;
+
import org.eclipse.emf.compare.uml2.tests.association.AddAssociation2Test;
import org.eclipse.emf.compare.uml2.tests.association.AddAssociation3Test;
import org.eclipse.emf.compare.uml2.tests.association.AddAssociationTest;
@@ -39,6 +43,7 @@ import org.eclipse.emf.compare.uml2.tests.include.AddIncludeTest;
import org.eclipse.emf.compare.uml2.tests.merge.ExtensionMergeTest;
import org.eclipse.emf.compare.uml2.tests.merge.MergeDiffInvolvingRefineDiffTest;
import org.eclipse.emf.compare.uml2.tests.message.AddMessageTest;
+import org.eclipse.emf.compare.uml2.tests.multiplicitychanges.MultiplicityElementChangesTest;
import org.eclipse.emf.compare.uml2.tests.nonreg.bug484576_pseudoconflicts.TestNonRegPseudoConflict_484576;
import org.eclipse.emf.compare.uml2.tests.opaque.OpaqueElementBodyChangeDiffTest;
import org.eclipse.emf.compare.uml2.tests.opaque.OpaqueElementBodyChangeMergeTest;
@@ -55,10 +60,6 @@ import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
-import junit.framework.JUnit4TestAdapter;
-import junit.framework.Test;
-import junit.textui.TestRunner;
-
/**
* This test suite allows us to launch all tests for EMF Compare at once.
*
@@ -79,7 +80,8 @@ import junit.textui.TestRunner;
StaticStereotypedElementItemProviderTest.class, DynamicStereotypedElementItemProviderTest.class,
OpaqueElementBodyChangeDiffTest.class, OpaqueElementBodyChangeMergeTest.class,
DanglingStereotypeApplicationTest.class, MergeDiffInvolvingRefineDiffTest.class,
- TestNonRegPseudoConflict_484576.class, RemoveStereotypeApplicationPseudoConflictTest.class })
+ TestNonRegPseudoConflict_484576.class, RemoveStereotypeApplicationPseudoConflictTest.class,
+ MultiplicityElementChangesTest.class })
public class AllTests {
/**
diff --git a/plugins/org.eclipse.emf.compare.uml2/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare.uml2/META-INF/MANIFEST.MF
index 3aa97b365..0e2fd56a2 100644
--- a/plugins/org.eclipse.emf.compare.uml2/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.compare.uml2/META-INF/MANIFEST.MF
@@ -2,16 +2,16 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.emf.compare.uml2;singleton:=true
-Bundle-Version: 2.4.0.qualifier
+Bundle-Version: 2.5.0.qualifier
Bundle-ClassPath: .
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.emf.ecore;visibility:=reexport,
- org.eclipse.uml2.uml;bundle-version="5.0.0",
- org.eclipse.uml2.types,
- org.eclipse.emf.compare
+ org.eclipse.uml2.uml;bundle-version="5.0.0";visibility:=reexport,
+ org.eclipse.uml2.types;visibility:=reexport,
+ org.eclipse.emf.compare;bundle-version="3.4.0";visibility:=reexport
Bundle-ActivationPolicy: lazy
Bundle-Activator: org.eclipse.emf.compare.uml2.internal.UMLComparePlugin
Import-Package: com.google.common.base;version="[11.0.0,16.0.0)",
diff --git a/plugins/org.eclipse.emf.compare.uml2/model/uml2compare.ecore b/plugins/org.eclipse.emf.compare.uml2/model/uml2compare.ecore
index c739777ee..b73dfd26c 100644
--- a/plugins/org.eclipse.emf.compare.uml2/model/uml2compare.ecore
+++ b/plugins/org.eclipse.emf.compare.uml2/model/uml2compare.ecore
@@ -25,4 +25,5 @@
<eStructuralFeatures xsi:type="ecore:EAttribute" name="language" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="DanglingStereotypeApplication" eSuperTypes="platform:/plugin/org.eclipse.emf.compare/model/compare.ecore#//ResourceAttachmentChange #//UMLDiff"/>
+ <eClassifiers xsi:type="ecore:EClass" name="MultiplicityElementChange" eSuperTypes="#//UMLDiff"/>
</ecore:EPackage>
diff --git a/plugins/org.eclipse.emf.compare.uml2/plugin.xml b/plugins/org.eclipse.emf.compare.uml2/plugin.xml
index 47cc9638c..dd9757364 100644
--- a/plugins/org.eclipse.emf.compare.uml2/plugin.xml
+++ b/plugins/org.eclipse.emf.compare.uml2/plugin.xml
@@ -50,6 +50,15 @@ Contributors:
value="http://www.eclipse.org/uml2/\d.0.0/UML">
</nsURI>
</processor>
+ <processor
+ class="org.eclipse.emf.compare.uml2.internal.postprocessor.MultiplicityElementChangePostProcessor"
+ description="Post Processor for handling UML MultiplicityElement changes"
+ label="Multiplicity Element Change Post Processor"
+ ordinal="25">
+ <nsURI
+ value="http://www.eclipse.org/uml2/\d.0.0/UML">
+ </nsURI>
+ </processor>
</extension>
<extension
point="org.eclipse.emf.compare.rcp.merger">
diff --git a/plugins/org.eclipse.emf.compare.uml2/pom.xml b/plugins/org.eclipse.emf.compare.uml2/pom.xml
index 930263655..502392fd8 100644
--- a/plugins/org.eclipse.emf.compare.uml2/pom.xml
+++ b/plugins/org.eclipse.emf.compare.uml2/pom.xml
@@ -10,6 +10,6 @@
</parent>
<groupId>org.eclipse.emf.compare</groupId>
<artifactId>org.eclipse.emf.compare.uml2</artifactId>
- <version>2.4.0-SNAPSHOT</version>
+ <version>2.5.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/MultiplicityElementChange.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/MultiplicityElementChange.java
new file mode 100644
index 000000000..18f27d99b
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/MultiplicityElementChange.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2012 Obeo.
+ * 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:
+ * Obeo - initial API and implementation
+ */
+package org.eclipse.emf.compare.uml2.internal;
+
+/**
+ * <!-- begin-user-doc --> A representation of the model object '<em><b>Multiplicity Element Change</b></em>
+ * '. <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.emf.compare.uml2.internal.UMLComparePackage#getMultiplicityElementChange()
+ * @model
+ * @generated
+ */
+public interface MultiplicityElementChange extends UMLDiff {
+} // MultiplicityElementChange
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLCompareFactory.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLCompareFactory.java
index 7f62f99ca..24a6f31e5 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLCompareFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLCompareFactory.java
@@ -151,6 +151,15 @@ public interface UMLCompareFactory extends EFactory {
DanglingStereotypeApplication createDanglingStereotypeApplication();
/**
+ * Returns a new object of class '<em>Multiplicity Element Change</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Multiplicity Element Change</em>'.
+ * @generated
+ */
+ MultiplicityElementChange createMultiplicityElementChange();
+
+ /**
* Returns the package supported by this factory.
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @return the package supported by this factory.
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLComparePackage.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLComparePackage.java
index 50aaec75b..6b4600df0 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLComparePackage.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/UMLComparePackage.java
@@ -69,7 +69,7 @@ public interface UMLComparePackage extends EPackage {
int UML_DIFF = 11;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
@@ -220,7 +220,7 @@ public interface UMLComparePackage extends EPackage {
int ASSOCIATION_CHANGE = 0;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
@@ -371,7 +371,7 @@ public interface UMLComparePackage extends EPackage {
int EXTEND_CHANGE = 1;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
@@ -522,7 +522,7 @@ public interface UMLComparePackage extends EPackage {
int GENERALIZATION_SET_CHANGE = 2;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
@@ -673,7 +673,7 @@ public interface UMLComparePackage extends EPackage {
int EXECUTION_SPECIFICATION_CHANGE = 3;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
@@ -824,7 +824,7 @@ public interface UMLComparePackage extends EPackage {
int INTERVAL_CONSTRAINT_CHANGE = 4;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
@@ -975,7 +975,7 @@ public interface UMLComparePackage extends EPackage {
int MESSAGE_CHANGE = 5;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
@@ -1126,7 +1126,7 @@ public interface UMLComparePackage extends EPackage {
int STEREOTYPE_ATTRIBUTE_CHANGE = 6;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
@@ -1277,7 +1277,7 @@ public interface UMLComparePackage extends EPackage {
int STEREOTYPE_APPLICATION_CHANGE = 7;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
@@ -1437,7 +1437,7 @@ public interface UMLComparePackage extends EPackage {
int STEREOTYPE_REFERENCE_CHANGE = 8;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
@@ -1588,7 +1588,7 @@ public interface UMLComparePackage extends EPackage {
int PROFILE_APPLICATION_CHANGE = 9;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
@@ -1748,7 +1748,7 @@ public interface UMLComparePackage extends EPackage {
int DIRECTED_RELATIONSHIP_CHANGE = 10;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
@@ -1899,7 +1899,7 @@ public interface UMLComparePackage extends EPackage {
int STEREOTYPED_ELEMENT_CHANGE = 12;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
@@ -2050,7 +2050,7 @@ public interface UMLComparePackage extends EPackage {
int OPAQUE_ELEMENT_BODY_CHANGE = 13;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
@@ -2211,7 +2211,7 @@ public interface UMLComparePackage extends EPackage {
int DANGLING_STEREOTYPE_APPLICATION = 14;
/**
- * The feature id for the '<em><b>Match</b></em>' reference.
+ * The feature id for the '<em><b>Match</b></em>' container reference.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
@@ -2364,6 +2364,160 @@ public interface UMLComparePackage extends EPackage {
int DANGLING_STEREOTYPE_APPLICATION_FEATURE_COUNT = ComparePackage.RESOURCE_ATTACHMENT_CHANGE_FEATURE_COUNT + 2;
/**
+ * The meta object id for the '{@link org.eclipse.emf.compare.uml2.internal.impl.MultiplicityElementChangeImpl <em>Multiplicity Element Change</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.emf.compare.uml2.internal.impl.MultiplicityElementChangeImpl
+ * @see org.eclipse.emf.compare.uml2.internal.impl.UMLComparePackageImpl#getMultiplicityElementChange()
+ * @generated
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE = 15;
+
+ /**
+ * The feature id for the '<em><b>Match</b></em>' container reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__MATCH = UML_DIFF__MATCH;
+
+ /**
+ * The feature id for the '<em><b>Requires</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__REQUIRES = UML_DIFF__REQUIRES;
+
+ /**
+ * The feature id for the '<em><b>Required By</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__REQUIRED_BY = UML_DIFF__REQUIRED_BY;
+
+ /**
+ * The feature id for the '<em><b>Implies</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__IMPLIES = UML_DIFF__IMPLIES;
+
+ /**
+ * The feature id for the '<em><b>Implied By</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__IMPLIED_BY = UML_DIFF__IMPLIED_BY;
+
+ /**
+ * The feature id for the '<em><b>Refines</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__REFINES = UML_DIFF__REFINES;
+
+ /**
+ * The feature id for the '<em><b>Refined By</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__REFINED_BY = UML_DIFF__REFINED_BY;
+
+ /**
+ * The feature id for the '<em><b>Prime Refining</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__PRIME_REFINING = UML_DIFF__PRIME_REFINING;
+
+ /**
+ * The feature id for the '<em><b>Kind</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__KIND = UML_DIFF__KIND;
+
+ /**
+ * The feature id for the '<em><b>Source</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__SOURCE = UML_DIFF__SOURCE;
+
+ /**
+ * The feature id for the '<em><b>State</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__STATE = UML_DIFF__STATE;
+
+ /**
+ * The feature id for the '<em><b>Equivalence</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__EQUIVALENCE = UML_DIFF__EQUIVALENCE;
+
+ /**
+ * The feature id for the '<em><b>Conflict</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__CONFLICT = UML_DIFF__CONFLICT;
+
+ /**
+ * The feature id for the '<em><b>Discriminant</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__DISCRIMINANT = UML_DIFF__DISCRIMINANT;
+
+ /**
+ * The feature id for the '<em><b>EReference</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE__EREFERENCE = UML_DIFF__EREFERENCE;
+
+ /**
+ * The number of structural features of the '<em>Multiplicity Element Change</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int MULTIPLICITY_ELEMENT_CHANGE_FEATURE_COUNT = UML_DIFF_FEATURE_COUNT + 0;
+
+ /**
* Returns the meta object for class '{@link org.eclipse.emf.compare.uml2.internal.AssociationChange <em>Association Change</em>}'.
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @return the meta object for class '<em>Association Change</em>'.
@@ -2554,6 +2708,16 @@ public interface UMLComparePackage extends EPackage {
EClass getDanglingStereotypeApplication();
/**
+ * Returns the meta object for class '{@link org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange <em>Multiplicity Element Change</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Multiplicity Element Change</em>'.
+ * @see org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange
+ * @generated
+ */
+ EClass getMultiplicityElementChange();
+
+ /**
* Returns the factory that creates the instances of the model. <!-- begin-user-doc --> <!-- end-user-doc
* -->
*
@@ -2753,6 +2917,16 @@ public interface UMLComparePackage extends EPackage {
*/
EClass DANGLING_STEREOTYPE_APPLICATION = eINSTANCE.getDanglingStereotypeApplication();
+ /**
+ * The meta object literal for the '{@link org.eclipse.emf.compare.uml2.internal.impl.MultiplicityElementChangeImpl <em>Multiplicity Element Change</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.emf.compare.uml2.internal.impl.MultiplicityElementChangeImpl
+ * @see org.eclipse.emf.compare.uml2.internal.impl.UMLComparePackageImpl#getMultiplicityElementChange()
+ * @generated
+ */
+ EClass MULTIPLICITY_ELEMENT_CHANGE = eINSTANCE.getMultiplicityElementChange();
+
}
} // UMLComparePackage
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/MultiplicityElementChangeImpl.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/MultiplicityElementChangeImpl.java
new file mode 100644
index 000000000..f0a198e92
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/MultiplicityElementChangeImpl.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2012 Obeo.
+ * 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:
+ * Obeo - initial API and implementation
+ */
+package org.eclipse.emf.compare.uml2.internal.impl;
+
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.uml2.internal.UMLComparePackage;
+import org.eclipse.emf.compare.uml2.internal.spec.UMLDiffSpec;
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc --> An implementation of the model object '<em><b>Multiplicity Element Change</b></em>
+ * '. <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public class MultiplicityElementChangeImpl extends UMLDiffSpec implements MultiplicityElementChange {
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ protected MultiplicityElementChangeImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return UMLComparePackage.Literals.MULTIPLICITY_ELEMENT_CHANGE;
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated NOT
+ */
+ @Override
+ public Diff getPrimeRefining() {
+ if (getRefinedBy().isEmpty()) {
+ return super.getPrimeRefining();
+ } else {
+ return getRefinedBy().get(0);
+ }
+ }
+
+} // MultiplicityElementChangeImpl
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLCompareFactoryImpl.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLCompareFactoryImpl.java
index 6867e7a8b..631ddc778 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLCompareFactoryImpl.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLCompareFactoryImpl.java
@@ -99,6 +99,8 @@ public class UMLCompareFactoryImpl extends EFactoryImpl implements UMLCompareFac
return createOpaqueElementBodyChange();
case UMLComparePackage.DANGLING_STEREOTYPE_APPLICATION:
return createDanglingStereotypeApplication();
+ case UMLComparePackage.MULTIPLICITY_ELEMENT_CHANGE:
+ return createMultiplicityElementChange();
default:
throw new IllegalArgumentException(
"The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
@@ -234,6 +236,16 @@ public class UMLCompareFactoryImpl extends EFactoryImpl implements UMLCompareFac
}
/**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public MultiplicityElementChange createMultiplicityElementChange() {
+ MultiplicityElementChangeImpl multiplicityElementChange = new MultiplicityElementChangeImpl();
+ return multiplicityElementChange;
+ }
+
+ /**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLComparePackageImpl.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLComparePackageImpl.java
index a6cf18c4e..6d7a7b7e0 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLComparePackageImpl.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/impl/UMLComparePackageImpl.java
@@ -19,6 +19,7 @@ import org.eclipse.emf.compare.uml2.internal.ExtendChange;
import org.eclipse.emf.compare.uml2.internal.GeneralizationSetChange;
import org.eclipse.emf.compare.uml2.internal.IntervalConstraintChange;
import org.eclipse.emf.compare.uml2.internal.MessageChange;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
import org.eclipse.emf.compare.uml2.internal.OpaqueElementBodyChange;
import org.eclipse.emf.compare.uml2.internal.ProfileApplicationChange;
import org.eclipse.emf.compare.uml2.internal.StereotypeApplicationChange;
@@ -38,112 +39,130 @@ import org.eclipse.uml2.uml.UMLPackage;
/**
* <!-- begin-user-doc --> An implementation of the model <b>Package</b>. <!-- end-user-doc -->
+ *
* @generated
*/
public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePackage {
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass associationChangeEClass = null;
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass extendChangeEClass = null;
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass generalizationSetChangeEClass = null;
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass executionSpecificationChangeEClass = null;
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass intervalConstraintChangeEClass = null;
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass messageChangeEClass = null;
/**
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass stereotypeAttributeChangeEClass = null;
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass stereotypeApplicationChangeEClass = null;
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass stereotypeReferenceChangeEClass = null;
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass profileApplicationChangeEClass = null;
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass directedRelationshipChangeEClass = null;
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass umlDiffEClass = null;
/**
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass stereotypedElementChangeEClass = null;
/**
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass opaqueElementBodyChangeEClass = null;
/**
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private EClass danglingStereotypeApplicationEClass = null;
/**
- * Creates an instance of the model <b>Package</b>, registered with
- * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
- * package URI value.
- * <p>Note: the correct way to create the package is via the static
- * factory method {@link #init init()}, which also performs
- * initialization of the package, or returns the registered package,
- * if one already exists.
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ private EClass multiplicityElementChangeEClass = null;
+
+ /**
+ * Creates an instance of the model <b>Package</b>, registered with
+ * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package package URI value.
+ * <p>
+ * Note: the correct way to create the package is via the static factory method {@link #init init()},
+ * which also performs initialization of the package, or returns the registered package, if one already
+ * exists. <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @see org.eclipse.emf.ecore.EPackage.Registry
* @see org.eclipse.emf.compare.uml2.internal.UMLComparePackage#eNS_URI
* @see #init()
@@ -155,24 +174,28 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private static boolean isInited = false;
/**
- * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+ * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it
+ * depends.
+ * <p>
+ * This method is used to initialize {@link UMLComparePackage#eINSTANCE} when that field is accessed.
+ * Clients should not invoke it directly. Instead, they should simply access that field to obtain the
+ * package. <!-- begin-user-doc --> <!-- end-user-doc -->
*
- * <p>This method is used to initialize {@link UMLComparePackage#eINSTANCE} when that field is accessed.
- * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
- * <!-- begin-user-doc --> <!-- end-user-doc -->
* @see #eNS_URI
* @see #createPackageContents()
* @see #initializePackageContents()
* @generated
*/
public static UMLComparePackage init() {
- if (isInited)
+ if (isInited) {
return (UMLComparePackage)EPackage.Registry.INSTANCE.getEPackage(UMLComparePackage.eNS_URI);
+ }
// Obtain or create and register package
UMLComparePackageImpl theUMLComparePackage = (UMLComparePackageImpl)(EPackage.Registry.INSTANCE
@@ -201,6 +224,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getAssociationChange() {
@@ -209,6 +233,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getExtendChange() {
@@ -217,6 +242,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getGeneralizationSetChange() {
@@ -225,6 +251,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getExecutionSpecificationChange() {
@@ -233,6 +260,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getIntervalConstraintChange() {
@@ -241,6 +269,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getMessageChange() {
@@ -248,8 +277,8 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
}
/**
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getStereotypeAttributeChange() {
@@ -258,6 +287,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getStereotypeApplicationChange() {
@@ -266,6 +296,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EReference getStereotypeApplicationChange_Stereotype() {
@@ -274,6 +305,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getStereotypeReferenceChange() {
@@ -282,6 +314,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getProfileApplicationChange() {
@@ -290,6 +323,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EReference getProfileApplicationChange_Profile() {
@@ -298,6 +332,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getDirectedRelationshipChange() {
@@ -306,6 +341,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getUMLDiff() {
@@ -314,6 +350,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EReference getUMLDiff_Discriminant() {
@@ -322,6 +359,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EReference getUMLDiff_EReference() {
@@ -329,8 +367,8 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
}
/**
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getStereotypedElementChange() {
@@ -338,8 +376,8 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
}
/**
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getOpaqueElementBodyChange() {
@@ -347,8 +385,8 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
}
/**
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EAttribute getOpaqueElementBodyChange_Language() {
@@ -356,8 +394,8 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
}
/**
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public EClass getDanglingStereotypeApplication() {
@@ -366,6 +404,16 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public EClass getMultiplicityElementChange() {
+ return multiplicityElementChangeEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public UMLCompareFactory getUMLCompareFactory() {
@@ -374,19 +422,21 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private boolean isCreated = false;
/**
- * Creates the meta-model objects for the package. This method is
- * guarded to have no affect on any invocation but its first.
- * <!-- begin-user-doc --> <!-- end-user-doc -->
+ * Creates the meta-model objects for the package. This method is guarded to have no affect on any
+ * invocation but its first. <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public void createPackageContents() {
- if (isCreated)
+ if (isCreated) {
return;
+ }
isCreated = true;
// Create classes and their features
@@ -424,23 +474,27 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
createEAttribute(opaqueElementBodyChangeEClass, OPAQUE_ELEMENT_BODY_CHANGE__LANGUAGE);
danglingStereotypeApplicationEClass = createEClass(DANGLING_STEREOTYPE_APPLICATION);
+
+ multiplicityElementChangeEClass = createEClass(MULTIPLICITY_ELEMENT_CHANGE);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
private boolean isInitialized = false;
/**
- * Complete the initialization of the package and its meta-model. This
- * method is guarded to have no affect on any invocation but its first.
- * <!-- begin-user-doc --> <!-- end-user-doc -->
+ * Complete the initialization of the package and its meta-model. This method is guarded to have no affect
+ * on any invocation but its first. <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
* @generated
*/
public void initializePackageContents() {
- if (isInitialized)
+ if (isInitialized) {
return;
+ }
isInitialized = true;
// Initialize package
@@ -477,6 +531,7 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
danglingStereotypeApplicationEClass.getESuperTypes().add(
theComparePackage.getResourceAttachmentChange());
danglingStereotypeApplicationEClass.getESuperTypes().add(this.getUMLDiff());
+ multiplicityElementChangeEClass.getESuperTypes().add(this.getUMLDiff());
// Initialize classes and features; add operations and parameters
initEClass(associationChangeEClass, AssociationChange.class,
@@ -548,6 +603,9 @@ public class UMLComparePackageImpl extends EPackageImpl implements UMLComparePac
initEClass(danglingStereotypeApplicationEClass, DanglingStereotypeApplication.class,
"DanglingStereotypeApplication", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+ initEClass(multiplicityElementChangeEClass, MultiplicityElementChange.class,
+ "MultiplicityElementChange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+
// Create resource
createResource(eNS_URI);
}
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareAdapterFactory.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareAdapterFactory.java
index 7d63b8f76..870697aad 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareAdapterFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareAdapterFactory.java
@@ -145,6 +145,11 @@ public class UMLCompareAdapterFactory extends AdapterFactoryImpl {
}
@Override
+ public Adapter caseMultiplicityElementChange(MultiplicityElementChange object) {
+ return createMultiplicityElementChangeAdapter();
+ }
+
+ @Override
public Adapter caseDiff(Diff object) {
return createDiffAdapter();
}
@@ -373,6 +378,20 @@ public class UMLCompareAdapterFactory extends AdapterFactoryImpl {
}
/**
+ * Creates a new adapter for an object of class '{@link org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange <em>Multiplicity Element Change</em>}'.
+ * <!-- begin-user-doc -->
+ * This default implementation returns null so that we can easily ignore cases;
+ * it's useful to ignore a case when inheritance will catch all the cases anyway.
+ * <!-- end-user-doc -->
+ * @return the new adapter.
+ * @see org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange
+ * @generated
+ */
+ public Adapter createMultiplicityElementChangeAdapter() {
+ return null;
+ }
+
+ /**
* Creates a new adapter for an object of class '{@link org.eclipse.emf.compare.Diff <em>Diff</em>}'. <!--
* begin-user-doc --> This default implementation returns null so that we can easily ignore cases; it's
* useful to ignore a case when inheritance will catch all the cases anyway. <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareSwitch.java b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareSwitch.java
index 0b1c31129..6161766db 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareSwitch.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src-gen/org/eclipse/emf/compare/uml2/internal/util/UMLCompareSwitch.java
@@ -258,6 +258,17 @@ public class UMLCompareSwitch<T> {
result = defaultCase(theEObject);
return result;
}
+ case UMLComparePackage.MULTIPLICITY_ELEMENT_CHANGE: {
+ MultiplicityElementChange multiplicityElementChange = (MultiplicityElementChange)theEObject;
+ T result = caseMultiplicityElementChange(multiplicityElementChange);
+ if (result == null)
+ result = caseUMLDiff(multiplicityElementChange);
+ if (result == null)
+ result = caseDiff(multiplicityElementChange);
+ if (result == null)
+ result = defaultCase(theEObject);
+ return result;
+ }
default:
return defaultCase(theEObject);
}
@@ -475,6 +486,21 @@ public class UMLCompareSwitch<T> {
}
/**
+ * Returns the result of interpreting the object as an instance of '<em>Multiplicity Element Change</em>'.
+ * <!-- begin-user-doc -->
+ * This implementation returns null;
+ * returning a non-null result will terminate the switch.
+ * <!-- end-user-doc -->
+ * @param object the target of the switch.
+ * @return the result of interpreting the object as an instance of '<em>Multiplicity Element Change</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseMultiplicityElementChange(MultiplicityElementChange object) {
+ return null;
+ }
+
+ /**
* Returns the result of interpreting the object as an instance of '<em>Diff</em>'.
* <!-- begin-user-doc
* --> This implementation returns null; returning a non-null result will terminate the switch. <!--
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/MultiplicityElementChangePostProcessor.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/MultiplicityElementChangePostProcessor.java
new file mode 100644
index 000000000..f106a972e
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/MultiplicityElementChangePostProcessor.java
@@ -0,0 +1,303 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource Muenchen GmbH 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:
+ * Alexandra Buzila - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.uml2.internal.postprocessor;
+
+import static com.google.common.collect.Iterables.filter;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterators;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.Monitor;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Conflict;
+import org.eclipse.emf.compare.ConflictKind;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceSource;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.ReferenceChange;
+import org.eclipse.emf.compare.postprocessor.IPostProcessor;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.uml2.uml.MultiplicityElement;
+import org.eclipse.uml2.uml.UMLPackage;
+
+/**
+ * Post processor handling conflicts of {@link MultiplicityElementChange MultiplicityElementChanges}.
+ *
+ * @author Alexandra Buzila <abuzila@eclipsesource.com>
+ */
+public class MultiplicityElementChangePostProcessor implements IPostProcessor {
+
+ /**
+ * A predicate that can be used to check whether a {@link Diff} is a {@link MultiplicityElementChange}.
+ */
+ private static final Predicate<Diff> IS_MULTIPLICITY_CHANGE = new Predicate<Diff>() {
+ public boolean apply(Diff diff) {
+ return diff instanceof MultiplicityElementChange;
+ }
+ };
+
+ /**
+ * A predicate that can be used to check whether a {@link Diff} is a {@link MultiplicityElementChange} and
+ * its {@link DifferenceSource} is LEFT.
+ */
+ private static final Predicate<Diff> IS_LEFT_MULTIPLICITY_CHANGE = new Predicate<Diff>() {
+ public boolean apply(Diff diff) {
+ return DifferenceSource.LEFT.equals(diff.getSource()) && IS_MULTIPLICITY_CHANGE.apply(diff);
+ }
+ };
+
+ /**
+ * A predicate that can be used to check whether a {@link Diff} is a {@link MultiplicityElementChange} and
+ * its {@link DifferenceSource} is RIGHT.
+ */
+ private static final Predicate<Diff> IS_RIGHT_MULTIPLICITY_CHANGE = new Predicate<Diff>() {
+ public boolean apply(Diff diff) {
+ return DifferenceSource.RIGHT.equals(diff.getSource()) && IS_MULTIPLICITY_CHANGE.apply(diff);
+ }
+ };
+
+ /** {@inheritDoc} */
+ public void postMatch(Comparison comparison, Monitor monitor) {
+ // do nothing
+ }
+
+ /** {@inheritDoc} */
+ public void postDiff(Comparison comparison, Monitor monitor) {
+ // do nothing
+ }
+
+ /** {@inheritDoc} */
+ public void postRequirements(Comparison comparison, Monitor monitor) {
+ // do nothing
+ }
+
+ /** {@inheritDoc} */
+ public void postEquivalences(Comparison comparison, Monitor monitor) {
+ // do nothing
+ }
+
+ /** {@inheritDoc} */
+ public void postConflicts(Comparison comparison, Monitor monitor) {
+ // do nothing
+ }
+
+ /** {@inheritDoc} */
+ public void postComparison(Comparison comparison, Monitor monitor) {
+ updateRequiresAndRefines(comparison);
+ verifyConflicts(comparison);
+ }
+
+ /**
+ * Update the "refinedBy" and "requiredBy" relationships for the MultiplicityElementChanges.
+ * <p>
+ * If a MultiplicityElementChange is refined by a difference, <b>refiningDiff</b>, which in turn refines
+ * another diff, <b>refinedDiff</b>, then the refinement relationships will be updated such that the
+ * MultiplicityElementChange will refine the <b>refinedDiff</b>, instead of the <b>refiningDiff</b>.
+ * <p>
+ * This is done to avoid having diffs that refine multiple elements. Moreover, since any refined diffs of
+ * a refining diff are marked as required by the {@link UMLPostProcessor}, the requirement relationship
+ * needs to be updated accordingly.
+ *
+ * @param comparison
+ * the current comparison
+ */
+ private void updateRequiresAndRefines(Comparison comparison) {
+ Iterator<Diff> multiplicityChanges = Iterators.filter(comparison.getDifferences().iterator(),
+ IS_MULTIPLICITY_CHANGE);
+ while (multiplicityChanges.hasNext()) {
+ MultiplicityElementChange refChange = (MultiplicityElementChange)multiplicityChanges.next();
+ for (Diff refiningDiff : refChange.getRefinedBy()) {
+ ArrayList<Diff> refinedChangesToUpdate = new ArrayList<Diff>();
+ for (Diff refinedDiff : refiningDiff.getRefines()) {
+ if (refinedDiff != refChange) {
+ refinedChangesToUpdate.add(refinedDiff);
+ }
+ }
+ for (Diff refined : refinedChangesToUpdate) {
+ refined.getRefinedBy().remove(refiningDiff);
+ refined.getRefinedBy().add(refChange);
+ refined.getRequires().remove(refChange);
+ }
+ }
+ }
+ }
+
+ /**
+ * Verifies whether the {@link ConflictKind} of conflicts between MultiplicityChanges is correct.
+ *
+ * @param comparison
+ * the comparison containing the conflicts
+ */
+ private void verifyConflicts(Comparison comparison) {
+ final EList<Diff> diffs = comparison.getDifferences();
+ final Iterable<Diff> leftChanges = filter(diffs, IS_LEFT_MULTIPLICITY_CHANGE);
+ for (Diff leftDiff : leftChanges) {
+ final MultiplicityElementChange leftChange = (MultiplicityElementChange)leftDiff;
+
+ final Match match = leftChange.getMatch();
+ final Iterable<Diff> rightChanges = filter(diffs, IS_RIGHT_MULTIPLICITY_CHANGE);
+ for (Diff rightDiff : rightChanges) {
+ MultiplicityElementChange rightChange = (MultiplicityElementChange)rightDiff;
+ if (leftChange.getConflict() != null) {
+ verifyConflict(match, leftChange, rightChange);
+ }
+ }
+ }
+ }
+
+ /**
+ * Verifies whether the {@link ConflictKind} of conflicts between MultiplicityChanges is correct, for a
+ * given match. Specifically, it checks whether the type of all the diffs refining the multiplicity
+ * reference changes is correct and makes sure that if a change contains both PSEUDO and REAL conflicts,
+ * the conflict of the multiplicity change is marked as REAL.
+ *
+ * @param match
+ * the {@link Match} for the object the multiplicity changes refer to
+ * @param leftChange
+ * the left side change
+ * @param rightChange
+ * the right side change
+ */
+ private void verifyConflict(Match match, MultiplicityElementChange leftChange,
+ MultiplicityElementChange rightChange) {
+ if (!isRefinedByReferenceChange(leftChange) || !isRefinedByReferenceChange(rightChange)) {
+ return;
+ }
+ ReferenceChange leftRefChange = (ReferenceChange)leftChange.getRefinedBy().get(0);
+ EReference reference = leftRefChange.getReference();
+
+ if (!affectsReference(reference, rightChange)) {
+ return;
+ }
+ boolean sameValue = sameValue(reference, match.getLeft(), match.getRight());
+ updateConflict(leftChange, rightChange, sameValue);
+
+ }
+
+ /**
+ * Updates the conflict kind of the given MultiplicityElementChanges.
+ *
+ * @param leftChange
+ * the change from the left side
+ * @param rightChange
+ * the change from the right side
+ * @param sameValue
+ * specifies whether the conflicting references have the same value (pseudo conflict) or not
+ * (real conflict)
+ */
+ private void updateConflict(MultiplicityElementChange leftChange, MultiplicityElementChange rightChange,
+ boolean sameValue) {
+ if (sameValue && leftChange.getConflict().getKind() != ConflictKind.PSEUDO
+ && containsOnlyMultiplicityReferenceChanges(leftChange.getConflict())) {
+ leftChange.getConflict().setKind(ConflictKind.PSEUDO);
+ } else if (!sameValue && (leftChange.getConflict().getKind() != ConflictKind.REAL || rightChange
+ .getConflict().getKind() != ConflictKind.REAL)) {
+ Conflict conflict = leftChange.getConflict();
+ conflict.setKind(ConflictKind.REAL);
+ // make sure the multiplicity changes' conflict is the real one
+ leftChange.setConflict(conflict);
+ rightChange.setConflict(conflict);
+ }
+
+ }
+
+ /**
+ * Returns true if the prime refining of the multiplicity element change is a reference change.
+ *
+ * @param change
+ * the {@link MultiplicityElementChange} to check
+ * @return whether the given change has a {@link ReferenceChange} as its prime refining
+ */
+ private boolean isRefinedByReferenceChange(MultiplicityElementChange change) {
+ return change.getPrimeRefining() instanceof ReferenceChange;
+ }
+
+ /**
+ * Checks if the given conflict contains differences that are not of type
+ * {@link MultiplicityElementChange} or are not {@link ReferenceChange reference changes} of
+ * {@link MultiplicityElement multiplicity elements}.
+ *
+ * @param conflict
+ * the conflict to check
+ * @return <code>true</code> if the conflict contains only {@link MultiplicityElementChange} diffs
+ */
+ private boolean containsOnlyMultiplicityReferenceChanges(Conflict conflict) {
+ for (Diff diff : conflict.getDifferences()) {
+ if (diff instanceof MultiplicityElementChange) {
+ continue;
+ }
+ if (!(diff instanceof ReferenceChange)) {
+ return false;
+ }
+ EReference reference = ((ReferenceChange)diff).getReference();
+ if (reference != UMLPackage.eINSTANCE.getMultiplicityElement_LowerValue()
+ && reference != UMLPackage.eINSTANCE.getMultiplicityElement_UpperValue()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Checks whether the given change affects the specified eReference.
+ *
+ * @param eReference
+ * the {@link EReference}
+ * @param change
+ * the {@link MultiplicityElementChange}
+ * @return true if the given {@link MultiplicityElementChange} contains a refining {@link ReferenceChange}
+ * affecting the provided {@link EReference}
+ */
+ private boolean affectsReference(EReference eReference, MultiplicityElementChange change) {
+ for (ReferenceChange diff : filter(change.getRefinedBy(), ReferenceChange.class)) {
+ if (diff.getReference() == eReference) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Checks whether the given EObjects have the same value for the specified {@link EStructuralFeature}.
+ *
+ * @param feature
+ * the {@link EStructuralFeature} to check
+ * @param object1
+ * the first object
+ * @param object2
+ * the second object
+ * @return true if the two given {@link EObject}s have the same value for the given
+ * {@link EStructuralFeature}.
+ */
+ private boolean sameValue(EStructuralFeature feature, EObject object1, EObject object2) {
+ if (object1 == null || object2 == null) {
+ return object1 == object2;
+ }
+ Object value1 = object1.eGet(feature);
+ Object value2 = object2.eGet(feature);
+ if (value1 == null || value2 == null) {
+ return value1 == value2;
+ }
+ if (value1 instanceof EObject && value2 instanceof EObject) {
+ return EcoreUtil.equals((EObject)value1, (EObject)value2);
+ }
+ return value1.equals(value2);
+ }
+
+}
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/MultiplicityElementChangeFactory.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/MultiplicityElementChangeFactory.java
new file mode 100644
index 000000000..74f899a99
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/MultiplicityElementChangeFactory.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource Muenchen GmbH 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:
+ * Alexandra Buzila - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.uml2.internal.postprocessor.extension;
+
+import static com.google.common.base.Predicates.instanceOf;
+import static com.google.common.collect.Iterables.any;
+import static com.google.common.collect.Iterables.find;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.emf.compare.AttributeChange;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.ReferenceChange;
+import org.eclipse.emf.compare.internal.utils.ComparisonUtil;
+import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange;
+import org.eclipse.emf.compare.uml2.internal.UMLCompareFactory;
+import org.eclipse.emf.compare.uml2.internal.postprocessor.AbstractUMLChangeFactory;
+import org.eclipse.emf.compare.utils.MatchUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.util.Switch;
+import org.eclipse.uml2.uml.LiteralInteger;
+import org.eclipse.uml2.uml.LiteralUnlimitedNatural;
+import org.eclipse.uml2.uml.MultiplicityElement;
+import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.ValueSpecification;
+
+/**
+ * Factory for diffs affecting {@link MultiplicityElement MultiplicityElements}.
+ *
+ * @author Alexandra Buzila <abuzila@eclipsesource.com>
+ */
+public class MultiplicityElementChangeFactory extends AbstractUMLChangeFactory {
+
+ @Override
+ public boolean handles(Diff input) {
+ return isChangeOfMultiplicityElement(input) && !refinesMultiplicityChange(input);
+ }
+
+ /**
+ * Check whether the given Diff represents a change of a {@link MultiplicityElement}.
+ *
+ * @param input
+ * the difference to be checked
+ * @return <code>true</code> if the diff is a change of a {@link MultiplicityElement}, <code>false</code>
+ * otherwise.
+ */
+ private boolean isChangeOfMultiplicityElement(Diff input) {
+ if (input instanceof ReferenceChange) {
+ EReference reference = ((ReferenceChange)input).getReference();
+ return reference == UMLPackage.eINSTANCE.getMultiplicityElement_LowerValue()
+ || reference == UMLPackage.eINSTANCE.getMultiplicityElement_UpperValue();
+ } else if (input instanceof AttributeChange) {
+ EObject container = MatchUtil.getContainer(input.getMatch().getComparison(), input);
+ if (container instanceof LiteralInteger || container instanceof LiteralUnlimitedNatural) {
+ EStructuralFeature eContainingFeature = container.eContainingFeature();
+ return eContainingFeature == UMLPackage.eINSTANCE.getMultiplicityElement_LowerValue()
+ || eContainingFeature == UMLPackage.eINSTANCE.getMultiplicityElement_UpperValue();
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Verify if the given diff refines a {@link MultiplicityElementChange} type diff.
+ *
+ * @param input
+ * the diff
+ * @return true if the diff refines a {@link MultiplicityElementChange}
+ */
+ private boolean refinesMultiplicityChange(Diff input) {
+ return any(input.getRefines(), instanceOf(MultiplicityElementChange.class));
+ }
+
+ @Override
+ public void fillRequiredDifferences(Comparison comparison, Diff extension) {
+ // do nothing
+ }
+
+ @Override
+ public void setRefiningChanges(Diff extension, DifferenceKind extensionKind, Diff refiningDiff) {
+ if (refiningDiff.getSource() == extension.getSource()) {
+ addRefiningDiffAndDependencies(extension, refiningDiff);
+ }
+ }
+
+ /**
+ * Add the extension's refining diff and update the its kind, based on the refining diff's kind.
+ *
+ * @param extension
+ * The diff to which the refining diff must be added
+ * @param refiningDiff
+ * The refining diff to add
+ */
+ private void addRefiningDiffAndDependencies(Diff extension, Diff refiningDiff) {
+ extension.getRefinedBy().add(refiningDiff);
+ extension.setKind(refiningDiff.getKind());
+ }
+
+ @Override
+ protected Switch<Set<EObject>> getDiscriminantsGetter() {
+ return new DiscriminantsGetter() {
+ @Override
+ public Set<EObject> caseValueSpecification(ValueSpecification object) {
+ Set<EObject> result = new HashSet<EObject>();
+ result.add(object);
+ return result;
+ }
+ };
+ }
+
+ @Override
+ public Class<? extends Diff> getExtensionKind() {
+ return MultiplicityElementChange.class;
+ }
+
+ @Override
+ protected EObject getDiscriminant(Diff input) {
+ return find(getDiscriminants(input), instanceOf(ValueSpecification.class), null);
+ }
+
+ @Override
+ public Match getParentMatch(Diff input) {
+ EObject multiplicityElement = getDiscriminant(input).eContainer();
+ return ComparisonUtil.getComparison(input).getMatch(multiplicityElement);
+ }
+
+ @Override
+ protected boolean isRelatedToAnExtensionAdd(ReferenceChange input) {
+ return input.getKind() == DifferenceKind.ADD;
+ }
+
+ @Override
+ protected boolean isRelatedToAnExtensionDelete(ReferenceChange input) {
+ return input.getKind() == DifferenceKind.DELETE;
+ }
+
+ @Override
+ public Diff createExtension() {
+ return UMLCompareFactory.eINSTANCE.createMultiplicityElementChange();
+ }
+
+}
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/UMLExtensionFactoryRegistry.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/UMLExtensionFactoryRegistry.java
index 6190d4abf..db81acbd5 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/UMLExtensionFactoryRegistry.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/postprocessor/extension/UMLExtensionFactoryRegistry.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2013, 2015 Obeo.
+ * Copyright (c) 2013, 2016 Obeo 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
@@ -67,6 +67,7 @@ public final class UMLExtensionFactoryRegistry {
factories.add(new UMLStereotypeApplicationChangeFactory());
factories.add(new UMLOpaqueElementBodyChangeFactory());
factories.add(new UMLDanglingStereotypeApplicationFactory());
+ factories.add(new MultiplicityElementChangeFactory());
for (IChangeFactory iDiffExtensionFactory : factories) {
dataset.put(iDiffExtensionFactory.getExtensionKind(), iDiffExtensionFactory);

Back to the top