// 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) {
if(oldChildMap != null)
for(T component : oldChildMap.values()) {
component.clearParent();
- mapping.addPendingRemoval(component);
+ addPendingRemoval(component);
}
}
// Alternative implementation when uids are not available.
if(oldChildMap != null)
for(T component : oldChildMap.values()) {
component.clearParent();
- mapping.addPendingRemoval(component);
+ addPendingRemoval(component);
}
}
}
}
+ 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 + ")");
+ mapping.addPendingRemoval(component);
+ }
+
private String getSubprocessName(String name,
Collection<SerializedVariable> properties) {
for(SerializedVariable property : properties)