package org.simantics.structural.synchronization.utils; import gnu.trove.map.hash.THashMap; import gnu.trove.procedure.TObjectObjectProcedure; import gnu.trove.procedure.TObjectProcedure; import java.io.PrintWriter; import java.util.Collection; import java.util.Collections; import java.util.concurrent.atomic.AtomicReference; import org.simantics.databoard.annotations.Optional; abstract public class ComponentBase> { public int componentId; public String uid; protected transient T parent; @Optional public String solverComponentName; public boolean attached; public ComponentBase() { } public ComponentBase(String uid) { this.uid = uid; } public ComponentBase(String uid, int moduleId) { this.uid = uid; this.componentId = moduleId; } public ComponentBase(int moduleId) { this.componentId = moduleId; } /** * Detaches a child by its UID. */ public void detachByUid(final String uid) { final AtomicReference nameRef = new AtomicReference(); getChildMap().forEachEntry(new TObjectObjectProcedure() { @Override public boolean execute(String name, T conf) { if(conf.uid.equals(uid)) { nameRef.set(name); return false; } else return true; } }); String name = nameRef.get(); getChildMap().remove(name); } public Collection getChildren() { if(getChildMap() == null) return Collections.emptyList(); else return getChildMap().values(); } public T getChild(String name) { if(getChildMap() == null) return null; else return getChildMap().get(name); } public THashMap setChildMapAndReturnOld( THashMap newChildMap) { THashMap oldChildMap = getChildMap(); setChildMap(newChildMap); return oldChildMap; } public int getModuleId() { return componentId; } public String getUid() { return uid; } public void setModuleId(int moduleId) { this.componentId = moduleId; } public void setUid(String uid) { this.uid = uid; } public boolean isComposite() { return getChildMap() != null; } public void printConfiguration(final int indentation) { printConfiguration(new PrintWriter(System.out), indentation); } public void printConfiguration(final PrintWriter out, final int indentation) { out.println(uid + " " + solverComponentName + "(" + componentId + ")"); if(getChildMap() != null) getChildMap().forEachEntry(new TObjectObjectProcedure() { @Override public boolean execute(String a, T b) { for(int i=0;i 0) componentId = idMap[componentId]; if(getChildMap() != null) getChildMap().forEachValue(new TObjectProcedure() { @Override public boolean execute(T component) { component.mapModuleIds(idMap); return true; } }); } abstract public THashMap getChildMap(); abstract public void setChildMap(THashMap newChildMap); public int componentHashCode() { return hashCode(); // final int prime = 31; // int result = 1; // result = prime * result + ((parent == null) ? 0 : parent.hashCode()); // result = prime * result + ((uid == null) ? 0 : uid.hashCode()); // result = prime * result + getChildren().hashCode(); // return result; } public boolean componentEquals(Object obj) { return this.equals(obj); // if (this == obj) // return true; // if (obj == null) // return false; // if (getClass() != obj.getClass()) // return false; // ComponentBase other = (ComponentBase) obj; // if (parent == null) { // if (other.parent != null) // return false; // } else if (!parent.equals(other.parent)) // return false; // if (uid == null) { // if (other.uid != null) // return false; // } else if (!uid.equals(other.uid)) // return false; // // return getChildren().equals(other.getChildren()); // // //return true; // } }