Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/merge/OpaqueElementBodyChangeMerger.java')
-rw-r--r--plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/merge/OpaqueElementBodyChangeMerger.java55
1 files changed, 44 insertions, 11 deletions
diff --git a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/merge/OpaqueElementBodyChangeMerger.java b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/merge/OpaqueElementBodyChangeMerger.java
index e806fd60b..a74fc0f96 100644
--- a/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/merge/OpaqueElementBodyChangeMerger.java
+++ b/plugins/org.eclipse.emf.compare.uml2/src/org/eclipse/emf/compare/uml2/internal/merge/OpaqueElementBodyChangeMerger.java
@@ -7,9 +7,11 @@
*
* Contributors:
* Philip Langer - initial API and implementation
+ * Martin Fleck - bug 507177: consider refinement behavior
*******************************************************************************/
package org.eclipse.emf.compare.uml2.internal.merge;
+import static org.eclipse.emf.compare.DifferenceState.MERGED;
import static org.eclipse.emf.compare.uml2.internal.postprocessor.util.UMLCompareUtil.getOpaqueElementLanguages;
import static org.eclipse.emf.compare.uml2.internal.postprocessor.util.UMLCompareUtil.isChangeOfOpaqueElementBodyAttribute;
import static org.eclipse.emf.compare.uml2.internal.postprocessor.util.UMLCompareUtil.isChangeOfOpaqueElementLanguageAttribute;
@@ -113,12 +115,37 @@ public class OpaqueElementBodyChangeMerger extends AttributeChangeMerger {
return Optional.absent();
}
+ /**
+ * Returns true if the complete body change has been merged, i.e., the change and all its refinements.
+ *
+ * @param bodyChange
+ * The {@link OpaqueElementBodyChange} to check.
+ * @return true if the complete body change is merged, false otherwise.
+ */
+ private boolean isFullyMerged(OpaqueElementBodyChange bodyChange) {
+ if (bodyChange.getState() != MERGED) {
+ return false;
+ }
+ for (Diff refiningDiff : bodyChange.getRefinedBy()) {
+ if (refiningDiff.getState() != MERGED) {
+ return false;
+ }
+ }
+ return true;
+ }
+
@Override
protected void accept(Diff diff, boolean rightToLeft) {
final Optional<OpaqueElementBodyChange> possibleBodyChange = getOpaqueElementBodyChange(diff);
if (possibleBodyChange.isPresent()) {
final OpaqueElementBodyChange bodyChange = getOpaqueElementBodyChange(diff).get();
+ // ensure that we do not merge an already MERGED OpaqueElementChange, e.g., when both language and
+ // body try to merge it
+ if (isFullyMerged(bodyChange)) {
+ return;
+ }
+
if (LOGGER.isDebugEnabled()) {
int refinedElementCount = bodyChange.getRefinedBy().size();
LOGGER.debug("accept(Diff, boolean) - " + refinedElementCount //$NON-NLS-1$
@@ -142,6 +169,9 @@ public class OpaqueElementBodyChangeMerger extends AttributeChangeMerger {
break;
}
+
+ // we set the whole refinement diff to merged
+ setFullyMerged(bodyChange);
}
}
@@ -151,6 +181,12 @@ public class OpaqueElementBodyChangeMerger extends AttributeChangeMerger {
if (possibleBodyChange.isPresent()) {
final OpaqueElementBodyChange bodyChange = possibleBodyChange.get();
+ // ensure that we do not merge an already MERGED OpaqueElementChange, e.g., when both language and
+ // body try to merge it
+ if (isFullyMerged(bodyChange)) {
+ return;
+ }
+
if (LOGGER.isDebugEnabled()) {
int refinedElementCount = bodyChange.getRefinedBy().size();
LOGGER.debug("Reject(Diff, boolean)" + refinedElementCount //$NON-NLS-1$
@@ -173,6 +209,9 @@ public class OpaqueElementBodyChangeMerger extends AttributeChangeMerger {
default:
break;
}
+
+ // we set the whole refinement diff to merged
+ setFullyMerged(bodyChange);
}
}
@@ -186,7 +225,6 @@ public class OpaqueElementBodyChangeMerger extends AttributeChangeMerger {
* The direction of merging.
*/
private void acceptRefiningDiffs(OpaqueElementBodyChange bodyChange, boolean rightToLeft) {
- bodyChange.setState(DifferenceState.MERGED);
final List<Diff> sortedRefiningDiffs = sortByMergePriority(bodyChange.getRefinedBy());
for (Diff refiningDiff : sortedRefiningDiffs) {
super.accept(refiningDiff, rightToLeft);
@@ -203,7 +241,6 @@ public class OpaqueElementBodyChangeMerger extends AttributeChangeMerger {
* The direction of merging.
*/
private void rejectRefiningDiffs(OpaqueElementBodyChange bodyChange, boolean rightToLeft) {
- bodyChange.setState(DifferenceState.MERGED);
final List<Diff> sortedRefiningDiffs = sortByMergePriority(bodyChange.getRefinedBy());
for (Diff refiningDiff : sortedRefiningDiffs) {
super.reject(refiningDiff, rightToLeft);
@@ -260,9 +297,6 @@ public class OpaqueElementBodyChangeMerger extends AttributeChangeMerger {
final String targetValue = getTargetBodyValue(bodyChange, rightToLeft);
setBody(targetContainer, targetValue, bodyChange.getLanguage());
-
- // we merge the body change as a whole, so set all refining to merged too
- setRefiningDiffsMerged(bodyChange);
}
/**
@@ -453,9 +487,6 @@ public class OpaqueElementBodyChangeMerger extends AttributeChangeMerger {
final int targetIndex = DiffUtil.findInsertionIndex(comparison, languageAttributeMove, rightToLeft);
doMove(container, sourceIndex, targetIndex);
-
- // we merged the body change as a whole, so set all refining to merged too
- setRefiningDiffsMerged(bodyChange);
}
/**
@@ -553,12 +584,14 @@ public class OpaqueElementBodyChangeMerger extends AttributeChangeMerger {
}
/**
- * Sets the {@link DifferenceState state} of all refining differences to merged.
+ * Sets the {@link DifferenceState state} of all refinement differences, i.e., the body change and its
+ * refining diffs, to merged.
*
* @param bodyChange
- * The {@link OpaqueElementBodyChange} to set its refining differences to merged.
+ * The {@link OpaqueElementBodyChange} to set to merged.
*/
- private void setRefiningDiffsMerged(OpaqueElementBodyChange bodyChange) {
+ private void setFullyMerged(OpaqueElementBodyChange bodyChange) {
+ bodyChange.setState(DifferenceState.MERGED);
for (Diff refiningDiff : bodyChange.getRefinedBy()) {
refiningDiff.setState(DifferenceState.MERGED);
}

Back to the top