]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.structural.synchronization/src/org/simantics/structural/synchronization/utils/MappingBase.java
Fix adding components to configurationBySolverName map in MappingBase
[simantics/platform.git] / bundles / org.simantics.structural.synchronization / src / org / simantics / structural / synchronization / utils / MappingBase.java
index 3c96a3feff3a8405938032973f457e25e34ada7e..7fd78189fe82c22ece853be8c892c08d9d770494 100644 (file)
@@ -1,6 +1,12 @@
 package org.simantics.structural.synchronization.utils;
 
 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;
@@ -16,13 +22,20 @@ import gnu.trove.set.hash.THashSet;
  */
 abstract public class MappingBase<T extends ComponentBase<T>> {
 
+    private final transient Logger LOGGER = LoggerFactory.getLogger(getClass());
+    
        abstract public T getConfiguration();
     
     /**
      * 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.
@@ -89,11 +102,44 @@ abstract public class MappingBase<T extends ComponentBase<T>> {
         }
     }
 
+    public Map<String, T> getConfigurationBySolverName() {
+        Map<String, T> result = configurationBySolverName;
+        if (result == null) {
+            T configuration = getConfiguration();
+            if (configuration != null)
+                result = configurationBySolverName = createConfigurationBySolverName(configuration);
+            else
+                result = Collections.emptyMap();
+        }
+        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) {
+        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<T extends ComponentBase<T>> {
     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<T>() {
                 @Override
@@ -212,6 +260,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();
     }
     
@@ -219,4 +271,11 @@ abstract public class MappingBase<T extends ComponentBase<T>> {
         return !pendingRemoval.isEmpty();
     }
 
+    public void forEachPendingRemoval(Consumer<T> consumer) {
+        pendingRemoval.forEach(c -> {
+            consumer.accept(c);
+            return true;
+        });
+    }
+
 }