X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.structural.synchronization.client%2Fsrc%2Forg%2Fsimantics%2Fstructural%2Fsynchronization%2Fbase%2FMappingBase.java;h=0714a1b11373fcffa49186690f2c6324fb14cbae;hb=a8ea477a16e16f53f2909c58fb88a379b36b3f2c;hp=ae66937764a9865af0cdc3ca3d496e7446969be8;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.structural.synchronization.client/src/org/simantics/structural/synchronization/base/MappingBase.java b/bundles/org.simantics.structural.synchronization.client/src/org/simantics/structural/synchronization/base/MappingBase.java index ae6693776..0714a1b11 100644 --- a/bundles/org.simantics.structural.synchronization.client/src/org/simantics/structural/synchronization/base/MappingBase.java +++ b/bundles/org.simantics.structural.synchronization.client/src/org/simantics/structural/synchronization/base/MappingBase.java @@ -1,12 +1,18 @@ package org.simantics.structural.synchronization.base; +import java.io.PrintWriter; +import java.util.Collections; +import java.util.Map; +import java.util.function.Consumer; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import gnu.trove.map.hash.THashMap; import gnu.trove.procedure.TObjectObjectProcedure; import gnu.trove.procedure.TObjectProcedure; import gnu.trove.set.hash.THashSet; -import java.io.PrintWriter; - /** * The entry point to the mapping structure between Simantics database and a * designated solver. It is used to synchronize changes from Simantics to the @@ -16,12 +22,19 @@ import java.io.PrintWriter; */ abstract public class MappingBase> { + private final transient Logger LOGGER = LoggerFactory.getLogger(getClass()); + abstract public T getConfiguration(); /** * Set of all components indexed by their UID. */ transient protected THashMap configurationByUid; + + /** + * Set of all components indexed by their solver name. + */ + transient protected Map configurationBySolverName; /** * Set of components whose removal is delayed because they might @@ -89,11 +102,44 @@ abstract public class MappingBase> { } } + public Map getConfigurationBySolverName() { + Map result = configurationBySolverName; + if (result == null) { + T configuration = getConfiguration(); + if (configuration != null) + result = configurationBySolverName = createConfigurationBySolverName(configuration); + else + result = Collections.emptyMap(); + } + return result; + } + + protected Map createConfigurationBySolverName(T configuration) { + THashMap configurationBySolverName = new THashMap<>(); + browseConfigurationBySolverName(configurationBySolverName, configuration); + return configurationBySolverName; + } + + private void browseConfigurationBySolverName( + THashMap configurationBySolverName, + T configuration) { + if (configuration.solverComponentName != null) { + configurationBySolverName.put(configuration.solverComponentName, configuration); + } else if (configuration.componentId != 0) { + LOGGER.warn("configuration.solverComponentName is null! configuration uid is {} and component id {}", configuration.getUid(), configuration.componentId); + } + for(T child : configuration.getChildren()) { + browseConfigurationBySolverName(configurationBySolverName, child); + child.parent = configuration; + } + } + public T detachOrCreateComponent(String uid) { T result = configurationByUid.get(uid); if(result == null) { result = componentFactory.create(uid); configurationByUid.put(uid, result); + configurationBySolverName = null; // forces recalculation } else { if(result.getParent() == null) @@ -140,6 +186,8 @@ abstract public class MappingBase> { public void remove(final Solver solver, T component) { if(configurationByUid != null) configurationByUid.remove(component.uid); + if (configurationBySolverName != null && component.solverComponentName != null) + configurationBySolverName.remove(component.solverComponentName); if(component.getChildMap() != null) component.getChildMap().forEachValue(new TObjectProcedure() { @Override @@ -212,7 +260,22 @@ abstract public class MappingBase> { public void dispose() { if (configurationByUid != null) configurationByUid.clear(); + if (configurationBySolverName != null) { + configurationBySolverName.clear(); + configurationBySolverName = null; + } pendingRemoval.clear(); } + + public boolean hasPendingRemovals() { + return !pendingRemoval.isEmpty(); + } + + public void forEachPendingRemoval(Consumer consumer) { + pendingRemoval.forEach(c -> { + consumer.accept(c); + return true; + }); + } }