X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.structural.synchronization%2Fsrc%2Forg%2Fsimantics%2Fstructural%2Fsynchronization%2Futils%2FComponentBase.java;fp=bundles%2Forg.simantics.structural.synchronization%2Fsrc%2Forg%2Fsimantics%2Fstructural%2Fsynchronization%2Futils%2FComponentBase.java;h=ae0ae7720624a8d26a76a2c922973ebf4a578477;hp=0000000000000000000000000000000000000000;hb=bb4e04be3cb29a5d08e412cd4eaa90ad0158b954;hpb=a5a5b0f8e0d52f5e400e3857c12fe862dd2e2dd9 diff --git a/bundles/org.simantics.structural.synchronization/src/org/simantics/structural/synchronization/utils/ComponentBase.java b/bundles/org.simantics.structural.synchronization/src/org/simantics/structural/synchronization/utils/ComponentBase.java new file mode 100644 index 000000000..ae0ae7720 --- /dev/null +++ b/bundles/org.simantics.structural.synchronization/src/org/simantics/structural/synchronization/utils/ComponentBase.java @@ -0,0 +1,180 @@ +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; +// + } + +}