Added implementation of InstanceIdentifier for yang-data-api 51/1451/1
authorTony Tkacik <ttkacik@cisco.com>
Fri, 27 Sep 2013 08:18:41 +0000 (10:18 +0200)
committerTony Tkacik <ttkacik@cisco.com>
Fri, 27 Sep 2013 08:18:41 +0000 (10:18 +0200)
Change-Id: I5900065b8c904d32fc2d200fb1390ebeefb402b3
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/InstanceIdentifier.java [new file with mode: 0644]

diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/InstanceIdentifier.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/InstanceIdentifier.java
new file mode 100644 (file)
index 0000000..35edc5a
--- /dev/null
@@ -0,0 +1,202 @@
+package org.opendaylight.yangtools.yang.data.api;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.opendaylight.yangtools.yang.common.QName;\r
+\r
+\r
+public class InstanceIdentifier {\r
+\r
+    private final List<PathArgument> path;\r
+\r
+    public List<PathArgument> getPath() {\r
+        return path;\r
+    }\r
+\r
+    public InstanceIdentifier(final List<? extends PathArgument> path) {\r
+        this.path = Collections.unmodifiableList(new ArrayList<>(path));\r
+    }\r
+\r
+    private InstanceIdentifier(NodeIdentifier nodeIdentifier) {\r
+        this.path = Collections.<PathArgument>singletonList(nodeIdentifier);\r
+    }\r
+\r
+    @Override\r
+    public int hashCode() {\r
+        final int prime = 31;\r
+        int result = 1;\r
+        result = prime * result + ((path == null) ? 0 : path.hashCode());\r
+        return result;\r
+    }\r
+\r
+    @Override\r
+    public boolean equals(Object obj) {\r
+        if (this == obj)\r
+            return true;\r
+        if (obj == null)\r
+            return false;\r
+        if (getClass() != obj.getClass())\r
+            return false;\r
+        InstanceIdentifier other = (InstanceIdentifier) obj;\r
+        if (path == null) {\r
+            if (other.path != null)\r
+                return false;\r
+        } else if (!path.equals(other.path))\r
+            return false;\r
+        return true;\r
+    }\r
+    \r
+    // Static factories & helpers\r
+    \r
+    \r
+    public InstanceIdentifier of(QName name) {\r
+        return new InstanceIdentifier(new NodeIdentifier(name));\r
+    }\r
+    \r
+    public InstanceIdentifierBuilder builder() {\r
+        return new BuilderImpl();\r
+    }\r
+    \r
+    public interface PathArgument {\r
+        QName getNodeType();\r
+\r
+    }\r
+\r
+\r
+\r
+    public interface InstanceIdentifierBuilder {\r
+        InstanceIdentifierBuilder node(QName nodeType);\r
+\r
+        InstanceIdentifierBuilder nodeWithKey(QName nodeType, Map<QName, Object> keyValues);\r
+\r
+        InstanceIdentifierBuilder nodeWithKey(QName nodeType, QName key, Object value);\r
+\r
+        InstanceIdentifier getIdentifier();\r
+    }\r
+\r
+    public static final class NodeIdentifier implements PathArgument {\r
+\r
+        private final QName nodeType;\r
+\r
+        public NodeIdentifier(QName node) {\r
+            this.nodeType = node;\r
+        }\r
+        \r
+        \r
+        public QName getNodeType() {\r
+            return nodeType;\r
+        }\r
+\r
+        @Override\r
+        public int hashCode() {\r
+            final int prime = 31;\r
+            int result = 1;\r
+            result = prime * result + ((nodeType == null) ? 0 : nodeType.hashCode());\r
+            return result;\r
+        }\r
+\r
+        @Override\r
+        public boolean equals(Object obj) {\r
+            if (this == obj)\r
+                return true;\r
+            if (obj == null)\r
+                return false;\r
+            if (getClass() != obj.getClass())\r
+                return false;\r
+            NodeIdentifier other = (NodeIdentifier) obj;\r
+            if (nodeType == null) {\r
+                if (other.nodeType != null)\r
+                    return false;\r
+            } else if (!nodeType.equals(other.nodeType))\r
+                return false;\r
+            return true;\r
+        }\r
+    }\r
+\r
+    public static final class NodeIdentifierWithPredicates implements PathArgument {\r
+        private final QName nodeType;\r
+        private final Map<QName, Object> keyValues;\r
+        \r
+        public NodeIdentifierWithPredicates(QName node,Map<QName, Object> keyValues) {\r
+            this.nodeType = node;\r
+            this.keyValues = Collections.unmodifiableMap(new HashMap<QName,Object>(keyValues));\r
+        }\r
+        \r
+        public NodeIdentifierWithPredicates(QName node, QName key, Object value) {\r
+            this.nodeType = node;\r
+            this.keyValues = Collections.singletonMap(key, value);\r
+        }\r
+\r
+        @Override\r
+        public QName getNodeType() {\r
+            return nodeType;\r
+        }\r
+        \r
+        public Map<QName,Object> getKeyValues() {\r
+            return keyValues;\r
+        }\r
+\r
+        @Override\r
+        public int hashCode() {\r
+            final int prime = 31;\r
+            int result = 1;\r
+            result = prime * result + ((keyValues == null) ? 0 : keyValues.hashCode());\r
+            result = prime * result + ((nodeType == null) ? 0 : nodeType.hashCode());\r
+            return result;\r
+        }\r
+\r
+        @Override\r
+        public boolean equals(Object obj) {\r
+            if (this == obj)\r
+                return true;\r
+            if (obj == null)\r
+                return false;\r
+            if (getClass() != obj.getClass())\r
+                return false;\r
+            NodeIdentifierWithPredicates other = (NodeIdentifierWithPredicates) obj;\r
+            if (keyValues == null) {\r
+                if (other.keyValues != null)\r
+                    return false;\r
+            } else if (!keyValues.equals(other.keyValues))\r
+                return false;\r
+            if (nodeType == null) {\r
+                if (other.nodeType != null)\r
+                    return false;\r
+            } else if (!nodeType.equals(other.nodeType))\r
+                return false;\r
+            return true;\r
+        }\r
+    }\r
+    \r
+    private static class BuilderImpl implements InstanceIdentifierBuilder {\r
+        \r
+        private List<PathArgument> path;\r
+        \r
+        @Override\r
+        public InstanceIdentifierBuilder node(QName nodeType) {\r
+            path.add(new NodeIdentifier(nodeType));\r
+            return this;\r
+        }\r
+        \r
+        @Override\r
+        public InstanceIdentifierBuilder nodeWithKey(QName nodeType, QName key, Object value) {\r
+            path.add(new NodeIdentifierWithPredicates(nodeType, key, value));\r
+            return this;\r
+        }\r
+        \r
+        @Override\r
+        public InstanceIdentifierBuilder nodeWithKey(QName nodeType, Map<QName, Object> keyValues) {\r
+            path.add(new NodeIdentifierWithPredicates(nodeType, keyValues));\r
+            return this;\r
+        }\r
+        \r
+        @Override\r
+        public InstanceIdentifier getIdentifier() {\r
+            return new InstanceIdentifier(path);\r
+        }\r
+    }\r
+}\r