import java.util.ArrayList;
import java.util.Collection;
+import java.util.Objects;
-import org.apache.log4j.Logger;
import org.simantics.db.ReadGraph;
import org.simantics.db.WriteGraph;
import org.simantics.objmap.backward.IBackwardMapping;
import org.simantics.objmap.forward.IForwardMapping;
import org.simantics.objmap.graph.rules.domain.IDomainAccessor;
import org.simantics.objmap.graph.rules.range.IRangeAccessor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
*/
public class MappedElementsRule<Domain, Range> implements IBidirectionalMappingRule<Domain, Range> {
- static Logger LOGGER = Logger.getLogger("org.simantics.objmap");
+ static final Logger LOGGER = LoggerFactory.getLogger(MappedElementsRule.class);
IDomainAccessor<Domain,Collection<Domain>> domainAccessor;
IRangeAccessor<Range,Collection<Range>> rangeAccessor;
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.
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);