1 package org.opendaylight.yangtools.yang.data.api;
\r
3 import java.io.Serializable;
\r
4 import java.util.ArrayList;
\r
5 import java.util.Collections;
\r
6 import java.util.HashMap;
\r
7 import java.util.List;
\r
8 import java.util.Map;
\r
10 import org.opendaylight.yangtools.concepts.Builder;
\r
11 import org.opendaylight.yangtools.concepts.Immutable;
\r
12 import org.opendaylight.yangtools.concepts.Path;
\r
13 import org.opendaylight.yangtools.yang.common.QName;
\r
15 import com.google.common.collect.ImmutableList;
\r
17 public class InstanceIdentifier implements Path<InstanceIdentifier>, Immutable, Serializable {
\r
19 private static final long serialVersionUID = 8467409862384206193L;
\r
20 private final List<PathArgument> path;
\r
22 private transient String to_string_cache = null;
\r
24 public List<PathArgument> getPath() {
\r
28 public InstanceIdentifier(final List<? extends PathArgument> path) {
\r
29 this.path =ImmutableList.copyOf(path);
\r
32 private InstanceIdentifier(NodeIdentifier nodeIdentifier) {
\r
33 this.path = ImmutableList.<PathArgument>of(nodeIdentifier);
\r
37 public int hashCode() {
\r
38 final int prime = 31;
\r
40 result = prime * result + ((path == null) ? 0 : path.hashCode());
\r
45 public boolean equals(Object obj) {
\r
50 if (getClass() != obj.getClass())
\r
52 InstanceIdentifier other = (InstanceIdentifier) obj;
\r
54 if (other.path != null)
\r
56 } else if (!path.equals(other.path))
\r
61 // Static factories & helpers
\r
63 public static InstanceIdentifier of(QName name) {
\r
64 return new InstanceIdentifier(new NodeIdentifier(name));
\r
67 static public InstanceIdentifierBuilder builder() {
\r
68 return new BuilderImpl();
\r
71 static public InstanceIdentifierBuilder builder(InstanceIdentifier origin) {
\r
72 return new BuilderImpl(origin.getPath());
\r
75 public interface PathArgument extends Immutable, Serializable {
\r
76 QName getNodeType();
\r
80 public interface InstanceIdentifierBuilder extends Builder<InstanceIdentifier> {
\r
81 InstanceIdentifierBuilder node(QName nodeType);
\r
83 InstanceIdentifierBuilder nodeWithKey(QName nodeType, Map<QName, Object> keyValues);
\r
85 InstanceIdentifierBuilder nodeWithKey(QName nodeType, QName key, Object value);
\r
88 InstanceIdentifier getIdentifier();
\r
91 public static final class NodeIdentifier implements PathArgument {
\r
96 private static final long serialVersionUID = -2255888212390871347L;
\r
98 private final QName nodeType;
\r
100 public NodeIdentifier(QName node) {
\r
101 this.nodeType = node;
\r
104 public QName getNodeType() {
\r
109 public int hashCode() {
\r
110 final int prime = 31;
\r
112 result = prime * result + ((nodeType == null) ? 0 : nodeType.hashCode());
\r
117 public boolean equals(Object obj) {
\r
122 if (getClass() != obj.getClass())
\r
124 NodeIdentifier other = (NodeIdentifier) obj;
\r
125 if (nodeType == null) {
\r
126 if (other.nodeType != null)
\r
128 } else if (!nodeType.equals(other.nodeType))
\r
134 public String toString() {
\r
135 return nodeType.toString();
\r
139 public static final class NodeIdentifierWithPredicates implements PathArgument {
\r
144 private static final long serialVersionUID = -4787195606494761540L;
\r
146 private final QName nodeType;
\r
147 private final Map<QName, Object> keyValues;
\r
149 public NodeIdentifierWithPredicates(QName node, Map<QName, Object> keyValues) {
\r
150 this.nodeType = node;
\r
151 this.keyValues = Collections.unmodifiableMap(new HashMap<QName, Object>(keyValues));
\r
154 public NodeIdentifierWithPredicates(QName node, QName key, Object value) {
\r
155 this.nodeType = node;
\r
156 this.keyValues = Collections.singletonMap(key, value);
\r
160 public QName getNodeType() {
\r
164 public Map<QName, Object> getKeyValues() {
\r
169 public int hashCode() {
\r
170 final int prime = 31;
\r
172 result = prime * result + ((keyValues == null) ? 0 : keyValues.hashCode());
\r
173 result = prime * result + ((nodeType == null) ? 0 : nodeType.hashCode());
\r
178 public boolean equals(Object obj) {
\r
183 if (getClass() != obj.getClass())
\r
185 NodeIdentifierWithPredicates other = (NodeIdentifierWithPredicates) obj;
\r
186 if (keyValues == null) {
\r
187 if (other.keyValues != null)
\r
189 } else if (!keyValues.equals(other.keyValues))
\r
191 if (nodeType == null) {
\r
192 if (other.nodeType != null)
\r
194 } else if (!nodeType.equals(other.nodeType))
\r
200 public String toString() {
\r
201 return nodeType + "[" + keyValues + "]";
\r
205 private static class BuilderImpl implements InstanceIdentifierBuilder {
\r
207 private final ImmutableList.Builder<PathArgument> path;
\r
209 public BuilderImpl() {
\r
210 path = ImmutableList.<PathArgument>builder();
\r
213 public BuilderImpl(List<? extends PathArgument> prefix) {
\r
214 path = ImmutableList.<PathArgument>builder();
\r
215 path.addAll(prefix);
\r
219 public InstanceIdentifierBuilder node(QName nodeType) {
\r
220 path.add(new NodeIdentifier(nodeType));
\r
225 public InstanceIdentifierBuilder nodeWithKey(QName nodeType, QName key, Object value) {
\r
226 path.add(new NodeIdentifierWithPredicates(nodeType, key, value));
\r
231 public InstanceIdentifierBuilder nodeWithKey(QName nodeType, Map<QName, Object> keyValues) {
\r
232 path.add(new NodeIdentifierWithPredicates(nodeType, keyValues));
\r
237 public InstanceIdentifier toInstance() {
\r
238 return new InstanceIdentifier(path.build());
\r
242 public InstanceIdentifier getIdentifier() {
\r
243 return toInstance();
\r
248 public boolean contains(final InstanceIdentifier other) {
\r
249 if (other == null) {
\r
250 throw new IllegalArgumentException("other should not be null");
\r
252 final int localSize = this.path.size();
\r
253 final List<PathArgument> otherPath = other.getPath();
\r
254 if (localSize > other.path.size()) {
\r
257 for (int i = 0; i < localSize; i++) {
\r
258 if (!path.get(i).equals(otherPath.get(i))) {
\r
266 public String toString() {
\r
267 if (to_string_cache != null) {
\r
268 return to_string_cache;
\r
270 StringBuilder builder = new StringBuilder();
\r
271 for (PathArgument argument : path) {
\r
272 builder.append("/");
\r
273 builder.append(argument.toString());
\r
275 to_string_cache = builder.toString();
\r
276 return to_string_cache;
\r
279 public static InstanceIdentifierBuilder builder(QName node) {
\r
280 return builder().node(node);
\r