Updated Concepts & YANG Binding
authorTony Tkacik <ttkacik@cisco.com>
Tue, 8 Oct 2013 06:53:57 +0000 (08:53 +0200)
committerTony Tkacik <ttkacik@cisco.com>
Tue, 8 Oct 2013 07:53:39 +0000 (09:53 +0200)
  - Added Path concept
  - Updated InstanceIdentifier
     - implements Path
     - Generic parameter T which represents Target Type
  - Added ChildOf Marker interface
  - Added DataContainer marker interface

Change-Id: I3875de61add780803b7cf89d4c6789bb345bd409
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
yang/yang-binding/pom.xml
yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/Augmentation.java
yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ChildOf.java [new file with mode: 0644]
yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/DataContainer.java [new file with mode: 0644]
yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/DataObject.java
yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/Identifiable.java
yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/Identifier.java
yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java
yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/Notification.java

index 4401c8a9205bdd638fa184265911e065c3294253..8efa9ac92d90e42c93127721d2264bce3749da14 100644 (file)
@@ -21,6 +21,8 @@
         <dependency>\r
             <groupId>org.opendaylight.yangtools</groupId>\r
             <artifactId>yang-common</artifactId>\r
+            <version>0.5.9-SNAPSHOT</version>\r
         </dependency>\r
     </dependencies>\r
+    <version>0.6.0-SNAPSHOT</version>\r
 </project>\r
index ad8401b0a7ec5ed7f7ec965cb41565ade14d3b9a..a89f030cdb430295ee05c4c9f743a8d6d1e2eb1f 100644 (file)
@@ -8,7 +8,16 @@
 package org.opendaylight.yangtools.yang.binding;\r
 \r
 /**\r
- * Augmentation (extension) of other interface\r
+ * Augmentation (extension) of other interface.\r
+ * \r
+ * This interface uniquely bounds Augmentation to generated \r
+ * interface.\r
+ * \r
+ * All interfaces generated from YANG Augmentation statement\r
+ * must implement this interface with parameter <code>P</code>\r
+ * which uniquely points to it's target class.\r
+ * \r
+ * \r
  *\r
  * @param <T> Class to which this implementation is extension.\r
  */\r
diff --git a/yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ChildOf.java b/yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/ChildOf.java
new file mode 100644 (file)
index 0000000..28b4e0c
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.binding;
+
+/**
+ * Child of parent container
+ * 
+ * Marker interface uniquelly bounding generated Java interfaces to their 
+ * parent container.
+ * 
+ * Any nested Java interface generated from YANG must implement this interface,
+ * where parameter <code>P</code> points to it's defining data node container
+ * (interface generated for List, Container, Case).
+ * 
+ * In case of children added by augmentation (which implements {@link Augmentation})
+ * interfaces representing nested container must implements {@link ChildOf} with
+ * same argument as Augmentation.
+ * 
+ * @param <P> Parent container
+ */
+public interface ChildOf<P> extends DataObject {
+
+}
diff --git a/yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/DataContainer.java b/yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/DataContainer.java
new file mode 100644 (file)
index 0000000..df81bdd
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.binding;
+
+/**
+ * Data Container - object contains structured data
+ * 
+ * Marker interface which must be implmeneted by all interfaces
+ * generated for YANG:
+ * <ul>
+ * <li>Rpc Input
+ * <li>Output 
+ * <li>Notification
+ * <li>Container
+ * <li>List
+ * <li>Case
+ * </ul>
+ * 
+ *
+ */
+public interface DataContainer {
+
+}
index d51572e2d89ee3fb4645ffb7a2e3022311b35506..599df0639b9314ec048c2ae06e2fea3f7e3ed59c 100644 (file)
@@ -14,6 +14,6 @@ package org.opendaylight.yangtools.yang.binding;
  * @author Tony Tkacik <ttkacik@cisco.com>\r
  *\r
  */\r
-public interface DataObject {\r
+public interface DataObject extends DataContainer {\r
 \r
 }\r
index 9f32c0f24f3a69d32aa2f10fdc3bad5360389b50..b5b8e8585802753fc8c8a76b1e1ee33ad619aed5 100644 (file)
@@ -1,3 +1,10 @@
+/*\r
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
 package org.opendaylight.yangtools.yang.binding;\r
 \r
 \r
index c9bd129414fae462a1bbfe0db6a46b444df6e720..6a2893d9c9c2a4679d514f3aa631f53c11287966 100644 (file)
@@ -1,14 +1,22 @@
+/*\r
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
 package org.opendaylight.yangtools.yang.binding;\r
 \r
 /**\r
  * \r
  * Object is unique identifier for another object\r
  * \r
- *\r
- *\r
- * @param <T> Class of object for which this object is identifier\r
+ * \r
+ * \r
+ * @param <T>\r
+ *            Class of object for which this object is identifier\r
  * @author ttkacik\r
  */\r
-public interface Identifier<T extends Identifiable<?>> {\r
+public interface Identifier<T extends Identifiable<?>> extends org.opendaylight.yangtools.concepts.Identifier {\r
 \r
 }\r
index 283889fe605988c1d5016ee6f5ba93c184e1ae57..01ec40381512c99d0129781dcd872ceb6f52547c 100644 (file)
@@ -13,6 +13,7 @@ import java.util.List;
 \r
 import org.opendaylight.yangtools.concepts.Builder;\r
 import org.opendaylight.yangtools.concepts.Immutable;\r
+import org.opendaylight.yangtools.concepts.Path;\r
 \r
 /**\r
  * Uniquely identifies data location in the overall of data tree \r
@@ -20,17 +21,17 @@ import org.opendaylight.yangtools.concepts.Immutable;
  * \r
  * \r
  */\r
-public final class InstanceIdentifier implements Immutable {\r
+public final class InstanceIdentifier<T extends DataObject> implements Path<InstanceIdentifier<?>>,Immutable {\r
 \r
     private final List<PathArgument> path;\r
-    private final Class<? extends DataObject> targetType;\r
-\r
-    public InstanceIdentifier(Class<? extends DataObject> type) {\r
+    private final Class<T> targetType;\r
+    \r
+    public InstanceIdentifier(Class<T> type) {\r
         path = Collections.<PathArgument> singletonList(new Item<>(type));\r
         this.targetType = type;\r
     }\r
 \r
-    public InstanceIdentifier(List<PathArgument> path, Class<? extends DataObject> type) {\r
+    public InstanceIdentifier(List<PathArgument> path, Class<T> type) {\r
         this.path = Collections.<PathArgument> unmodifiableList(new ArrayList<>(path));\r
         this.targetType = type;\r
     }\r
@@ -43,7 +44,7 @@ public final class InstanceIdentifier implements Immutable {
         return this.path;\r
     }\r
 \r
-    public Class<?> getTargetType() {\r
+    public Class<T> getTargetType() {\r
         return this.targetType;\r
     }\r
 \r
@@ -100,6 +101,11 @@ public final class InstanceIdentifier implements Immutable {
                 return false;\r
             return true;\r
         }\r
+        \r
+        @Override\r
+        public String toString() {\r
+            return type.getName();\r
+        }\r
     }\r
 \r
     public static final class IdentifiableItem<I extends Identifiable<T> & DataObject, T extends Identifier<I>> implements\r
@@ -152,24 +158,31 @@ public final class InstanceIdentifier implements Immutable {
         }\r
     }\r
 \r
-    public interface InstanceIdentifierBuilder extends Builder<InstanceIdentifier> {\r
+    public interface InstanceIdentifierBuilder<T extends DataObject> extends Builder<InstanceIdentifier<T>> {\r
+\r
+        <N extends DataObject> InstanceIdentifierBuilder<N> node(Class<N> container);\r
 \r
-        <T extends DataObject> InstanceIdentifierBuilder node(Class<T> container);\r
+        <N extends Identifiable<K> & DataObject, K extends Identifier<N>> InstanceIdentifierBuilder<N> node(\r
+                Class<N> listItem, K listKey);\r
 \r
-        <I extends Identifiable<T> & DataObject, T extends Identifier<I>> InstanceIdentifierBuilder node(\r
-                Class<I> listItem, T listKey);\r
+        <N extends ChildOf<? super T>> InstanceIdentifierBuilder<N> child(Class<N> container);\r
+        \r
+        <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>> InstanceIdentifierBuilder<N> child(\r
+                Class<N> listItem, K listKey);\r
 \r
     }\r
 \r
-    public static InstanceIdentifierBuilder builder() {\r
+    @SuppressWarnings("rawtypes")\r
+    public static InstanceIdentifierBuilder<?> builder() {\r
         return new BuilderImpl();\r
     }\r
 \r
-    public static InstanceIdentifierBuilder builder(InstanceIdentifier basePath) {\r
-        return new BuilderImpl(basePath.path);\r
+    @SuppressWarnings({ "rawtypes", "unchecked" })\r
+    public static InstanceIdentifierBuilder<?> builder(InstanceIdentifier<?> basePath) {\r
+        return new BuilderImpl(basePath.path,basePath.targetType);\r
     }\r
 \r
-    private static final class BuilderImpl implements InstanceIdentifierBuilder {\r
+    private static final class BuilderImpl<T extends DataObject> implements InstanceIdentifierBuilder<T> {\r
 \r
         private List<PathArgument> path;\r
         private Class<? extends DataObject> target = null;\r
@@ -179,29 +192,44 @@ public final class InstanceIdentifier implements Immutable {
         }\r
         \r
 \r
-        public BuilderImpl(List<? extends PathArgument> prefix) {\r
+        public BuilderImpl(List<? extends PathArgument> prefix,Class<? extends DataObject> target) {\r
             this.path = new ArrayList<>(prefix);\r
+            this.target = target;\r
         }\r
 \r
+        @SuppressWarnings({ "unchecked", "rawtypes" })\r
         @Override\r
-        public InstanceIdentifier toInstance() {\r
+        public InstanceIdentifier<T> toInstance() {\r
             List<PathArgument> immutablePath = Collections.unmodifiableList(new ArrayList<PathArgument>(path));\r
             return new InstanceIdentifier(immutablePath, target);\r
         }\r
 \r
         @Override\r
-        public <T extends DataObject> InstanceIdentifierBuilder node(Class<T> container) {\r
+        @SuppressWarnings("unchecked")\r
+        public <N extends DataObject> InstanceIdentifierBuilder<N> node(Class<N> container) {\r
             target = container;\r
-            path.add(new Item<T>(container));\r
-            return this;\r
+            path.add(new Item<N>(container));\r
+            return (InstanceIdentifierBuilder<N>) this;\r
         }\r
 \r
         @Override\r
-        public <I extends Identifiable<T> & DataObject, T extends Identifier<I>> InstanceIdentifierBuilder node(\r
-                Class<I> listItem, T listKey) {\r
+        @SuppressWarnings("unchecked")\r
+        public <N extends DataObject & Identifiable<K> , K extends Identifier<N>> InstanceIdentifierBuilder<N> node(\r
+                Class<N> listItem, K listKey) {\r
             target = listItem;\r
-            path.add(new IdentifiableItem<I, T>(listItem, listKey));\r
-            return this;\r
+            path.add(new IdentifiableItem<N, K>(listItem, listKey));\r
+            return (InstanceIdentifierBuilder<N>) this;\r
+        }\r
+        \r
+        @Override\r
+        public <N extends ChildOf<? super T>> InstanceIdentifierBuilder<N> child(Class<N> container) {\r
+            return node(container);\r
+        }\r
+        \r
+        @Override\r
+        public <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>> InstanceIdentifierBuilder<N> child(\r
+                Class<N> listItem, K listKey) {\r
+            return node(listItem,listKey);\r
         }\r
     }\r
 \r
@@ -224,7 +252,7 @@ public final class InstanceIdentifier implements Immutable {
         if (getClass() != obj.getClass()) {\r
             return false;\r
         }\r
-        InstanceIdentifier other = (InstanceIdentifier) obj;\r
+        InstanceIdentifier<?> other = (InstanceIdentifier<?>) obj;\r
         if (path == null) {\r
             if (other.path != null) {\r
                 return false;\r
@@ -234,4 +262,23 @@ public final class InstanceIdentifier implements Immutable {
         }\r
         return true;\r
     }\r
+\r
+    @Override\r
+    public boolean contains(final InstanceIdentifier<?> other) {\r
+        if(other == null) {\r
+            throw new IllegalArgumentException("other should not be null");\r
+        }\r
+        final int localSize = this.path.size();\r
+        final List<PathArgument> otherPath = other.getPath();\r
+        if(localSize > other.path.size()) {\r
+            return false;\r
+        }\r
+        for(int i = 0;i<localSize;i++ ) {\r
+            if(!path.get(i).equals(otherPath.get(i))) {\r
+                return false;\r
+            }\r
+        }\r
+        \r
+        return true;\r
+    }\r
 }\r
index d551b44b3d2eb9ceaf9a6b5e06bf293769d3fee4..677f5869b875d19a5ecc88fa454dd913e82d43e3 100644 (file)
@@ -12,7 +12,7 @@ package org.opendaylight.yangtools.yang.binding;
  *\r
  *\r
  */\r
-public interface Notification extends DataObject {\r
+public interface Notification extends DataContainer {\r
 \r
 }\r