From 2f84ab989352d583f22557d524b1469ffd582cf1 Mon Sep 17 00:00:00 2001 From: Maros Marsalek Date: Tue, 27 Jan 2015 17:39:09 +0100 Subject: [PATCH] Add notification support to SchemaTracker This allows serialization of notification from NormalizedNode writer Change-Id: Id3fdf415aef7ceae271bbc187ba578f37434e90b Signed-off-by: Maros Marsalek --- .../gson/JSONNormalizedNodeStreamWriter.java | 16 ++++--- .../yang/data/impl/codec/SchemaTracker.java | 46 ++++++++++++++++--- 2 files changed, 49 insertions(+), 13 deletions(-) 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 087a996559..53c8d5439e 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 @@ -11,6 +11,9 @@ import com.google.common.base.CharMatcher; import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.gson.stream.JsonWriter; +import java.io.IOException; +import java.io.Writer; +import java.net.URI; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; @@ -21,12 +24,9 @@ import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; -import java.io.IOException; -import java.io.Writer; -import java.net.URI; - /** * This implementation will create JSON output as output stream. * @@ -161,8 +161,12 @@ public class JSONNormalizedNodeStreamWriter implements NormalizedNodeStreamWrite @SuppressWarnings("unused") @Override public void startContainerNode(final NodeIdentifier name, final int childSizeHint) throws IOException { - final ContainerSchemaNode schema = tracker.startContainerNode(name); - context = new JSONStreamWriterNamedObjectContext(context, name, DEFAULT_EMIT_EMPTY_CONTAINERS || schema.isPresenceContainer()); + final SchemaNode schema = tracker.startContainerNode(name); + + final boolean isPresence = schema instanceof ContainerSchemaNode ? + ((ContainerSchemaNode) schema).isPresenceContainer() : DEFAULT_EMIT_EMPTY_CONTAINERS; + + context = new JSONStreamWriterNamedObjectContext(context, name, isPresence); } @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 cd7e6d706c..725c115afb 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 @@ -8,7 +8,10 @@ package org.opendaylight.yangtools.yang.data.impl.codec; import com.google.common.annotations.Beta; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; import java.io.IOException; import java.util.ArrayDeque; import java.util.Deque; @@ -31,6 +34,7 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; +import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; @@ -48,15 +52,20 @@ public final class SchemaTracker { private final DataNodeContainer root; private SchemaTracker(final SchemaContext context, final SchemaPath path) { - DataSchemaNode current = Preconditions.checkNotNull(context); - for (QName qname : path.getPathFromRoot()) { - final DataSchemaNode child; + SchemaNode current = Preconditions.checkNotNull(context); + for (final QName qname : path.getPathFromRoot()) { + SchemaNode child; if(current instanceof DataNodeContainer) { child = ((DataNodeContainer) current).getDataChildByName(qname); + + if(child == null && current instanceof SchemaContext) { + child = tryFindNotification((SchemaContext) current, qname) + .orNull(); + } } else if (current instanceof ChoiceNode) { child = ((ChoiceNode) current).getCaseNodeByName(qname); } else { - throw new IllegalArgumentException(String.format("Schema node %s does not allow children.",current)); + throw new IllegalArgumentException(String.format("Schema node %s does not allow children.", current)); } current = child; } @@ -64,6 +73,10 @@ public final class SchemaTracker { this.root = (DataNodeContainer) current; } + private Optional tryFindNotification(final SchemaContext ctx, final QName qname) { + return Optional.fromNullable(Iterables.find(ctx.getNotifications(), new SchemaNodePredicate(qname), null)); + } + /** * Create a new writer with the specified context as its root. * @@ -100,6 +113,9 @@ public final class SchemaTracker { if(parent instanceof DataNodeContainer) { schema = ((DataNodeContainer)parent).getDataChildByName(qname); + if(schema == null && parent instanceof NotificationDefinition) { + schema = ((NotificationDefinition) parent); + } } else if(parent instanceof ChoiceNode) { for(ChoiceCaseNode caze : ((ChoiceNode) parent).getCases()) { DataSchemaNode potential = caze.getDataChildByName(qname); @@ -158,13 +174,16 @@ public final class SchemaTracker { return (ChoiceNode)schema; } - public ContainerSchemaNode startContainerNode(final NodeIdentifier name) { + public SchemaNode startContainerNode(final NodeIdentifier name) { LOG.debug("Enter container {}", name); final SchemaNode schema = getSchema(name); - Preconditions.checkArgument(schema instanceof ContainerSchemaNode, "Node %s is not a container", schema.getPath()); + boolean isAllowed = schema instanceof ContainerSchemaNode; + isAllowed |= schema instanceof NotificationDefinition; + + Preconditions.checkArgument(isAllowed, "Node %s is not a container nor a notification", schema.getPath()); schemaStack.push(schema); - return (ContainerSchemaNode)schema; + return schema; } public AugmentationSchema startAugmentationNode(final AugmentationIdentifier identifier) { @@ -193,4 +212,17 @@ public final class SchemaTracker { public Object endNode() { return schemaStack.pop(); } + + private static final class SchemaNodePredicate implements Predicate { + private final QName qname; + + public SchemaNodePredicate(final QName qname) { + this.qname = qname; + } + + @Override + public boolean apply(final SchemaNode input) { + return input.getQName().equals(qname); + } + } } -- 2.36.6