]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.databoard/src/org/simantics/databoard/binding/reflection/ClassBindingFactory.java
Improve Databoard's dynamically typed data capabilities.
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / binding / reflection / ClassBindingFactory.java
index 081e8b1ecbdb4547f5f1a22c9620db43c8f0d5e1..94d3ed5f6d4f323950cfec22df2095193d9e8a13 100644 (file)
@@ -74,6 +74,7 @@ import org.simantics.databoard.type.DoubleType;
 import org.simantics.databoard.type.FloatType;\r
 import org.simantics.databoard.type.IntegerType;\r
 import org.simantics.databoard.type.LongType;\r
+import org.simantics.databoard.type.MapType;\r
 import org.simantics.databoard.type.OptionalType;\r
 import org.simantics.databoard.type.RecordType;\r
 import org.simantics.databoard.type.StringType;\r
@@ -391,15 +392,16 @@ public class ClassBindingFactory {
                                lengths[i] = org.simantics.databoard.util.Range.valueOf(strs[i]);                               \r
                }\r
                \r
-               if ( binding.componentBinding==null && request.componentBinding!=null ) binding.componentBinding = request.componentBinding;\r
+               if ( binding.componentBinding==null && request.componentBindings!=null ) binding.componentBinding = request.componentBindings[0];\r
                if ( binding.componentBinding == null) {\r
-                       BindingRequest componentRequest = request.componentRequest;\r
-                               if (componentClass!=null && componentRequest==null) {\r
+                       BindingRequest componentRequest = request.componentRequests != null ? request.componentRequests[0] : null;\r
+                               if (componentRequest==null) {\r
+                                       if (componentClass==null) {\r
+                                               componentClass = Object.class;\r
+                                       // throw new BindingConstructionException("Cannot determine array component type");\r
+                                       }\r
                                        componentRequest = new BindingRequest(componentClass, componentAnnotations);                    \r
                                }\r
-                               if (componentRequest==null) {\r
-                               throw new BindingConstructionException("Cannot determine array component type");\r
-                       }\r
                                \r
                                inprogress.put(request, binding);\r
                                binding.componentBinding = construct( componentRequest );\r
@@ -426,44 +428,64 @@ public class ClassBindingFactory {
                \r
                        Arguments argumentsAnnotation = request.getAnnotation(Arguments.class);\r
                        Annotation[] componentAnnotations = request.dropAnnotations( 2 );\r
+                Class<?>[] arguments = argumentsAnnotation != null ? argumentsAnnotation.value() : null;\r
 \r
                 BindingRequest keyRequest = null;\r
                 BindingRequest valueRequest = null;\r
+                \r
+                Binding keyBinding = null;\r
+                Binding valueBinding = null;\r
                        \r
-                       if (binding.getKeyBinding() == null) {\r
-                               Class<?> keyClass = argumentsAnnotation.value()[0];\r
+                       if (binding.getKeyBinding() != null) {\r
+                           keyBinding = binding.getKeyBinding();\r
+                       }\r
+                       else if (request.componentBindings != null) {\r
+                               keyBinding = request.componentBindings[0];\r
+                       }\r
+                       else if (request.componentRequests != null) {\r
+                               keyRequest = request.componentRequests[0];\r
+                       }\r
+                       else {\r
+                               Class<?> keyClass = arguments != null && arguments.length >= 1 ? arguments[0] : null;\r
                     if (keyClass==null) {\r
-                       throw new BindingConstructionException("Cannot determine key class, use @Arguments annotation");\r
+                       keyClass = Object.class;\r
+                       //throw new BindingConstructionException("Cannot determine key class, use @Arguments annotation");\r
                     }\r
                     keyRequest = new BindingRequest(keyClass, componentAnnotations);\r
                        }\r
-                       else {\r
-                               binding.type().keyType = binding.getKeyBinding().type();                                \r
-                       }\r
                        \r
-                       if (binding.getValueBinding() == null) {\r
-                               Class<?> valueClass = argumentsAnnotation.value()[1];\r
+                       if (binding.getValueBinding() != null) {\r
+                    valueBinding = binding.getValueBinding();\r
+                       }\r
+                       else if (request.componentBindings != null) {\r
+                               valueBinding = request.componentBindings[1];\r
+                       }\r
+                       else if (request.componentRequests != null) {\r
+                               valueRequest = request.componentRequests[1];\r
+                       }\r
+                       else {\r
+                               Class<?> valueClass = arguments != null && arguments.length >= 2 ? arguments[1] : null;\r
                     if (valueClass==null) {\r
-                       throw new BindingConstructionException("Cannot determine value class, use @Arguments annotation");\r
+                       valueClass = Object.class;\r
+                       //throw new BindingConstructionException("Cannot determine value class, use @Arguments annotation");\r
                     }\r
                     valueRequest = new BindingRequest(valueClass, componentAnnotations);\r
                        }\r
-                       else {\r
-                               binding.type().valueType = binding.getValueBinding().type();                            \r
-                       }\r
-                                \r
+                       \r
                        inprogress.put(request, result);\r
                        if (keyRequest!=null) {\r
-                               Binding keyBinding = construct( keyRequest );\r
-                               binding.type().keyType = keyBinding.type();\r
-                               binding.setKeyBinding(keyBinding);\r
+                               keyBinding = construct( keyRequest );\r
                        }\r
                        if (valueRequest!=null) {\r
-                               Binding valueBinding = construct( valueRequest );\r
-                               binding.type().valueType = valueBinding.type();\r
-                               binding.setValueBinding(valueBinding);\r
+                               valueBinding = construct( valueRequest );\r
                        }\r
-                       inprogress.remove(request);\r
+                inprogress.remove(request);\r
+                \r
+                MapType type = binding.type();\r
+                type.keyType = keyBinding.type();\r
+                type.valueType = valueBinding.type();\r
+                       binding.setKeyBinding( keyBinding );\r
+                       binding.setValueBinding( valueBinding );\r
             }\r
                \r
                /// Optional\r