]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.debug.browser/src/org/simantics/debug/browser/utils/Values.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.debug.browser / src / org / simantics / debug / browser / utils / Values.java
diff --git a/bundles/org.simantics.debug.browser/src/org/simantics/debug/browser/utils/Values.java b/bundles/org.simantics.debug.browser/src/org/simantics/debug/browser/utils/Values.java
new file mode 100644 (file)
index 0000000..0038de5
--- /dev/null
@@ -0,0 +1,159 @@
+/*******************************************************************************\r
+ * Copyright (c) 2016 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     THTH ry - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.debug.browser.utils;\r
+\r
+import java.io.IOException;\r
+import java.lang.reflect.Array;\r
+import java.util.Arrays;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.Databoard;\r
+import org.simantics.databoard.binding.ArrayBinding;\r
+import org.simantics.databoard.binding.Binding;\r
+import org.simantics.databoard.binding.error.BindingException;\r
+import org.simantics.databoard.serialization.Serializer;\r
+import org.simantics.databoard.type.ArrayType;\r
+import org.simantics.databoard.type.Datatype;\r
+import org.simantics.databoard.util.ObjectUtils;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.utils.CommonDBUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.variable.RVI;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.db.layer0.variable.Variables;\r
+import org.simantics.layer0.Layer0;\r
+\r
+public class Values {\r
+\r
+    private static int RESOURCE_NAME_MAX_LENGTH = 1000;\r
+    private static int RESOURCE_VALUE_MAX_SIZE = 16384;\r
+\r
+    public static ValueInfo getPossibleValueInfo(ReadGraph graph, Resource r) {\r
+        try {\r
+            if (!graph.hasValue(r))\r
+                return null;\r
+\r
+            String value = null;\r
+            String datatype = null;\r
+\r
+            Layer0 L0 = Layer0.getInstance(graph);\r
+            Datatype type = graph.getPossibleRelatedValue(r, L0.HasDataType, Bindings.getBindingUnchecked(Datatype.class));\r
+            if (type != null) {\r
+                if (graph.isInstanceOf(r, L0.RVI)) {\r
+                    try {\r
+                        RVI rvi = graph.getPossibleValue(r, graph.getService(Databoard.class).getBindingUnchecked(RVI.class));\r
+                        Resource owner = CommonDBUtils.getPossibleOwner(graph, r);\r
+                        if (owner != null) {\r
+                            Variable context  = Variables.getPossibleConfigurationContext(graph, owner);\r
+                            if (context != null)  \r
+                                value = rvi.asPossibleString(graph, context);\r
+                        }\r
+                        if (value == null)\r
+                            value = rvi.toString( graph );\r
+                        if (value != null)\r
+                            datatype = "Relative Variable Identifier (RVI)";\r
+                    } catch (DatabaseException e) {\r
+                        // Fall through to more generic mechanisms\r
+                    }\r
+                }\r
+\r
+                // Generic datatype-based fallback method\r
+                if (value == null) {\r
+                    Binding b = Bindings.getBinding(type);\r
+                    Object v = graph.getPossibleValue(r, b);\r
+                    Serializer s = Bindings.getSerializerUnchecked(b);\r
+                    int size = s.getSize(v);\r
+                    if (size > RESOURCE_VALUE_MAX_SIZE) {\r
+                        value = "Approx. " + size + " byte literal";\r
+                    } else {\r
+                        if (b instanceof ArrayBinding) {\r
+                            // Manipulate data type to contain actual array\r
+                            // length for printing purposes.\r
+                            int arraySize = ((ArrayBinding) b).size(v);\r
+                            ArrayType atype = (ArrayType) type;\r
+                            atype.setLength(Integer.toString(arraySize));\r
+                        }\r
+                        value = b.toString(v, false);\r
+                    }\r
+//                    datatype = type.toSingleLineString();\r
+//                    datatype = type.toString();\r
+//                    datatype = DataTypePrinter2.print(type);\r
+                    datatype = Bindings.getBindingUnchecked(Datatype.class).toString(type, false);\r
+                }\r
+            }\r
+\r
+            // Final fallback if there's no datatype specified\r
+            ValueInfo info = null;\r
+            if (value != null)\r
+                info = new ValueInfo(r, value, datatype);\r
+            if (info == null)\r
+                info = toSimpleValueInfo(r, graph.getValue(r));\r
+\r
+            return info;\r
+        } catch (DatabaseException e) {\r
+            return null;\r
+        } catch (IOException e) {\r
+            return null;\r
+        } catch (BindingException e) {\r
+            return null;\r
+        }\r
+    }\r
+\r
+    private static ValueInfo toSimpleValueInfo(Resource r, Object value) {\r
+        Class<?> clazz = value.getClass();\r
+        if (clazz.isArray()) {\r
+            int length = Array.getLength(value);\r
+            if (length > RESOURCE_NAME_MAX_LENGTH) {\r
+                if (value instanceof byte[]) {\r
+                    byte[] arr = (byte[]) value;\r
+                    byte[] arr2 = Arrays.copyOf(arr, RESOURCE_NAME_MAX_LENGTH);\r
+                    return truncated(r, "byte", Arrays.toString(arr2), arr.length);\r
+                } else if (value instanceof int[]) {\r
+                    int[] arr = (int[]) value;\r
+                    int[] arr2 = Arrays.copyOf(arr, RESOURCE_NAME_MAX_LENGTH);\r
+                    return truncated(r, "int", Arrays.toString(arr2), arr.length);\r
+                } else if (value instanceof long[]) {\r
+                    long[] arr = (long[]) value;\r
+                    long[] arr2 = Arrays.copyOf(arr, RESOURCE_NAME_MAX_LENGTH);\r
+                    return truncated(r, "long", Arrays.toString(arr2), arr.length);\r
+                } else if (value instanceof float[]) {\r
+                    float[] arr = (float[]) value;\r
+                    float[] arr2 = Arrays.copyOf(arr, RESOURCE_NAME_MAX_LENGTH);\r
+                    return truncated(r, "float", Arrays.toString(arr2), arr.length);\r
+                } else if (value instanceof double[]) {\r
+                    double[] arr = (double[]) value;\r
+                    double[] arr2 = Arrays.copyOf(arr, RESOURCE_NAME_MAX_LENGTH);\r
+                    return truncated(r, "double", Arrays.toString(arr2), arr.length);\r
+                } else if (value instanceof boolean[]) {\r
+                    boolean[] arr = (boolean[]) value;\r
+                    boolean[] arr2 = Arrays.copyOf(arr, RESOURCE_NAME_MAX_LENGTH);\r
+                    return truncated(r, "boolean", Arrays.toString(arr2), arr.length);\r
+                } else if (value instanceof Object[]) {\r
+                    Object[] arr = (Object[]) value;\r
+                    Object[] arr2 = Arrays.copyOf(arr, RESOURCE_NAME_MAX_LENGTH);\r
+                    return truncated(r, "Object", Arrays.toString(arr2), arr.length);\r
+                } else {\r
+                    return new ValueInfo(r, "", "Unknown big array " + clazz.getCanonicalName());\r
+                }\r
+            } else {\r
+                return new ValueInfo(r, ObjectUtils.toString(value), clazz.getComponentType() + "[" + length + "]");\r
+            }\r
+        }\r
+        return new ValueInfo(r, ObjectUtils.toString(value), clazz.getCanonicalName());\r
+    }\r
+\r
+    private static ValueInfo truncated(Resource r, String type, String value, int originalLength) {\r
+        return new ValueInfo(r, value, type + "[" + RESOURCE_NAME_MAX_LENGTH + "/" + originalLength + "]");\r
+    }\r
+\r
+}\r