Bug-6195: Fix issue with leafSetEntryNode in SchemaTracker 45/42445/3
authorAjay <ajayl.bro@gmail.com>
Mon, 25 Jul 2016 07:48:01 +0000 (07:48 +0000)
committerTony Tkacik <ttkacik@cisco.com>
Fri, 29 Jul 2016 11:44:26 +0000 (11:44 +0000)
Changed SchemaTracker:leafSetEntryNode so that if LeafSetEntryNode
is present without it's parent LeafEntryNode in data-change notification,
it's serialization is handled properly.

Change-Id: I911eef98898f2269b31378b383617373c1b47903
Signed-off-by: Ajay <ajayl.bro@gmail.com>
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaUtils.java

index b869f5c3990d60925e9e01e0f422014168f8e348..272685cb3041d8c1c6d72933dc80c37a525dac2a 100644 (file)
@@ -106,7 +106,7 @@ public final class JSONNormalizedNodeStreamWriter implements NormalizedNodeStrea
 
     @Override
     public void leafSetEntryNode(final QName name, final Object value) throws IOException {
-        final LeafListSchemaNode schema = tracker.leafSetEntryNode();
+        final LeafListSchemaNode schema = tracker.leafSetEntryNode(name);
         final JSONCodec<Object> codec = codecs.codecFor(schema);
         context.emittingChild(codecs.getSchemaContext(), writer);
         writeValue(value, codec);
index c6b87362a11758f269bcf87224cf36cf4551af64..5072d50786c7ec293e8e35e2f43ee5a93b163713 100644 (file)
@@ -111,13 +111,13 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
     @Override
     public void leafSetEntryNode(final QName name, final Object value, final Map<QName, String> attributes)
             throws IOException {
-        final LeafListSchemaNode schema = tracker.leafSetEntryNode();
+        final LeafListSchemaNode schema = tracker.leafSetEntryNode(name);
         writeElement(schema.getQName(), value, attributes, schema);
     }
 
     @Override
     public void leafSetEntryNode(final QName name, final Object value) throws IOException {
-        final LeafListSchemaNode schema = tracker.leafSetEntryNode();
+        final LeafListSchemaNode schema = tracker.leafSetEntryNode(name);
         writeElement(schema.getQName(), value, Collections.emptyMap(), schema);
     }
     @Override
index 79463d031951bd648ee8d28494e2b74c91bd7df6..1f6adf8bf96496a94f53692d309a61d0b203f80c 100644 (file)
@@ -160,6 +160,7 @@ public final class SchemaTracker {
         return (LeafListSchemaNode)schema;
     }
 
+    @Deprecated
     public LeafListSchemaNode leafSetEntryNode() {
         final Object parent = getParent();
 
@@ -167,6 +168,18 @@ public final class SchemaTracker {
         return (LeafListSchemaNode) parent;
     }
 
+    public LeafListSchemaNode leafSetEntryNode(final QName qname) {
+        final Object parent = getParent();
+        if (parent instanceof LeafListSchemaNode) {
+            return (LeafListSchemaNode) parent;
+        } else {
+            final SchemaNode child = SchemaUtils.findChildSchemaByQName((SchemaNode) parent, qname);
+            Preconditions.checkArgument(child instanceof LeafListSchemaNode,
+                    "Node %s is neither a leaf-list nor currently in a leaf-list", child.getPath());
+            return (LeafListSchemaNode) child;
+        }
+    }
+
     public ChoiceSchemaNode startChoiceNode(final NodeIdentifier name) {
         LOG.debug("Enter choice {}", name);
         final SchemaNode schema = getSchema(name);
index 5a0d6c5b15be4d8b6f9eaa23ab33582ac9712bc2..c816cfa4c70a0e69ac6a02dbab36f45b607ffe1b 100644 (file)
@@ -91,13 +91,13 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
     @Override
     public void leafSetEntryNode(final QName name, final Object value, final Map<QName, String> attributes)
             throws IOException {
-        final LeafListSchemaNode schema = tracker.leafSetEntryNode();
+        final LeafListSchemaNode schema = tracker.leafSetEntryNode(name);
         writeElement(schema.getQName(), value, attributes, schema);
     }
 
     @Override
     public void leafSetEntryNode(final QName name, final Object value) throws IOException {
-        final LeafListSchemaNode schema = tracker.leafSetEntryNode();
+        final LeafListSchemaNode schema = tracker.leafSetEntryNode(name);
         writeElement(schema.getQName(), value, Collections.emptyMap(), schema);
     }
     @Override
index e4b923c2dbbe40a80cda99b23eca332cbeb24a1d..84f7284aeeb23860788f4fe87fb357d890a7ce01 100644 (file)
@@ -412,38 +412,51 @@ public final class SchemaUtils {
     public static SchemaNode findParentSchemaOnPath(final SchemaContext schemaContext, final SchemaPath path) {
         SchemaNode current = Preconditions.checkNotNull(schemaContext);
         for (final QName qname : path.getPathFromRoot()) {
-            SchemaNode child;
-            if (current instanceof DataNodeContainer) {
-                child = ((DataNodeContainer) current).getDataChildByName(qname);
+            current = findChildSchemaByQName(current, qname);
+        }
+        return current;
+    }
 
-                if (child == null && current instanceof SchemaContext) {
-                    child = tryFindGroupings((SchemaContext) current, qname).orNull();
-                }
+    /**
+     * Find child schema node identified by its QName within a provided schema node.
+     * @param node schema node
+     * @param qname QName
+     * @return child schema node
+     * @throws java.lang.IllegalArgumentException if the schema node does not allow children
+     */
+    public static SchemaNode findChildSchemaByQName(final SchemaNode node, final QName qname) {
+        SchemaNode child = null;
 
-                if (child == null && current instanceof SchemaContext) {
-                    child = tryFindNotification((SchemaContext) current, qname)
-                            .or(tryFindRpc(((SchemaContext) current), qname)).orNull();
-                }
-            } else if (current instanceof ChoiceSchemaNode) {
-                child = ((ChoiceSchemaNode) current).getCaseNodeByName(qname);
-            } else if (current instanceof RpcDefinition) {
-                switch (qname.getLocalName()) {
-                    case "input":
-                        child = ((RpcDefinition) current).getInput();
-                        break;
-                    case "output":
-                        child = ((RpcDefinition) current).getOutput();
-                        break;
-                    default:
-                        child = null;
-                        break;
-                }
-            } else {
-                throw new IllegalArgumentException(String.format("Schema node %s does not allow children.", current));
+        if (node instanceof DataNodeContainer) {
+            child = ((DataNodeContainer) node).getDataChildByName(qname);
+
+            if (child == null && node instanceof SchemaContext) {
+                child = tryFindGroupings((SchemaContext) node, qname).orNull();
+            }
+
+            if (child == null && node instanceof SchemaContext) {
+                child = tryFindNotification((SchemaContext) node, qname)
+                        .or(tryFindRpc(((SchemaContext) node), qname)).orNull();
             }
-            current = child;
+        } else if (node instanceof ChoiceSchemaNode) {
+            child = ((ChoiceSchemaNode) node).getCaseNodeByName(qname);
+        } else if (node instanceof RpcDefinition) {
+            switch (qname.getLocalName()) {
+                case "input":
+                    child = ((RpcDefinition) node).getInput();
+                    break;
+                case "output":
+                    child = ((RpcDefinition) node).getOutput();
+                    break;
+                default:
+                    child = null;
+                    break;
+            }
+        } else {
+            throw new IllegalArgumentException(String.format("Schema node %s does not allow children.", node));
         }
-        return current;
+
+        return child;
     }
 
     private static Optional<SchemaNode> tryFindGroupings(final SchemaContext ctx, final QName qname) {