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