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