1 package org.simantics.structural.synchronization.base;
3 import java.util.ArrayList;
5 import org.simantics.databoard.binding.mutable.Variant;
6 import org.simantics.structural.synchronization.utils.ComponentBase;
7 import org.simantics.structural.synchronization.utils.Solver;
9 import gnu.trove.map.hash.THashMap;
11 public class ModuleUpdateContext<T extends ComponentBase<T>> {
13 private ModuleUpdaterBase<T> updater;
14 private final SynchronizationEventHandlerBase<T> handler;
15 public final T component;
16 public CommandBuilder command;
17 private ArrayList<Runnable> postUpdateActions;
18 private THashMap<String, Variant> storedProperties;
20 private int pendingRuleCount;
21 public boolean stateLoadedFromUndo;
23 public ModuleUpdateContext(SynchronizationEventHandlerBase<T> handler, ModuleUpdaterBase<T> updater, T component) {
24 assert(updater != null);
25 this.handler = handler;
26 this.updater = updater;
27 this.component = component;
30 public void incPendingCount() {
34 public void decPendingCount() {
36 if(pendingRuleCount == 0) {
38 command.apply(getSolver());
40 } catch (Exception e) {
41 handler.reportProblem("Exception while issuing command.", e);
43 if(getModuleId() <= 0) {
44 setModuleId(getSolver().getId(getModuleName()));
45 component.setModuleId(getModuleId());
47 if(postUpdateActions != null) {
48 for(Runnable action : postUpdateActions)
51 } catch(Exception e) {
52 handler.reportProblem("Post update action failed.", e);
54 postUpdateActions = null;
56 handler.resolver.unmarkPending(component);
60 public void addPostUpdateAction(Runnable action) {
61 if(postUpdateActions == null)
62 postUpdateActions = new ArrayList<Runnable>(2);
63 postUpdateActions.add(action);
66 public int getModuleId() {
67 return component.getModuleId();
70 public ModuleUpdaterBase<T> getUpdater() {
74 public SynchronizationEventHandlerBase<T> getHandler() {
78 @SuppressWarnings("unchecked")
79 public <E extends SynchronizationEventHandlerBase<?>> E getConcreteHandler() {
83 public void setModuleId(int moduleId) {
84 component.setModuleId(moduleId);
87 public Solver getSolver() {
88 return handler.solver;
91 public <S> S getConcreteSolver() {
92 return handler.solver.getConcreteSolver();
95 public String getModuleType() {
96 return updater != null ? updater.moduleType : null;
99 public String getModuleName() {
100 return component.solverComponentName;
103 public void setModuleName(String moduleName) {
104 component.solverComponentName = moduleName;
107 public void reportProblem(String description) {
108 handler.reportProblem(description);
112 public void reportProblem(String description, Exception e) {
113 handler.reportProblem(description, e);
116 public void resolveReference(String connectionPoint, ModuleCallback moduleCallback) {
117 handler.resolver.resolveReference(component, connectionPoint, moduleCallback);
120 public void storeProperty(String name, Variant value) {
121 if(storedProperties == null)
122 storedProperties = new THashMap<String, Variant>();
123 storedProperties.put(name, value);
126 public Variant getStoredProperty(String name) {
127 if(storedProperties == null)
129 return storedProperties.get(name);
132 public void addPostSynchronizationAction(Runnable action) {
133 handler.addPostSynchronizationAction(action);
136 @SuppressWarnings("unchecked")
137 public <C> C getConcreteCommand() {
138 return (C)command.getConcrete();
141 public void setDidChanges() {
142 handler.setDidChanges();
145 ArrayList<ResynchronizeAction> resynchronizeActions;
147 private class ResynchronizeAction {
148 final String connectionPoint;
149 final ModuleCallback callback;
151 public ResynchronizeAction(String connectionPoint,
152 ModuleCallback callback) {
153 this.connectionPoint = connectionPoint;
154 this.callback = callback;
158 public void resynchronize(String connectionPoint, ModuleCallback callback) {
159 if(resynchronizeActions == null) {
160 resynchronizeActions = new ArrayList<ResynchronizeAction>();
161 handler.addPostSynchronizationAction(new Runnable() {
164 ArrayList<ResynchronizeAction> resynchronizeActions = ModuleUpdateContext.this.resynchronizeActions;
165 ModuleUpdateContext.this.resynchronizeActions = null;
167 command = updater.createUpdateCommandBuilder(getModuleName());
168 for(ResynchronizeAction action : resynchronizeActions)
169 resolveReference(action.connectionPoint, action.callback);
171 command.apply(getSolver());
172 } catch (Exception e) {
173 handler.reportProblem("Exception while issuing command.", e);
178 resynchronizeActions.add(new ResynchronizeAction(connectionPoint, callback));