X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.structural.synchronization%2Fsrc%2Forg%2Fsimantics%2Fstructural%2Fsynchronization%2Fbase%2FModuleUpdateContext.java;fp=bundles%2Forg.simantics.structural.synchronization%2Fsrc%2Forg%2Fsimantics%2Fstructural%2Fsynchronization%2Fbase%2FModuleUpdateContext.java;h=a4dea1ab25ad9ce600e7b4edae7897acde3c50e8;hp=0000000000000000000000000000000000000000;hb=e4007b17057ff4acc2e900c5c811743b74f71f41;hpb=3fe6778c21d6437e90d08987de6dae7bca89bc6d diff --git a/bundles/org.simantics.structural.synchronization/src/org/simantics/structural/synchronization/base/ModuleUpdateContext.java b/bundles/org.simantics.structural.synchronization/src/org/simantics/structural/synchronization/base/ModuleUpdateContext.java new file mode 100644 index 000000000..a4dea1ab2 --- /dev/null +++ b/bundles/org.simantics.structural.synchronization/src/org/simantics/structural/synchronization/base/ModuleUpdateContext.java @@ -0,0 +1,172 @@ +package org.simantics.structural.synchronization.base; + +import java.util.ArrayList; + +import org.simantics.databoard.binding.mutable.Variant; +import org.simantics.structural.synchronization.utils.ComponentBase; +import org.simantics.structural.synchronization.utils.Solver; + +import gnu.trove.map.hash.THashMap; + +public class ModuleUpdateContext> { + + private ModuleUpdaterBase updater; + private final SynchronizationEventHandlerBase handler; + public final T component; + public CommandBuilder command; + private ArrayList postUpdateActions; + private THashMap storedProperties; + + private int pendingRuleCount; + public boolean stateLoadedFromUndo; + + public ModuleUpdateContext(SynchronizationEventHandlerBase handler, ModuleUpdaterBase updater, T component) { + assert(updater != null); + this.handler = handler; + this.updater = updater; + this.component = component; + } + + public void incPendingCount() { + ++pendingRuleCount; + } + + public void decPendingCount() { + --pendingRuleCount; + if(pendingRuleCount == 0) { + try { + command.apply(getSolver()); + command = null; + } catch (Exception e) { + handler.reportProblem("Exception while issuing command.", e); + } + if(getModuleId() <= 0) { + setModuleId(getSolver().getId(getModuleName())); + component.setModuleId(getModuleId()); + } + if(postUpdateActions != null) { + for(Runnable action : postUpdateActions) + try { + action.run(); + } catch(Exception e) { + handler.reportProblem("Post update action failed.", e); + } + postUpdateActions = null; + } + handler.resolver.unmarkPending(component); + } + } + + public void addPostUpdateAction(Runnable action) { + if(postUpdateActions == null) + postUpdateActions = new ArrayList(2); + postUpdateActions.add(action); + } + + public int getModuleId() { + return component.getModuleId(); + } + + public SynchronizationEventHandlerBase getHandler() { + return handler; + } + + public void setModuleId(int moduleId) { + component.setModuleId(moduleId); + } + + public Solver getSolver() { + return handler.solver; + } + + public S getConcreteSolver() { + return handler.solver.getConcreteSolver(); + } + + public String getModuleType() { + return updater != null ? updater.moduleType : null; + } + + public String getModuleName() { + return component.solverComponentName; + } + + public void setModuleName(String moduleName) { + component.solverComponentName = moduleName; + } + + public void reportProblem(String description) { + handler.reportProblem(description); + + } + + public void reportProblem(String description, Exception e) { + handler.reportProblem(description, e); + } + + public void resolveReference(String connectionPoint, ModuleCallback moduleCallback) { + handler.resolver.resolveReference(component, connectionPoint, moduleCallback); + } + + public void storeProperty(String name, Variant value) { + if(storedProperties == null) + storedProperties = new THashMap(); + storedProperties.put(name, value); + } + + public Variant getStoredProperty(String name) { + if(storedProperties == null) + return null; + return storedProperties.get(name); + } + + public void addPostSynchronizationAction(Runnable action) { + handler.addPostSynchronizationAction(action); + } + + @SuppressWarnings("unchecked") + public C getConcreteCommand() { + return (C)command.getConcrete(); + } + + public void setDidChanges() { + handler.setDidChanges(); + } + + ArrayList resynchronizeActions; + + private class ResynchronizeAction { + final String connectionPoint; + final ModuleCallback callback; + + public ResynchronizeAction(String connectionPoint, + ModuleCallback callback) { + this.connectionPoint = connectionPoint; + this.callback = callback; + } + } + + public void resynchronize(String connectionPoint, ModuleCallback callback) { + if(resynchronizeActions == null) { + resynchronizeActions = new ArrayList(); + handler.addPostSynchronizationAction(new Runnable() { + @Override + public void run() { + ArrayList resynchronizeActions = ModuleUpdateContext.this.resynchronizeActions; + ModuleUpdateContext.this.resynchronizeActions = null; + + command = updater.createUpdateCommandBuilder(getModuleName()); + for(ResynchronizeAction action : resynchronizeActions) + resolveReference(action.connectionPoint, action.callback); + try { + command.apply(getSolver()); + } catch (Exception e) { + handler.reportProblem("Exception while issuing command.", e); + } + } + }); + } + resynchronizeActions.add(new ResynchronizeAction(connectionPoint, callback)); + } + +}