diff options
author | lgoubet | 2011-07-29 13:08:29 +0000 |
---|---|---|
committer | lgoubet | 2011-08-04 11:07:05 +0000 |
commit | 171a4ce4a5becaa2a16d83f4c06bfd8e108fc4ee (patch) | |
tree | a01e64becf87b4085c3cca5844e4339cabacc637 | |
parent | 8e6ea44dc12e0ceab74d7f0db4501be8a4707ba2 (diff) | |
download | org.eclipse.emf.compare-171a4ce4a5becaa2a16d83f4c06bfd8e108fc4ee.tar.gz org.eclipse.emf.compare-171a4ce4a5becaa2a16d83f4c06bfd8e108fc4ee.tar.xz org.eclipse.emf.compare-171a4ce4a5becaa2a16d83f4c06bfd8e108fc4ee.zip |
Add check to avoid detecting differences on proxyfied references
-rw-r--r-- | plugins/org.eclipse.emf.compare.diff/src/org/eclipse/emf/compare/diff/engine/check/ReferencesCheck.java | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/plugins/org.eclipse.emf.compare.diff/src/org/eclipse/emf/compare/diff/engine/check/ReferencesCheck.java b/plugins/org.eclipse.emf.compare.diff/src/org/eclipse/emf/compare/diff/engine/check/ReferencesCheck.java index fe6d0a4c6..0c334c81d 100644 --- a/plugins/org.eclipse.emf.compare.diff/src/org/eclipse/emf/compare/diff/engine/check/ReferencesCheck.java +++ b/plugins/org.eclipse.emf.compare.diff/src/org/eclipse/emf/compare/diff/engine/check/ReferencesCheck.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.Iterator;
import java.util.List;
+import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.compare.FactoryException;
import org.eclipse.emf.compare.diff.metamodel.ConflictingDiffElement;
import org.eclipse.emf.compare.diff.metamodel.DiffElement;
@@ -31,6 +32,7 @@ import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
/**
@@ -228,6 +230,7 @@ public class ReferencesCheck extends AbstractCheck { for (final ReferenceChangeRightTarget removed : removedReferences) {
removedIndices.add(Integer.valueOf(rightElementReferences.indexOf(removed.getRightTarget())));
}
+
int expectedIndex = 0;
for (int i = 0; i < leftElementReferences.size(); i++) {
final EObject matched = getMatchedEObject(leftElementReferences.get(i));
@@ -430,6 +433,24 @@ public class ReferencesCheck extends AbstractCheck { // have no matching "right" counterpart
addedReferences.removeAll(matchedOldReferences);
+ // Double check for proxies
+ for (EObject addedValue : new ArrayList<EObject>(addedReferences)) {
+ if (addedValue.eIsProxy() && addedValue instanceof InternalEObject) {
+ boolean found = false;
+ final URI proxyURI = ((InternalEObject)addedValue).eProxyURI();
+ final Iterator<EObject> deletedValuesIterator = deletedReferences.iterator();
+ while (!found && deletedValuesIterator.hasNext()) {
+ final EObject deletedValue = deletedValuesIterator.next();
+ if (deletedValue.eIsProxy() && deletedValue instanceof InternalEObject) {
+ found = proxyURI.equals(((InternalEObject)deletedValue).eProxyURI());
+ }
+ }
+ if (found) {
+ addedReferences.remove(addedValue);
+ }
+ }
+ }
+
return addedReferences;
}
@@ -462,6 +483,24 @@ public class ReferencesCheck extends AbstractCheck { // have no counterpart in the left element
deletedReferences.removeAll(matchedNewReferences);
+ // Double check for proxies and external dependencies
+ for (EObject deletedValue : new ArrayList<EObject>(deletedReferences)) {
+ if (deletedValue.eIsProxy() && deletedValue instanceof InternalEObject) {
+ boolean found = false;
+ final URI proxyURI = ((InternalEObject)deletedValue).eProxyURI();
+ final Iterator<EObject> addedValuesIterator = addedReferences.iterator();
+ while (!found && addedValuesIterator.hasNext()) {
+ final EObject addedValue = addedValuesIterator.next();
+ if (addedValue.eIsProxy() && addedValue instanceof InternalEObject) {
+ found = proxyURI.equals(((InternalEObject)addedValue).eProxyURI());
+ }
+ }
+ if (found) {
+ deletedReferences.remove(deletedValue);
+ }
+ }
+ }
+
return deletedReferences;
}
|