X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=org.simantics.interop.update%2Fsrc%2Forg%2Fsimantics%2Finterop%2Fupdate%2Feditor%2FModelUpdateEditor.java;h=4c172997bd1068f490dd267b86f125760e3af021;hb=3fe624a016f20b34e5e8b4056a3aeebfff0c9f7b;hp=860057d240f6d9763c6659f62fed9b9f876a05e8;hpb=3f2d346f673d9ad89f586223fc9af663325a8ded;p=simantics%2Finterop.git diff --git a/org.simantics.interop.update/src/org/simantics/interop/update/editor/ModelUpdateEditor.java b/org.simantics.interop.update/src/org/simantics/interop/update/editor/ModelUpdateEditor.java index 860057d..4c17299 100644 --- a/org.simantics.interop.update/src/org/simantics/interop/update/editor/ModelUpdateEditor.java +++ b/org.simantics.interop.update/src/org/simantics/interop/update/editor/ModelUpdateEditor.java @@ -4,8 +4,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; -import java.util.Stack; import java.util.Map.Entry; +import java.util.Stack; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; @@ -83,6 +83,7 @@ public abstract class ModelUpdateEditor extends Composite{ private UpdateList updateList; private GraphChanges changes2; + private GraphChanges changes3; private UpdateTree updateTree2; private UpdateList updateList2; @@ -401,23 +402,16 @@ public abstract class ModelUpdateEditor extends Composite{ addFilters(filters); - Resource r1 = uei.getR1(); - Resource r2 = uei.getR2(); - Resource r3 = uei.getR3(); + Resource oldModel = uei.getR1(); // old model that is being updated, contains user made changes + Resource newModel = uei.getR2(); // new model, + Resource originalModel = uei.getR3(); // original old model without user made changes try { - Pair result = getChanges(r1,r2); - GraphComparator comparator = result.first; - if (result.second != null) - showWarning(result.second); - comparator.test(getSession()); - changes = comparator.getChanges(); - changes = getSession().syncRequest(new FilterChangesRead(changes)); - updateTree = getUpdateTree(changes); - updateList = getUpdateList(changes); - if (r3 != null) { - Pair result2 = getChanges(r1,r3); + if (originalModel != null) { + // tree way comparison + // compare the original and the old model + Pair result2 = getChanges(originalModel, oldModel); GraphComparator comparator2 = result2.first; if (result2.second != null) showWarning(result2.second); @@ -427,8 +421,63 @@ public abstract class ModelUpdateEditor extends Composite{ updateTree2 = getUpdateTree(changes2); updateList2 = getUpdateList(changes2); + // compare the original and the new model + Pair result3 = getChanges(originalModel,newModel); + GraphComparator comparator3 = result3.first; + if (result3.second != null) + showWarning(result3.second); + comparator3.test(getSession()); + changes3 = comparator3.getChanges(); + changes3 = getSession().syncRequest(new FilterChangesRead(changes3)); + } + + Pair result = getChanges(oldModel,newModel); + GraphComparator comparator = result.first; + if (result.second != null) + showWarning(result.second); + if (originalModel != null) { + // three-way comparison: use change information to configure + // the comparison between the old and the new model. + + // 1. map comparable resources + for (Entry origToOld : changes2.getComparable().getEntries()) { + Resource oldR = origToOld.getValue(); + Resource newR = changes3.getComparable().getRight(origToOld.getKey()); + if (newR != null) { + comparator.addComparableResources(oldR, newR); + } + } + // 2. mark removed resources as distinct, so that comparison does not pair them + for (Statement s : changes2.getDeletions()) { + if (changes3.getComparable().containsLeft(s.getObject())) + comparator.addNonMatchedRight(changes3.getComparable().getRight(s.getObject())); + } + + for (Statement s : changes3.getDeletions()) { + if (changes2.getComparable().containsLeft(s.getObject())) + comparator.addNonMatchedLeft(changes2.getComparable().getRight(s.getObject())); + } + if (uei.isNewDistinct()) { + // 3. mark added resources as distinct, so that comparison does not pair them + for (Statement s : changes2.getAdditions()) { + comparator.addNonMatchedLeft(s.getObject()); + } + + for (Statement s : changes3.getAdditions()) { + comparator.addNonMatchedRight(s.getObject()); + } + } + } + comparator.test(getSession()); + changes = comparator.getChanges(); + changes = getSession().syncRequest(new FilterChangesRead(changes)); + updateTree = getUpdateTree(changes); + updateList = getUpdateList(changes); + + if (originalModel != null) { createDefaultSelections(); } + } catch (DatabaseException e) { Text text = new Text(this, SWT.MULTI); text.setText(e.getMessage()); @@ -509,7 +558,8 @@ public abstract class ModelUpdateEditor extends Composite{ public void perform(WriteGraph graph) throws DatabaseException { Layer0Utils.addCommentMetadata(graph, "Apply selected model updates"); graph.markUndoPoint(); - for (Pair mod : updateList.getSelected()) { + HashSet> changes = new HashSet<>(updateList.getSelected()); + for (Pair mod : changes) { updateList.removeChange(mod); applyLiteralChange(graph, mod); } @@ -529,6 +579,47 @@ public abstract class ModelUpdateEditor extends Composite{ } }); } + + protected void createDefaultSelections() { + // select all changes + for (Entry op : updateTree.getUpdateOps().getResourceMap().entrySet()) { + op.getValue().select(true); + } + + + for (Pair pair : updateList.getChanges()) { + updateList.addSelected(pair); + } + + // preserve user-made changes (by removing selections) + for (Entry op : updateTree.getUpdateOps().getResourceMap().entrySet()) { + UpdateOp op2 = updateTree2.getUpdateOps().getUpdateOp(op.getKey()); + if (op2 == null) { + if (changes3.getComparable().containsRight(op.getKey())){ + op2 = updateTree2.getUpdateOps().getUpdateOp(changes3.getComparable().getLeft(op.getKey())); + } + } + if (op2 != null && op.getValue().getClass() == op2.getClass()) { + op.getValue().select(false); + } + } + + for (Pair pair : updateList.getChanges()) { + if (pair.first != null) { + boolean found = false; + for (Pair pair2 : updateList2.getChanges()) { + if (pair.first.equals(pair2.first)) { + found = true; + break; + } + } + if (found) { + updateList.removeSelected(pair); + } + } + } + + } /** @@ -565,42 +656,7 @@ public abstract class ModelUpdateEditor extends Composite{ public interface ChangeFilter { public boolean accept(ReadGraph g, Pair change) throws DatabaseException; } - - - protected void createDefaultSelections() { - for (Entry op : updateTree.getUpdateOps().getResourceMap().entrySet()) { - UpdateOp op2 = updateTree2.getUpdateOps().getUpdateOp(op.getKey()); - if (op2 == null) { - op.getValue().select(true); - } - } - - for (Entry op : updateTree.getUpdateOps().getStatementMap().entrySet()) { - UpdateOp op2 = updateTree2.getUpdateOps().getUpdateOp(op.getKey()); - if (op2 == null) { - op.getValue().select(true); - } - } - - for (Pair pair : updateList.getChanges()) { - if (pair.first != null) { - boolean found = false; - for (Pair pair2 : updateList2.getChanges()) { - if (pair.first.equals(pair2.first)) { - found = true; - break; - } - } - if (!found) { - updateList.addSelected(pair); - } - } else { - updateList.addSelected(pair); - } - } - } - - + /** *