]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 /*******************************************************************************\r
2  * Copyright (c) 2016 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     THTH ry - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.debug.browser.utils;\r
13 \r
14 import java.io.IOException;\r
15 import java.lang.reflect.Array;\r
16 import java.util.Arrays;\r
17 \r
18 import org.simantics.databoard.Bindings;\r
19 import org.simantics.databoard.Databoard;\r
20 import org.simantics.databoard.binding.ArrayBinding;\r
21 import org.simantics.databoard.binding.Binding;\r
22 import org.simantics.databoard.binding.error.BindingException;\r
23 import org.simantics.databoard.serialization.Serializer;\r
24 import org.simantics.databoard.type.ArrayType;\r
25 import org.simantics.databoard.type.Datatype;\r
26 import org.simantics.databoard.util.ObjectUtils;\r
27 import org.simantics.db.ReadGraph;\r
28 import org.simantics.db.Resource;\r
29 import org.simantics.db.common.utils.CommonDBUtils;\r
30 import org.simantics.db.exception.DatabaseException;\r
31 import org.simantics.db.layer0.variable.RVI;\r
32 import org.simantics.db.layer0.variable.Variable;\r
33 import org.simantics.db.layer0.variable.Variables;\r
34 import org.simantics.layer0.Layer0;\r
35 \r
36 public class Values {\r
37 \r
38     private static int RESOURCE_NAME_MAX_LENGTH = 1000;\r
39     private static int RESOURCE_VALUE_MAX_SIZE = 16384;\r
40 \r
41     public static ValueInfo getPossibleValueInfo(ReadGraph graph, Resource r) {\r
42         try {\r
43             if (!graph.hasValue(r))\r
44                 return null;\r
45 \r
46             String value = null;\r
47             String datatype = null;\r
48 \r
49             Layer0 L0 = Layer0.getInstance(graph);\r
50             Datatype type = graph.getPossibleRelatedValue(r, L0.HasDataType, Bindings.getBindingUnchecked(Datatype.class));\r
51             if (type != null) {\r
52                 if (graph.isInstanceOf(r, L0.RVI)) {\r
53                     try {\r
54                         RVI rvi = graph.getPossibleValue(r, graph.getService(Databoard.class).getBindingUnchecked(RVI.class));\r
55                         Resource owner = CommonDBUtils.getPossibleOwner(graph, r);\r
56                         if (owner != null) {\r
57                             Variable context  = Variables.getPossibleConfigurationContext(graph, owner);\r
58                             if (context != null)  \r
59                                 value = rvi.asPossibleString(graph, context);\r
60                         }\r
61                         if (value == null)\r
62                             value = rvi.toString( graph );\r
63                         if (value != null)\r
64                             datatype = "Relative Variable Identifier (RVI)";\r
65                     } catch (DatabaseException e) {\r
66                         // Fall through to more generic mechanisms\r
67                     }\r
68                 }\r
69 \r
70                 // Generic datatype-based fallback method\r
71                 if (value == null) {\r
72                     Binding b = Bindings.getBinding(type);\r
73                     Object v = graph.getPossibleValue(r, b);\r
74                     Serializer s = Bindings.getSerializerUnchecked(b);\r
75                     int size = s.getSize(v);\r
76                     if (size > RESOURCE_VALUE_MAX_SIZE) {\r
77                         value = "Approx. " + size + " byte literal";\r
78                     } else {\r
79                         if (b instanceof ArrayBinding) {\r
80                             // Manipulate data type to contain actual array\r
81                             // length for printing purposes.\r
82                             int arraySize = ((ArrayBinding) b).size(v);\r
83                             ArrayType atype = (ArrayType) type;\r
84                             atype.setLength(Integer.toString(arraySize));\r
85                         }\r
86                         value = b.toString(v, false);\r
87                     }\r
88 //                    datatype = type.toSingleLineString();\r
89 //                    datatype = type.toString();\r
90 //                    datatype = DataTypePrinter2.print(type);\r
91                     datatype = Bindings.getBindingUnchecked(Datatype.class).toString(type, false);\r
92                 }\r
93             }\r
94 \r
95             // Final fallback if there's no datatype specified\r
96             ValueInfo info = null;\r
97             if (value != null)\r
98                 info = new ValueInfo(r, value, datatype);\r
99             if (info == null)\r
100                 info = toSimpleValueInfo(r, graph.getValue(r));\r
101 \r
102             return info;\r
103         } catch (DatabaseException e) {\r
104             return null;\r
105         } catch (IOException e) {\r
106             return null;\r
107         } catch (BindingException e) {\r
108             return null;\r
109         }\r
110     }\r
111 \r
112     private static ValueInfo toSimpleValueInfo(Resource r, Object value) {\r
113         Class<?> clazz = value.getClass();\r
114         if (clazz.isArray()) {\r
115             int length = Array.getLength(value);\r
116             if (length > RESOURCE_NAME_MAX_LENGTH) {\r
117                 if (value instanceof byte[]) {\r
118                     byte[] arr = (byte[]) value;\r
119                     byte[] arr2 = Arrays.copyOf(arr, RESOURCE_NAME_MAX_LENGTH);\r
120                     return truncated(r, "byte", Arrays.toString(arr2), arr.length);\r
121                 } else if (value instanceof int[]) {\r
122                     int[] arr = (int[]) value;\r
123                     int[] arr2 = Arrays.copyOf(arr, RESOURCE_NAME_MAX_LENGTH);\r
124                     return truncated(r, "int", Arrays.toString(arr2), arr.length);\r
125                 } else if (value instanceof long[]) {\r
126                     long[] arr = (long[]) value;\r
127                     long[] arr2 = Arrays.copyOf(arr, RESOURCE_NAME_MAX_LENGTH);\r
128                     return truncated(r, "long", Arrays.toString(arr2), arr.length);\r
129                 } else if (value instanceof float[]) {\r
130                     float[] arr = (float[]) value;\r
131                     float[] arr2 = Arrays.copyOf(arr, RESOURCE_NAME_MAX_LENGTH);\r
132                     return truncated(r, "float", Arrays.toString(arr2), arr.length);\r
133                 } else if (value instanceof double[]) {\r
134                     double[] arr = (double[]) value;\r
135                     double[] arr2 = Arrays.copyOf(arr, RESOURCE_NAME_MAX_LENGTH);\r
136                     return truncated(r, "double", Arrays.toString(arr2), arr.length);\r
137                 } else if (value instanceof boolean[]) {\r
138                     boolean[] arr = (boolean[]) value;\r
139                     boolean[] arr2 = Arrays.copyOf(arr, RESOURCE_NAME_MAX_LENGTH);\r
140                     return truncated(r, "boolean", Arrays.toString(arr2), arr.length);\r
141                 } else if (value instanceof Object[]) {\r
142                     Object[] arr = (Object[]) value;\r
143                     Object[] arr2 = Arrays.copyOf(arr, RESOURCE_NAME_MAX_LENGTH);\r
144                     return truncated(r, "Object", Arrays.toString(arr2), arr.length);\r
145                 } else {\r
146                     return new ValueInfo(r, "", "Unknown big array " + clazz.getCanonicalName());\r
147                 }\r
148             } else {\r
149                 return new ValueInfo(r, ObjectUtils.toString(value), clazz.getComponentType() + "[" + length + "]");\r
150             }\r
151         }\r
152         return new ValueInfo(r, ObjectUtils.toString(value), clazz.getCanonicalName());\r
153     }\r
154 \r
155     private static ValueInfo truncated(Resource r, String type, String value, int originalLength) {\r
156         return new ValueInfo(r, value, type + "[" + RESOURCE_NAME_MAX_LENGTH + "/" + originalLength + "]");\r
157     }\r
158 \r
159 }\r