811b947537fb50ea4d9289a0664bcd4b03ae315b
[yangtools.git] / yang / yang-data-api / src / main / java / org / opendaylight / yangtools / yang / data / api / InstanceIdentifier.java
1 package org.opendaylight.yangtools.yang.data.api;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collections;\r
5 import java.util.HashMap;\r
6 import java.util.List;\r
7 import java.util.Map;\r
8 \r
9 import org.opendaylight.yangtools.concepts.Immutable;\r
10 import org.opendaylight.yangtools.concepts.Path;\r
11 import org.opendaylight.yangtools.yang.common.QName;\r
12 \r
13 public class InstanceIdentifier implements Path<InstanceIdentifier>, Immutable {\r
14 \r
15     private final List<PathArgument> path;\r
16 \r
17     public List<PathArgument> getPath() {\r
18         return path;\r
19     }\r
20 \r
21     public InstanceIdentifier(final List<? extends PathArgument> path) {\r
22         this.path = Collections.unmodifiableList(new ArrayList<>(path));\r
23     }\r
24 \r
25     private InstanceIdentifier(NodeIdentifier nodeIdentifier) {\r
26         this.path = Collections.<PathArgument> singletonList(nodeIdentifier);\r
27     }\r
28 \r
29     @Override\r
30     public int hashCode() {\r
31         final int prime = 31;\r
32         int result = 1;\r
33         result = prime * result + ((path == null) ? 0 : path.hashCode());\r
34         return result;\r
35     }\r
36 \r
37     @Override\r
38     public boolean equals(Object obj) {\r
39         if (this == obj)\r
40             return true;\r
41         if (obj == null)\r
42             return false;\r
43         if (getClass() != obj.getClass())\r
44             return false;\r
45         InstanceIdentifier other = (InstanceIdentifier) obj;\r
46         if (path == null) {\r
47             if (other.path != null)\r
48                 return false;\r
49         } else if (!path.equals(other.path))\r
50             return false;\r
51         return true;\r
52     }\r
53 \r
54     // Static factories & helpers\r
55 \r
56     public InstanceIdentifier of(QName name) {\r
57         return new InstanceIdentifier(new NodeIdentifier(name));\r
58     }\r
59 \r
60     public InstanceIdentifierBuilder builder() {\r
61         return new BuilderImpl();\r
62     }\r
63 \r
64     public interface PathArgument {\r
65         QName getNodeType();\r
66 \r
67     }\r
68 \r
69     public interface InstanceIdentifierBuilder {\r
70         InstanceIdentifierBuilder node(QName nodeType);\r
71 \r
72         InstanceIdentifierBuilder nodeWithKey(QName nodeType, Map<QName, Object> keyValues);\r
73 \r
74         InstanceIdentifierBuilder nodeWithKey(QName nodeType, QName key, Object value);\r
75 \r
76         InstanceIdentifier getIdentifier();\r
77     }\r
78 \r
79     public static final class NodeIdentifier implements PathArgument {\r
80 \r
81         private final QName nodeType;\r
82 \r
83         public NodeIdentifier(QName node) {\r
84             this.nodeType = node;\r
85         }\r
86 \r
87         public QName getNodeType() {\r
88             return nodeType;\r
89         }\r
90 \r
91         @Override\r
92         public int hashCode() {\r
93             final int prime = 31;\r
94             int result = 1;\r
95             result = prime * result + ((nodeType == null) ? 0 : nodeType.hashCode());\r
96             return result;\r
97         }\r
98 \r
99         @Override\r
100         public boolean equals(Object obj) {\r
101             if (this == obj)\r
102                 return true;\r
103             if (obj == null)\r
104                 return false;\r
105             if (getClass() != obj.getClass())\r
106                 return false;\r
107             NodeIdentifier other = (NodeIdentifier) obj;\r
108             if (nodeType == null) {\r
109                 if (other.nodeType != null)\r
110                     return false;\r
111             } else if (!nodeType.equals(other.nodeType))\r
112                 return false;\r
113             return true;\r
114         }\r
115     }\r
116 \r
117     public static final class NodeIdentifierWithPredicates implements PathArgument {\r
118         private final QName nodeType;\r
119         private final Map<QName, Object> keyValues;\r
120 \r
121         public NodeIdentifierWithPredicates(QName node, Map<QName, Object> keyValues) {\r
122             this.nodeType = node;\r
123             this.keyValues = Collections.unmodifiableMap(new HashMap<QName, Object>(keyValues));\r
124         }\r
125 \r
126         public NodeIdentifierWithPredicates(QName node, QName key, Object value) {\r
127             this.nodeType = node;\r
128             this.keyValues = Collections.singletonMap(key, value);\r
129         }\r
130 \r
131         @Override\r
132         public QName getNodeType() {\r
133             return nodeType;\r
134         }\r
135 \r
136         public Map<QName, Object> getKeyValues() {\r
137             return keyValues;\r
138         }\r
139 \r
140         @Override\r
141         public int hashCode() {\r
142             final int prime = 31;\r
143             int result = 1;\r
144             result = prime * result + ((keyValues == null) ? 0 : keyValues.hashCode());\r
145             result = prime * result + ((nodeType == null) ? 0 : nodeType.hashCode());\r
146             return result;\r
147         }\r
148 \r
149         @Override\r
150         public boolean equals(Object obj) {\r
151             if (this == obj)\r
152                 return true;\r
153             if (obj == null)\r
154                 return false;\r
155             if (getClass() != obj.getClass())\r
156                 return false;\r
157             NodeIdentifierWithPredicates other = (NodeIdentifierWithPredicates) obj;\r
158             if (keyValues == null) {\r
159                 if (other.keyValues != null)\r
160                     return false;\r
161             } else if (!keyValues.equals(other.keyValues))\r
162                 return false;\r
163             if (nodeType == null) {\r
164                 if (other.nodeType != null)\r
165                     return false;\r
166             } else if (!nodeType.equals(other.nodeType))\r
167                 return false;\r
168             return true;\r
169         }\r
170     }\r
171 \r
172     private static class BuilderImpl implements InstanceIdentifierBuilder {\r
173 \r
174         private List<PathArgument> path;\r
175 \r
176         @Override\r
177         public InstanceIdentifierBuilder node(QName nodeType) {\r
178             path.add(new NodeIdentifier(nodeType));\r
179             return this;\r
180         }\r
181 \r
182         @Override\r
183         public InstanceIdentifierBuilder nodeWithKey(QName nodeType, QName key, Object value) {\r
184             path.add(new NodeIdentifierWithPredicates(nodeType, key, value));\r
185             return this;\r
186         }\r
187 \r
188         @Override\r
189         public InstanceIdentifierBuilder nodeWithKey(QName nodeType, Map<QName, Object> keyValues) {\r
190             path.add(new NodeIdentifierWithPredicates(nodeType, keyValues));\r
191             return this;\r
192         }\r
193 \r
194         @Override\r
195         public InstanceIdentifier getIdentifier() {\r
196             return new InstanceIdentifier(path);\r
197         }\r
198     }\r
199 \r
200     @Override\r
201     public boolean contains(final InstanceIdentifier other) {\r
202         if (other == null) {\r
203             throw new IllegalArgumentException("other should not be null");\r
204         }\r
205         final int localSize = this.path.size();\r
206         final List<PathArgument> otherPath = other.getPath();\r
207         if (localSize > other.path.size()) {\r
208             return false;\r
209         }\r
210         for (int i = 0; i < localSize; i++) {\r
211             if (!path.get(i).equals(otherPath.get(i))) {\r
212                 return false;\r
213             }\r
214         }\r
215         return true;\r
216     }\r
217 }\r