--- /dev/null
+package org.simantics.interop.mapping.data;\r
+\r
+\r
+import org.simantics.utils.datastructures.hints.HintContext;\r
+\r
+public class Link <T> extends HintContext {\r
+ private GraphNode<T> from;\r
+ private GraphNode<T> to;\r
+ private String name;\r
+ \r
+ private Link<T> inverseLink;\r
+ private Link<T> mainLink;\r
+\r
+ Link(GraphNode<T> from, String name, GraphNode<T> to) {\r
+ this.from = from;\r
+ this.to = to;\r
+ this.name = name;\r
+ }\r
+ \r
+ public GraphNode<T> from() {\r
+ return from;\r
+ }\r
+ \r
+ public GraphNode<T> to() {\r
+ return to;\r
+ }\r
+ \r
+ public String getName() {\r
+ return name;\r
+ }\r
+ \r
+ void setInverseLink(Link<T> inverseLink) {\r
+ this.inverseLink = inverseLink;\r
+ }\r
+ \r
+ void setMainLink(Link<T> mainLink) {\r
+ this.mainLink = mainLink;\r
+ }\r
+ \r
+ public String getInverseName() {\r
+ if (inverseLink != null)\r
+ return inverseLink.getName();\r
+ if (mainLink != null)\r
+ return mainLink.getName();\r
+ return null;\r
+ }\r
+ \r
+ public boolean hasInverse() {\r
+ return inverseLink != null || mainLink != null;\r
+ }\r
+ \r
+ public Link<T> getInverse() {\r
+ if (inverseLink != null)\r
+ return inverseLink;\r
+ if (mainLink != null)\r
+ return mainLink;\r
+ return null;\r
+ }\r
+ \r
+ public boolean isInverse() {\r
+ return mainLink != null;\r
+ }\r
+ \r
+ public boolean isMain() {\r
+ return inverseLink != null;\r
+ }\r
+ \r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (!obj.getClass().equals(getClass()))\r
+ return false;\r
+ Link<?> other = (Link<?>)obj;\r
+ if (!from.equals(other.from))\r
+ return false;\r
+ if (!to.equals(other.to))\r
+ return false;\r
+ if (!GraphNode.equals(name,other.name))\r
+ return false;\r
+ return true;\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public int hashCode() {\r
+ return from.hashCode() * to.hashCode() + name.hashCode();\r
+ }\r
+ \r
+ @Override\r
+ public void setHint(Key key, Object value) {\r
+ if (value == null)\r
+ return;\r
+ super.setHint(key, value);\r
+ }\r
+\r
+}\r