Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlgoubet2012-10-05 09:30:33 +0000
committerlgoubet2012-10-05 09:30:33 +0000
commitb373be8eaf5a32ca111955842fab19e0760b758f (patch)
treece7d46c67bc2397c3d4b4e784dc237eee3aaf177
parente85152996b162d06cb7f8e11606bf583c04ebe6d (diff)
downloadorg.eclipse.emf.compare-b373be8eaf5a32ca111955842fab19e0760b758f.tar.gz
org.eclipse.emf.compare-b373be8eaf5a32ca111955842fab19e0760b758f.tar.xz
org.eclipse.emf.compare-b373be8eaf5a32ca111955842fab19e0760b758f.zip
Merging Cedric's changes
-rw-r--r--plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/diff/internal/extension/AbstractDiffExtensionFactory.java19
-rw-r--r--plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/diff/internal/extension/factories/NodeChangeFactory.java6
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/AbstractDiffExtensionFactory.java19
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLAssociationChangeFactory.java4
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLDependencyChangeFactory.java5
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLGeneralizationSetChangeFactory.java2
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/profile/UMLProfileApplicationChangeFactory.java2
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/profile/UMLStereotypeApplicationChangeFactory.java12
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLExecutionSpecificationChangeFactory.java4
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLIntervalConstraintChangeFactory.java5
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLMessageChangeFactory.java5
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/usecase/UMLExtendChangeFactory.java2
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/usecase/UMLIncludeChangeFactory.java2
-rw-r--r--plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/equi/DefaultEquiEngine.java7
-rw-r--r--plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/req/DefaultReqEngine.java10
-rw-r--r--plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/utils/MatchUtil.java151
16 files changed, 131 insertions, 124 deletions
diff --git a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/diff/internal/extension/AbstractDiffExtensionFactory.java b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/diff/internal/extension/AbstractDiffExtensionFactory.java
index d7c2381ad..7a4a31ea4 100644
--- a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/diff/internal/extension/AbstractDiffExtensionFactory.java
+++ b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/diff/internal/extension/AbstractDiffExtensionFactory.java
@@ -184,12 +184,19 @@ public abstract class AbstractDiffExtensionFactory implements IDiffExtensionFact
private boolean isChangeOnAddOrDelete(Diff input) {
if (getRelatedExtensionKind(input) == DifferenceKind.CHANGE) {
- final List<Diff> differences = input.getMatch().getComparison().getDifferences();
- differences.remove(input);
- for (Diff diff : differences) {
- if ((getRelatedExtensionKind(diff) == DifferenceKind.ADD || getRelatedExtensionKind(diff) == DifferenceKind.DELETE)
- && getDiscriminantFromDiff(diff) == getDiscriminantFromDiff(input)) {
- return true;
+ final Comparison comparison = input.getMatch().getComparison();
+ final EObject discriminant = getDiscriminantFromDiff(input);
+ final List<Diff> candidates = comparison.getDifferences(discriminant);
+
+ for (Diff diff : candidates) {
+ if (diff == input) {
+ // ignore this one
+ } else {
+ DifferenceKind relatedExtensionKind = getRelatedExtensionKind(diff);
+ if ((relatedExtensionKind == DifferenceKind.ADD || relatedExtensionKind == DifferenceKind.DELETE)
+ && getDiscriminantFromDiff(diff) == discriminant) {
+ return true;
+ }
}
}
}
diff --git a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/diff/internal/extension/factories/NodeChangeFactory.java b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/diff/internal/extension/factories/NodeChangeFactory.java
index 47a58c650..7a8e19511 100644
--- a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/diff/internal/extension/factories/NodeChangeFactory.java
+++ b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/diff/internal/extension/factories/NodeChangeFactory.java
@@ -18,6 +18,7 @@ import java.util.Iterator;
import java.util.List;
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.ReferenceChange;
@@ -93,8 +94,9 @@ public class NodeChangeFactory extends AbstractDiffExtensionFactory {
* @return True if it is over the threshold.
*/
private static boolean isOverThreshold(AttributeChange diff) {
- final EObject left = MatchUtil.getContainer(diff);
- final EObject right = MatchUtil.getOriginContainer(diff);
+ final Comparison comparison = diff.getMatch().getComparison();
+ final EObject left = MatchUtil.getContainer(comparison, diff);
+ final EObject right = MatchUtil.getOriginContainer(comparison, diff);
if (left instanceof Bounds && right instanceof Bounds) {
final int leftX = ((Bounds)left).getX();
final int leftY = ((Bounds)left).getY();
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/AbstractDiffExtensionFactory.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/AbstractDiffExtensionFactory.java
index d5d6968e8..8f46eaa22 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/AbstractDiffExtensionFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/AbstractDiffExtensionFactory.java
@@ -205,12 +205,19 @@ public abstract class AbstractDiffExtensionFactory implements IDiffExtensionFact
private boolean isChangeOnAddOrDelete(Diff input) {
if (getRelatedExtensionKind(input) == DifferenceKind.CHANGE) {
- final List<Diff> differences = input.getMatch().getComparison().getDifferences();
- differences.remove(input);
- for (Diff diff : differences) {
- if ((getRelatedExtensionKind(diff) == DifferenceKind.ADD || getRelatedExtensionKind(diff) == DifferenceKind.DELETE)
- && getDiscriminantFromDiff(diff) == getDiscriminantFromDiff(input)) {
- return true;
+ final Comparison comparison = input.getMatch().getComparison();
+ final EObject discriminant = getDiscriminantFromDiff(input);
+ final List<Diff> candidates = comparison.getDifferences(discriminant);
+
+ for (Diff diff : candidates) {
+ if (diff == input) {
+ // ignore this one
+ } else {
+ DifferenceKind relatedExtensionKind = getRelatedExtensionKind(diff);
+ if ((relatedExtensionKind == DifferenceKind.ADD || relatedExtensionKind == DifferenceKind.DELETE)
+ && getDiscriminantFromDiff(diff) == discriminant) {
+ return true;
+ }
}
}
}
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLAssociationChangeFactory.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLAssociationChangeFactory.java
index 18d67c27d..e2cf59e51 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLAssociationChangeFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLAssociationChangeFactory.java
@@ -47,7 +47,7 @@ public class UMLAssociationChangeFactory extends AbstractDiffExtensionFactory {
if (kind == DifferenceKind.ADD || kind == DifferenceKind.DELETE) {
result = ((ReferenceChange)input).getValue();
} else if (kind == DifferenceKind.CHANGE) {
- final EObject container = MatchUtil.getContainer(input);
+ final EObject container = MatchUtil.getContainer(input.getMatch().getComparison(), input);
if (container instanceof Property) {
result = ((Property)container).getAssociation();
}
@@ -89,7 +89,7 @@ public class UMLAssociationChangeFactory extends AbstractDiffExtensionFactory {
@Override
protected boolean isRelatedToAnExtensionChange(ReferenceChange input) {
- final EObject diffContainer = MatchUtil.getContainer(input);
+ final EObject diffContainer = MatchUtil.getContainer(input.getMatch().getComparison(), input);
return isAssociationPropertyChange(input, diffContainer)
|| isAssociationPropertyCardinalityChange(input, diffContainer);
}
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLDependencyChangeFactory.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLDependencyChangeFactory.java
index 752c86426..a1b303df3 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLDependencyChangeFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLDependencyChangeFactory.java
@@ -54,7 +54,7 @@ public class UMLDependencyChangeFactory extends AbstractDiffExtensionFactory {
if (kind == DifferenceKind.ADD || kind == DifferenceKind.DELETE) {
result = ((ReferenceChange)input).getValue();
} else if (kind == DifferenceKind.CHANGE) {
- final EObject container = MatchUtil.getContainer(input);
+ final EObject container = MatchUtil.getContainer(input.getMatch().getComparison(), input);
if (container instanceof Dependency) {
result = container;
}
@@ -75,7 +75,8 @@ public class UMLDependencyChangeFactory extends AbstractDiffExtensionFactory {
protected boolean isRelatedToAnExtensionChange(ReferenceChange input) {
return (input.getReference().equals(UMLPackage.Literals.DEPENDENCY__CLIENT) || input.getReference()
.equals(UMLPackage.Literals.DEPENDENCY__SUPPLIER))
- && getManagedConcreteDiscriminantKind().contains(MatchUtil.getContainer(input).eClass());
+ && getManagedConcreteDiscriminantKind().contains(
+ MatchUtil.getContainer(input.getMatch().getComparison(), input).eClass());
}
@Override
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLGeneralizationSetChangeFactory.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLGeneralizationSetChangeFactory.java
index bbf6960e0..c3be49aa6 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLGeneralizationSetChangeFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/clazz/UMLGeneralizationSetChangeFactory.java
@@ -46,7 +46,7 @@ public class UMLGeneralizationSetChangeFactory extends AbstractDiffExtensionFact
if (kind == DifferenceKind.ADD || kind == DifferenceKind.DELETE) {
result = ((ReferenceChange)input).getValue();
} else if (kind == DifferenceKind.CHANGE) {
- final EObject container = MatchUtil.getContainer(input);
+ final EObject container = MatchUtil.getContainer(input.getMatch().getComparison(), input);
if (container instanceof GeneralizationSet) {
result = container;
}
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/profile/UMLProfileApplicationChangeFactory.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/profile/UMLProfileApplicationChangeFactory.java
index e5b6c2153..e922b59a0 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/profile/UMLProfileApplicationChangeFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/profile/UMLProfileApplicationChangeFactory.java
@@ -58,7 +58,7 @@ public class UMLProfileApplicationChangeFactory extends AbstractDiffExtensionFac
if (kind == DifferenceKind.ADD || kind == DifferenceKind.DELETE) {
return ((ReferenceChange)input).getValue();
} else if (kind == DifferenceKind.CHANGE) {
- final EObject container = MatchUtil.getContainer(input);
+ final EObject container = MatchUtil.getContainer(input.getMatch().getComparison(), input);
return getDiscriminantForChanges(container);
}
return result;
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/profile/UMLStereotypeApplicationChangeFactory.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/profile/UMLStereotypeApplicationChangeFactory.java
index be1ee2fce..e5c7344d3 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/profile/UMLStereotypeApplicationChangeFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/profile/UMLStereotypeApplicationChangeFactory.java
@@ -65,10 +65,10 @@ public class UMLStereotypeApplicationChangeFactory extends AbstractDiffExtension
if (input instanceof ReferenceChange) {
return ((ReferenceChange)input).getValue();
} else if (input instanceof ResourceAttachmentChange) {
- return MatchUtil.getContainer(input);
+ return MatchUtil.getContainer(input.getMatch().getComparison(), input);
}
} else if (kind == DifferenceKind.CHANGE) {
- return MatchUtil.getContainer(input);
+ return MatchUtil.getContainer(input.getMatch().getComparison(), input);
}
return result;
}
@@ -118,24 +118,24 @@ public class UMLStereotypeApplicationChangeFactory extends AbstractDiffExtension
@Override
protected boolean isRelatedToAnExtensionChange(AttributeChange input) {
- return UMLUtil.getBaseElement(MatchUtil.getContainer(input)) != null;
+ return UMLUtil.getBaseElement(MatchUtil.getContainer(input.getMatch().getComparison(), input)) != null;
}
@Override
protected boolean isRelatedToAnExtensionChange(ReferenceChange input) {
- return UMLUtil.getBaseElement(MatchUtil.getContainer(input)) != null;
+ return UMLUtil.getBaseElement(MatchUtil.getContainer(input.getMatch().getComparison(), input)) != null;
}
@Override
protected boolean isRelatedToAnExtensionAdd(ResourceAttachmentChange input) {
return input.getKind() == DifferenceKind.ADD
- && UMLUtil.getBaseElement(MatchUtil.getContainer(input)) != null;
+ && UMLUtil.getBaseElement(MatchUtil.getContainer(input.getMatch().getComparison(), input)) != null;
}
@Override
protected boolean isRelatedToAnExtensionDelete(ResourceAttachmentChange input) {
return input.getKind() == DifferenceKind.DELETE
- && UMLUtil.getBaseElement(MatchUtil.getContainer(input)) != null;
+ && UMLUtil.getBaseElement(MatchUtil.getContainer(input.getMatch().getComparison(), input)) != null;
}
@Override
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLExecutionSpecificationChangeFactory.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLExecutionSpecificationChangeFactory.java
index 697e61ab9..25deb2f2f 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLExecutionSpecificationChangeFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLExecutionSpecificationChangeFactory.java
@@ -48,7 +48,7 @@ public class UMLExecutionSpecificationChangeFactory extends AbstractDiffExtensio
if (kind == DifferenceKind.ADD || kind == DifferenceKind.DELETE) {
result = ((ReferenceChange)input).getValue();
} else if (kind == DifferenceKind.CHANGE) {
- final EObject container = MatchUtil.getContainer(input);
+ final EObject container = MatchUtil.getContainer(input.getMatch().getComparison(), input);
if (container instanceof ExecutionSpecification) {
result = container;
} else if (container instanceof ExecutionOccurrenceSpecification) {
@@ -82,7 +82,7 @@ public class UMLExecutionSpecificationChangeFactory extends AbstractDiffExtensio
return ((input.getReference().equals(UMLPackage.Literals.EXECUTION_SPECIFICATION__START)
|| input.getReference().equals(UMLPackage.Literals.EXECUTION_SPECIFICATION__FINISH) || input
.getReference().equals(UMLPackage.Literals.INTERACTION_FRAGMENT__COVERED)) && getManagedConcreteDiscriminantKind()
- .contains(MatchUtil.getContainer(input).eClass()));
+ .contains(MatchUtil.getContainer(input.getMatch().getComparison(), input).eClass()));
}
@Override
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLIntervalConstraintChangeFactory.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLIntervalConstraintChangeFactory.java
index 6ebfe6bb4..0c56304a5 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLIntervalConstraintChangeFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLIntervalConstraintChangeFactory.java
@@ -53,7 +53,7 @@ public class UMLIntervalConstraintChangeFactory extends AbstractDiffExtensionFac
if (kind == DifferenceKind.ADD || kind == DifferenceKind.DELETE) {
result = ((ReferenceChange)input).getValue();
} else if (kind == DifferenceKind.CHANGE) {
- final EObject container = MatchUtil.getContainer(input);
+ final EObject container = MatchUtil.getContainer(input.getMatch().getComparison(), input);
result = getIntervalContraint(container);
}
return result;
@@ -106,7 +106,8 @@ public class UMLIntervalConstraintChangeFactory extends AbstractDiffExtensionFac
|| input.getReference().equals(UMLPackage.Literals.INTERVAL__MIN)
|| input.getReference().equals(UMLPackage.Literals.INTERVAL__MAX) || input.getReference()
.equals(UMLPackage.Literals.TIME_EXPRESSION__EXPR))
- && getManagedConcreteDiscriminantKind().contains(MatchUtil.getContainer(input).eClass());
+ && getManagedConcreteDiscriminantKind().contains(
+ MatchUtil.getContainer(input.getMatch().getComparison(), input).eClass());
}
@Override
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLMessageChangeFactory.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLMessageChangeFactory.java
index cc73f44ea..c9a978b13 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLMessageChangeFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/sequence/UMLMessageChangeFactory.java
@@ -50,7 +50,7 @@ public class UMLMessageChangeFactory extends AbstractDiffExtensionFactory {
if (kind == DifferenceKind.ADD || kind == DifferenceKind.DELETE) {
result = ((ReferenceChange)input).getValue();
} else if (kind == DifferenceKind.CHANGE) {
- final EObject container = MatchUtil.getContainer(input);
+ final EObject container = MatchUtil.getContainer(input.getMatch().getComparison(), input);
if (container instanceof Message) {
result = container;
} else if (container instanceof MessageOccurrenceSpecification) {
@@ -90,7 +90,8 @@ public class UMLMessageChangeFactory extends AbstractDiffExtensionFactory {
return (input.getReference().equals(UMLPackage.Literals.MESSAGE__RECEIVE_EVENT)
|| input.getReference().equals(UMLPackage.Literals.MESSAGE__SEND_EVENT) || input
.getReference().equals(UMLPackage.Literals.INTERACTION_FRAGMENT__COVERED))
- && getManagedConcreteDiscriminantKind().contains(MatchUtil.getContainer(input).eClass());
+ && getManagedConcreteDiscriminantKind().contains(
+ MatchUtil.getContainer(input.getMatch().getComparison(), input).eClass());
}
@Override
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/usecase/UMLExtendChangeFactory.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/usecase/UMLExtendChangeFactory.java
index e50fd65d6..35185b850 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/usecase/UMLExtendChangeFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/usecase/UMLExtendChangeFactory.java
@@ -46,7 +46,7 @@ public class UMLExtendChangeFactory extends AbstractDiffExtensionFactory {
if (kind == DifferenceKind.ADD || kind == DifferenceKind.DELETE) {
result = ((ReferenceChange)input).getValue();
} else if (kind == DifferenceKind.CHANGE) {
- final EObject container = MatchUtil.getContainer(input);
+ final EObject container = MatchUtil.getContainer(input.getMatch().getComparison(), input);
if (container instanceof Extend) {
result = container;
}
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/usecase/UMLIncludeChangeFactory.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/usecase/UMLIncludeChangeFactory.java
index 0bbae714a..b0456328b 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/usecase/UMLIncludeChangeFactory.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/diff/internal/extension/usecase/UMLIncludeChangeFactory.java
@@ -46,7 +46,7 @@ public class UMLIncludeChangeFactory extends AbstractDiffExtensionFactory {
if (kind == DifferenceKind.ADD || kind == DifferenceKind.DELETE) {
result = ((ReferenceChange)input).getValue();
} else if (kind == DifferenceKind.CHANGE) {
- final EObject container = MatchUtil.getContainer(input);
+ final EObject container = MatchUtil.getContainer(input.getMatch().getComparison(), input);
if (container instanceof Include) {
result = container;
}
diff --git a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/equi/DefaultEquiEngine.java b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/equi/DefaultEquiEngine.java
index acb1bb4fe..84c2deb1c 100644
--- a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/equi/DefaultEquiEngine.java
+++ b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/equi/DefaultEquiEngine.java
@@ -90,7 +90,7 @@ public class DefaultEquiEngine implements IEquiEngine {
* Add the difference where the value is the object containing the current difference, which is
* contained by the value of the current difference, where the reference is linked to the opposite
* one
- */
+ */
final Match valueMatch = comparison.getMatch(referenceChange.getValue());
final EReference eOpposite = referenceChange.getReference().getEOpposite();
if (eOpposite != null && valueMatch != null) {
@@ -102,7 +102,7 @@ public class DefaultEquiEngine implements IEquiEngine {
.getValue());
return candidateMatch == referenceChange.getMatch();
}
- return false;
+ return false;
}
};
final Iterable<Diff> candidates = filter(valueMatch.getDifferences(), candidateFilter);
@@ -130,7 +130,8 @@ public class DefaultEquiEngine implements IEquiEngine {
*/
private void addChangesFromOrigin(Comparison comparison, ReferenceChange diff, Equivalence equivalence) {
if (!diff.getReference().isMany()) {
- final EObject originContainer = MatchUtil.getOriginContainer(diff);
+ final EObject originContainer = MatchUtil.getOriginContainer(diff.getMatch().getComparison(),
+ diff);
if (originContainer != null) {
for (Diff referenceChange : comparison.getDifferences(originContainer)) {
if (referenceChange instanceof ReferenceChange
diff --git a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/req/DefaultReqEngine.java b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/req/DefaultReqEngine.java
index 4dc7d9968..26f9b0c1c 100644
--- a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/req/DefaultReqEngine.java
+++ b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/req/DefaultReqEngine.java
@@ -88,8 +88,8 @@ public class DefaultReqEngine implements IReqEngine {
// -> requires ADD of the value of the reference (target object)
requiredDifferences.addAll(getDifferenceOnGivenObject(comparison, value, DifferenceKind.ADD));
- // -> requires ADD of the object containing the reference
- final EObject container = MatchUtil.getContainer(sourceDifference);
+ // -> requires ADD of the object containing the reference
+ final EObject container = MatchUtil.getContainer(comparison, sourceDifference);
if (container != null) {
requiredDifferences.addAll(getDifferenceOnGivenObject(comparison, container,
DifferenceKind.ADD));
@@ -135,8 +135,8 @@ public class DefaultReqEngine implements IReqEngine {
&& !isChangeDelete(sourceDifference)) {
// -> is required by DELETE of the origin target object
- requiredByDifferences.addAll(getDifferenceOnGivenObject(comparison, MatchUtil
- .getOriginValue(sourceDifference), DifferenceKind.DELETE));
+ requiredByDifferences.addAll(getDifferenceOnGivenObject(comparison, MatchUtil.getOriginValue(
+ comparison, sourceDifference), DifferenceKind.DELETE));
// -> requires ADD of the value of the reference (target object) if required
requiredDifferences.addAll(getDifferenceOnGivenObject(comparison, value, DifferenceKind.ADD));
@@ -164,7 +164,7 @@ public class DefaultReqEngine implements IReqEngine {
Set<ReferenceChange> result = new HashSet<ReferenceChange>();
EReference reference = sourceDifference.getReference();
if (!reference.isMany()) {
- EObject originContainer = MatchUtil.getOriginContainer(sourceDifference);
+ EObject originContainer = MatchUtil.getOriginContainer(comparison, sourceDifference);
if (originContainer != null) {
Object originValue = ReferenceUtil.safeEGet(originContainer, reference);
if (originValue instanceof EObject) {
diff --git a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/utils/MatchUtil.java b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/utils/MatchUtil.java
index 2f784ab33..2f416b840 100644
--- a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/utils/MatchUtil.java
+++ b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/utils/MatchUtil.java
@@ -16,10 +16,12 @@ 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.DifferenceSource;
import org.eclipse.emf.compare.Match;
import org.eclipse.emf.compare.ReferenceChange;
import org.eclipse.emf.compare.util.CompareSwitch;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
/**
@@ -70,12 +72,13 @@ public final class MatchUtil {
* The given reference change.
* @return The origin value.
*/
- public static EObject getOriginValue(ReferenceChange difference) {
- if (!difference.getReference().isContainment() && !difference.getReference().isMany()
+ public static EObject getOriginValue(Comparison comparison, ReferenceChange difference) {
+ final EReference reference = difference.getReference();
+ if (!reference.isContainment() && !reference.isMany()
&& difference.getKind().equals(DifferenceKind.CHANGE)) {
- EObject originContainer = getOriginContainer(difference);
+ EObject originContainer = getOriginContainer(comparison, difference);
if (originContainer != null) {
- Object originValue = ReferenceUtil.safeEGet(originContainer, difference.getReference());
+ Object originValue = ReferenceUtil.safeEGet(originContainer, reference);
if (originValue instanceof EObject) {
return (EObject)originValue;
}
@@ -93,12 +96,12 @@ public final class MatchUtil {
* The difference.
* @return The object.
*/
- public static EObject getOriginContainer(Diff difference) {
+ public static EObject getOriginContainer(Comparison comparison, Diff difference) {
final EObject diffContainer;
- if (difference.getMatch().getComparison().isThreeWay()) {
+ if (comparison.isThreeWay()) {
diffContainer = difference.getMatch().getOrigin();
} else {
- if (getContainer(difference) == difference.getMatch().getLeft()) {
+ if (getContainer(comparison, difference) == difference.getMatch().getLeft()) {
diffContainer = difference.getMatch().getRight();
} else {
diffContainer = difference.getMatch().getLeft();
@@ -107,84 +110,66 @@ public final class MatchUtil {
return diffContainer;
}
- // /**
- // * Get the business model object containing the given <code>difference</code>.
- // *
- // * @param comparison
- // * The comparison.
- // * @param difference
- // * The difference.
- // * @return The object.
- // */
- // public static EObject getContainer(Comparison comparison, ReferenceChange difference) {
- // EObject result = null;
- // Match match = difference.getMatch();
- // final DifferenceSource source = difference.getSource();
- // final DifferenceKind kind = difference.getKind();
- // switch (kind) {
- // case DELETE:
- // if (comparison.isThreeWay()) {
- // result = match.getOrigin();
- // } else {
- // result = match.getRight();
- // }
- // break;
- // case ADD:
- // // fall through
- // case MOVE:
- // if (source == DifferenceSource.LEFT) {
- // result = match.getLeft();
- // } else {
- // result = match.getRight();
- // }
- // break;
- // case CHANGE:
- // final EObject value = difference.getValue();
- // if (getAsList(match.getLeft(), difference.getReference()).contains(value)) {
- // result = match.getLeft();
- // } else if (getAsList(match.getRight(), difference.getReference()).contains(value)) {
- // result = match.getRight();
- // } else {
- // result = match.getOrigin();
- // }
- // break;
- // default:
- // // no other case for now.
- // }
- // return result;
- // }
-
/**
* Get the business model object containing the given <code>difference</code>.
*
+ * @param comparison
+ * The comparison.
* @param difference
- * The detected difference for which we need the actually modified object.
- * @return The object which presents the given difference.
+ * The difference.
+ * @return The object.
*/
- public static EObject getContainer(Diff difference) {
+ public static EObject getContainer(Comparison comparison, Diff difference) {
EObject result = null;
- final Object value = getValue(difference);
- if (value != null) {
- Match match = difference.getMatch();
- if (getAsList(match.getLeft(), getStructuralFeature(difference)).contains(value)) {
- result = match.getLeft();
- } else if (getAsList(match.getRight(), getStructuralFeature(difference)).contains(value)) {
- result = match.getRight();
- } else if (getAsList(match.getOrigin(), getStructuralFeature(difference)).contains(value)) {
- result = match.getOrigin();
- }
- } else {
- if (difference.getMatch().getLeft() != null) {
- return difference.getMatch().getLeft();
- }
- if (difference.getMatch().getRight() != null) {
- return difference.getMatch().getRight();
- }
- if (difference.getMatch().getOrigin() != null) {
- return difference.getMatch().getOrigin();
- }
+ Match match = difference.getMatch();
+ final DifferenceSource source = difference.getSource();
+ final DifferenceKind kind = difference.getKind();
+ switch (kind) {
+ case DELETE:
+ if (comparison.isThreeWay()) {
+ result = match.getOrigin();
+ } else {
+ result = match.getRight();
+ }
+ break;
+ case ADD:
+ // fall through
+ case MOVE:
+ if (source == DifferenceSource.LEFT) {
+ result = match.getLeft();
+ } else {
+ result = match.getRight();
+ }
+ break;
+ case CHANGE:
+ final Object value = getValue(difference);
+ final EStructuralFeature feature = getStructuralFeature(difference);
+ if (value == null || feature == null) {
+ // TODO ?
+ throw new IllegalArgumentException();
+ }
+ if (source == DifferenceSource.LEFT) {
+ if (getAsList(match.getLeft(), feature).contains(value)) {
+ result = match.getLeft();
+ } else if (comparison.isThreeWay()) {
+ result = match.getOrigin();
+ } else {
+ result = match.getRight();
+ }
+ } else {
+ if (getAsList(match.getRight(), feature).contains(value)) {
+ result = match.getRight();
+ } else if (comparison.isThreeWay()) {
+ result = match.getOrigin();
+ } else {
+ // Cannot happen ... for now
+ result = match.getLeft();
+ }
+ }
+ break;
+ default:
+ // no other case for now.
}
-
return result;
}
@@ -196,7 +181,7 @@ public final class MatchUtil {
* @return the value of the difference.
*/
public static Object getValue(Diff input) {
- return new CompareSwitch<Object>() {
+ final CompareSwitch<Object> customSwitch = new CompareSwitch<Object>() {
@Override
public Object caseAttributeChange(AttributeChange object) {
return object.getValue();
@@ -207,7 +192,8 @@ public final class MatchUtil {
return object.getValue();
}
- }.doSwitch(input);
+ };
+ return customSwitch.doSwitch(input);
}
/**
@@ -218,7 +204,7 @@ public final class MatchUtil {
* @return the structural feature.
*/
public static EStructuralFeature getStructuralFeature(Diff input) {
- return new CompareSwitch<EStructuralFeature>() {
+ final CompareSwitch<EStructuralFeature> customSwitch = new CompareSwitch<EStructuralFeature>() {
@Override
public EStructuralFeature caseAttributeChange(AttributeChange object) {
return object.getAttribute();
@@ -229,7 +215,8 @@ public final class MatchUtil {
return object.getReference();
}
- }.doSwitch(input);
+ };
+ return customSwitch.doSwitch(input);
}
}

Back to the top