]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/equations/TestEquationContext.java
Added missing parts from SVN org.simantics.root project.
[simantics/platform.git] / bundles / org.simantics.scl.runtime / src / org / simantics / scl / runtime / equations / TestEquationContext.java
1 package org.simantics.scl.runtime.equations;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collections;\r
5 import java.util.Comparator;\r
6 import java.util.List;\r
7 \r
8 import org.simantics.scl.runtime.SCLContext;\r
9 import org.simantics.scl.runtime.function.Function;\r
10 import org.simantics.scl.runtime.tuple.Tuple0;\r
11 import org.simantics.scl.runtime.tuple.Tuple2;\r
12 \r
13 import gnu.trove.map.hash.THashMap;\r
14 import gnu.trove.procedure.TObjectObjectProcedure;\r
15 \r
16 public class TestEquationContext implements EquationContext {\r
17 \r
18     public static final boolean TRACE = true;\r
19     \r
20     THashMap<String, Object> values = new THashMap<String, Object>(); \r
21     THashMap<String, ArrayList<Function>> listenerMap = new THashMap<String, ArrayList<Function>>(); \r
22 \r
23     @Override\r
24     public void listenEquationVariable(String variableName, Function listener) {\r
25         if(TRACE)\r
26             System.out.println("listenEquationVariable(" + variableName + ", " + listener + ")");\r
27         if(values.containsKey(variableName)) {\r
28             Object value = values.get(variableName);\r
29             if(TRACE)\r
30                 System.out.println("    apply " + value);\r
31             listener.apply(value);\r
32         }\r
33         else {\r
34             if(TRACE)\r
35                 System.out.println("    add listener");\r
36             ArrayList<Function> listeners = listenerMap.get(variableName);\r
37             if(listeners == null) {\r
38                 listeners = new ArrayList<Function>();\r
39                 listenerMap.put(variableName, listeners);\r
40             }\r
41             listeners.add(listener);\r
42         }\r
43     }\r
44 \r
45     @Override\r
46     public void setEquationVariable(String variableName, Object value) {\r
47         if(TRACE)\r
48             System.out.println("setEquationVariable(" + variableName + ", " + value + ")");\r
49         if(values.containsKey(variableName))\r
50             throw new IllegalStateException("Value for " + variableName + " already defined (oldValue=" + values.get(variableName) + \r
51                     ", newValue=" + value + ").");\r
52         values.put(variableName, value);\r
53         ArrayList<Function> listeners = listenerMap.remove(variableName);\r
54         SCLContext context = SCLContext.getCurrent();\r
55         if(listeners != null) {\r
56             Object oldEquationContex = context.put("equation", this);\r
57             try {\r
58                 for(Function listener : listeners) {\r
59                     if(TRACE)\r
60                         System.out.println("    apply " + listener + " " + value);\r
61                     listener.apply(value);\r
62                 }\r
63             } finally {\r
64                 context.put("equation", oldEquationContex);\r
65             }\r
66         }\r
67     }\r
68     \r
69     public static List<Tuple2> solveEquations(Function f) {\r
70         TestEquationContext equationContext = new TestEquationContext();\r
71         SCLContext context = SCLContext.getCurrent();\r
72         Object oldEquationContext = context.put("equation", equationContext);\r
73         try {\r
74             f.apply(Tuple0.INSTANCE);\r
75         } finally {\r
76             context.put("equation", oldEquationContext);\r
77         }\r
78         ArrayList<Tuple2> result = new ArrayList<Tuple2>(equationContext.values.size());\r
79         equationContext.values.forEachEntry(new TObjectObjectProcedure<String, Object>() {\r
80             @Override\r
81             public boolean execute(String a, Object b) {\r
82                 result.add(new Tuple2(a, String.valueOf(b)));\r
83                 return true;\r
84             }\r
85         });\r
86         Collections.sort(result, (t1, t2) -> {\r
87             return ((String)t1.c0).compareTo((String)t2.c0);\r
88         });\r
89         return result;\r
90     }\r
91     \r
92     public THashMap<String, Object> getValues() {\r
93         return values;\r
94     }\r
95 \r
96 }\r