1 package org.simantics.structural.synchronization.base;
\r
3 import gnu.trove.map.hash.THashMap;
\r
5 import java.util.ArrayList;
\r
7 import org.simantics.databoard.binding.mutable.Variant;
\r
9 public class ModuleUpdateContext<T extends ComponentBase<T>> {
\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
18 private int pendingRuleCount;
\r
19 public boolean stateLoadedFromUndo;
\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
28 public void incPendingCount() {
\r
32 public void decPendingCount() {
\r
34 if(pendingRuleCount == 0) {
\r
36 command.apply(getSolver());
\r
38 } catch (Exception e) {
\r
39 handler.reportProblem("Exception while issuing command.", e);
\r
41 if(getModuleId() <= 0) {
\r
42 setModuleId(getSolver().getId(getModuleName()));
\r
43 component.setModuleId(getModuleId());
\r
45 if(postUpdateActions != null) {
\r
46 for(Runnable action : postUpdateActions)
\r
49 } catch(Exception e) {
\r
50 handler.reportProblem("Post update action failed.", e);
\r
52 postUpdateActions = null;
\r
54 handler.resolver.unmarkPending(component);
\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
64 public int getModuleId() {
\r
65 return component.getModuleId();
\r
68 public SynchronizationEventHandlerBase<T> getHandler() {
\r
72 public void setModuleId(int moduleId) {
\r
73 component.setModuleId(moduleId);
\r
76 public Solver getSolver() {
\r
77 return handler.solver;
\r
80 public <S> S getConcreteSolver() {
\r
81 return handler.solver.getConcreteSolver();
\r
84 public String getModuleName() {
\r
85 return component.solverComponentName;
\r
88 public void setModuleName(String moduleName) {
\r
89 component.solverComponentName = moduleName;
\r
92 public void reportProblem(String description) {
\r
93 handler.reportProblem(description);
\r
97 public void reportProblem(String description, Exception e) {
\r
98 handler.reportProblem(description, e);
\r
101 public void resolveReference(String connectionPoint, ModuleCallback moduleCallback) {
\r
102 handler.resolver.resolveReference(component, connectionPoint, moduleCallback);
\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
111 public Variant getStoredProperty(String name) {
\r
112 if(storedProperties == null)
\r
114 return storedProperties.get(name);
\r
117 public void addPostSynchronizationAction(Runnable action) {
\r
118 handler.addPostSynchronizationAction(action);
\r
121 @SuppressWarnings("unchecked")
\r
122 public <C> C getConcreteCommand() {
\r
123 return (C)command.getConcrete();
\r
126 public void setDidChanges() {
\r
127 handler.setDidChanges();
\r
130 ArrayList<ResynchronizeAction> resynchronizeActions;
\r
132 private class ResynchronizeAction {
\r
133 final String connectionPoint;
\r
134 final ModuleCallback callback;
\r
136 public ResynchronizeAction(String connectionPoint,
\r
137 ModuleCallback callback) {
\r
138 this.connectionPoint = connectionPoint;
\r
139 this.callback = callback;
\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
148 public void run() {
\r
149 ArrayList<ResynchronizeAction> resynchronizeActions = ModuleUpdateContext.this.resynchronizeActions;
\r
150 ModuleUpdateContext.this.resynchronizeActions = null;
\r
152 command = updater.createUpdateCommandBuilder(getModuleName());
\r
153 for(ResynchronizeAction action : resynchronizeActions)
\r
154 resolveReference(action.connectionPoint, action.callback);
\r
156 command.apply(getSolver());
\r
157 } catch (Exception e) {
\r
158 handler.reportProblem("Exception while issuing command.", e);
\r
163 resynchronizeActions.add(new ResynchronizeAction(connectionPoint, callback));
\r