+package org.simantics.db.layer0.variable;\r
+\r
+import java.util.concurrent.TimeUnit;\r
+\r
+import org.simantics.databoard.binding.mutable.Variant;\r
+import org.simantics.db.layer0.variable.Variables.NodeStructure;\r
+import org.simantics.simulator.variable.NodeManager;\r
+\r
+/**\r
+ * @author Antti Villberg\r
+ *\r
+ * @param <Node>\r
+ * @since 1.23\r
+ */\r
+public class NodeSupport<Node> {\r
+\r
+ public final NodeManager<Node> manager;\r
+ public final NodeCache<Node,Variant> valueCache;\r
+ public final NodeCache<Node,NodeStructure> structureCache;\r
+\r
+ public NodeSupport(NodeManager<Node> manager) {\r
+ this(manager, 1, TimeUnit.SECONDS);\r
+ }\r
+\r
+ public NodeSupport(NodeManager<Node> manager, long defaultExpirationTime, TimeUnit expirationTimeUnit) {\r
+ if (manager == null)\r
+ throw new NullPointerException("null NodeManager");\r
+ long ns = expirationTimeUnit.toNanos(defaultExpirationTime);\r
+ this.manager = manager;\r
+ this.valueCache = new NodeCache<>(ns);\r
+ this.structureCache = new NodeCache<>(ns);\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ final int prime = 31;\r
+ int result = 1;\r
+ result = prime * result + valueCache.hashCode();\r
+ result = prime * result + structureCache.hashCode();\r
+ result = prime * result + manager.hashCode();\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (this == obj)\r
+ return true;\r
+ if (obj == null)\r
+ return false;\r
+ if (getClass() != obj.getClass())\r
+ return false;\r
+ NodeSupport<?> other = (NodeSupport<?>) obj;\r
+ return valueCache.equals(other.valueCache)\r
+ && structureCache.equals(other.structureCache)\r
+ && manager.equals(other.manager);\r
+ }\r
+\r
+ public void dispose() {\r
+ valueCache.dispose();\r
+ structureCache.dispose();\r
+ }\r
+\r
+}\r