]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.objmap2/src/org/simantics/objmap/graph/rules/MappedElementsRule.java
Fix change comparison expressions in mapping rules
[simantics/platform.git] / bundles / org.simantics.objmap2 / src / org / simantics / objmap / graph / rules / MappedElementsRule.java
index 43a8ff49325fc46436954243092c5a22e391998b..fcc62d7b5444e925ad451124eb14bd67c9b02caf 100644 (file)
@@ -13,6 +13,7 @@ package org.simantics.objmap.graph.rules;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Objects;
 
 import org.simantics.db.ReadGraph;
 import org.simantics.db.WriteGraph;
@@ -49,7 +50,7 @@ public class MappedElementsRule<Domain, Range> implements IBidirectionalMappingR
     public boolean updateDomain(WriteGraph g, IBackwardMapping<Domain, Range> map,
             Domain domainElement, Range rangeElement)
     throws MappingException {
-        LOGGER.info("    MappedElementsRule.updateDomain");
+        LOGGER.trace("    MappedElementsRule.updateDomain");
         // Snapshot the accessed range value for concurrency safety.
         // NOTE: still assumes that the accessed collection is concurrent or
         // synchronized for toArray to be atomic.
@@ -65,13 +66,26 @@ public class MappedElementsRule<Domain, Range> implements IBidirectionalMappingR
     public boolean updateRange(ReadGraph g, IForwardMapping<Domain, Range> map,
             Domain domainElement, Range rangeElement)
     throws MappingException {
-        LOGGER.info("    MappedElementsRule.updateRange");
-        Collection<Domain> value = domainAccessor.get(g, domainElement);
+        LOGGER.trace("    MappedElementsRule.updateRange");
+        ArrayList<Range> mappedValue = getMappedValue(g, map, domainElement);
+        return rangeAccessor.set(rangeElement, mappedValue);
+    }
+    
+    @Override
+    public boolean checkChanges(ReadGraph g, IForwardMapping<Domain, Range> map, Domain domainElement, Range rangeElement) throws MappingException {
+        LOGGER.trace("    MappedElementsRule.updateRange");
+        ArrayList<Range> mappedValue = getMappedValue(g, map, domainElement);
+        return !Objects.equals(mappedValue, rangeAccessor.get(rangeElement));
+    }
+
+       private ArrayList<Range> getMappedValue(ReadGraph g, IForwardMapping<Domain, Range> map, Domain domainElement)
+                       throws MappingException {
+               Collection<Domain> value = domainAccessor.get(g, domainElement);
         ArrayList<Range> mappedValue = new ArrayList<Range>(value.size());
         for(Domain r : value)
             mappedValue.add(map.map(g, r));//map.get(r));
-        return rangeAccessor.set(rangeElement, mappedValue);
-    }
+               return mappedValue;
+       }
     
     public void createDomain(WriteGraph g, IBackwardMapping<Domain,Range> map, Domain domainElement, Range rangeElement) throws MappingException {
        updateDomain(g, map, domainElement, rangeElement);