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
10 * THTH ry - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.debug.browser.utils;
\r
14 import java.io.IOException;
\r
15 import java.lang.reflect.Array;
\r
16 import java.util.Arrays;
\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
36 public class Values {
\r
38 private static int RESOURCE_NAME_MAX_LENGTH = 1000;
\r
39 private static int RESOURCE_VALUE_MAX_SIZE = 16384;
\r
41 public static ValueInfo getPossibleValueInfo(ReadGraph graph, Resource r) {
\r
43 if (!graph.hasValue(r))
\r
46 String value = null;
\r
47 String datatype = null;
\r
49 Layer0 L0 = Layer0.getInstance(graph);
\r
50 Datatype type = graph.getPossibleRelatedValue(r, L0.HasDataType, Bindings.getBindingUnchecked(Datatype.class));
\r
52 if (graph.isInstanceOf(r, L0.RVI)) {
\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
62 value = rvi.toString( graph );
\r
64 datatype = "Relative Variable Identifier (RVI)";
\r
65 } catch (DatabaseException e) {
\r
66 // Fall through to more generic mechanisms
\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
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
86 value = b.toString(v, false);
\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
95 // Final fallback if there's no datatype specified
\r
96 ValueInfo info = null;
\r
98 info = new ValueInfo(r, value, datatype);
\r
100 info = toSimpleValueInfo(r, graph.getValue(r));
\r
103 } catch (DatabaseException e) {
\r
105 } catch (IOException e) {
\r
107 } catch (BindingException e) {
\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
146 return new ValueInfo(r, "", "Unknown big array " + clazz.getCanonicalName());
\r
149 return new ValueInfo(r, ObjectUtils.toString(value), clazz.getComponentType() + "[" + length + "]");
\r
152 return new ValueInfo(r, ObjectUtils.toString(value), clazz.getCanonicalName());
\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