]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/All.java
Sync git svn branch with SVN repository r33366.
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / All.java
1 package org.simantics.modeling;\r
2 \r
3 import gnu.trove.map.hash.THashMap;\r
4 \r
5 import java.text.SimpleDateFormat;\r
6 import java.util.Date;\r
7 import java.util.Map;\r
8 \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
47 \r
48 public class All {\r
49 \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
52     }\r
53         \r
54     @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")\r
55     public static String issueDocumentHeader(ReadGraph graph, Resource converter, Variable context) throws DatabaseException {\r
56         \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
60         \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
64 \r
65         return result;\r
66         \r
67     }\r
68         \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
72     }\r
73 \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
77     }\r
78 \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
86         }\r
87 \r
88     @SCLValue(type = "ValueAccessor")\r
89         public static ValueAccessor monitorValueAccessor = new ValueAccessor() {\r
90         \r
91         @Override\r
92         public void setValue(WriteGraph graph, Variable context, Object value, Binding binding) throws DatabaseException {\r
93             setValue(graph, context, value);\r
94         }\r
95         \r
96         @Override\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
102         }\r
103         \r
104         @Override\r
105         public Object getValue(ReadGraph graph, Variable context, Binding binding) throws DatabaseException {\r
106             try {\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
114                         }\r
115         }\r
116         \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
121         }\r
122         \r
123         @Override\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
127             else\r
128                 return CompileSCLMonitorRequest.compileAndEvaluate(graph, context);\r
129         }\r
130 \r
131                 @Override\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
135                 }\r
136         \r
137     };\r
138 \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
142         }\r
143 \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
147         }\r
148         \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
152         }\r
153 \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
157         }\r
158 \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
162         }\r
163 \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
167         }\r
168         \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
171 \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
176         }\r
177 \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
182         }\r
183 \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
188         if (rvi == null)\r
189             return "Undefined, invalid subscription item";\r
190 \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
198     }\r
199 \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
208 \r
209                         @Override\r
210                         public String apply(String proposition) {\r
211                                 return modifier.isValid(proposition);\r
212                         }\r
213                         \r
214                 };\r
215         }\r
216         \r
217     @SCLValue(type = "VariableMap")\r
218     public static VariableMap queryChildMap = new VariableMapImpl() {\r
219 \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
223         }\r
224         \r
225         @Override\r
226         public Variable getVariable(ReadGraph graph, Variable context, String name) throws DatabaseException {\r
227 \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
230             \r
231         }\r
232 \r
233         @Override\r
234         public Map<String, Variable> getVariables(ReadGraph graph, Variable context, Map<String, Variable> map) throws DatabaseException {\r
235 \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
239             return map;\r
240             \r
241         }\r
242         \r
243     };\r
244         \r
245 }\r