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;
private List<ChangeFilter2> userFilters = new ArrayList<ChangeFilter2>();
boolean init = false;
+ private int chunkSize = -1;
public void setInput(Resource oldModel, Resource newModel) throws DatabaseException {
setInput(oldModel, newModel, null, false);
showWarning(result2.second);
comparator2.test(getSession(), monitor);
changes2 = comparator2.getChanges();
- if (monitor.isCanceled())
+ comparator2.dispose();
+ if (monitor.isCanceled()) {
+ dispose();
return;
+ }
changes2 = getSession().syncRequest(createFilterRead(changes2, filters));
Pair<UpdateTree, UpdateList> chg2 = createChangeObjects(changes2, null);
updateTree2 = chg2.first;
showWarning(result3.second);
comparator3.test(getSession(), monitor);
changes3 = comparator3.getChanges();
+ comparator2.dispose();
changes3 = getSession().syncRequest(createFilterRead(changes3, filters));
}
- if (monitor.isCanceled())
+ if (monitor.isCanceled()) {
+ dispose();
return;
+ }
Pair<GraphComparator,String> result = getChanges(oldModel,newModel);
GraphComparator comparator = result.first;
}
}
}
- if (monitor.isCanceled())
+ 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));
Pair<UpdateTree, UpdateList> 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;
+ }
+
+ 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<UpdateTree, UpdateList> chg = createChangeObjects(changes, monitor);
+ if (chg == null) {
+ dispose();
+ return;
+ }
updateTree = chg.first;
updateList = chg.second;
if (userFilters.size() != 0) {
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.
protected abstract Pair<GraphComparator,String> getChanges(Resource r1, Resource r2) throws DatabaseException;
protected Pair<UpdateTree, UpdateList> createChangeObjects(GraphChanges changes, IProgressMonitor monitor) throws DatabaseException{
- if (monitor != null)
+ if (monitor != null) {
+ if (monitor.isCanceled())
+ return null;
monitor.subTask("Processing structural changes");
- UpdateTree updateTree = getUpdateTree(changes);
- if (monitor != null)
+ }
+ UpdateTree updateTree = getUpdateTree(changes, monitor);
+ if (monitor != null) {
+ if (monitor.isCanceled())
+ return null;
monitor.subTask("Processing property changes");
- UpdateList updateList = getUpdateList(changes);
- if (monitor != null)
+ }
+ 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>(updateTree, updateList);
}
- protected abstract UpdateTree getUpdateTree(GraphChanges changes) throws DatabaseException;
- protected UpdateList getUpdateList(GraphChanges changes) throws DatabaseException {
+ 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());
}
}
public UpdateList getUpdateList3() throws DatabaseException {
if (updateList3 == null && changes3 != null) {
- Pair<UpdateTree, UpdateList> chg3 = createChangeObjects(changes3, null);
- updateTree3 = chg3.first;
- updateList3 = chg3.second;
+ Pair<UpdateTree, UpdateList> chg3 = createChangeObjects(changes3, null);
+ updateTree3 = chg3.first;
+ updateList3 = chg3.second;
}
return updateList3;
}
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<PropertyChange> 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<PropertyChange> list = new ArrayList<PropertyChange>();
+ for (PropertyChange mod : updateList.getChanges()) {
+ if (mod.selected())
+ list.add(mod);
+ }
+ apply(graph, list, "Apply selected model updates");
updateTree.getUpdateOps().applySelected(graph);
+ }
+
+ public void applyAll(Session session, VirtualGraph vg) throws DatabaseException {
+ List<PropertyChange> 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<PropertyChange> list = new ArrayList<PropertyChange>();
for (PropertyChange mod : updateList.getChanges()) {
if (mod.selected())
- mod.apply(graph);
+ list.add(mod);
}
+ apply(session, list, "Apply selected model updates", vg);
+
+ updateTree.getUpdateOps().applySelected(session, vg);
+
}
+ protected void apply(WriteGraph graph, List<PropertyChange> list, String message) throws DatabaseException {
+ Layer0Utils.addCommentMetadata(graph, message);
+ graph.markUndoPoint();
+ for (PropertyChange mod : list) {
+ mod.apply(graph);
+ }
+ }
+ protected void apply(Session session, List<PropertyChange> 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<PropertyChange> subList = updateList.getChanges().subList(e, 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() {
updateTree2 = null;
updateTree3 = null;
updateNode3 = null;
+ init = false;
}
}