X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.objmap2%2Fsrc%2Forg%2Fsimantics%2Fobjmap%2Fgraph%2Frules%2Fdomain%2FCompoundValueAccessor.java;h=39df524b270943022478f51669f2a6627cbbe03e;hb=993f8fda339c833e182a540bd4c10d3a91624966;hp=1c7e267c7d869d80cc6d89743b0683c015cd5468;hpb=aefd2e1032b23c86b153be48bcdfee9f8b4dd126;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.objmap2/src/org/simantics/objmap/graph/rules/domain/CompoundValueAccessor.java b/bundles/org.simantics.objmap2/src/org/simantics/objmap/graph/rules/domain/CompoundValueAccessor.java index 1c7e267c7..39df524b2 100644 --- a/bundles/org.simantics.objmap2/src/org/simantics/objmap/graph/rules/domain/CompoundValueAccessor.java +++ b/bundles/org.simantics.objmap2/src/org/simantics/objmap/graph/rules/domain/CompoundValueAccessor.java @@ -11,19 +11,20 @@ *******************************************************************************/ package org.simantics.objmap.graph.rules.domain; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map; +import org.simantics.databoard.binding.Binding; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.Statement; import org.simantics.db.WriteGraph; import org.simantics.db.exception.DatabaseException; +import org.simantics.db.exception.ServiceException; import org.simantics.layer0.Layer0; import org.simantics.objmap.exceptions.MappingException; -import org.simantics.objmap.graph.annotations.factories.CompoundRelatedGetSetValueRuleFactory; +import org.simantics.objmap.graph.annotations.factories.DataTypeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,37 +39,41 @@ public class CompoundValueAccessor implements IDomainAccessor { Resource objRelation; Resource objType; Resource valRelation; + Binding valueBinding; - public CompoundValueAccessor(Resource objRelation, Resource objType, Resource valRelation) { + public CompoundValueAccessor(Resource objRelation, Resource objType, Resource valRelation, Binding valueBinding) { this.objRelation = objRelation; this.objType = objType; this.valRelation = valRelation; + this.valueBinding = valueBinding; } @Override public Object get(ReadGraph g, Resource element) throws MappingException { try { Layer0 l0 = Layer0.getInstance(g); - LOGGER.info(" CompoundValueAccessor.get"); + LOGGER.trace(" CompoundValueAccessor.get"); Collection coll = g.getStatements(element, objRelation); Map map = new HashMap(); for (Statement c : coll) { String name = g.getRelatedValue(c.getObject(), l0.HasName); - if (!map.containsKey(name) || !c.isAsserted(element)) - map.put(name, g.getRelatedValue(c.getObject(), valRelation)); + if (!map.containsKey(name) || !c.isAsserted(element)) { + final Object value = getValue(g, c.getObject()); + map.put(name, value); + } } return map; } catch (DatabaseException e) { throw new MappingException(e); } } - + @Override public boolean set(WriteGraph g, Resource element, Object v) throws MappingException { try { Layer0 l0 = Layer0.getInstance(g); - LOGGER.info(" CompoundValueAccessor.set"); + LOGGER.trace(" CompoundValueAccessor.set"); @SuppressWarnings("unchecked") Map values = (Map)v; @@ -82,6 +87,7 @@ public class CompoundValueAccessor implements IDomainAccessor { valueMap.put(name, g.getRelatedValue(c.getObject(), valRelation)); } } + boolean changed = false; for (String key : values.keySet()) { Object value = values.get(key); @@ -98,34 +104,40 @@ public class CompoundValueAccessor implements IDomainAccessor { } Statement valueStatement = g.getPossibleStatement(stm.getObject(), valRelation); - Resource valueType = CompoundRelatedGetSetValueRuleFactory.dataTypeOfClass(g, value.getClass()); + Resource valueType = valueBinding != null ? + DataTypeUtils.dataTypeOfDatatype(g, valueBinding.type()) : + DataTypeUtils.dataTypeOfClass(g, value.getClass()); + if(valueStatement == null) { - Resource valueResource = g.newResource(); - g.claim(valueResource, Layer0.getInstance(g).InstanceOf, null, valueType); + g.claim(valueResource, Layer0.getInstance(g).InstanceOf, null, valueType); g.claim(stm.getObject(), valRelation, valueResource); - g.claimValue(valueResource, value); + claimValue(g, valueResource, value); } else { - - if (!valueStatement.isAsserted(stm.getObject())) g.claimValue(valueStatement.getObject(), value); else { Resource valueResource = g.newResource(); - g.claim(valueResource, Layer0.getInstance(g).InstanceOf, null, - valueType); + g.claim(valueResource, Layer0.getInstance(g).InstanceOf, null, valueType); g.claim(stm.getObject(), valRelation, valueResource); - g.claimValue(valueResource, value); + claimValue(g, valueResource, value); } } } - return changed; + return changed; } catch (DatabaseException e) { throw new MappingException(e); } } + + private void claimValue(WriteGraph g, Resource valueResource, Object value) throws ServiceException { + if (valueBinding != null) + g.claimValue(valueResource, value, valueBinding); + else + g.claimValue(valueResource, value); + } private Statement getStatement(ReadGraph g, Resource s, Resource p, Resource o) throws DatabaseException{ for (Statement stm : g.getStatements(s, p)) { @@ -135,19 +147,8 @@ public class CompoundValueAccessor implements IDomainAccessor { return null; } - private boolean equals(Object o1, Object o2) { - if (o1 instanceof boolean[]) - Arrays.equals((boolean[])o1,(boolean[])o2); - if (o1 instanceof int[]) - Arrays.equals((int[])o1,(int[])o2); - if (o1 instanceof float[]) - Arrays.equals((float[])o1,(float[])o2); - if (o1 instanceof double[]) - Arrays.equals((double[])o1,(double[])o2); - if (o1 instanceof byte[]) - Arrays.equals((byte[])o1,(byte[])o2); - return o1.equals(o2); - + private Object getValue(ReadGraph g, final Resource object) throws DatabaseException { + return valueBinding != null ? g.getRelatedValue(object, valRelation, valueBinding) : g.getRelatedValue(object, valRelation); } }