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%2Fadapter%2FAdapterFactory.java;h=2dc51e402eee7300db0f8aea4dd898ff5168c905;hp=0c07958d580e7e7b9707b044e79e84c761583238;hb=ada96685970d938b68b28085e51610187401b8a9;hpb=969bd23cab98a79ca9101af33334000879fb60c5 diff --git a/bundles/org.simantics.databoard/src/org/simantics/databoard/adapter/AdapterFactory.java b/bundles/org.simantics.databoard/src/org/simantics/databoard/adapter/AdapterFactory.java index 0c07958d5..2dc51e402 100644 --- a/bundles/org.simantics.databoard/src/org/simantics/databoard/adapter/AdapterFactory.java +++ b/bundles/org.simantics.databoard/src/org/simantics/databoard/adapter/AdapterFactory.java @@ -15,6 +15,7 @@ import java.util.ArrayList; import java.util.Map; import org.apache.commons.collections.map.ReferenceMap; +import org.simantics.databoard.Bindings; import org.simantics.databoard.Units; import org.simantics.databoard.binding.ArrayBinding; import org.simantics.databoard.binding.Binding; @@ -854,6 +855,29 @@ public class AdapterFactory { return result; } + if (domain instanceof VariantBinding && !(range instanceof VariantBinding)) + { + // Make a recursive adaptation from a variant source + final VariantBinding domainBinding = (VariantBinding)domain; + final Binding rangeBinding = range; + AbstractAdapter result = new AbstractAdapter() { + @Override + public Object adapt(Object obj) throws AdaptException { + try { + Object value = domainBinding.getContent(obj); + Binding contentBinding = domainBinding.getContentBinding(obj); + AbstractAdapter adapter = (AbstractAdapter) getAdapter(contentBinding, rangeBinding, typeAdapter, mustClone); + return adapter.adapt(value); + } catch (BindingException | AdapterConstructionException e) { + throw new AdaptException(e); + } + } + }; + result.clones = mustClone; + addToCache(req, result); + return result; + } + if (range instanceof VariantBinding && !(domain instanceof VariantBinding)) { // Default to just wrapping the domain type