X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.databoard%2Fsrc%2Forg%2Fsimantics%2Fdataboard%2Fbinding%2Freflection%2FClassBindingFactory.java;h=94d3ed5f6d4f323950cfec22df2095193d9e8a13;hp=081e8b1ecbdb4547f5f1a22c9620db43c8f0d5e1;hb=ada96685970d938b68b28085e51610187401b8a9;hpb=7b02cfbbab66342eac845e2877e7906cc1960ad2 diff --git a/bundles/org.simantics.databoard/src/org/simantics/databoard/binding/reflection/ClassBindingFactory.java b/bundles/org.simantics.databoard/src/org/simantics/databoard/binding/reflection/ClassBindingFactory.java index 081e8b1ec..94d3ed5f6 100644 --- a/bundles/org.simantics.databoard/src/org/simantics/databoard/binding/reflection/ClassBindingFactory.java +++ b/bundles/org.simantics.databoard/src/org/simantics/databoard/binding/reflection/ClassBindingFactory.java @@ -74,6 +74,7 @@ import org.simantics.databoard.type.DoubleType; import org.simantics.databoard.type.FloatType; import org.simantics.databoard.type.IntegerType; import org.simantics.databoard.type.LongType; +import org.simantics.databoard.type.MapType; import org.simantics.databoard.type.OptionalType; import org.simantics.databoard.type.RecordType; import org.simantics.databoard.type.StringType; @@ -391,15 +392,16 @@ public class ClassBindingFactory { lengths[i] = org.simantics.databoard.util.Range.valueOf(strs[i]); } - if ( binding.componentBinding==null && request.componentBinding!=null ) binding.componentBinding = request.componentBinding; + if ( binding.componentBinding==null && request.componentBindings!=null ) binding.componentBinding = request.componentBindings[0]; if ( binding.componentBinding == null) { - BindingRequest componentRequest = request.componentRequest; - if (componentClass!=null && componentRequest==null) { + BindingRequest componentRequest = request.componentRequests != null ? request.componentRequests[0] : null; + if (componentRequest==null) { + if (componentClass==null) { + componentClass = Object.class; + // throw new BindingConstructionException("Cannot determine array component type"); + } componentRequest = new BindingRequest(componentClass, componentAnnotations); } - if (componentRequest==null) { - throw new BindingConstructionException("Cannot determine array component type"); - } inprogress.put(request, binding); binding.componentBinding = construct( componentRequest ); @@ -426,44 +428,64 @@ public class ClassBindingFactory { Arguments argumentsAnnotation = request.getAnnotation(Arguments.class); Annotation[] componentAnnotations = request.dropAnnotations( 2 ); + Class[] arguments = argumentsAnnotation != null ? argumentsAnnotation.value() : null; BindingRequest keyRequest = null; BindingRequest valueRequest = null; + + Binding keyBinding = null; + Binding valueBinding = null; - if (binding.getKeyBinding() == null) { - Class keyClass = argumentsAnnotation.value()[0]; + if (binding.getKeyBinding() != null) { + keyBinding = binding.getKeyBinding(); + } + else if (request.componentBindings != null) { + keyBinding = request.componentBindings[0]; + } + else if (request.componentRequests != null) { + keyRequest = request.componentRequests[0]; + } + else { + Class keyClass = arguments != null && arguments.length >= 1 ? arguments[0] : null; if (keyClass==null) { - throw new BindingConstructionException("Cannot determine key class, use @Arguments annotation"); + keyClass = Object.class; + //throw new BindingConstructionException("Cannot determine key class, use @Arguments annotation"); } keyRequest = new BindingRequest(keyClass, componentAnnotations); } - else { - binding.type().keyType = binding.getKeyBinding().type(); - } - if (binding.getValueBinding() == null) { - Class valueClass = argumentsAnnotation.value()[1]; + if (binding.getValueBinding() != null) { + valueBinding = binding.getValueBinding(); + } + else if (request.componentBindings != null) { + valueBinding = request.componentBindings[1]; + } + else if (request.componentRequests != null) { + valueRequest = request.componentRequests[1]; + } + else { + Class valueClass = arguments != null && arguments.length >= 2 ? arguments[1] : null; if (valueClass==null) { - throw new BindingConstructionException("Cannot determine value class, use @Arguments annotation"); + valueClass = Object.class; + //throw new BindingConstructionException("Cannot determine value class, use @Arguments annotation"); } valueRequest = new BindingRequest(valueClass, componentAnnotations); } - else { - binding.type().valueType = binding.getValueBinding().type(); - } - + inprogress.put(request, result); if (keyRequest!=null) { - Binding keyBinding = construct( keyRequest ); - binding.type().keyType = keyBinding.type(); - binding.setKeyBinding(keyBinding); + keyBinding = construct( keyRequest ); } if (valueRequest!=null) { - Binding valueBinding = construct( valueRequest ); - binding.type().valueType = valueBinding.type(); - binding.setValueBinding(valueBinding); + valueBinding = construct( valueRequest ); } - inprogress.remove(request); + inprogress.remove(request); + + MapType type = binding.type(); + type.keyType = keyBinding.type(); + type.valueType = valueBinding.type(); + binding.setKeyBinding( keyBinding ); + binding.setValueBinding( valueBinding ); } /// Optional