1 /*******************************************************************************
2 * Copyright (c) 2016 Association for Decentralized Information Management
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
10 * THTH ry - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.debug.browser.utils;
14 import java.io.IOException;
15 import java.lang.reflect.Array;
16 import java.util.Arrays;
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;
38 private static int RESOURCE_NAME_MAX_LENGTH = 1000;
39 private static int RESOURCE_VALUE_MAX_SIZE = 16384;
41 public static ValueInfo getPossibleValueInfo(ReadGraph graph, Resource r) {
43 if (!graph.hasValue(r))
47 String datatype = null;
49 Layer0 L0 = Layer0.getInstance(graph);
50 Datatype type = graph.getPossibleRelatedValue(r, L0.HasDataType, Bindings.getBindingUnchecked(Datatype.class));
52 if (graph.isInstanceOf(r, L0.RVI)) {
54 RVI rvi = graph.getPossibleValue(r, graph.getService(Databoard.class).getBindingUnchecked(RVI.class));
55 Resource owner = CommonDBUtils.getPossibleOwner(graph, r);
57 Variable context = Variables.getPossibleConfigurationContext(graph, owner);
59 value = rvi.asPossibleString(graph, context);
62 value = rvi.toString( graph );
64 datatype = "Relative Variable Identifier (RVI)";
65 } catch (DatabaseException e) {
66 // Fall through to more generic mechanisms
70 // Generic datatype-based fallback method
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";
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));
86 value = b.toString(v, false);
88 // datatype = type.toSingleLineString();
89 // datatype = type.toString();
90 // datatype = DataTypePrinter2.print(type);
91 datatype = Bindings.getBindingUnchecked(Datatype.class).toString(type, false);
95 // Final fallback if there's no datatype specified
96 ValueInfo info = null;
98 info = new ValueInfo(r, value, datatype);
100 info = toSimpleValueInfo(r, graph.getValue(r));
103 } catch (DatabaseException e) {
105 } catch (IOException e) {
107 } catch (BindingException e) {
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);
146 return new ValueInfo(r, "", "Unknown big array " + clazz.getCanonicalName());
149 return new ValueInfo(r, ObjectUtils.toString(value), clazz.getComponentType() + "[" + length + "]");
152 return new ValueInfo(r, ObjectUtils.toString(value), clazz.getCanonicalName());
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 + "]");