*******************************************************************************/
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;
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
Map<String,Object> map = new HashMap<String, Object>();
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 {
valueMap.put(name, g.getRelatedValue(c.getObject(), valRelation));
}
}
+
boolean changed = false;
for (String key : values.keySet()) {
Object value = values.get(key);
}
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)) {
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);
}
}