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;fp=org.simantics.interop.update%2Fsrc%2Forg%2Fsimantics%2Finterop%2Fupdate%2Fmodel%2FModelUpdate.java;h=7cd2afd06784e49dacdd1b7a2d31b721af66357f;hb=c276677539e2b4111a072a2e6f6c4e8aa3e65b30;hp=5f400df4c653285946551ea0f2addf8c4c81f497;hpb=f13ae5d0bf1d136232cbce22b1a31be429ca2b54;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 5f400df..7cd2afd 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 @@ -2,7 +2,6 @@ package org.simantics.interop.update.model; import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.Deque; import java.util.List; @@ -14,13 +13,13 @@ import org.simantics.db.Resource; import org.simantics.db.Session; import org.simantics.db.Statement; import org.simantics.db.WriteGraph; +import org.simantics.db.common.request.ReadRequest; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.util.Layer0Utils; import org.simantics.db.request.Read; import org.simantics.interop.test.GraphChanges; import org.simantics.interop.test.GraphChanges.Modification; import org.simantics.interop.test.GraphComparator; -import org.simantics.utils.datastructures.BijectionMap; import org.simantics.utils.datastructures.Pair; public abstract class ModelUpdate { @@ -41,8 +40,10 @@ public abstract class ModelUpdate { private UpdateTree updateTree3; private UpdateList updateList3; + private UpdateNode3 updateNode3; + private List filters = new ArrayList(); - private List userFilters = new ArrayList(); + private List userFilters = new ArrayList(); boolean init = false; @@ -155,7 +156,7 @@ public abstract class ModelUpdate { * Adds an user filter. Use refreshUserFilters() to apply the changes. * @param filter */ - public void addUserFilter(ChangeFilter filter) { + public void addUserFilter(ChangeFilter2 filter) { userFilters.add(filter); } @@ -163,7 +164,7 @@ public abstract class ModelUpdate { * Removes an user filter. Use refreshUserFilters() to apply the changes. * @param filter */ - public void removeUserFilter(ChangeFilter filter) { + public void removeUserFilter(ChangeFilter2 filter) { userFilters.remove(filter); } @@ -174,7 +175,7 @@ public abstract class ModelUpdate { userFilters.clear(); } - public List getUserFilters() { + public List getUserFilters() { return userFilters; } @@ -192,72 +193,62 @@ public abstract class ModelUpdate { pc.setVisible(true); } if (userFilters.size() > 0) { - // Create filtered changes - List combined = new ArrayList<>(filters); - combined.addAll(userFilters); - GraphChanges filteredChanges = getSession().syncRequest(createFilterRead(changes, combined)); - UpdateTree updateTreeF = getUpdateTree(filteredChanges); - UpdateList updateListF = getUpdateList(filteredChanges); - // hide changes that are not contained within the filtered changes. - applyVisibleFlags(updateTree.getRootNode(), updateTreeF.getRootNode()); - applyVisibleFlags(updateList.getChanges(), updateListF.getChanges()); + if (changes2 != null && changes3 != null) { + getUpdateTree3(); + } + getSession().syncRequest(new ReadRequest() { + + @Override + public void run(ReadGraph graph) throws DatabaseException { + for (PropertyChange change : updateList.getChanges()) { + boolean visible = true; + for (ChangeFilter2 filter : userFilters) { + if (!filter.accept(graph, change)) { + visible = false; + break; + } + } + change.setVisible(visible); + } + if (updateTree3 != null) { + Deque stack = new ArrayDeque<>(); + stack.add(getUpdateNode3()); + while (!stack.isEmpty()) { + UpdateNode3 n = stack.pop(); + boolean visible = true; + for (ChangeFilter2 filter : userFilters) { + if (!filter.accept(graph, n)) { + visible = false; + break; + } + } + n.setVisible(visible); + for (UpdateNode3 c : n.getChildren()) + stack.push(c); + } + } else { + + Deque stack = new ArrayDeque<>(); + stack.add(updateTree.getRootNode()); + while (!stack.isEmpty()) { + UpdateNode n = stack.pop(); + boolean visible = true; + for (ChangeFilter2 filter : userFilters) { + if (!filter.accept(graph, n)) { + visible = false; + break; + } + } + n.setVisible(visible); + for (UpdateNode c : n.getChildren()) + stack.push(c); + } + } + } + }); } } - private void applyVisibleFlags(UpdateNode l, UpdateNode r) { - BijectionMap comparable = new BijectionMap<>(); - for (UpdateNode lc : l.getChildren()) { - for (UpdateNode rc : r.getChildren()) { - if (comparable.containsRight(rc)) - continue; - if (lc.getResource() != null) { - if (lc.getResource().equals(rc.getResource())) { - - comparable.map(lc, rc); - break; - } - } else if (rc.getResource() == null){ - UpdateOp lop = lc.getOp(); - UpdateOp rop = rc.getOp(); - if (lop.getStatement() != null && lop.getStatement().equals(rop.getStatement())) { - comparable.map(lc, rc); - break; - } - } - } - } - for (UpdateNode lc : l.getChildren()) { - if (!comparable.containsLeft(lc)) - lc.setVisible(false); - } - for (Entry entry : comparable.getEntries()) { - applyVisibleFlags(entry.getKey(), entry.getValue()); - } - } - - private void applyVisibleFlags(Collection l, Collection r) { - BijectionMap comparable = new BijectionMap<>(); - for (PropertyChange lc : l) { - for (PropertyChange rc : r) { - if (comparable.containsRight(rc)) - continue; - if (lc.getFirst() != null && lc.getFirst().equals(rc.getFirst())) { - comparable.map(lc, rc); - break; - } - if (lc.getSecond() != null && lc.getSecond().equals(rc.getSecond())) { - comparable.map(lc, rc); - break; - } - } - } - for (PropertyChange lc : l) { - if (!comparable.containsLeft(lc)) - lc.setVisible(false); - } - - } - 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 { @@ -314,6 +305,13 @@ public abstract class ModelUpdate { updateList3 = getUpdateList(changes3); return updateList3; } + + public UpdateNode3 getUpdateNode3() throws DatabaseException { + if (updateNode3 == null && changes2 != null && changes3 != null) { + updateNode3 = UpdateNode3.getCombinedTree(this); + } + return updateNode3; + } public void applyAll(WriteGraph graph) throws DatabaseException { @@ -391,14 +389,61 @@ public abstract class ModelUpdate { if (accept) modifications.add(mod); } - GraphChanges newChanges = new GraphChanges(changes.getResource1(),changes.getResource2(),changes.getDeletions(), changes.getAdditions(), modifications, changes.getComparable()); + List deletions = new ArrayList(); + for (Statement del : changes.getDeletions()) { + + boolean accept = true; + for (ChangeFilter filter : filters) { + if (!filter.acceptDeletion(g, del)) { + accept = false; + break; + } + } + if (accept) + deletions.add(del); + } + List additions = new ArrayList(); + for (Statement del : changes.getAdditions()) { + + boolean accept = true; + for (ChangeFilter filter : filters) { + if (!filter.acceptAddition(g, del)) { + accept = false; + break; + } + } + if (accept) + additions.add(del); + } + + GraphChanges newChanges = new GraphChanges(changes.getResource1(),changes.getResource2(),deletions, additions, modifications, changes.getComparable()); return newChanges; } } - + /** + * Interface for built-in filters that are used for processing raw change data before forming UpdateTree + UpdateList + * @author luukkainen + * + */ public interface ChangeFilter { public boolean accept(ReadGraph g, Modification change) throws DatabaseException; + public boolean acceptAddition(ReadGraph g, Statement addition) throws DatabaseException; + public boolean acceptDeletion(ReadGraph g, Statement deletion) throws DatabaseException; + } + + /** + * Interface for user defined filters. + * + * This filter only affects visible flags. + * + * @author luukkainen + * + */ + public interface ChangeFilter2 { + public boolean accept(ReadGraph g, PropertyChange change) throws DatabaseException; + public boolean accept(ReadGraph g, UpdateNode change) throws DatabaseException; + public boolean accept(ReadGraph g, UpdateNode3 change) throws DatabaseException; } @@ -443,6 +488,16 @@ public abstract class ModelUpdate { return true; } + + @Override + public boolean acceptAddition(ReadGraph g, Statement addition) throws DatabaseException { + return true; + } + + @Override + public boolean acceptDeletion(ReadGraph g, Statement deletion) throws DatabaseException { + return true; + } } public void defaultSelections() {