From: Ajay Date: Mon, 25 Jul 2016 07:48:01 +0000 (+0000) Subject: Bug-6195: Fix issue with leafSetEntryNode in SchemaTracker X-Git-Tag: release/boron~36 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=746a859fcc4538e7ad2fcc8b51e8ff126206c829;p=yangtools.git Bug-6195: Fix issue with leafSetEntryNode in SchemaTracker 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 --- diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java index b869f5c399..272685cb30 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java @@ -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 codec = codecs.codecFor(schema); context.emittingChild(codecs.getSchemaContext(), writer); writeValue(value, codec); diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java index c6b87362a1..5072d50786 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java @@ -111,13 +111,13 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm @Override public void leafSetEntryNode(final QName name, final Object value, final Map 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 diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java index 79463d0319..1f6adf8bf9 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java @@ -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); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java index 5a0d6c5b15..c816cfa4c7 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java @@ -91,13 +91,13 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm @Override public void leafSetEntryNode(final QName name, final Object value, final Map 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 diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaUtils.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaUtils.java index e4b923c2db..84f7284aee 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaUtils.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaUtils.java @@ -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 tryFindGroupings(final SchemaContext ctx, final QName qname) {