]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.databoard/src/org/simantics/databoard/adapter/AdapterFactory.java
Improve Databoard's dynamically typed data capabilities.
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / adapter / AdapterFactory.java
index 0c07958d580e7e7b9707b044e79e84c761583238..2dc51e402eee7300db0f8aea4dd898ff5168c905 100644 (file)
@@ -15,6 +15,7 @@ import java.util.ArrayList;
 import java.util.Map;\r
 \r
 import org.apache.commons.collections.map.ReferenceMap;\r
+import org.simantics.databoard.Bindings;\r
 import org.simantics.databoard.Units;\r
 import org.simantics.databoard.binding.ArrayBinding;\r
 import org.simantics.databoard.binding.Binding;\r
@@ -854,6 +855,29 @@ public class AdapterFactory {
                return result;
        }\r
        \r
+       if (domain instanceof VariantBinding && !(range instanceof VariantBinding))\r
+       {\r
+               // Make a recursive adaptation from a variant source\r
+               final VariantBinding domainBinding = (VariantBinding)domain;\r
+               final Binding rangeBinding = range;\r
+               AbstractAdapter result = new AbstractAdapter() {\r
+                               @Override\r
+                               public Object adapt(Object obj) throws AdaptException {\r
+                                       try {\r
+                                               Object value = domainBinding.getContent(obj);\r
+                                               Binding contentBinding = domainBinding.getContentBinding(obj);\r
+                                               AbstractAdapter adapter = (AbstractAdapter) getAdapter(contentBinding, rangeBinding, typeAdapter, mustClone);\r
+                                               return adapter.adapt(value);\r
+                                       } catch (BindingException | AdapterConstructionException e) {\r
+                                               throw new AdaptException(e);\r
+                                       }\r
+                               }\r
+               };\r
+               result.clones = mustClone;\r
+               addToCache(req, result);\r
+               return result;                  \r
+       }\r
+       \r
        if (range instanceof VariantBinding && !(domain instanceof VariantBinding))\r
        {\r
                // Default to just wrapping the domain type\r