]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.structural.synchronization/src/org/simantics/structural/synchronization/utils/MappingBase.java
Add configurationBySolverName map to MappingBase
[simantics/platform.git] / bundles / org.simantics.structural.synchronization / src / org / simantics / structural / synchronization / utils / MappingBase.java
index 423e5a1256b5b54921a4f2537bb84a566173bb2f..e50d8498d8d0f048084a95c19edae6f7abd64041 100644 (file)
@@ -6,6 +6,7 @@ import gnu.trove.procedure.TObjectProcedure;
 import gnu.trove.set.hash.THashSet;
 
 import java.io.PrintWriter;
+import java.util.Map;
 import java.util.function.Consumer;
 
 /**
@@ -23,7 +24,12 @@ abstract public class MappingBase<T extends ComponentBase<T>> {
      * Set of all components indexed by their UID.
      */
     transient protected THashMap<String, T> configurationByUid;
-    
+
+    /**
+     * Set of all components indexed by their solver name.
+     */
+    transient protected Map<String, T> configurationBySolverName;
+
     /** 
      * Set of components whose removal is delayed because they might
      * have been moved somewhere else.
@@ -90,6 +96,29 @@ abstract public class MappingBase<T extends ComponentBase<T>> {
         }
     }
 
+    public Map<String, T> getConfigurationBySolverName() {
+        Map<String, T> result = configurationBySolverName;
+        if (result == null)
+            result = configurationBySolverName = createConfigurationBySolverName(getConfiguration());
+        return result;
+    }
+
+    protected Map<String, T> createConfigurationBySolverName(T configuration) {
+        THashMap<String, T> configurationBySolverName = new THashMap<>();
+        browseConfigurationBySolverName(configurationBySolverName, configuration);
+        return configurationBySolverName;
+    }
+
+    private void browseConfigurationBySolverName(
+            THashMap<String, T> configurationBySolverName,
+            T configuration) {
+        configurationBySolverName.put(configuration.solverComponentName, configuration);
+        for(T child : configuration.getChildren()) {
+            browseConfigurationBySolverName(configurationBySolverName, child);
+            child.parent = configuration;
+        }
+    }
+
     public T detachOrCreateComponent(String uid) {
         T result = configurationByUid.get(uid);
         if(result == null) {
@@ -141,6 +170,8 @@ abstract public class MappingBase<T extends ComponentBase<T>> {
     public void remove(final Solver solver, T component) {
         if(configurationByUid != null)
             configurationByUid.remove(component.uid);
+        if (configurationBySolverName != null)
+            configurationBySolverName.remove(component.solverComponentName);
         if(component.getChildMap() != null)
             component.getChildMap().forEachValue(new TObjectProcedure<T>() {
                 @Override
@@ -213,6 +244,10 @@ abstract public class MappingBase<T extends ComponentBase<T>> {
     public void dispose() {
         if (configurationByUid != null)
             configurationByUid.clear();
+        if (configurationBySolverName != null) {
+            configurationBySolverName.clear();
+            configurationBySolverName = null;
+        }
         pendingRemoval.clear();
     }