Handle componentless parent nodes of UCs in synchronization 46/3246/1
authorTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Wed, 11 Sep 2019 21:32:39 +0000 (00:32 +0300)
committerTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Wed, 11 Sep 2019 21:32:39 +0000 (00:32 +0300)
gitlab #382

Change-Id: I78c3a258e5a33cb16ae38ef080424d382f42c710

bundles/org.simantics.structural.synchronization/src/org/simantics/structural/synchronization/base/SynchronizationEventHandlerBase.java

index 67b120b6462cc10b3e36364c70e884f91f8c9d9c..095640c4aa1f0a2185da8bd6a92010421da6d63a 100644 (file)
@@ -201,10 +201,14 @@ public abstract class SynchronizationEventHandlerBase<T extends ComponentBase<T>
 
                     // TODO these two lines can be removed when IncludedInSimulation -property is given to all composites
                     if(component.getParent() != null) {
-                       String parentName = solver.getName(component.getParent().getModuleId());
-                       solver.includeSubprocess(parentName, subprocessName);
-                       component.solverComponentName = subprocessName;
-                       solverComponentNameToComponent.put(subprocessName, component);
+                        int nearestParentId = getNearestParentComponentId(component);
+                        if (nearestParentId <= 0) {
+                            throw new SynchronizationException("Could not find parent with non-zero component id from Component("+name+", " + (component != null ? component.uid : "null") + "," + typeId + ")");
+                        }
+                        String parentName = solver.getName(nearestParentId);
+                        solver.includeSubprocess(parentName, subprocessName);
+                        component.solverComponentName = subprocessName;
+                        solverComponentNameToComponent.put(subprocessName, component);
                     }
                     
                     if(updater.isComposite) {
@@ -334,6 +338,17 @@ public abstract class SynchronizationEventHandlerBase<T extends ComponentBase<T>
         }
     }
 
+    private static int getNearestParentComponentId(ComponentBase<?> component) {
+        ComponentBase<?> parent = component.getParent();
+        while (parent != null) {
+            int pid = parent.getModuleId();
+            if (pid > 0)
+                return pid;
+            parent = parent.getParent();
+        }
+        return -1;
+    }
+
     protected void addPendingRemoval(T component) {
         if (TRACE_EVENTS)
             System.out.println("addPendingRemoval(" + component.componentId + " : " + component.solverComponentName + ")");