Added wildcarded contains to InstanceIdentifier 86/3286/2
authorTony Tkacik <ttkacik@cisco.com>
Sun, 1 Dec 2013 11:21:00 +0000 (12:21 +0100)
committerTony Tkacik <ttkacik@cisco.com>
Sun, 1 Dec 2013 11:56:19 +0000 (12:56 +0100)
Change-Id: I0947116ee0f7bf2b3cd04519c9d6512c716116c6
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
yang/yang-binding/pom.xml
yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java
yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/InstanceIdentifierTest.java [new file with mode: 0644]
yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/FooChild.java [new file with mode: 0644]
yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/GroupingFoo.java [new file with mode: 0644]
yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/InstantiatedFoo.java [new file with mode: 0644]
yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Node.java [new file with mode: 0644]
yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeChild.java [new file with mode: 0644]
yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeChildKey.java [new file with mode: 0644]
yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeKey.java [new file with mode: 0644]
yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Nodes.java [new file with mode: 0644]

index 34727ec373f02ac76a70eb93b85d91c7dcda3528..b5a7b69c40faff19e10178442184ca8b332c4746 100644 (file)
             <groupId>com.google.guava</groupId>\r
             <artifactId>guava</artifactId>\r
         </dependency>\r
+        <dependency>\r
+            <groupId>junit</groupId>\r
+            <artifactId>junit</artifactId>\r
+            <scope>test</scope>\r
+        </dependency>\r
     </dependencies>\r
     <version>0.6.0-SNAPSHOT</version>\r
 </project>\r
index 726eebe7fec4c07f5782f2ff1f9d3dac75f7eb22..4a1d994c66adc2529c140fac7182dd4482c70c86 100644 (file)
@@ -43,6 +43,10 @@ public final class InstanceIdentifier<T extends DataObject> implements Path<Inst
      * @return path
      */
     public List<PathArgument> getPath() {
+        return getPathArguments();
+    }
+    
+    public List<PathArgument> getPathArguments() {
         return this.path;
     }
 
@@ -234,6 +238,8 @@ public final class InstanceIdentifier<T extends DataObject> implements Path<Inst
                 Class<N> listItem, K listKey);
 
         <N extends DataObject & Augmentation<? super T>> InstanceIdentifierBuilder<N> augmentation(Class<N> container);
+        
+        InstanceIdentifier<T> build();
 
     }
 
@@ -294,6 +300,11 @@ public final class InstanceIdentifier<T extends DataObject> implements Path<Inst
             List<PathArgument> immutablePath = Collections.unmodifiableList(new ArrayList<PathArgument>(path));
             return new InstanceIdentifier(immutablePath, target);
         }
+        
+        @Override
+        public InstanceIdentifier<T> build() {
+            return toInstance();
+        }
 
         @Override
         public <N extends DataObject> InstanceIdentifierBuilder<N> node(Class<N> container) {
@@ -369,7 +380,36 @@ public final class InstanceIdentifier<T extends DataObject> implements Path<Inst
                 return false;
             }
         }
-
         return true;
     }
+    
+    public boolean containsWildcarded(final InstanceIdentifier<?> other) {
+        if(other == null) {
+            throw new IllegalArgumentException("other should not be null");
+        }
+        final int localSize = this.path.size();
+        final List<PathArgument> otherPath = other.getPath();
+        if(localSize > other.path.size()) {
+            return false;
+        }
+        for(int i = 0;i<localSize;i++ ) {
+            final PathArgument localArgument = path.get(i);
+            if(!localArgument.getType().equals(otherPath.get(i).getType())) {
+                return false;
+            } 
+            if(localArgument instanceof IdentifiableItem<?, ?> && !localArgument.equals(otherPath.get(i))) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public boolean isWildcarded() {
+        for(PathArgument pathArgument : path) {
+            if(Identifiable.class.isAssignableFrom(pathArgument.getType()) && !(pathArgument instanceof IdentifiableItem<?, ?>)) {
+                return true;
+            }
+        }
+        return false;
+    }
 }
diff --git a/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/InstanceIdentifierTest.java b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/InstanceIdentifierTest.java
new file mode 100644 (file)
index 0000000..52763b4
--- /dev/null
@@ -0,0 +1,109 @@
+package org.opendaylight.yangtools.yang.binding.test;\r
+\r
+import static org.junit.Assert.*;\r
+\r
+import org.junit.Test;\r
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
+import org.opendaylight.yangtools.yang.binding.test.mock.FooChild;\r
+import org.opendaylight.yangtools.yang.binding.test.mock.InstantiatedFoo;\r
+import org.opendaylight.yangtools.yang.binding.test.mock.Node;\r
+import org.opendaylight.yangtools.yang.binding.test.mock.NodeChild;\r
+import org.opendaylight.yangtools.yang.binding.test.mock.NodeChildKey;\r
+import org.opendaylight.yangtools.yang.binding.test.mock.NodeKey;\r
+import org.opendaylight.yangtools.yang.binding.test.mock.Nodes;\r
+\r
+public class InstanceIdentifierTest {\r
+\r
+    @Test\r
+    public void constructWithPredicates() {\r
+        \r
+        InstanceIdentifier<Nodes> nodes = InstanceIdentifier.builder(Nodes.class).toInstance();\r
+        \r
+        assertNotNull(nodes);\r
+        assertEquals(Nodes.class, nodes.getTargetType());\r
+        \r
+        \r
+        InstanceIdentifier<Node> node = InstanceIdentifier.builder(nodes).node(Node.class).toInstance();\r
+        \r
+        assertNotNull(node);\r
+        assertEquals(Node.class, node.getTargetType());\r
+        \r
+        assertTrue(nodes.contains(node));\r
+    }\r
+\r
+    @Test\r
+    public void fluentConstruction() {\r
+\r
+        InstanceIdentifier<Nodes> nodes = InstanceIdentifier.builder(Nodes.class).toInstance();\r
+        InstanceIdentifier<Node> node = InstanceIdentifier.builder(Nodes.class).child(Node.class,new NodeKey(10)).toInstance();\r
+\r
+        assertNotNull(node);\r
+        assertEquals(Node.class, node.getTargetType());\r
+\r
+        assertTrue(nodes.contains(node));\r
+    }\r
+   \r
+    \r
+    @Test\r
+    public void negativeContains() {\r
+        InstanceIdentifier<FooChild> fooChild = InstanceIdentifier.builder(Nodes.class).child(InstantiatedFoo.class).child(FooChild.class).build();\r
+        \r
+        InstanceIdentifier<Node> nodeTen = InstanceIdentifier.builder(Nodes.class) //\r
+                .child(Node.class,new NodeKey(10)).toInstance();\r
+        InstanceIdentifier<Node> nodeOne = InstanceIdentifier.builder(Nodes.class) //\r
+                .child(Node.class,new NodeKey(1)).toInstance();\r
+        InstanceIdentifier<Nodes> nodes = InstanceIdentifier.builder(Nodes.class).toInstance();\r
+    \r
+        assertFalse(fooChild.contains(nodeTen));\r
+        assertFalse(nodeTen.contains(nodes));\r
+        \r
+        assertFalse(nodeOne.contains(nodes));\r
+        assertTrue(nodes.contains(nodeOne));\r
+    }\r
+    \r
+    @Test\r
+    public void containsWildcarded() {\r
+        InstanceIdentifier<Nodes> nodes = InstanceIdentifier.builder(Nodes.class).toInstance();\r
+        InstanceIdentifier<Node> wildcarded = InstanceIdentifier.builder(Nodes.class).child(Node.class).build();\r
+        InstanceIdentifier<NodeChild> wildcardedChildren = InstanceIdentifier.builder(Nodes.class) //\r
+                .child(Node.class) //\r
+                .child(NodeChild.class).build();\r
+        \r
+        assertTrue(wildcarded.isWildcarded());\r
+        assertTrue(wildcardedChildren.isWildcarded());\r
+        \r
+        \r
+        InstanceIdentifier<Node> nodeTen = InstanceIdentifier.builder(Nodes.class) //\r
+                .child(Node.class,new NodeKey(10)).toInstance();\r
+        InstanceIdentifier<Node> nodeOne = InstanceIdentifier.builder(Nodes.class) //\r
+                .child(Node.class,new NodeKey(1)).toInstance();\r
+        \r
+        assertFalse(nodeTen.isWildcarded());\r
+        assertFalse(nodeOne.isWildcarded());\r
+        assertTrue(nodes.containsWildcarded(nodeOne));\r
+        assertTrue(wildcarded.containsWildcarded(nodeOne));\r
+        assertTrue(wildcarded.containsWildcarded(nodeTen));\r
+        \r
+        \r
+        InstanceIdentifier<NodeChild> nodeTenChildWildcarded = InstanceIdentifier.builder(Nodes.class) //\r
+                .child(Node.class,new NodeKey(10)).child(NodeChild.class).toInstance();\r
+        \r
+        assertTrue(nodeTenChildWildcarded.isWildcarded());\r
+        \r
+        InstanceIdentifier<NodeChild> nodeTenChild = InstanceIdentifier.builder(Nodes.class) //\r
+                .child(Node.class,new NodeKey(10)).child(NodeChild.class, new NodeChildKey(10)).toInstance();\r
+        InstanceIdentifier<NodeChild> nodeOneChild = InstanceIdentifier.builder(Nodes.class) //\r
+                .child(Node.class,new NodeKey(1)).child(NodeChild.class, new NodeChildKey(1)).toInstance();\r
+\r
+        \r
+        assertFalse(nodeTenChildWildcarded.containsWildcarded(nodeOneChild));\r
+        assertTrue(nodeTenChildWildcarded.containsWildcarded(nodeTenChild));\r
+        \r
+    }\r
+    \r
+    \r
+    void childOfTest() {\r
+        InstanceIdentifier.builder(Nodes.class).child(InstantiatedFoo.class).child(FooChild.class);\r
+    }\r
+\r
+}\r
diff --git a/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/FooChild.java b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/FooChild.java
new file mode 100644 (file)
index 0000000..85cfef2
--- /dev/null
@@ -0,0 +1,7 @@
+package org.opendaylight.yangtools.yang.binding.test.mock;\r
+\r
+import org.opendaylight.yangtools.yang.binding.ChildOf;\r
+\r
+public interface FooChild extends ChildOf<GroupingFoo> {\r
+\r
+}\r
diff --git a/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/GroupingFoo.java b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/GroupingFoo.java
new file mode 100644 (file)
index 0000000..5da92ae
--- /dev/null
@@ -0,0 +1,5 @@
+package org.opendaylight.yangtools.yang.binding.test.mock;\r
+\r
+public interface GroupingFoo {\r
+\r
+}\r
diff --git a/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/InstantiatedFoo.java b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/InstantiatedFoo.java
new file mode 100644 (file)
index 0000000..1d36df6
--- /dev/null
@@ -0,0 +1,8 @@
+package org.opendaylight.yangtools.yang.binding.test.mock;\r
+\r
+import org.opendaylight.yangtools.yang.binding.ChildOf;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+\r
+public interface InstantiatedFoo extends DataObject, GroupingFoo, ChildOf<Nodes> {\r
+\r
+}\r
diff --git a/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Node.java b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Node.java
new file mode 100644 (file)
index 0000000..d8da0c2
--- /dev/null
@@ -0,0 +1,12 @@
+package org.opendaylight.yangtools.yang.binding.test.mock;\r
+\r
+import org.opendaylight.yangtools.yang.binding.ChildOf;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+import org.opendaylight.yangtools.yang.binding.Identifiable;\r
+\r
+public interface Node extends //\r
+    DataObject, //\r
+    Identifiable<NodeKey>, //\r
+    ChildOf<Nodes> {\r
+\r
+}\r
diff --git a/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeChild.java b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeChild.java
new file mode 100644 (file)
index 0000000..50f6037
--- /dev/null
@@ -0,0 +1,12 @@
+package org.opendaylight.yangtools.yang.binding.test.mock;\r
+\r
+import org.opendaylight.yangtools.yang.binding.ChildOf;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+import org.opendaylight.yangtools.yang.binding.Identifiable;\r
+\r
+public interface NodeChild extends //\r
+        DataObject, //\r
+        Identifiable<NodeChildKey>, //\r
+        ChildOf<Node> {\r
+\r
+}\r
diff --git a/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeChildKey.java b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeChildKey.java
new file mode 100644 (file)
index 0000000..e727558
--- /dev/null
@@ -0,0 +1,40 @@
+package org.opendaylight.yangtools.yang.binding.test.mock;\r
+\r
+import org.opendaylight.yangtools.yang.binding.Identifier;\r
+\r
+public class NodeChildKey implements //\r
+        Identifier<NodeChild> {\r
+\r
+    private final int id;\r
+\r
+    public NodeChildKey(int id) {\r
+        super();\r
+        this.id = id;\r
+    }\r
+\r
+    public int getId() {\r
+        return id;\r
+    }\r
+\r
+    @Override\r
+    public int hashCode() {\r
+        final int prime = 31;\r
+        int result = 1;\r
+        result = prime * result + id;\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
+        NodeChildKey other = (NodeChildKey) obj;\r
+        if (id != other.id)\r
+            return false;\r
+        return true;\r
+    }\r
+}\r
diff --git a/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeKey.java b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeKey.java
new file mode 100644 (file)
index 0000000..99dab18
--- /dev/null
@@ -0,0 +1,40 @@
+package org.opendaylight.yangtools.yang.binding.test.mock;\r
+\r
+import org.opendaylight.yangtools.yang.binding.Identifier;\r
+\r
+public class NodeKey implements //\r
+        Identifier<Node> {\r
+\r
+    private final int id;\r
+\r
+    public NodeKey(int id) {\r
+        super();\r
+        this.id = id;\r
+    }\r
+\r
+    public int getId() {\r
+        return id;\r
+    }\r
+\r
+    @Override\r
+    public int hashCode() {\r
+        final int prime = 31;\r
+        int result = 1;\r
+        result = prime * result + id;\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
+        NodeKey other = (NodeKey) obj;\r
+        if (id != other.id)\r
+            return false;\r
+        return true;\r
+    }\r
+}\r
diff --git a/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Nodes.java b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Nodes.java
new file mode 100644 (file)
index 0000000..438a35b
--- /dev/null
@@ -0,0 +1,11 @@
+package org.opendaylight.yangtools.yang.binding.test.mock;\r
+\r
+import org.opendaylight.yangtools.yang.binding.ChildOf;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+import org.opendaylight.yangtools.yang.binding.DataRoot;\r
+\r
+public interface Nodes extends //\r
+        ChildOf<DataRoot>, //\r
+        DataObject {\r
+\r
+}\r