1 package org.opendaylight.yangtools.yang.data.api;
\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
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
13 public class InstanceIdentifier implements Path<InstanceIdentifier>, Immutable {
\r
15 private final List<PathArgument> path;
\r
17 public List<PathArgument> getPath() {
\r
21 public InstanceIdentifier(final List<? extends PathArgument> path) {
\r
22 this.path = Collections.unmodifiableList(new ArrayList<>(path));
\r
25 private InstanceIdentifier(NodeIdentifier nodeIdentifier) {
\r
26 this.path = Collections.<PathArgument> singletonList(nodeIdentifier);
\r
30 public int hashCode() {
\r
31 final int prime = 31;
\r
33 result = prime * result + ((path == null) ? 0 : path.hashCode());
\r
38 public boolean equals(Object obj) {
\r
43 if (getClass() != obj.getClass())
\r
45 InstanceIdentifier other = (InstanceIdentifier) obj;
\r
47 if (other.path != null)
\r
49 } else if (!path.equals(other.path))
\r
54 // Static factories & helpers
\r
56 public InstanceIdentifier of(QName name) {
\r
57 return new InstanceIdentifier(new NodeIdentifier(name));
\r
60 public InstanceIdentifierBuilder builder() {
\r
61 return new BuilderImpl();
\r
64 public interface PathArgument {
\r
65 QName getNodeType();
\r
69 public interface InstanceIdentifierBuilder {
\r
70 InstanceIdentifierBuilder node(QName nodeType);
\r
72 InstanceIdentifierBuilder nodeWithKey(QName nodeType, Map<QName, Object> keyValues);
\r
74 InstanceIdentifierBuilder nodeWithKey(QName nodeType, QName key, Object value);
\r
76 InstanceIdentifier getIdentifier();
\r
79 public static final class NodeIdentifier implements PathArgument {
\r
81 private final QName nodeType;
\r
83 public NodeIdentifier(QName node) {
\r
84 this.nodeType = node;
\r
87 public QName getNodeType() {
\r
92 public int hashCode() {
\r
93 final int prime = 31;
\r
95 result = prime * result + ((nodeType == null) ? 0 : nodeType.hashCode());
\r
100 public boolean equals(Object obj) {
\r
105 if (getClass() != obj.getClass())
\r
107 NodeIdentifier other = (NodeIdentifier) obj;
\r
108 if (nodeType == null) {
\r
109 if (other.nodeType != null)
\r
111 } else if (!nodeType.equals(other.nodeType))
\r
117 public static final class NodeIdentifierWithPredicates implements PathArgument {
\r
118 private final QName nodeType;
\r
119 private final Map<QName, Object> keyValues;
\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
126 public NodeIdentifierWithPredicates(QName node, QName key, Object value) {
\r
127 this.nodeType = node;
\r
128 this.keyValues = Collections.singletonMap(key, value);
\r
132 public QName getNodeType() {
\r
136 public Map<QName, Object> getKeyValues() {
\r
141 public int hashCode() {
\r
142 final int prime = 31;
\r
144 result = prime * result + ((keyValues == null) ? 0 : keyValues.hashCode());
\r
145 result = prime * result + ((nodeType == null) ? 0 : nodeType.hashCode());
\r
150 public boolean equals(Object obj) {
\r
155 if (getClass() != obj.getClass())
\r
157 NodeIdentifierWithPredicates other = (NodeIdentifierWithPredicates) obj;
\r
158 if (keyValues == null) {
\r
159 if (other.keyValues != null)
\r
161 } else if (!keyValues.equals(other.keyValues))
\r
163 if (nodeType == null) {
\r
164 if (other.nodeType != null)
\r
166 } else if (!nodeType.equals(other.nodeType))
\r
172 private static class BuilderImpl implements InstanceIdentifierBuilder {
\r
174 private List<PathArgument> path;
\r
177 public InstanceIdentifierBuilder node(QName nodeType) {
\r
178 path.add(new NodeIdentifier(nodeType));
\r
183 public InstanceIdentifierBuilder nodeWithKey(QName nodeType, QName key, Object value) {
\r
184 path.add(new NodeIdentifierWithPredicates(nodeType, key, value));
\r
189 public InstanceIdentifierBuilder nodeWithKey(QName nodeType, Map<QName, Object> keyValues) {
\r
190 path.add(new NodeIdentifierWithPredicates(nodeType, keyValues));
\r
195 public InstanceIdentifier getIdentifier() {
\r
196 return new InstanceIdentifier(path);
\r
201 public boolean contains(final InstanceIdentifier other) {
\r
202 if (other == null) {
\r
203 throw new IllegalArgumentException("other should not be null");
\r
205 final int localSize = this.path.size();
\r
206 final List<PathArgument> otherPath = other.getPath();
\r
207 if (localSize > other.path.size()) {
\r
210 for (int i = 0; i < localSize; i++) {
\r
211 if (!path.get(i).equals(otherPath.get(i))) {
\r