]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.structural.synchronization.client/src/org/simantics/structural/synchronization/base/ModuleUpdateContext.java
Sync git svn branch with SVN repository r33366.
[simantics/platform.git] / bundles / org.simantics.structural.synchronization.client / src / org / simantics / structural / synchronization / base / ModuleUpdateContext.java
1 package org.simantics.structural.synchronization.base;\r
2 \r
3 import gnu.trove.map.hash.THashMap;\r
4 \r
5 import java.util.ArrayList;\r
6 \r
7 import org.simantics.databoard.binding.mutable.Variant;\r
8 \r
9 public class ModuleUpdateContext<T extends ComponentBase<T>> {\r
10 \r
11     private ModuleUpdaterBase<T> updater;\r
12     private final SynchronizationEventHandlerBase<T> handler;\r
13     public final T component;\r
14     public CommandBuilder command;\r
15     private ArrayList<Runnable> postUpdateActions; \r
16     private THashMap<String, Variant> storedProperties;\r
17     \r
18     private int pendingRuleCount;\r
19     public boolean stateLoadedFromUndo;\r
20 \r
21     public ModuleUpdateContext(SynchronizationEventHandlerBase<T> handler, ModuleUpdaterBase<T> updater, T component) {\r
22         assert(updater != null);\r
23         this.handler = handler;\r
24         this.updater = updater;\r
25         this.component = component;\r
26     }\r
27 \r
28     public void incPendingCount() {\r
29         ++pendingRuleCount;\r
30     }\r
31     \r
32     public void decPendingCount() {\r
33         --pendingRuleCount;\r
34         if(pendingRuleCount == 0) {\r
35                 try {\r
36                         command.apply(getSolver());\r
37                         command = null;\r
38                 } catch (Exception e) {\r
39                         handler.reportProblem("Exception while issuing command.", e);\r
40                 }\r
41             if(getModuleId() <= 0) {\r
42                 setModuleId(getSolver().getId(getModuleName()));\r
43                 component.setModuleId(getModuleId());\r
44             }\r
45             if(postUpdateActions != null) {\r
46                 for(Runnable action : postUpdateActions)\r
47                     try {\r
48                         action.run();\r
49                     } catch(Exception e) {\r
50                         handler.reportProblem("Post update action failed.", e);\r
51                     }\r
52                 postUpdateActions = null;\r
53             }\r
54             handler.resolver.unmarkPending(component);\r
55         }\r
56     }\r
57     \r
58     public void addPostUpdateAction(Runnable action) {\r
59         if(postUpdateActions == null)\r
60             postUpdateActions = new ArrayList<Runnable>(2);\r
61         postUpdateActions.add(action);\r
62     }\r
63 \r
64     public int getModuleId() {\r
65         return component.getModuleId();\r
66     }\r
67     \r
68     public SynchronizationEventHandlerBase<T> getHandler() {\r
69         return handler;\r
70     }\r
71 \r
72     public void setModuleId(int moduleId) {\r
73         component.setModuleId(moduleId);\r
74     }\r
75 \r
76     public Solver getSolver() {\r
77         return handler.solver;\r
78     }\r
79     \r
80     public <S> S getConcreteSolver() {\r
81         return handler.solver.getConcreteSolver();\r
82     }\r
83     \r
84     public String getModuleName() {\r
85         return component.solverComponentName;\r
86     }\r
87 \r
88     public void setModuleName(String moduleName) {\r
89         component.solverComponentName = moduleName;\r
90     }\r
91 \r
92     public void reportProblem(String description) {\r
93         handler.reportProblem(description);\r
94        \r
95     }\r
96     \r
97     public void reportProblem(String description, Exception e) {\r
98         handler.reportProblem(description, e);\r
99     }\r
100 \r
101     public void resolveReference(String connectionPoint, ModuleCallback moduleCallback) {\r
102         handler.resolver.resolveReference(component, connectionPoint, moduleCallback);\r
103     }\r
104     \r
105     public void storeProperty(String name, Variant value) {\r
106         if(storedProperties == null)\r
107             storedProperties = new THashMap<String, Variant>();\r
108         storedProperties.put(name, value);\r
109     }\r
110     \r
111     public Variant getStoredProperty(String name) {\r
112         if(storedProperties == null)\r
113             return null;\r
114         return storedProperties.get(name);\r
115     }\r
116 \r
117     public void addPostSynchronizationAction(Runnable action) {\r
118         handler.addPostSynchronizationAction(action); \r
119     }\r
120     \r
121     @SuppressWarnings("unchecked")\r
122         public <C> C getConcreteCommand() {\r
123         return (C)command.getConcrete();\r
124     }\r
125 \r
126     public void setDidChanges() {\r
127         handler.setDidChanges();\r
128     }\r
129     \r
130     ArrayList<ResynchronizeAction> resynchronizeActions;\r
131 \r
132     private class ResynchronizeAction {\r
133         final String connectionPoint;\r
134         final ModuleCallback callback;\r
135         \r
136         public ResynchronizeAction(String connectionPoint,\r
137                 ModuleCallback callback) {\r
138             this.connectionPoint = connectionPoint;\r
139             this.callback = callback;\r
140         }\r
141     }\r
142     \r
143     public void resynchronize(String connectionPoint, ModuleCallback callback) {\r
144         if(resynchronizeActions == null) {\r
145             resynchronizeActions = new ArrayList<ResynchronizeAction>();\r
146             handler.addPostSynchronizationAction(new Runnable() {\r
147                 @Override\r
148                 public void run() {\r
149                     ArrayList<ResynchronizeAction> resynchronizeActions = ModuleUpdateContext.this.resynchronizeActions;\r
150                     ModuleUpdateContext.this.resynchronizeActions = null;\r
151                     \r
152                     command = updater.createUpdateCommandBuilder(getModuleName());\r
153                     for(ResynchronizeAction action : resynchronizeActions)\r
154                         resolveReference(action.connectionPoint, action.callback);\r
155                     try {\r
156                         command.apply(getSolver());\r
157                     } catch (Exception e) {\r
158                         handler.reportProblem("Exception while issuing command.", e);\r
159                     }\r
160                 }\r
161             });\r
162         }\r
163         resynchronizeActions.add(new ResynchronizeAction(connectionPoint, callback));\r
164     }\r
165 \r
166 }\r