]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.objmap2/src/org/simantics/objmap/graph/rules/domain/CompoundValueAccessor.java
Use type reflection tools from databoard in objmap2.
[simantics/platform.git] / bundles / org.simantics.objmap2 / src / org / simantics / objmap / graph / rules / domain / CompoundValueAccessor.java
index 1c7e267c7d869d80cc6d89743b0683c015cd5468..53eb0116829fe8181c61dc1147bf96d7b7cf78d9 100644 (file)
  *******************************************************************************/
 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,11 +39,13 @@ public class CompoundValueAccessor implements IDomainAccessor<Resource,Object> {
        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
@@ -54,15 +57,17 @@ public class CompoundValueAccessor implements IDomainAccessor<Resource,Object> {
                    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 {
@@ -82,6 +87,7 @@ public class CompoundValueAccessor implements IDomainAccessor<Resource,Object> {
                                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<Resource,Object> {
                        }
                        
                        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<Resource,Object> {
                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);
        }
 
 }