1 package org.simantics.modeling;
\r
3 import gnu.trove.map.hash.THashMap;
\r
5 import java.text.SimpleDateFormat;
\r
6 import java.util.Date;
\r
7 import java.util.Map;
\r
9 import org.simantics.common.color.Color;
\r
10 import org.simantics.common.format.Formatter;
\r
11 import org.simantics.databoard.Bindings;
\r
12 import org.simantics.databoard.Databoard;
\r
13 import org.simantics.databoard.adapter.AdaptException;
\r
14 import org.simantics.databoard.binding.Binding;
\r
15 import org.simantics.databoard.binding.error.BindingException;
\r
16 import org.simantics.databoard.type.Datatype;
\r
17 import org.simantics.databoard.util.URIStringUtils;
\r
18 import org.simantics.datatypes.literal.DecimalFormatFormatter;
\r
19 import org.simantics.datatypes.literal.RGB;
\r
20 import org.simantics.datatypes.literal.Vec2d;
\r
21 import org.simantics.db.ReadGraph;
\r
22 import org.simantics.db.RelationContext;
\r
23 import org.simantics.db.Resource;
\r
24 import org.simantics.db.WriteGraph;
\r
25 import org.simantics.db.exception.DatabaseException;
\r
26 import org.simantics.db.layer0.adapter.impl.EntityNameModifier;
\r
27 import org.simantics.db.layer0.request.PossibleActiveExperiment;
\r
28 import org.simantics.db.layer0.request.PossibleVariableModel;
\r
29 import org.simantics.db.layer0.util.Layer0Utils;
\r
30 import org.simantics.db.layer0.variable.ProxyChildVariable;
\r
31 import org.simantics.db.layer0.variable.RVI;
\r
32 import org.simantics.db.layer0.variable.ValueAccessor;
\r
33 import org.simantics.db.layer0.variable.Variable;
\r
34 import org.simantics.db.layer0.variable.VariableMap;
\r
35 import org.simantics.db.layer0.variable.VariableMapImpl;
\r
36 import org.simantics.db.layer0.variable.Variables;
\r
37 import org.simantics.layer0.Layer0;
\r
38 import org.simantics.modeling.query.QueryProxyChildVariable;
\r
39 import org.simantics.modeling.scl.CompileProceduralSCLMonitorRequest;
\r
40 import org.simantics.modeling.scl.CompileSCLMonitorRequest;
\r
41 import org.simantics.modeling.scl.CompileSCLQueryRequest;
\r
42 import org.simantics.scenegraph.loader.ScenegraphLoaderUtils;
\r
43 import org.simantics.scl.reflection.annotations.SCLValue;
\r
44 import org.simantics.scl.runtime.function.FunctionImpl1;
\r
45 import org.simantics.structural.stubs.StructuralResource2;
\r
46 import org.simantics.structural2.scl.CompileStructuralValueRequest;
\r
50 private static String formatted(String text, String color, int size) {
\r
51 return "<font style=\"font-size:" + size + ";color:" + color + ";\">" + text + "</font>";
\r
54 @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")
\r
55 public static String issueDocumentHeader(ReadGraph graph, Resource converter, Variable context) throws DatabaseException {
\r
57 Variable selection = ScenegraphLoaderUtils.getVariableSelection(graph, context);
\r
58 String label = selection.getLabel(graph);
\r
59 String severity = selection.getPropertyValue(graph, "severity", Bindings.STRING);
\r
61 String result = "== " + label + " ==\r\n" +
\r
62 formatted("An issue with severity ", "#000000", 12) +
\r
63 formatted(severity, "#5050aa", 15) + "\r\n\r\n<hr/>";
\r
69 @SCLValue(type = "ReadGraph -> Resource -> Variable -> a")
\r
70 public static Object sclValue(ReadGraph graph, Resource converter, Variable context) throws DatabaseException {
\r
71 return CompileStructuralValueRequest.compileAndEvaluate(graph, context);
\r
74 @SCLValue(type = "ReadGraph -> Resource -> Variable -> a")
\r
75 public static Object queryValue(ReadGraph graph, Resource converter, Variable context) throws DatabaseException {
\r
76 return CompileSCLQueryRequest.compileAndEvaluate(graph, context);
\r
79 @SCLValue(type = "ReadGraph -> Resource -> Variable -> Boolean")
\r
80 public static Boolean monitorReadOnly(ReadGraph graph, Resource converter, Variable ro) throws DatabaseException {
\r
81 Variable context = ro.getParent(graph);
\r
82 Layer0 L0 = Layer0.getInstance(graph);
\r
83 String expression = graph.getPossibleRelatedValue(context.getRepresents(graph), L0.SCLValue_expression, Bindings.STRING);
\r
84 if(expression == null) return true;
\r
85 return !InvertBasicExpressionVisitor.isInvertible(graph, context.getParent(graph), expression);
\r
88 @SCLValue(type = "ValueAccessor")
\r
89 public static ValueAccessor monitorValueAccessor = new ValueAccessor() {
\r
92 public void setValue(WriteGraph graph, Variable context, Object value, Binding binding) throws DatabaseException {
\r
93 setValue(graph, context, value);
\r
97 public void setValue(WriteGraph graph, Variable context, Object value) throws DatabaseException {
\r
98 Layer0 L0 = Layer0.getInstance(graph);
\r
99 String expression = graph.getPossibleRelatedValue(context.getRepresents(graph), L0.SCLValue_expression, Bindings.STRING);
\r
100 if(expression == null) return;
\r
101 InvertBasicExpressionVisitor.invert(graph, context.getParent(graph), expression, value);
\r
105 public Object getValue(ReadGraph graph, Variable context, Binding binding) throws DatabaseException {
\r
107 Object value = getValue(graph, context);
\r
108 Binding srcBinding = Bindings.OBJECT.getContentBinding(value);
\r
109 return Bindings.adapt(value, srcBinding, binding);
\r
110 } catch (AdaptException e) {
\r
111 throw new DatabaseException(e);
\r
112 } catch (BindingException e) {
\r
113 throw new DatabaseException(e);
\r
117 private boolean isProcedural(ReadGraph graph, Variable context) throws DatabaseException {
\r
118 StructuralResource2 STR = StructuralResource2.getInstance(graph);
\r
119 Resource type = context.getParent(graph).getPossibleType(graph);
\r
120 return graph.isInstanceOf(type, STR.ProceduralComponentType);
\r
124 public Object getValue(ReadGraph graph, Variable context) throws DatabaseException {
\r
125 if(isProcedural(graph, context))
\r
126 return CompileProceduralSCLMonitorRequest.compileAndEvaluate(graph, context);
\r
128 return CompileSCLMonitorRequest.compileAndEvaluate(graph, context);
\r
132 public Datatype getDatatype(ReadGraph graph, Variable context)
\r
133 throws DatabaseException {
\r
134 return org.simantics.db.layer0.function.All.getDatatypeFromValue(graph, context);
\r
139 @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> String")
\r
140 public static String obtainedString(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {
\r
141 return Layer0Utils.possibleObtainedValue(graph, context, Bindings.STRING);
\r
144 @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Double")
\r
145 public static Double obtainedDouble(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {
\r
146 return Layer0Utils.possibleObtainedValue(graph, context, Bindings.DOUBLE);
\r
149 @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Boolean")
\r
150 public static Boolean obtainedBoolean(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {
\r
151 return Layer0Utils.possibleObtainedValue(graph, context, Bindings.BOOLEAN);
\r
154 @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Color")
\r
155 public static Color obtainedColor(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {
\r
156 return Layer0Utils.possibleObtainedValue(graph, context, RGB.Integer.BINDING);
\r
159 @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Vec2d")
\r
160 public static Vec2d obtainedVec2d(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {
\r
161 return Layer0Utils.possibleObtainedValue(graph, context, Vec2d.BINDING);
\r
164 @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Formatter")
\r
165 public static Formatter obtainedFormatter(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {
\r
166 return Layer0Utils.possibleObtainedValue(graph, context, DecimalFormatFormatter.BINDING);
\r
169 public static final SimpleDateFormat sdfShort = new SimpleDateFormat("d.M.yyyy");
\r
170 public static final SimpleDateFormat sdfLong = new SimpleDateFormat("d.M.yyyy H:mm:ss");
\r
172 @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")
\r
173 public static String modificationTimeTextShort(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {
\r
174 Long millis = variable.getParent(graph).getValue(graph, Bindings.LONG);
\r
175 return sdfShort.format(new Date(millis));
\r
178 @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")
\r
179 public static String modificationTimeTextLong(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {
\r
180 Long millis = variable.getParent(graph).getValue(graph, Bindings.LONG);
\r
181 return sdfLong.format(new Date(millis));
\r
184 @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")
\r
185 public static String variableIdDisplayValue(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {
\r
186 Binding rviBinding = graph.getService(Databoard.class).getBindingUnchecked( RVI.class );
\r
187 RVI rvi = variable.getParent(graph).getPossibleValue(graph, rviBinding);
\r
189 return "Undefined, invalid subscription item";
\r
191 Resource model = graph.sync( new PossibleVariableModel(variable) );
\r
192 Resource run = model != null ? graph.sync( new PossibleActiveExperiment(model) ) : null;
\r
193 Variable base = run != null ? Variables.getPossibleVariable(graph, run) : null;
\r
194 Variable var = base != null ? rvi.resolvePossible(graph, base) : null;
\r
195 String rvistr = base != null ? rvi.toPossibleString(graph, base) : null;
\r
196 String result = rvistr != null ? URIStringUtils.unescape( rvistr ) : "";
\r
197 return var != null ? result : result + " (INVALID)";
\r
200 @SCLValue(type = "ReadGraph -> Resource -> Variable -> a")
\r
201 public static Object nameInputValidator(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {
\r
202 Layer0 L0 = Layer0.getInstance(graph);
\r
203 Resource container = variable.getParent(graph).getParent(graph).getParent(graph).getPossibleRepresents(graph);
\r
204 if(container == null) return null;
\r
205 Resource name = graph.getSingleObject(container, L0.HasName);
\r
206 final EntityNameModifier modifier = new EntityNameModifier(graph, container, name);
\r
207 return new FunctionImpl1<String, String>() {
\r
210 public String apply(String proposition) {
\r
211 return modifier.isValid(proposition);
\r
217 @SCLValue(type = "VariableMap")
\r
218 public static VariableMap queryChildMap = new VariableMapImpl() {
\r
220 private Variable getProxy(ReadGraph graph, Variable context) throws DatabaseException {
\r
221 Variable root = Variables.getRootVariable(graph);
\r
222 return new QueryProxyChildVariable(context, context, root, ProxyChildVariable.CONTEXT_BEGIN);
\r
226 public Variable getVariable(ReadGraph graph, Variable context, String name) throws DatabaseException {
\r
228 if(ProxyChildVariable.CONTEXT_BEGIN.equals(name)) return getProxy(graph, context);
\r
229 return org.simantics.db.layer0.function.All.standardChildDomainChildren.getVariable(graph, context, name);
\r
234 public Map<String, Variable> getVariables(ReadGraph graph, Variable context, Map<String, Variable> map) throws DatabaseException {
\r
236 map = org.simantics.db.layer0.function.All.standardChildDomainChildren.getVariables(graph, context, map);
\r
237 if(map == null) map = new THashMap<String,Variable>();
\r
238 map.put(ProxyChildVariable.CONTEXT_BEGIN, getProxy(graph, context));
\r