]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.objmap2/src/org/simantics/objmap/graph/annotations/factories/RelatedValueRuleFactory.java
Use type reflection tools from databoard in objmap2.
[simantics/platform.git] / bundles / org.simantics.objmap2 / src / org / simantics / objmap / graph / annotations / factories / RelatedValueRuleFactory.java
index ca226c60554edc91a625dffa889b492acbd06dc0..adb2f6215e3a76c8d45f76a9122f5feef2ec7ec6 100644 (file)
@@ -14,12 +14,15 @@ package org.simantics.objmap.graph.annotations.factories;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 
+import org.simantics.databoard.Bindings;
+import org.simantics.databoard.binding.Binding;
+import org.simantics.databoard.binding.error.BindingConstructionException;
+import org.simantics.databoard.binding.reflection.BindingRequest;
 import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;
 import org.simantics.db.exception.ResourceNotFoundException;
 import org.simantics.db.exception.ServiceException;
 import org.simantics.db.exception.ValidationException;
-
 import org.simantics.objmap.bidirectional.IBidirectionalMappingRule;
 import org.simantics.objmap.graph.annotations.RelatedValue;
 import org.simantics.objmap.graph.rules.ValueRule;
@@ -41,8 +44,14 @@ public class RelatedValueRuleFactory<Range> implements IFieldRuleFactory<Resourc
         Class<? extends ValueAdapter> adapterClass = annotation.adapter();
         IRangeAccessor<Range,Object> rangeAccessor = new FieldAccessor<Range,Object>(field);
         Resource valueType;
+        Binding valueBinding = null;
         if (adapterClass == IdentityAdapter.class) {
-            valueType = DataTypeUtils.dataTypeOfClass(g, field.getType());
+            try {
+                valueBinding = Bindings.getBinding(BindingRequest.create(field));
+                valueType = DataTypeUtils.dataTypeOfDatatype(g, valueBinding.type());
+            } catch (BindingConstructionException e) {
+                return null;
+            }
         } else {
             try {
                 ValueAdapter adapter = adapterClass.newInstance();
@@ -54,7 +63,7 @@ public class RelatedValueRuleFactory<Range> implements IFieldRuleFactory<Resourc
                 throw new RuntimeException(e);
             }
         }
-        return new ValueRule<Resource,Range>(new RelatedValueAccessor(g.getResource(annotation.value()), valueType), rangeAccessor);
+        return new ValueRule<Resource,Range>(new RelatedValueAccessor(g.getResource(annotation.value()), valueType, valueBinding), rangeAccessor);
     }
 
 }