X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.interop.update%2Fsrc%2Forg%2Fsimantics%2Finterop%2Fupdate%2Fmodel%2FModelUpdate.java;h=4e1cc4fed37efb8decac9616d92662fd2aad1cd7;hb=b7493f55002eb0e11f3d38b578adfe0292cd2c98;hp=7cd2afd06784e49dacdd1b7a2d31b721af66357f;hpb=c276677539e2b4111a072a2e6f6c4e8aa3e65b30;p=simantics%2Finterop.git diff --git a/org.simantics.interop.update/src/org/simantics/interop/update/model/ModelUpdate.java b/org.simantics.interop.update/src/org/simantics/interop/update/model/ModelUpdate.java index 7cd2afd..4e1cc4f 100644 --- a/org.simantics.interop.update/src/org/simantics/interop/update/model/ModelUpdate.java +++ b/org.simantics.interop.update/src/org/simantics/interop/update/model/ModelUpdate.java @@ -7,13 +7,17 @@ import java.util.Deque; import java.util.List; import java.util.Map.Entry; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; import org.simantics.Simantics; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.Session; import org.simantics.db.Statement; +import org.simantics.db.VirtualGraph; import org.simantics.db.WriteGraph; import org.simantics.db.common.request.ReadRequest; +import org.simantics.db.common.request.WriteRequest; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.util.Layer0Utils; import org.simantics.db.request.Read; @@ -46,6 +50,7 @@ public abstract class ModelUpdate { private List userFilters = new ArrayList(); boolean init = false; + private int chunkSize = -1; public void setInput(Resource oldModel, Resource newModel) throws DatabaseException { setInput(oldModel, newModel, null, false); @@ -60,9 +65,16 @@ public abstract class ModelUpdate { * @throws DatabaseException */ public void setInput(Resource oldModel, Resource newModel, Resource originalModel, boolean newDistinct) throws DatabaseException{ + this.setInput(oldModel, newModel, originalModel, newDistinct, null); + } + public void setInput(Resource oldModel, Resource newModel, Resource originalModel, boolean newDistinct, IProgressMonitor monitor) throws DatabaseException{ + this.oldModel = oldModel; this.newModel = newModel; this.originalModel = originalModel; + + if (monitor == null) + monitor = new NullProgressMonitor(); // addFilters(filters); if (originalModel != null) { // tree way comparison @@ -71,21 +83,32 @@ public abstract class ModelUpdate { GraphComparator comparator2 = result2.first; if (result2.second != null) showWarning(result2.second); - comparator2.test(getSession()); + comparator2.test(getSession(), monitor); changes2 = comparator2.getChanges(); + comparator2.dispose(); + if (monitor.isCanceled()) { + dispose(); + return; + } changes2 = getSession().syncRequest(createFilterRead(changes2, filters)); - updateTree2 = getUpdateTree(changes2); - updateList2 = getUpdateList(changes2); + Pair chg2 = createChangeObjects(changes2, null); + updateTree2 = chg2.first; + updateList2 = chg2.second; // 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()); + comparator3.test(getSession(), monitor); changes3 = comparator3.getChanges(); + comparator2.dispose(); changes3 = getSession().syncRequest(createFilterRead(changes3, filters)); } + if (monitor.isCanceled()) { + dispose(); + return; + } Pair result = getChanges(oldModel,newModel); GraphComparator comparator = result.first; @@ -124,11 +147,23 @@ public abstract class ModelUpdate { } } } - comparator.test(getSession()); + if (monitor.isCanceled()) { + dispose(); + return; + } + comparator.test(getSession(), monitor); + monitor.setTaskName("Processing changes..."); + monitor.subTask(""); changes = comparator.getChanges(); + comparator.dispose(); changes = getSession().syncRequest(createFilterRead(changes, filters)); - updateTree = getUpdateTree(changes); - updateList = getUpdateList(changes); + Pair chg = createChangeObjects(changes, monitor); + if (chg == null) { + dispose(); + return; + } + updateTree = chg.first; + updateList = chg.second; if (userFilters.size() != 0) { refreshUserFilters(); } @@ -137,7 +172,30 @@ public abstract class ModelUpdate { if (originalModel != null) { defaultSelections(); } + init = true; + } + + public void setInput(Resource oldModel, Resource newModel, GraphChanges changes, IProgressMonitor monitor) throws DatabaseException{ + if (!oldModel.equals(changes.getResource1()) || + !newModel.equals(changes.getResource2())) { + throw new DatabaseException("GraphChanges does not match input models"); + } + this.changes = getSession().syncRequest(createFilterRead(changes, filters)); + Pair chg = createChangeObjects(changes, monitor); + if (chg == null) { + dispose(); + return; + } + updateTree = chg.first; + updateList = chg.second; + if (userFilters.size() != 0) { + refreshUserFilters(); + } + + if (originalModel != null) { + defaultSelections(); + } init = true; } @@ -179,6 +237,14 @@ public abstract class ModelUpdate { return userFilters; } + public int getChunkSize() { + return chunkSize; + } + + public void setChunkSize(int chunkSize) { + this.chunkSize = chunkSize; + } + public void refreshUserFilters() throws DatabaseException{ // use user filters to set visible flags of changes. // First, set all changes visible. @@ -250,11 +316,39 @@ public abstract class ModelUpdate { } protected abstract Pair getChanges(Resource r1, Resource r2) throws DatabaseException; - protected abstract UpdateTree getUpdateTree(GraphChanges changes) throws DatabaseException; - protected UpdateList getUpdateList(GraphChanges changes) throws DatabaseException { + + protected Pair createChangeObjects(GraphChanges changes, IProgressMonitor monitor) throws DatabaseException{ + if (monitor != null) { + if (monitor.isCanceled()) + return null; + monitor.subTask("Processing structural changes"); + } + UpdateTree updateTree = getUpdateTree(changes, monitor); + if (monitor != null) { + if (monitor.isCanceled()) + return null; + monitor.subTask("Processing property changes"); + } + UpdateList updateList = getUpdateList(changes, monitor); + if (monitor != null) { + if (monitor.isCanceled()) + return null; + monitor.subTask("Postprocessing changes"); + } + postProcess(updateTree, updateList); + return new Pair(updateTree, updateList); + } + + protected abstract UpdateTree getUpdateTree(GraphChanges changes, IProgressMonitor monitor) throws DatabaseException; + protected UpdateList getUpdateList(GraphChanges changes, IProgressMonitor monitor) throws DatabaseException { return new UpdateList(changes, changes.getModifications()); } + + protected void postProcess(UpdateTree updateTree, UpdateList updateList) throws DatabaseException{ + + } + public Resource getOldModel() { return oldModel; } @@ -296,13 +390,19 @@ public abstract class ModelUpdate { } public UpdateTree getUpdateTree3() throws DatabaseException{ - if (updateTree3 == null && changes3 != null) - updateTree3 = getUpdateTree(changes3); + if (updateTree3 == null && changes3 != null) { + Pair chg3 = createChangeObjects(changes3, null); + updateTree3 = chg3.first; + updateList3 = chg3.second; + } return updateTree3; } public UpdateList getUpdateList3() throws DatabaseException { - if (updateList3 == null && changes3 != null) - updateList3 = getUpdateList(changes3); + if (updateList3 == null && changes3 != null) { + Pair chg3 = createChangeObjects(changes3, null); + updateTree3 = chg3.first; + updateList3 = chg3.second; + } return updateList3; } @@ -313,29 +413,91 @@ public abstract class ModelUpdate { return updateNode3; } - public void applyAll(WriteGraph graph) throws DatabaseException { - Layer0Utils.addCommentMetadata(graph, "Apply all model updates"); - graph.markUndoPoint(); - for (PropertyChange mod : updateList.getChanges()) { - mod.apply(graph); - } + List list = updateList.getChanges(); + apply(graph, list, "Apply all model updates"); updateTree.getUpdateOps().applyAll(graph); } public void applySelected(WriteGraph graph) throws DatabaseException { - Layer0Utils.addCommentMetadata(graph, "Apply selected model updates"); - graph.markUndoPoint(); + List list = new ArrayList(); for (PropertyChange mod : updateList.getChanges()) { if (mod.selected()) - mod.apply(graph); + list.add(mod); } + apply(graph, list, "Apply selected model updates"); updateTree.getUpdateOps().applySelected(graph); } + public void applyAll(Session session, VirtualGraph vg) throws DatabaseException { + List list = updateList.getChanges(); + apply(session, list, "Apply all model updates", vg); + + updateTree.getUpdateOps().applyAll(session, vg); + } + public void applySelected(Session session, VirtualGraph vg) throws DatabaseException { + List list = new ArrayList(); + for (PropertyChange mod : updateList.getChanges()) { + if (mod.selected()) + list.add(mod); + } + apply(session, list, "Apply selected model updates", vg); + + updateTree.getUpdateOps().applySelected(session, vg); + + } + + protected void apply(WriteGraph graph, List list, String message) throws DatabaseException { + Layer0Utils.addCommentMetadata(graph, message); + graph.markUndoPoint(); + for (PropertyChange mod : list) { + mod.apply(graph); + } + } + + protected void apply(Session session, List list, String message, VirtualGraph vg) throws DatabaseException { + if (getChunkSize() > 0) { + for (int s = 0; s < list.size(); ) { + int e = s + getChunkSize(); + if (e > list.size()) + e = list.size(); + List subList = list.subList(s, e); + if (s == 0) { + session.syncRequest(new WriteRequest(vg) { + public void perform(WriteGraph graph) throws DatabaseException { + Layer0Utils.addCommentMetadata(graph, message); + graph.markUndoPoint(); + } + }); + } + session.syncRequest(new WriteRequest(vg) { + + @Override + public void perform(WriteGraph graph) throws DatabaseException { + for (PropertyChange mod : subList) { + mod.apply(graph); + } + } + }); + s = e; + } + } else { + session.syncRequest(new WriteRequest(vg) { + + @Override + public void perform(WriteGraph graph) throws DatabaseException { + Layer0Utils.addCommentMetadata(graph, message); + graph.markUndoPoint(); + for (PropertyChange mod : list) { + mod.apply(graph); + } + } + }); + } + } protected Session getSession() { @@ -469,6 +631,8 @@ public abstract class ModelUpdate { @Override public boolean accept(ReadGraph g, Modification change) throws DatabaseException { //filter floating point values that have less than 1% difference. + if (change.getLeftStm() == null || change.getRightStm() == null) + return true; if (!g.hasValue(change.getLeftStm().getObject()) || !g.hasValue(change.getRightStm().getObject())) return true; Object v1 = g.getValue(change.getLeftStm().getObject()); @@ -562,4 +726,20 @@ public abstract class ModelUpdate { public void removeListener(WarningListener listener) { warningListeners.remove(listener); } + + public void dispose() { + changes = null; + changes2 = null; + changes3 = null; + filters = null; + userFilters = null; + updateList = null; + updateList2 = null; + updateList3 = null; + updateTree = null; + updateTree2 = null; + updateTree3 = null; + updateNode3 = null; + init = false; + } }