]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop.mapping/src/org/simantics/interop/mapping/data/Link.java
Interop mapping changes/ fixes
[simantics/interop.git] / org.simantics.interop.mapping / src / org / simantics / interop / mapping / data / Link.java
1 package org.simantics.interop.mapping.data;\r
2 \r
3 \r
4 import org.simantics.utils.datastructures.hints.HintContext;\r
5 \r
6 public class Link <T> extends HintContext {\r
7         private GraphNode<T> from;\r
8         private GraphNode<T> to;\r
9         private String name;\r
10         \r
11         private Link<T> inverseLink;\r
12         private Link<T> mainLink;\r
13 \r
14         Link(GraphNode<T> from, String name, GraphNode<T> to) {\r
15                 this.from = from;\r
16                 this.to = to;\r
17                 this.name = name;\r
18         }\r
19         \r
20         public GraphNode<T> from() {\r
21                 return from;\r
22         }\r
23         \r
24         public GraphNode<T> to() {\r
25                 return to;\r
26         }\r
27         \r
28         public String getName() {\r
29                 return name;\r
30         }\r
31         \r
32         void setInverseLink(Link<T> inverseLink) {\r
33                 this.inverseLink = inverseLink;\r
34         }\r
35         \r
36         void setMainLink(Link<T> mainLink) {\r
37                 this.mainLink = mainLink;\r
38         }\r
39         \r
40         public String getInverseName() {\r
41                 if (inverseLink != null)\r
42                         return inverseLink.getName();\r
43                 if (mainLink != null)\r
44                         return mainLink.getName();\r
45                 return null;\r
46         }\r
47         \r
48         public boolean hasInverse() {\r
49                 return inverseLink != null || mainLink != null;\r
50         }\r
51         \r
52         public Link<T> getInverse() {\r
53                 if (inverseLink != null)\r
54                         return inverseLink;\r
55                 if (mainLink != null)\r
56                         return mainLink;\r
57                 return null;\r
58         }\r
59         \r
60         public boolean isInverse() {\r
61                 return mainLink != null;\r
62         }\r
63         \r
64         public boolean isMain() {\r
65                 return inverseLink != null;\r
66         }\r
67         \r
68         @Override\r
69         public boolean equals(Object obj) {\r
70                 if (!obj.getClass().equals(getClass()))\r
71                         return false;\r
72                 Link<?> other = (Link<?>)obj;\r
73                 if (!from.equals(other.from))\r
74                         return false;\r
75                 if (!to.equals(other.to))\r
76                         return false;\r
77                 if (!GraphNode.equals(name,other.name))\r
78                         return false;\r
79                 return true;\r
80                 \r
81         }\r
82         \r
83         @Override\r
84         public int hashCode() {\r
85                 return from.hashCode() * to.hashCode() + name.hashCode();\r
86         }\r
87         \r
88         @Override\r
89     public void setHint(Key key, Object value) {\r
90                 if (value == null)\r
91                         return;\r
92                 super.setHint(key, value);\r
93         }\r
94 \r
95         \r
96         public String toString() {\r
97                 return name + "/" + getInverseName() + " -> " + to.toString();\r
98         }\r
99 }\r