--- /dev/null
+package org.simantics.modeling;\r
+\r
+import gnu.trove.map.hash.THashMap;\r
+\r
+import java.text.SimpleDateFormat;\r
+import java.util.Date;\r
+import java.util.Map;\r
+\r
+import org.simantics.common.color.Color;\r
+import org.simantics.common.format.Formatter;\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.Databoard;\r
+import org.simantics.databoard.adapter.AdaptException;\r
+import org.simantics.databoard.binding.Binding;\r
+import org.simantics.databoard.binding.error.BindingException;\r
+import org.simantics.databoard.type.Datatype;\r
+import org.simantics.databoard.util.URIStringUtils;\r
+import org.simantics.datatypes.literal.DecimalFormatFormatter;\r
+import org.simantics.datatypes.literal.RGB;\r
+import org.simantics.datatypes.literal.Vec2d;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.RelationContext;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.adapter.impl.EntityNameModifier;\r
+import org.simantics.db.layer0.request.PossibleActiveExperiment;\r
+import org.simantics.db.layer0.request.PossibleVariableModel;\r
+import org.simantics.db.layer0.util.Layer0Utils;\r
+import org.simantics.db.layer0.variable.ProxyChildVariable;\r
+import org.simantics.db.layer0.variable.RVI;\r
+import org.simantics.db.layer0.variable.ValueAccessor;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.db.layer0.variable.VariableMap;\r
+import org.simantics.db.layer0.variable.VariableMapImpl;\r
+import org.simantics.db.layer0.variable.Variables;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.modeling.query.QueryProxyChildVariable;\r
+import org.simantics.modeling.scl.CompileProceduralSCLMonitorRequest;\r
+import org.simantics.modeling.scl.CompileSCLMonitorRequest;\r
+import org.simantics.modeling.scl.CompileSCLQueryRequest;\r
+import org.simantics.scenegraph.loader.ScenegraphLoaderUtils;\r
+import org.simantics.scl.reflection.annotations.SCLValue;\r
+import org.simantics.scl.runtime.function.FunctionImpl1;\r
+import org.simantics.structural.stubs.StructuralResource2;\r
+import org.simantics.structural2.scl.CompileStructuralValueRequest;\r
+\r
+public class All {\r
+\r
+ private static String formatted(String text, String color, int size) {\r
+ return "<font style=\"font-size:" + size + ";color:" + color + ";\">" + text + "</font>";\r
+ }\r
+ \r
+ @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")\r
+ public static String issueDocumentHeader(ReadGraph graph, Resource converter, Variable context) throws DatabaseException {\r
+ \r
+ Variable selection = ScenegraphLoaderUtils.getVariableSelection(graph, context);\r
+ String label = selection.getLabel(graph);\r
+ String severity = selection.getPropertyValue(graph, "severity", Bindings.STRING);\r
+ \r
+ String result = "== " + label + " ==\r\n" +\r
+ formatted("An issue with severity ", "#000000", 12) +\r
+ formatted(severity, "#5050aa", 15) + "\r\n\r\n<hr/>";\r
+\r
+ return result;\r
+ \r
+ }\r
+ \r
+ @SCLValue(type = "ReadGraph -> Resource -> Variable -> a")\r
+ public static Object sclValue(ReadGraph graph, Resource converter, Variable context) throws DatabaseException {\r
+ return CompileStructuralValueRequest.compileAndEvaluate(graph, context);\r
+ }\r
+\r
+ @SCLValue(type = "ReadGraph -> Resource -> Variable -> a")\r
+ public static Object queryValue(ReadGraph graph, Resource converter, Variable context) throws DatabaseException {\r
+ return CompileSCLQueryRequest.compileAndEvaluate(graph, context);\r
+ }\r
+\r
+ @SCLValue(type = "ReadGraph -> Resource -> Variable -> Boolean")\r
+ public static Boolean monitorReadOnly(ReadGraph graph, Resource converter, Variable ro) throws DatabaseException {\r
+ Variable context = ro.getParent(graph);\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ String expression = graph.getPossibleRelatedValue(context.getRepresents(graph), L0.SCLValue_expression, Bindings.STRING);\r
+ if(expression == null) return true;\r
+ return !InvertBasicExpressionVisitor.isInvertible(graph, context.getParent(graph), expression);\r
+ }\r
+\r
+ @SCLValue(type = "ValueAccessor")\r
+ public static ValueAccessor monitorValueAccessor = new ValueAccessor() {\r
+ \r
+ @Override\r
+ public void setValue(WriteGraph graph, Variable context, Object value, Binding binding) throws DatabaseException {\r
+ setValue(graph, context, value);\r
+ }\r
+ \r
+ @Override\r
+ public void setValue(WriteGraph graph, Variable context, Object value) throws DatabaseException {\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ String expression = graph.getPossibleRelatedValue(context.getRepresents(graph), L0.SCLValue_expression, Bindings.STRING);\r
+ if(expression == null) return;\r
+ InvertBasicExpressionVisitor.invert(graph, context.getParent(graph), expression, value);\r
+ }\r
+ \r
+ @Override\r
+ public Object getValue(ReadGraph graph, Variable context, Binding binding) throws DatabaseException {\r
+ try {\r
+ Object value = getValue(graph, context);\r
+ Binding srcBinding = Bindings.OBJECT.getContentBinding(value);\r
+ return Bindings.adapt(value, srcBinding, binding);\r
+ } catch (AdaptException e) {\r
+ throw new DatabaseException(e);\r
+ } catch (BindingException e) {\r
+ throw new DatabaseException(e);\r
+ }\r
+ }\r
+ \r
+ private boolean isProcedural(ReadGraph graph, Variable context) throws DatabaseException {\r
+ StructuralResource2 STR = StructuralResource2.getInstance(graph);\r
+ Resource type = context.getParent(graph).getPossibleType(graph);\r
+ return graph.isInstanceOf(type, STR.ProceduralComponentType);\r
+ }\r
+ \r
+ @Override\r
+ public Object getValue(ReadGraph graph, Variable context) throws DatabaseException {\r
+ if(isProcedural(graph, context))\r
+ return CompileProceduralSCLMonitorRequest.compileAndEvaluate(graph, context);\r
+ else\r
+ return CompileSCLMonitorRequest.compileAndEvaluate(graph, context);\r
+ }\r
+\r
+ @Override\r
+ public Datatype getDatatype(ReadGraph graph, Variable context)\r
+ throws DatabaseException {\r
+ return org.simantics.db.layer0.function.All.getDatatypeFromValue(graph, context);\r
+ }\r
+ \r
+ };\r
+\r
+ @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> String")\r
+ public static String obtainedString(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {\r
+ return Layer0Utils.possibleObtainedValue(graph, context, Bindings.STRING);\r
+ }\r
+\r
+ @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Double")\r
+ public static Double obtainedDouble(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {\r
+ return Layer0Utils.possibleObtainedValue(graph, context, Bindings.DOUBLE);\r
+ }\r
+ \r
+ @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Boolean")\r
+ public static Boolean obtainedBoolean(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {\r
+ return Layer0Utils.possibleObtainedValue(graph, context, Bindings.BOOLEAN);\r
+ }\r
+\r
+ @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Color")\r
+ public static Color obtainedColor(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {\r
+ return Layer0Utils.possibleObtainedValue(graph, context, RGB.Integer.BINDING);\r
+ }\r
+\r
+ @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Vec2d")\r
+ public static Vec2d obtainedVec2d(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {\r
+ return Layer0Utils.possibleObtainedValue(graph, context, Vec2d.BINDING);\r
+ }\r
+\r
+ @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Formatter")\r
+ public static Formatter obtainedFormatter(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {\r
+ return Layer0Utils.possibleObtainedValue(graph, context, DecimalFormatFormatter.BINDING);\r
+ }\r
+ \r
+ public static final SimpleDateFormat sdfShort = new SimpleDateFormat("d.M.yyyy");\r
+ public static final SimpleDateFormat sdfLong = new SimpleDateFormat("d.M.yyyy H:mm:ss");\r
+\r
+ @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")\r
+ public static String modificationTimeTextShort(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {\r
+ Long millis = variable.getParent(graph).getValue(graph, Bindings.LONG);\r
+ return sdfShort.format(new Date(millis));\r
+ }\r
+\r
+ @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")\r
+ public static String modificationTimeTextLong(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {\r
+ Long millis = variable.getParent(graph).getValue(graph, Bindings.LONG);\r
+ return sdfLong.format(new Date(millis));\r
+ }\r
+\r
+ @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")\r
+ public static String variableIdDisplayValue(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {\r
+ Binding rviBinding = graph.getService(Databoard.class).getBindingUnchecked( RVI.class );\r
+ RVI rvi = variable.getParent(graph).getPossibleValue(graph, rviBinding);\r
+ if (rvi == null)\r
+ return "Undefined, invalid subscription item";\r
+\r
+ Resource model = graph.sync( new PossibleVariableModel(variable) );\r
+ Resource run = model != null ? graph.sync( new PossibleActiveExperiment(model) ) : null;\r
+ Variable base = run != null ? Variables.getPossibleVariable(graph, run) : null;\r
+ Variable var = base != null ? rvi.resolvePossible(graph, base) : null;\r
+ String rvistr = base != null ? rvi.toPossibleString(graph, base) : null;\r
+ String result = rvistr != null ? URIStringUtils.unescape( rvistr ) : "";\r
+ return var != null ? result : result + " (INVALID)";\r
+ }\r
+\r
+ @SCLValue(type = "ReadGraph -> Resource -> Variable -> a")\r
+ public static Object nameInputValidator(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ Resource container = variable.getParent(graph).getParent(graph).getParent(graph).getPossibleRepresents(graph);\r
+ if(container == null) return null;\r
+ Resource name = graph.getSingleObject(container, L0.HasName);\r
+ final EntityNameModifier modifier = new EntityNameModifier(graph, container, name);\r
+ return new FunctionImpl1<String, String>() {\r
+\r
+ @Override\r
+ public String apply(String proposition) {\r
+ return modifier.isValid(proposition);\r
+ }\r
+ \r
+ };\r
+ }\r
+ \r
+ @SCLValue(type = "VariableMap")\r
+ public static VariableMap queryChildMap = new VariableMapImpl() {\r
+\r
+ private Variable getProxy(ReadGraph graph, Variable context) throws DatabaseException {\r
+ Variable root = Variables.getRootVariable(graph);\r
+ return new QueryProxyChildVariable(context, context, root, ProxyChildVariable.CONTEXT_BEGIN);\r
+ }\r
+ \r
+ @Override\r
+ public Variable getVariable(ReadGraph graph, Variable context, String name) throws DatabaseException {\r
+\r
+ if(ProxyChildVariable.CONTEXT_BEGIN.equals(name)) return getProxy(graph, context);\r
+ return org.simantics.db.layer0.function.All.standardChildDomainChildren.getVariable(graph, context, name);\r
+ \r
+ }\r
+\r
+ @Override\r
+ public Map<String, Variable> getVariables(ReadGraph graph, Variable context, Map<String, Variable> map) throws DatabaseException {\r
+\r
+ map = org.simantics.db.layer0.function.All.standardChildDomainChildren.getVariables(graph, context, map);\r
+ if(map == null) map = new THashMap<String,Variable>();\r
+ map.put(ProxyChildVariable.CONTEXT_BEGIN, getProxy(graph, context));\r
+ return map;\r
+ \r
+ }\r
+ \r
+ };\r
+ \r
+}\r