]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/Layer0Utils.java
Optimized Layer0Utils.getPossibleDefaultBinding
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / util / Layer0Utils.java
index d89d7165226e7522fdf0a015a7209418e5185847..62c7093da11e999d7e22b60a17ccb1221088fe18 100644 (file)
@@ -129,8 +129,6 @@ public class Layer0Utils {
        @SuppressWarnings("rawtypes")
        public static final ThreadLocal SCL_GRAPH = new ThreadLocal();
 
-       final public static Binding datatype_binging = Bindings.getBindingUnchecked(Datatype.class);
-
        public static Resource literal(WriteGraph g, String value) throws DatabaseException {
                Layer0 L0 = Layer0.getInstance(g);
                Resource r = g.newResource();
@@ -272,7 +270,7 @@ public class Layer0Utils {
                Resource range = graph.getPossibleObject(property, L0.HasRange);
                if(range != null && !L0.Value.equals(range)) return range;
 
-               Datatype requiredDataType = graph.getPossibleRelatedValue(property, L0X.RequiresDataType, datatype_binging);
+               Datatype requiredDataType = graph.getPossibleRelatedValue(property, L0X.RequiresDataType, Bindings.DATATYPE);
                if(requiredDataType != null) return getLiteralType(graph, requiredDataType);
 
                String requiredValueType = graph.getPossibleRelatedValue(property, L0.RequiresValueType, Bindings.STRING);
@@ -388,7 +386,7 @@ public class Layer0Utils {
                Layer0 L0 = Layer0.getInstance(graph);
                Layer0X L0X = Layer0X.getInstance(graph);
 
-               Datatype literalDatatype = graph.getPossibleRelatedValue(value, L0.HasDataType, datatype_binging);
+               Datatype literalDatatype = graph.getPossibleRelatedValue(value, L0.HasDataType, Bindings.DATATYPE);
                if(literalDatatype != null) return getSCLType(literalDatatype);
 
                String literalValueType = graph.getPossibleRelatedValue(value, L0.HasValueType, Bindings.STRING);
@@ -396,7 +394,7 @@ public class Layer0Utils {
 
                if(predicate != null) {
 
-                       Datatype requiredDataType = graph.getPossibleRelatedValue(predicate, L0X.RequiresDataType, datatype_binging);
+                       Datatype requiredDataType = graph.getPossibleRelatedValue(predicate, L0X.RequiresDataType, Bindings.DATATYPE);
                        if(requiredDataType != null) return getSCLType(requiredDataType);
 
                        throw new DatabaseException("Unidentified literal data type for property " + NameUtils.getURIOrSafeNameInternal(graph, predicate));
@@ -414,26 +412,30 @@ public class Layer0Utils {
        }
 
        public static Datatype getPossibleDatatype(ReadGraph graph, Variable variable) throws DatabaseException {
+               return getPossibleDatatype(graph, variable, null, true);
+       }
 
+       private static Datatype getPossibleDatatype(ReadGraph graph, Variable variable, PropertyInfo info, boolean checkPropertyDatatype) throws DatabaseException {
                Layer0 L0 = Layer0.getInstance(graph);
                Layer0X L0X = Layer0X.getInstance(graph);
 
                Resource property = variable.getPossiblePredicateResource(graph);
-               if(property != null) {
-//                     Datatype requiredDataType = graph.getPossibleRelatedValue(property, L0X.RequiresDataType, datatype_binging);
-                       Datatype requiredDataType = graph.syncRequest(new PossibleRelatedValue<Datatype>(property, L0X.RequiresDataType, datatype_binging));
+               if(checkPropertyDatatype && property != null) {
+                       Datatype requiredDataType = graph.syncRequest(new PossibleRelatedValue<Datatype>(property, L0X.RequiresDataType, Bindings.DATATYPE));
                        if(requiredDataType != null) return requiredDataType;
                }
 
                Resource literal = variable.getPossibleRepresents(graph);
                if(literal != null) {
-                   Datatype literalDatatype = graph.getPossibleRelatedValue2(literal, L0.HasDataType, new StandardGraphPropertyVariable(graph, variable, null, literal, L0.HasDataType), datatype_binging);
-                   if(literalDatatype != null) return literalDatatype;
+                       Datatype literalDatatype = graph.getPossibleRelatedValue2(literal, L0.HasDataType, new StandardGraphPropertyVariable(graph, variable, null, literal, L0.HasDataType), Bindings.DATATYPE);
+                       if(literalDatatype != null) return literalDatatype;
                }
 
                if(property != null) {
 
-                       String requiredValueType = graph.getPossibleRelatedValue(property, L0.RequiresValueType, Bindings.STRING);
+                       String requiredValueType = info != null
+                                       ? info.requiredValueType
+                                       : graph.getPossibleRelatedValue(property, L0.RequiresValueType, Bindings.STRING);
                        if(requiredValueType != null) {
                                Datatype datatype = getPossibleDatatypeForValueType(requiredValueType);
                                if(datatype != null) return datatype;
@@ -455,7 +457,6 @@ public class Layer0Utils {
                }
 
                return null;
-
        }
 
        private static Datatype getPossibleDatatypeForValueType(String requiredValueType) throws DatabaseException {
@@ -468,11 +469,9 @@ public class Layer0Utils {
                        arrayType = requiredValueType.substring(1, requiredValueType.length()-1);
                }
 
-               if(arrayType != null) {
-                       Datatype arrayDataType = getArrayDataTypeForType(arrayType);
-                       if(arrayDataType != null)
-                               return arrayDataType;
-               }
+               Datatype arrayDataType = getDatatypeForType(arrayType != null ? arrayType : requiredValueType, arrayType != null);
+               if(arrayDataType != null)
+                       return arrayDataType;
 
                Datatype dt = Datatypes.getDatatype(requiredValueType);
                if(dt != null) return dt;
@@ -483,18 +482,19 @@ public class Layer0Utils {
                        return null;
                }
 
-
        }
 
-       private static Datatype getArrayDataTypeForType(String type) {
-               if("Double".equals(type)) return Datatypes.DOUBLE_ARRAY;
-               else if("String".equals(type)) return Datatypes.STRING_ARRAY;
-               else if("Integer".equals(type)) return Datatypes.INTEGER_ARRAY;
-               else if("Long".equals(type)) return Datatypes.LONG_ARRAY;
-               else if("Float".equals(type)) return Datatypes.FLOAT_ARRAY;
-               else if("Byte".equals(type)) return Datatypes.BYTE_ARRAY;
-               else if("Boolean".equals(type)) return Datatypes.BOOLEAN_ARRAY;
-               else if("Variant".equals(type)) return Datatypes.VARIANT_ARRAY;
+       private static Datatype getDatatypeForType(String type, boolean isArray) {
+               switch (type) {
+                       case "Double":  return isArray ? Datatypes.DOUBLE_ARRAY  : Datatypes.DOUBLE;
+                       case "String":  return isArray ? Datatypes.STRING_ARRAY  : Datatypes.STRING;
+                       case "Integer": return isArray ? Datatypes.INTEGER_ARRAY : Datatypes.INTEGER;
+                       case "Long":    return isArray ? Datatypes.LONG_ARRAY    : Datatypes.LONG;
+                       case "Float":   return isArray ? Datatypes.FLOAT_ARRAY   : Datatypes.FLOAT;
+                       case "Byte":    return isArray ? Datatypes.BYTE_ARRAY    : Datatypes.BYTE;
+                       case "Boolean": return isArray ? Datatypes.BOOLEAN_ARRAY : Datatypes.BOOLEAN;
+                       case "Variant": return isArray ? Datatypes.VARIANT_ARRAY : Datatypes.VARIANT;
+               }
                return null;
        }
 
@@ -507,8 +507,6 @@ public class Layer0Utils {
                }
 
                Datatype type = getDatatype(graph, variable);
-               if (type == null)
-                       throw new DatabaseException("No datatype available for variable " + variable.getURI(graph));
                return Bindings.getBinding(type);
 
        }
@@ -516,12 +514,13 @@ public class Layer0Utils {
        public static Binding getPossibleDefaultBinding(ReadGraph graph, Variable variable) throws DatabaseException {
 
                Resource property = variable.getPossiblePredicateResource(graph);
+               PropertyInfo info = null;
                if(property != null) {
-                       PropertyInfo info = graph.syncRequest(new PropertyInfoRequest(property), TransientCacheAsyncListener.<PropertyInfo>instance());
+                       info = graph.syncRequest(new PropertyInfoRequest(property), TransientCacheAsyncListener.<PropertyInfo>instance());
                        if(info.defaultBinding != null) return info.defaultBinding;
                }
 
-               Datatype type = getPossibleDatatype(graph, variable);
+               Datatype type = getPossibleDatatype(graph, variable, info, false);
                if (type == null) return null;
 
                return Bindings.getBinding(type);
@@ -553,7 +552,7 @@ public class Layer0Utils {
                if(literal == null)
                    return "";
 
-               Datatype literalDatatype = graph.getPossibleRelatedValue2(literal, L0.HasDataType, new StandardGraphPropertyVariable(graph, variable, null, literal, L0.HasDataType), datatype_binging);
+               Datatype literalDatatype = graph.getPossibleRelatedValue2(literal, L0.HasDataType, new StandardGraphPropertyVariable(graph, variable, null, literal, L0.HasDataType), Bindings.DATATYPE);
                if(literalDatatype != null) {
                        String unit = getPossibleUnit(literalDatatype);
                        if(unit != null) return unit;
@@ -562,7 +561,7 @@ public class Layer0Utils {
                Resource property = variable.getPossiblePredicateResource(graph);
                if(property != null) {
 
-                       Datatype requiredDataType = graph.getPossibleRelatedValue(property, L0X.RequiresDataType, datatype_binging);
+                       Datatype requiredDataType = graph.getPossibleRelatedValue(property, L0X.RequiresDataType, Bindings.DATATYPE);
                        if(requiredDataType != null) {
                                String unit = getPossibleUnit(requiredDataType);
                                if(unit != null) return unit;