From 93bb178d5cd836b00a3d16ff2072db7bcfc0975c Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Sun, 1 Dec 2013 12:21:00 +0100 Subject: [PATCH] Added wildcarded contains to InstanceIdentifier Change-Id: I0947116ee0f7bf2b3cd04519c9d6512c716116c6 Signed-off-by: Tony Tkacik --- yang/yang-binding/pom.xml | 5 + .../yang/binding/InstanceIdentifier.java | 42 ++++++- .../binding/test/InstanceIdentifierTest.java | 109 ++++++++++++++++++ .../yang/binding/test/mock/FooChild.java | 7 ++ .../yang/binding/test/mock/GroupingFoo.java | 5 + .../binding/test/mock/InstantiatedFoo.java | 8 ++ .../yang/binding/test/mock/Node.java | 12 ++ .../yang/binding/test/mock/NodeChild.java | 12 ++ .../yang/binding/test/mock/NodeChildKey.java | 40 +++++++ .../yang/binding/test/mock/NodeKey.java | 40 +++++++ .../yang/binding/test/mock/Nodes.java | 11 ++ 11 files changed, 290 insertions(+), 1 deletion(-) create mode 100644 yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/InstanceIdentifierTest.java create mode 100644 yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/FooChild.java create mode 100644 yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/GroupingFoo.java create mode 100644 yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/InstantiatedFoo.java create mode 100644 yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Node.java create mode 100644 yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeChild.java create mode 100644 yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeChildKey.java create mode 100644 yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeKey.java create mode 100644 yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Nodes.java diff --git a/yang/yang-binding/pom.xml b/yang/yang-binding/pom.xml index 34727ec373..b5a7b69c40 100644 --- a/yang/yang-binding/pom.xml +++ b/yang/yang-binding/pom.xml @@ -27,6 +27,11 @@ com.google.guava guava + + junit + junit + test + 0.6.0-SNAPSHOT diff --git a/yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java b/yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java index 726eebe7fe..4a1d994c66 100644 --- a/yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java +++ b/yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java @@ -43,6 +43,10 @@ public final class InstanceIdentifier implements Path getPath() { + return getPathArguments(); + } + + public List getPathArguments() { return this.path; } @@ -234,6 +238,8 @@ public final class InstanceIdentifier implements Path listItem, K listKey); > InstanceIdentifierBuilder augmentation(Class container); + + InstanceIdentifier build(); } @@ -294,6 +300,11 @@ public final class InstanceIdentifier implements Path immutablePath = Collections.unmodifiableList(new ArrayList(path)); return new InstanceIdentifier(immutablePath, target); } + + @Override + public InstanceIdentifier build() { + return toInstance(); + } @Override public InstanceIdentifierBuilder node(Class container) { @@ -369,7 +380,36 @@ public final class InstanceIdentifier implements Path other) { + if(other == null) { + throw new IllegalArgumentException("other should not be null"); + } + final int localSize = this.path.size(); + final List otherPath = other.getPath(); + if(localSize > other.path.size()) { + return false; + } + for(int i = 0;i && !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 index 0000000000..52763b46ff --- /dev/null +++ b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/InstanceIdentifierTest.java @@ -0,0 +1,109 @@ +package org.opendaylight.yangtools.yang.binding.test; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.test.mock.FooChild; +import org.opendaylight.yangtools.yang.binding.test.mock.InstantiatedFoo; +import org.opendaylight.yangtools.yang.binding.test.mock.Node; +import org.opendaylight.yangtools.yang.binding.test.mock.NodeChild; +import org.opendaylight.yangtools.yang.binding.test.mock.NodeChildKey; +import org.opendaylight.yangtools.yang.binding.test.mock.NodeKey; +import org.opendaylight.yangtools.yang.binding.test.mock.Nodes; + +public class InstanceIdentifierTest { + + @Test + public void constructWithPredicates() { + + InstanceIdentifier nodes = InstanceIdentifier.builder(Nodes.class).toInstance(); + + assertNotNull(nodes); + assertEquals(Nodes.class, nodes.getTargetType()); + + + InstanceIdentifier node = InstanceIdentifier.builder(nodes).node(Node.class).toInstance(); + + assertNotNull(node); + assertEquals(Node.class, node.getTargetType()); + + assertTrue(nodes.contains(node)); + } + + @Test + public void fluentConstruction() { + + InstanceIdentifier nodes = InstanceIdentifier.builder(Nodes.class).toInstance(); + InstanceIdentifier node = InstanceIdentifier.builder(Nodes.class).child(Node.class,new NodeKey(10)).toInstance(); + + assertNotNull(node); + assertEquals(Node.class, node.getTargetType()); + + assertTrue(nodes.contains(node)); + } + + + @Test + public void negativeContains() { + InstanceIdentifier fooChild = InstanceIdentifier.builder(Nodes.class).child(InstantiatedFoo.class).child(FooChild.class).build(); + + InstanceIdentifier nodeTen = InstanceIdentifier.builder(Nodes.class) // + .child(Node.class,new NodeKey(10)).toInstance(); + InstanceIdentifier nodeOne = InstanceIdentifier.builder(Nodes.class) // + .child(Node.class,new NodeKey(1)).toInstance(); + InstanceIdentifier nodes = InstanceIdentifier.builder(Nodes.class).toInstance(); + + assertFalse(fooChild.contains(nodeTen)); + assertFalse(nodeTen.contains(nodes)); + + assertFalse(nodeOne.contains(nodes)); + assertTrue(nodes.contains(nodeOne)); + } + + @Test + public void containsWildcarded() { + InstanceIdentifier nodes = InstanceIdentifier.builder(Nodes.class).toInstance(); + InstanceIdentifier wildcarded = InstanceIdentifier.builder(Nodes.class).child(Node.class).build(); + InstanceIdentifier wildcardedChildren = InstanceIdentifier.builder(Nodes.class) // + .child(Node.class) // + .child(NodeChild.class).build(); + + assertTrue(wildcarded.isWildcarded()); + assertTrue(wildcardedChildren.isWildcarded()); + + + InstanceIdentifier nodeTen = InstanceIdentifier.builder(Nodes.class) // + .child(Node.class,new NodeKey(10)).toInstance(); + InstanceIdentifier nodeOne = InstanceIdentifier.builder(Nodes.class) // + .child(Node.class,new NodeKey(1)).toInstance(); + + assertFalse(nodeTen.isWildcarded()); + assertFalse(nodeOne.isWildcarded()); + assertTrue(nodes.containsWildcarded(nodeOne)); + assertTrue(wildcarded.containsWildcarded(nodeOne)); + assertTrue(wildcarded.containsWildcarded(nodeTen)); + + + InstanceIdentifier nodeTenChildWildcarded = InstanceIdentifier.builder(Nodes.class) // + .child(Node.class,new NodeKey(10)).child(NodeChild.class).toInstance(); + + assertTrue(nodeTenChildWildcarded.isWildcarded()); + + InstanceIdentifier nodeTenChild = InstanceIdentifier.builder(Nodes.class) // + .child(Node.class,new NodeKey(10)).child(NodeChild.class, new NodeChildKey(10)).toInstance(); + InstanceIdentifier nodeOneChild = InstanceIdentifier.builder(Nodes.class) // + .child(Node.class,new NodeKey(1)).child(NodeChild.class, new NodeChildKey(1)).toInstance(); + + + assertFalse(nodeTenChildWildcarded.containsWildcarded(nodeOneChild)); + assertTrue(nodeTenChildWildcarded.containsWildcarded(nodeTenChild)); + + } + + + void childOfTest() { + InstanceIdentifier.builder(Nodes.class).child(InstantiatedFoo.class).child(FooChild.class); + } + +} 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 index 0000000000..85cfef21a2 --- /dev/null +++ b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/FooChild.java @@ -0,0 +1,7 @@ +package org.opendaylight.yangtools.yang.binding.test.mock; + +import org.opendaylight.yangtools.yang.binding.ChildOf; + +public interface FooChild extends ChildOf { + +} 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 index 0000000000..5da92aef1e --- /dev/null +++ b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/GroupingFoo.java @@ -0,0 +1,5 @@ +package org.opendaylight.yangtools.yang.binding.test.mock; + +public interface GroupingFoo { + +} 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 index 0000000000..1d36df62ec --- /dev/null +++ b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/InstantiatedFoo.java @@ -0,0 +1,8 @@ +package org.opendaylight.yangtools.yang.binding.test.mock; + +import org.opendaylight.yangtools.yang.binding.ChildOf; +import org.opendaylight.yangtools.yang.binding.DataObject; + +public interface InstantiatedFoo extends DataObject, GroupingFoo, ChildOf { + +} 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 index 0000000000..d8da0c2af4 --- /dev/null +++ b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Node.java @@ -0,0 +1,12 @@ +package org.opendaylight.yangtools.yang.binding.test.mock; + +import org.opendaylight.yangtools.yang.binding.ChildOf; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.Identifiable; + +public interface Node extends // + DataObject, // + Identifiable, // + ChildOf { + +} 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 index 0000000000..50f6037a3e --- /dev/null +++ b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeChild.java @@ -0,0 +1,12 @@ +package org.opendaylight.yangtools.yang.binding.test.mock; + +import org.opendaylight.yangtools.yang.binding.ChildOf; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.Identifiable; + +public interface NodeChild extends // + DataObject, // + Identifiable, // + ChildOf { + +} 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 index 0000000000..e72755807f --- /dev/null +++ b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeChildKey.java @@ -0,0 +1,40 @@ +package org.opendaylight.yangtools.yang.binding.test.mock; + +import org.opendaylight.yangtools.yang.binding.Identifier; + +public class NodeChildKey implements // + Identifier { + + private final int id; + + public NodeChildKey(int id) { + super(); + this.id = id; + } + + public int getId() { + return id; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + id; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + NodeChildKey other = (NodeChildKey) obj; + if (id != other.id) + return false; + return true; + } +} 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 index 0000000000..99dab18566 --- /dev/null +++ b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/NodeKey.java @@ -0,0 +1,40 @@ +package org.opendaylight.yangtools.yang.binding.test.mock; + +import org.opendaylight.yangtools.yang.binding.Identifier; + +public class NodeKey implements // + Identifier { + + private final int id; + + public NodeKey(int id) { + super(); + this.id = id; + } + + public int getId() { + return id; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + id; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + NodeKey other = (NodeKey) obj; + if (id != other.id) + return false; + return true; + } +} 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 index 0000000000..438a35b2bc --- /dev/null +++ b/yang/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/test/mock/Nodes.java @@ -0,0 +1,11 @@ +package org.opendaylight.yangtools.yang.binding.test.mock; + +import org.opendaylight.yangtools.yang.binding.ChildOf; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.DataRoot; + +public interface Nodes extends // + ChildOf, // + DataObject { + +} -- 2.36.6