Added initial draft of Normalized Yang Data Tree model. 41/5441/1
authorTony Tkacik <ttkacik@cisco.com>
Fri, 21 Feb 2014 16:38:14 +0000 (17:38 +0100)
committerTony Tkacik <ttkacik@cisco.com>
Fri, 21 Feb 2014 16:38:14 +0000 (17:38 +0100)
Change-Id: Ic50335f8a7bfe0fa4d7c239c997f6ca090b9b506
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
22 files changed:
yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java
yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/DataObjectReadingUtil.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/AttributesContainer.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/CompositeNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/InstanceIdentifier.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/MutableCompositeNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/MutableNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/Node.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NodeModification.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AugmentationNode.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/ChoiceNode.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/ContainerNode.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/DataContainerChild.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/DataContainerNode.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/LeafNode.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/LeafSetEntryNode.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/LeafSetNode.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MapEntryNode.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MapNode.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MixinNode.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedNode.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedNodeContainer.java [new file with mode: 0644]

index 6cf89b24633e58bd4d70936ce871c104d9a8d036..aad6a72e55cb6d7a9ec42d71c3484568126c485c 100644 (file)
@@ -124,7 +124,6 @@ public final class InstanceIdentifier<T extends DataObject> implements Path<Inst
     public interface PathArgument {
 
         Class<? extends DataObject> getType();
-
     }
 
     public static final class Item<T extends DataObject> implements PathArgument {
index 35f83f72e6e9ee8dc0d1309159aa69b135bfe39d..db4127f214393148dafa618d88982bfc548d355c 100644 (file)
@@ -235,6 +235,7 @@ public class DataObjectReadingUtil {
             try {
                 Object potentialList = getGetterMethod().invoke(parent);
                 if (potentialList instanceof Iterable) {
+
                     final Iterable<Identifiable> dataList = (Iterable<Identifiable>) potentialList;
                     if (childArgument instanceof IdentifiableItem<?, ?>) {
                         return readUsingIdentifiableItem(dataList, (IdentifiableItem) childArgument, builder);
index 5f1b2522ab675800eb07775c699c55402285aa84..9146315c47925353413ab4e7e7bb7fdf1b99a567 100644 (file)
@@ -13,9 +13,8 @@ import org.opendaylight.yangtools.yang.common.QName;
 
 public interface AttributesContainer {
 
-    
-    Map<QName,String> getAttributes();
-    
+    Map<QName, String> getAttributes();
+
     Object getAttributeValue(QName value);
-    
+
 }
index 82ebe80d3ef4b9905efc6ce30debd37ae07ab748..f02ada0d67d8d96438a741f439f2728f98fc8532 100644 (file)
@@ -30,8 +30,19 @@ import org.opendaylight.yangtools.yang.common.QName;
  *\r
  *\r
  */\r
-public interface CompositeNode extends Node<List<Node<?>>>, NodeModification, Map<QName,List<Node<?>>> {\r
+public interface CompositeNode extends //\r
+    Node<List<Node<?>>>, //\r
+    NodeModification, //\r
+    Map<QName,List<Node<?>>> {\r
 \r
+    /**\r
+     * Returns a list of children as seens in resulting XML serialization\r
+     * defined by YANG specification.\r
+     *\r
+     *\r
+     * @return\r
+     */\r
+    @Deprecated\r
     List<Node<?>> getChildren();\r
 \r
     List<CompositeNode> getCompositesByName(QName children);\r
@@ -49,6 +60,7 @@ public interface CompositeNode extends Node<List<Node<?>>>, NodeModification, Ma
     /**\r
      * @return cast self to mutable, if possible\r
      */\r
+    @Deprecated\r
     MutableCompositeNode asMutable();\r
-    \r
+\r
 }\r
index 79a7f4c31797d670ad0d650d2feae3b32fa718a4..54c1c46609834c8b5956862886bbc1100e76fd54 100644 (file)
  * 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.data.api;\r
-\r
+package org.opendaylight.yangtools.yang.data.api;
+
 import java.io.Serializable;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.opendaylight.yangtools.concepts.Builder;
 import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.concepts.Path;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-\r
-public class InstanceIdentifier implements Path<InstanceIdentifier>, Immutable, Serializable {\r
-\r
-    private static final long serialVersionUID = 8467409862384206193L;\r
-    private final List<PathArgument> path;\r
-\r
+import com.google.common.collect.ImmutableSet;
+
+public class InstanceIdentifier implements Path<InstanceIdentifier>, Immutable, Serializable {
+
+    private static final long serialVersionUID = 8467409862384206193L;
+    private final List<PathArgument> path;
+
     private transient String toStringCache = null;
-    private transient Integer hashCodeCache = null;\r
-\r
-    public List<PathArgument> getPath() {\r
-        return path;\r
-    }\r
-\r
-    public InstanceIdentifier(final List<? extends PathArgument> path) {\r
-        this.path =ImmutableList.copyOf(path);\r
-    }\r
-\r
-    private InstanceIdentifier(NodeIdentifier nodeIdentifier) {\r
-        this.path = ImmutableList.<PathArgument>of(nodeIdentifier);\r
-    }\r
-\r
-    @Override\r
+    private transient Integer hashCodeCache = null;
+
+    public List<PathArgument> getPath() {
+        return path;
+    }
+
+    public InstanceIdentifier(final List<? extends PathArgument> path) {
+        this.path = ImmutableList.copyOf(path);
+    }
+
+    private InstanceIdentifier(NodeIdentifier nodeIdentifier) {
+        this.path = ImmutableList.<PathArgument> of(nodeIdentifier);
+    }
+
+    @Override
     public int hashCode() {
         /*
-         * The hashCodeCache is safe, since the object contract requires immutability
-         * of the object and all objects referenced from this object.
+         * The hashCodeCache is safe, since the object contract requires
+         * immutability of the object and all objects referenced from this
+         * object.
          *
-         * Used lists, maps are immutable. Path Arguments (elements) are also immutable,
-         * since the PathArgument contract requires immutability.
+         * Used lists, maps are immutable. Path Arguments (elements) are also
+         * immutable, since the PathArgument contract requires immutability.
          *
-         * The cache is thread-safe - if multiple computations occurs at the same time,
-         * cache will be overwritten with same result.
+         * The cache is thread-safe - if multiple computations occurs at the
+         * same time, cache will be overwritten with same result.
          */
-        if(hashCodeCache  == null) {
+        if (hashCodeCache == null) {
             final int prime = 31;
             int result = 1;
             result = prime * result + ((path == null) ? 0 : path.hashCode());
             hashCodeCache = result;
         }
-        return hashCodeCache;\r
-    }\r
-\r
-    @Override\r
-    public boolean equals(Object obj) {\r
-        if (this == obj) {\r
-            return true;\r
+        return hashCodeCache;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
         }
-        if (obj == null) {\r
+        if (obj == null) {
             return false;
-        }\r
-        if (getClass() != obj.getClass()) {\r
+        }
+        if (getClass() != obj.getClass()) {
             return false;
-        }\r
+        }
         InstanceIdentifier other = (InstanceIdentifier) obj;
-        if(this.hashCode() != obj.hashCode()) {
+        if (this.hashCode() != obj.hashCode()) {
             return false;
-        }\r
-        if (path == null) {\r
-            if (other.path != null) {\r
+        }
+        if (path == null) {
+            if (other.path != null) {
                 return false;
-            }\r
-        } else if (!path.equals(other.path)) {\r
+            }
+        } else if (!path.equals(other.path)) {
             return false;
-        }\r
-        return true;\r
-    }\r
-\r
-    // Static factories & helpers\r
-\r
-    public static InstanceIdentifier of(QName name) {\r
-        return new InstanceIdentifier(new NodeIdentifier(name));\r
-    }\r
-\r
-    static public InstanceIdentifierBuilder builder() {\r
-        return new BuilderImpl();\r
-    }\r
-\r
-    static public InstanceIdentifierBuilder builder(InstanceIdentifier origin) {\r
-        return new BuilderImpl(origin.getPath());\r
-    }\r
-\r
-    public interface PathArgument extends Immutable, Serializable {\r
-        QName getNodeType();\r
-\r
-    }\r
-\r
-    public interface InstanceIdentifierBuilder extends Builder<InstanceIdentifier> {\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
-        @Deprecated\r
-        InstanceIdentifier getIdentifier();\r
-    }\r
-\r
-    public static final class NodeIdentifier implements PathArgument {\r
-\r
+        }
+        return true;
+    }
+
+    // Static factories & helpers
+
+    public static InstanceIdentifier of(QName name) {
+        return new InstanceIdentifier(new NodeIdentifier(name));
+    }
+
+    static public InstanceIdentifierBuilder builder() {
+        return new BuilderImpl();
+    }
+
+    static public InstanceIdentifierBuilder builder(InstanceIdentifier origin) {
+        return new BuilderImpl(origin.getPath());
+    }
+
+    public interface PathArgument extends Immutable, Serializable {
+
+        /**
+         * If applicable returns uniqee QName of data node as defined in YANG
+         * Schema.
+         *
+         * This method may return null, if the corresponding schema node, does
+         * not have QName associated, such as in cases of augmentations.
+         *
+         * @return
+         */
+        QName getNodeType();
+
+    }
+
+    public interface InstanceIdentifierBuilder extends Builder<InstanceIdentifier> {
+        InstanceIdentifierBuilder node(QName nodeType);
+
+        InstanceIdentifierBuilder nodeWithKey(QName nodeType, Map<QName, Object> keyValues);
+
+        InstanceIdentifierBuilder nodeWithKey(QName nodeType, QName key, Object value);
+
+        @Deprecated
+        InstanceIdentifier getIdentifier();
+
+        InstanceIdentifier build();
+    }
+
+    /**
+     * Simple path argument identifying a {@link ContainerNode} or {@link LeafNode} leaf
+     * overal data tree.
+     *
+     */
+    public static final class NodeIdentifier implements PathArgument {
+
         /**\r
          *\r
-         */\r
-        private static final long serialVersionUID = -2255888212390871347L;\r
-\r
-        private final QName nodeType;\r
-\r
-        public NodeIdentifier(QName node) {\r
-            this.nodeType = node;\r
-        }\r
-\r
+         */
+        private static final long serialVersionUID = -2255888212390871347L;
+
+        private final QName nodeType;
+
+        public NodeIdentifier(QName node) {
+            this.nodeType = node;
+        }
+
+        @Override
+        public QName getNodeType() {
+            return nodeType;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + ((nodeType == null) ? 0 : nodeType.hashCode());
+            return result;
+        }
+
         @Override
-        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
-        @Override\r
-        public String toString() {\r
-            return nodeType.toString();\r
-        }\r
-    }\r
-\r
-    public static final class NodeIdentifierWithPredicates implements PathArgument {\r
-\r
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            NodeIdentifier other = (NodeIdentifier) obj;
+            if (nodeType == null) {
+                if (other.nodeType != null)
+                    return false;
+            } else if (!nodeType.equals(other.nodeType))
+                return false;
+            return true;
+        }
+
+        @Override
+        public String toString() {
+            return nodeType.toString();
+        }
+    }
+
+    /**
+     *
+     * Composite path argument identifying a {@link MapEntryNode} leaf
+     * overal data tree.
+     *
+     */
+    public static final class NodeIdentifierWithPredicates implements PathArgument {
+
         /**\r
          *\r
-         */\r
-        private static final long serialVersionUID = -4787195606494761540L;\r
-\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 = ImmutableMap.copyOf(keyValues);\r
-        }\r
-\r
-        public NodeIdentifierWithPredicates(QName node, QName key, Object value) {\r
-            this.nodeType = node;\r
-            this.keyValues = ImmutableMap.of(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
-        @Override\r
-        public String toString() {\r
-            return nodeType + "[" + keyValues + "]";\r
-        }\r
+         */
+        private static final long serialVersionUID = -4787195606494761540L;
+
+        private final QName nodeType;
+        private final Map<QName, Object> keyValues;
+
+        public NodeIdentifierWithPredicates(QName node, Map<QName, Object> keyValues) {
+            this.nodeType = node;
+            this.keyValues = ImmutableMap.copyOf(keyValues);
+        }
+
+        public NodeIdentifierWithPredicates(QName node, QName key, Object value) {
+            this.nodeType = node;
+            this.keyValues = ImmutableMap.of(key, value);
+        }
+
+        @Override
+        public QName getNodeType() {
+            return nodeType;
+        }
+
+        public Map<QName, Object> getKeyValues() {
+            return keyValues;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + ((keyValues == null) ? 0 : keyValues.hashCode());
+            result = prime * result + ((nodeType == null) ? 0 : nodeType.hashCode());
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            NodeIdentifierWithPredicates other = (NodeIdentifierWithPredicates) obj;
+            if (keyValues == null) {
+                if (other.keyValues != null)
+                    return false;
+            } else if (!keyValues.equals(other.keyValues))
+                return false;
+            if (nodeType == null) {
+                if (other.nodeType != null)
+                    return false;
+            } else if (!nodeType.equals(other.nodeType))
+                return false;
+            return true;
+        }
+
+        @Override
+        public String toString() {
+            return nodeType + "[" + keyValues + "]";
+        }
     }
 
+    /**
+     * Simple path argument identifying a {@link LeafSetEntryNode} leaf
+     * overal data tree.
+     *
+     */
     public static final class NodeWithValue implements PathArgument {
 
-        /**
-         *
-         */
+       /**
+        *
+        * Composite path argument identifying a {@link AugmentationNode} leaf
+        * overal data tree.
+        *
+        */
         private static final long serialVersionUID = -3637456085341738431L;
 
         private final QName nodeType;
@@ -290,93 +329,126 @@ public class InstanceIdentifier implements Path<InstanceIdentifier>, Immutable,
             return nodeType + "[" + value + "]";
         }
 
-    }\r
-\r
-    private static class BuilderImpl implements InstanceIdentifierBuilder {\r
-\r
-        private final ImmutableList.Builder<PathArgument> path;\r
-\r
-        public BuilderImpl() {\r
-            path = ImmutableList.<PathArgument>builder();\r
-        }\r
-\r
-        public BuilderImpl(List<? extends PathArgument> prefix) {\r
-            path = ImmutableList.<PathArgument>builder();\r
-            path.addAll(prefix);\r
-        }\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 toInstance() {\r
-            return new InstanceIdentifier(path.build());\r
-        }\r
-\r
-        @Override\r
-        public InstanceIdentifier getIdentifier() {\r
-            return toInstance();\r
-        }\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
-        return true;\r
-    }\r
-\r
-    @Override\r
+    }
+
+
+    public static final class AugmentationIdentifier implements PathArgument {
+
+
+        private static final long serialVersionUID = -8122335594681936939L;
+        private final QName nodeType;
+        private final ImmutableSet<QName> childNames;
+
+        @Override
+        public QName getNodeType() {
+            return nodeType;
+        }
+
+        public AugmentationIdentifier(QName nodeType, Set<QName> childNames) {
+            super();
+            this.nodeType = nodeType;
+            this.childNames = ImmutableSet.copyOf(childNames);
+        }
+
+        public Set<QName> getPossibleChildNames() {
+            return childNames;
+        }
+
+    }
+
+    private static class BuilderImpl implements InstanceIdentifierBuilder {
+
+        private final ImmutableList.Builder<PathArgument> path;
+
+        public BuilderImpl() {
+            path = ImmutableList.<PathArgument> builder();
+        }
+
+        public BuilderImpl(List<? extends PathArgument> prefix) {
+            path = ImmutableList.<PathArgument> builder();
+            path.addAll(prefix);
+        }
+
+        @Override
+        public InstanceIdentifierBuilder node(QName nodeType) {
+            path.add(new NodeIdentifier(nodeType));
+            return this;
+        }
+
+        @Override
+        public InstanceIdentifierBuilder nodeWithKey(QName nodeType, QName key, Object value) {
+            path.add(new NodeIdentifierWithPredicates(nodeType, key, value));
+            return this;
+        }
+
+        @Override
+        public InstanceIdentifierBuilder nodeWithKey(QName nodeType, Map<QName, Object> keyValues) {
+            path.add(new NodeIdentifierWithPredicates(nodeType, keyValues));
+            return this;
+        }
+
+        @Override
+        @Deprecated
+        public InstanceIdentifier toInstance() {
+            return build();
+        }
+
+        @Override
+        public InstanceIdentifier build() {
+            return new InstanceIdentifier(path.build());
+        }
+
+        @Override
+        @Deprecated
+        public InstanceIdentifier getIdentifier() {
+            return build();
+        }
+    }
+
+    @Override
+    public boolean contains(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++) {
+            if (!path.get(i).equals(otherPath.get(i))) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    @Override
     public String toString() {
         /*
-         * The toStringCache is safe, since the object contract requires immutability
-         * of the object and all objects referenced from this object.
+         * The toStringCache is safe, since the object contract requires
+         * immutability of the object and all objects referenced from this
+         * object.
          *
-         * Used lists, maps are immutable. Path Arguments (elements) are also immutable,
-         * since the PathArgument contract requires immutability.
+         * Used lists, maps are immutable. Path Arguments (elements) are also
+         * immutable, since the PathArgument contract requires immutability.
          *
-         * The cache is thread-safe - if multiple computations occurs at the same time,
-         * cache will be overwritten with same result.
-         */\r
-        if (toStringCache != null) {\r
-            return toStringCache;\r
-        }\r
-        StringBuilder builder = new StringBuilder();\r
-        for (PathArgument argument : path) {\r
-            builder.append("/");\r
-            builder.append(argument.toString());\r
-        }\r
-        toStringCache = builder.toString();\r
-        return toStringCache;\r
-    }\r
-\r
-    public static InstanceIdentifierBuilder builder(QName node) {\r
-        return builder().node(node);\r
-    }\r
-}\r
+         * The cache is thread-safe - if multiple computations occurs at the
+         * same time, cache will be overwritten with same result.
+         */
+        if (toStringCache != null) {
+            return toStringCache;
+        }
+        StringBuilder builder = new StringBuilder();
+        for (PathArgument argument : path) {
+            builder.append("/");
+            builder.append(argument.toString());
+        }
+        toStringCache = builder.toString();
+        return toStringCache;
+    }
+
+    public static InstanceIdentifierBuilder builder(QName node) {
+        return builder().node(node);
+    }
+}
index 105981ac2a6d2bf071761221fbf7e880e93c035b..f14cba12e4ab66365203da4ad76c16782d501117 100755 (executable)
@@ -15,12 +15,13 @@ import java.util.List;
  *
  */
 public interface MutableCompositeNode extends MutableNode<List<Node<?>>>, CompositeNode {
-    
+
     /**
      * update internal map
      */
+    @Deprecated
     void init();
-    
+
     /**
      * @return original node, if available
      */
index 3e4e0a9bb2c2dcdbc19278870cb44973d415ac54..adfb5fb1cbc0c81a230ee7c8d15342a9c842fee5 100755 (executable)
@@ -7,26 +7,29 @@
  */\r
 package org.opendaylight.yangtools.yang.data.api;\r
 \r
+import org.opendaylight.yangtools.concepts.Mutable;\r
+\r
 \r
 /**\r
  * Base representation of node in the data tree, defines basic parameters of\r
  * node such as a QName.\r
- * \r
- * \r
+ *\r
+ *\r
  * @param <T>\r
  */\r
-public interface MutableNode<T> extends Node<T> {\r
+public interface MutableNode<T> extends Node<T>,Mutable {\r
 \r
     /**\r
      * @param parent value to set\r
      */\r
     void setParent(CompositeNode parent);\r
-    \r
+\r
     /**\r
      * @param value value to set (children list or leaf value)\r
      */\r
+    @Override\r
     T setValue(T value);\r
-    \r
+\r
     /**\r
      * @param action value to set\r
      */\r
index 3515413f26225903b08799845d59b2583ada71e7..ccd0871793f80cbcdff13546aef2e102cfc25ddb 100644 (file)
@@ -32,6 +32,7 @@ public interface Node<T> extends Entry<QName, T> {
      *\r
      * @return parent node\r
      */\r
+    @Deprecated\r
     CompositeNode getParent();\r
 \r
     /**\r
@@ -40,5 +41,6 @@ public interface Node<T> extends Entry<QName, T> {
      *\r
      * @return Returns the value that holds current node.\r
      */\r
+    @Override\r
     T getValue();\r
 }\r
index 0dc5d6ac03f0811028fcaafb7c2998b7f75d4d1e..3774771818f10e55b3da4a77dc501ca91b4135b6 100755 (executable)
@@ -9,8 +9,9 @@ package org.opendaylight.yangtools.yang.data.api;
 \r
 /**\r
  * @author michal.rehak\r
- * \r
+ *\r
  */\r
+@Deprecated\r
 public interface NodeModification {\r
 \r
     /**\r
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AugmentationNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AugmentationNode.java
new file mode 100644 (file)
index 0000000..babba07
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2014 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.data.api.schema;
+
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.AugmentationIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
+
+import com.google.common.base.Optional;
+
+
+/**
+ *
+ * Node representing Augmentation.
+ *
+ * Augmentation node MUST NOT be direct child of other augmentation node.
+ *
+ */
+public interface AugmentationNode extends //
+    MixinNode, //
+    DataContainerNode<AugmentationIdentifier> {
+
+
+    @Override
+    public Iterable<DataContainerChild<?, ?>> getValue();
+
+
+    @Override
+    public Optional<DataContainerChild<?, ?>> getChild(PathArgument child);
+
+    @Override
+    public AugmentationIdentifier getIdentifier();
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/ChoiceNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/ChoiceNode.java
new file mode 100644 (file)
index 0000000..d1dd33b
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2014 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.data.api.schema;
+
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
+
+import com.google.common.base.Optional;
+
+/**
+ *
+ * Node representing choice.
+ *
+ * @author Tony Tkacik
+ *
+ */
+public interface ChoiceNode extends //
+        MixinNode, //
+        DataContainerNode<NodeIdentifier> {
+
+    @Override
+    public NodeIdentifier getIdentifier();
+
+    @Override
+    public Optional<DataContainerChild<?, ?>> getChild(PathArgument child);
+
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/ContainerNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/ContainerNode.java
new file mode 100644 (file)
index 0000000..e1acb55
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2014 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.data.api.schema;
+
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
+
+import com.google.common.base.Optional;
+
+public interface ContainerNode extends //
+        DataContainerNode<NodeIdentifier> {
+
+    @Override
+    public NodeIdentifier getIdentifier();
+
+    @Override
+    public Optional<DataContainerChild<?, ?>> getChild(PathArgument child);
+
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/DataContainerChild.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/DataContainerChild.java
new file mode 100644 (file)
index 0000000..f60dc98
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2014 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.data.api.schema;
+
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
+
+/**
+ *
+ * Marker interface for direct children of {@link DataContainerNode}.
+ *
+ * Implementation notes:
+ * This interface should not be implemented directly, but rather using one
+ * of its subinterfaces:
+ *
+ *
+ * {@link LeafNode}
+ * {@link ContainerNode}
+ * {@link ChoiceNode}
+ * {@link MapNode}
+ * {@link AugmentationNode}
+ *
+ * @param <K>
+ * @param <V>
+ */
+public interface DataContainerChild<K extends PathArgument,V> extends NormalizedNode<K, V> {
+
+    @Override
+    public K getIdentifier();
+
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/DataContainerNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/DataContainerNode.java
new file mode 100644 (file)
index 0000000..683f815
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 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.data.api.schema;
+
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
+
+import com.google.common.base.Optional;
+
+public interface DataContainerNode<K extends PathArgument> extends //
+        NormalizedNodeContainer<K, PathArgument, DataContainerChild<? extends PathArgument, ?>> {
+
+    @Override
+    public K getIdentifier();
+
+    @Override
+    public Iterable<DataContainerChild<?, ?>> getValue();
+
+    @Override
+    public Optional<DataContainerChild<?, ?>> getChild(PathArgument child);
+
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/LeafNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/LeafNode.java
new file mode 100644 (file)
index 0000000..9347bdc
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2014 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.data.api.schema;
+
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier;
+
+public interface LeafNode<T> extends //
+        DataContainerChild<NodeIdentifier, T> {
+
+    @Override
+    public NodeIdentifier getIdentifier();
+
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/LeafSetEntryNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/LeafSetEntryNode.java
new file mode 100644 (file)
index 0000000..3209b5e
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2014 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.data.api.schema;
+
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeWithValue;
+
+public interface LeafSetEntryNode<T> extends NormalizedNode<NodeWithValue, T> {
+
+    @Override
+    public NodeWithValue getIdentifier();
+
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/LeafSetNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/LeafSetNode.java
new file mode 100644 (file)
index 0000000..a738cc6
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2014 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.data.api.schema;
+
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeWithValue;
+
+import com.google.common.base.Optional;
+
+public interface LeafSetNode<T> extends
+    MixinNode, //
+    DataContainerChild<NodeIdentifier, Iterable<LeafSetEntryNode<T>>>, //
+    NormalizedNodeContainer<NodeIdentifier, NodeWithValue,LeafSetEntryNode<T>> {
+
+    @Override
+    public NodeIdentifier getIdentifier();
+
+    @Override
+    public Iterable<LeafSetEntryNode<T>> getValue();
+
+
+    @Override
+    public Optional<LeafSetEntryNode<T>> getChild(NodeWithValue child);
+
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MapEntryNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MapEntryNode.java
new file mode 100644 (file)
index 0000000..69e9dd9
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2014 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.data.api.schema;
+
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates;
+
+public interface MapEntryNode extends DataContainerNode<NodeIdentifierWithPredicates> {
+
+    @Override
+    public NodeIdentifierWithPredicates getIdentifier();
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MapNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MapNode.java
new file mode 100644 (file)
index 0000000..eab5a12
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2014 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.data.api.schema;
+
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates;
+
+/**
+ * Containment node, which contains {@link MapEntryNode} of the same type.
+ *
+ * This node maps to the list node in YANG schema.
+ *
+ */
+public interface MapNode extends //
+        MixinNode,
+        DataContainerChild<NodeIdentifier, Iterable<MapEntryNode>>,
+        NormalizedNodeContainer<NodeIdentifier, NodeIdentifierWithPredicates, MapEntryNode> {
+
+    @Override
+    public NodeIdentifier getIdentifier();
+
+
+
+
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MixinNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MixinNode.java
new file mode 100644 (file)
index 0000000..f0d8e40
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2014 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.data.api.schema;
+
+/**
+ *
+ * Marker interface for nodes, which are mixins - their content
+ * belongs to parent node and in serialized form this node
+ * does not exists, but it's children are present.
+ *
+ */
+public interface MixinNode {
+
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedNode.java
new file mode 100644 (file)
index 0000000..1a91570
--- /dev/null
@@ -0,0 +1,47 @@
+package org.opendaylight.yangtools.yang.data.api.schema;
+
+import org.opendaylight.yangtools.concepts.Identifiable;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.Node;
+
+/**
+ *
+ * Node which is normalized according to the YANG schema
+ * is identifiable by {@link InstanceIdentifier}.
+ *
+ *
+ * @author Tony Tkacik
+ *
+ * @param <K> Local identifier of node
+ * @param <V> Value of node
+ */
+public interface NormalizedNode<K extends InstanceIdentifier.PathArgument,V> extends
+    Identifiable<K>, //
+    Node<V> {
+
+    /**
+     *
+     * QName of the node as defined in YANG schema.
+     *
+     */
+    @Override
+    public QName getNodeType();
+
+    /**
+     *
+     * Locally unique identifier of nodes
+     *
+     */
+    @Override
+    public K getIdentifier();
+
+    /**
+     *
+     * Value of node
+     *
+     */
+    @Override
+    public V getValue();
+
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedNodeContainer.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedNodeContainer.java
new file mode 100644 (file)
index 0000000..841f5b5
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2014 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.data.api.schema;
+
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
+
+import com.google.common.base.Optional;
+
+/**
+ *
+ * @param <I> Node Identifier type
+ * @param <K> Child Node Identifier type
+ * @param <V> Child Node type
+ */
+public interface NormalizedNodeContainer<I extends PathArgument, K extends PathArgument, V extends NormalizedNode<? extends K, ?>>
+        extends NormalizedNode<I, Iterable<V>> {
+
+    @Override
+    public I getIdentifier();
+
+    @Override
+    public Iterable<V> getValue();
+
+    /**
+     *
+     *
+     * @param child
+     * @return
+     */
+    Optional<V> getChild(K child);
+}