Allow {Json,Xml}ParserStream to handle actions 73/79773/4
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 20 Jan 2019 18:25:12 +0000 (19:25 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 21 Jan 2019 09:45:24 +0000 (10:45 +0100)
Generalize the support for RPCs to include actions, so that we can
use both. Also fix null handling to comply with javadoc.

Change-Id: Id84052c1d1f20aa9d0371015f01b0c8845152de2
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 80ae3a4d7f12024341ef4900b4d672c17abd0262)

yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/OperationAsContainer.java [new file with mode: 0644]
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/RpcAsContainer.java

index 15925d29eeca17910ca2f729ffb2d57fe81c37cb..3616de515b1408691c1f2f93c6ac00d2fa784bbc 100644 (file)
@@ -43,15 +43,15 @@ import org.opendaylight.yangtools.yang.data.util.LeafListNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.LeafNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.ListEntryNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.ListNodeDataWithSchema;
+import org.opendaylight.yangtools.yang.data.util.OperationAsContainer;
 import org.opendaylight.yangtools.yang.data.util.ParserStreamUtils;
-import org.opendaylight.yangtools.yang.data.util.RpcAsContainer;
 import org.opendaylight.yangtools.yang.data.util.SimpleNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
+import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
@@ -89,7 +89,7 @@ public final class JsonParserStream implements Closeable, Flushable {
      * @return A new {@link JsonParserStream}
      * @throws NullPointerException if any of the arguments are null
      */
-    public static JsonParserStream create(final @NonNull NormalizedNodeStreamWriter writer,
+    public static @NonNull JsonParserStream create(final @NonNull NormalizedNodeStreamWriter writer,
             final @NonNull JSONCodecFactory codecFactory) {
         return new JsonParserStream(writer, codecFactory, codecFactory.getSchemaContext());
     }
@@ -104,14 +104,17 @@ public final class JsonParserStream implements Closeable, Flushable {
      * @return A new {@link JsonParserStream}
      * @throws NullPointerException if any of the arguments are null
      */
-    public static JsonParserStream create(final @NonNull NormalizedNodeStreamWriter writer,
+    public static @NonNull JsonParserStream create(final @NonNull NormalizedNodeStreamWriter writer,
             final @NonNull JSONCodecFactory codecFactory, final @NonNull SchemaNode parentNode) {
-        if (parentNode instanceof RpcDefinition) {
-            return new JsonParserStream(writer, codecFactory, new RpcAsContainer((RpcDefinition) parentNode));
+        final DataSchemaNode parent;
+        if (parentNode instanceof DataSchemaNode) {
+            parent = (DataSchemaNode) parentNode;
+        } else if (parentNode instanceof OperationDefinition) {
+            parent = OperationAsContainer.of((OperationDefinition) parentNode);
+        } else {
+            throw new IllegalArgumentException("Illegal parent node " + requireNonNull(parentNode));
         }
-        checkArgument(parentNode instanceof DataSchemaNode, "An instance of DataSchemaNode is expected, %s supplied",
-            parentNode);
-        return new JsonParserStream(writer, codecFactory, (DataSchemaNode) parentNode);
+        return new JsonParserStream(writer, codecFactory, parent);
     }
 
     /**
@@ -125,8 +128,7 @@ public final class JsonParserStream implements Closeable, Flushable {
      *
      * @deprecated Use {@link #create(NormalizedNodeStreamWriter, JSONCodecFactory)} instead.
      */
-    @Deprecated
-    public static JsonParserStream create(final @NonNull NormalizedNodeStreamWriter writer,
+    @Deprecated public static @NonNull JsonParserStream create(final @NonNull NormalizedNodeStreamWriter writer,
             final @NonNull SchemaContext schemaContext) {
         return create(writer, JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.getShared(schemaContext));
     }
@@ -143,8 +145,7 @@ public final class JsonParserStream implements Closeable, Flushable {
      *
      * @deprecated Use {@link #create(NormalizedNodeStreamWriter, JSONCodecFactory, SchemaNode)} instead.
      */
-    @Deprecated
-    public static JsonParserStream create(final @NonNull NormalizedNodeStreamWriter writer,
+    @Deprecated public static @NonNull JsonParserStream create(final @NonNull NormalizedNodeStreamWriter writer,
             final @NonNull SchemaContext schemaContext, final @NonNull SchemaNode parentNode) {
         return create(writer, JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.getShared(schemaContext),
             parentNode);
index 2b342a30f5bd333ee5365d768efd0eabbdc6ec49..00dd5f973a56dba826686b66e624def79b053115 100644 (file)
@@ -51,8 +51,8 @@ import org.opendaylight.yangtools.yang.data.util.LeafListNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.LeafNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.ListEntryNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.ListNodeDataWithSchema;
+import org.opendaylight.yangtools.yang.data.util.OperationAsContainer;
 import org.opendaylight.yangtools.yang.data.util.ParserStreamUtils;
-import org.opendaylight.yangtools.yang.data.util.RpcAsContainer;
 import org.opendaylight.yangtools.yang.data.util.SimpleNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.YangModeledAnyXmlNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
@@ -61,7 +61,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.RpcDefinition;
+import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
@@ -119,11 +119,15 @@ public final class XmlParserStream implements Closeable, Flushable {
      */
     public static XmlParserStream create(final NormalizedNodeStreamWriter writer, final XmlCodecFactory codecs,
             final SchemaNode parentNode, final boolean strictParsing) {
-        if (parentNode instanceof RpcDefinition) {
-            return new XmlParserStream(writer, codecs, new RpcAsContainer((RpcDefinition) parentNode), strictParsing);
+        final DataSchemaNode parent;
+        if (parentNode instanceof DataSchemaNode) {
+            parent = (DataSchemaNode) parentNode;
+        } else if (parentNode instanceof OperationDefinition) {
+            parent = OperationAsContainer.of((OperationDefinition) parentNode);
+        } else {
+            throw new IllegalArgumentException("Illegal parent node " + parentNode);
         }
-        checkArgument(parentNode instanceof DataSchemaNode, "Instance of DataSchemaNode class awaited.");
-        return new XmlParserStream(writer, codecs, (DataSchemaNode) parentNode, strictParsing);
+        return new XmlParserStream(writer, codecs, parent, strictParsing);
     }
 
     /**
diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/OperationAsContainer.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/OperationAsContainer.java
new file mode 100644 (file)
index 0000000..1d2c3fa
--- /dev/null
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2016 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.util;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ForwardingObject;
+import com.google.common.collect.ImmutableSet;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
+import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
+import org.opendaylight.yangtools.yang.model.api.MustDefinition;
+import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
+import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
+import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.Status;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.UsesNode;
+
+@Beta
+public class OperationAsContainer extends ForwardingObject implements ContainerSchemaNode, OperationDefinition {
+    private final OperationDefinition delegate;
+
+    OperationAsContainer(final OperationDefinition parentNode) {
+        delegate = requireNonNull(parentNode);
+    }
+
+    public static OperationAsContainer of(final OperationDefinition delegate) {
+        return new OperationAsContainer(delegate);
+    }
+
+    @Override
+    protected final OperationDefinition delegate() {
+        return delegate;
+    }
+
+    @Override
+    public final Optional<String> getDescription() {
+        return delegate.getDescription();
+    }
+
+    @Override
+    public final Optional<String> getReference() {
+        return delegate.getReference();
+    }
+
+    @Override
+    public final Set<TypeDefinition<?>> getTypeDefinitions() {
+        return delegate.getTypeDefinitions();
+    }
+
+    @Override
+    public final Set<GroupingDefinition> getGroupings() {
+        return delegate.getGroupings();
+    }
+
+    @Override
+    public final Status getStatus() {
+        return delegate.getStatus();
+    }
+
+    @Override
+    public final ContainerSchemaNode getInput() {
+        return delegate.getInput();
+    }
+
+    @Override
+    public final ContainerSchemaNode getOutput() {
+        return delegate.getOutput();
+    }
+
+    @Override
+    public final QName getQName() {
+        return delegate.getQName();
+    }
+
+    @Override
+    public final SchemaPath getPath() {
+        return delegate.getPath();
+    }
+
+    @Override
+    public final Optional<DataSchemaNode> findDataChildByName(final QName name) {
+        // FIXME: 3.0.0: check QNameModule
+        switch (name.getLocalName()) {
+            case "input":
+                return Optional.of(delegate.getInput());
+            case "output":
+                return Optional.of(delegate.getOutput());
+            default:
+                return Optional.empty();
+        }
+    }
+
+    @Override
+    public Set<UsesNode> getUses() {
+        return ImmutableSet.of();
+    }
+
+    @Override
+    public final Set<AugmentationSchemaNode> getAvailableAugmentations() {
+        return ImmutableSet.of();
+    }
+
+    @Override
+    public final boolean isPresenceContainer() {
+        return false;
+    }
+
+    @Override
+    public final Collection<DataSchemaNode> getChildNodes() {
+        final List<DataSchemaNode> ret = new ArrayList<>();
+        final ContainerSchemaNode input = getInput();
+        final ContainerSchemaNode output = getOutput();
+        if (input != null) {
+            ret.add(input);
+        }
+        if (output != null) {
+            ret.add(output);
+        }
+        return ret;
+    }
+
+    @Deprecated
+    @Override
+    public final boolean isAugmenting() {
+        return false;
+    }
+
+    @Deprecated
+    @Override
+    public final boolean isAddedByUses() {
+        return false;
+    }
+
+    @Override
+    public final boolean isConfiguration() {
+        return false;
+    }
+
+    @Override
+    public final Set<ActionDefinition> getActions() {
+        return ImmutableSet.of();
+    }
+
+    @Override
+    public final Set<NotificationDefinition> getNotifications() {
+        return ImmutableSet.of();
+    }
+
+    @Override
+    public final Collection<MustDefinition> getMustConstraints() {
+        return ImmutableSet.of();
+    }
+
+    @Override
+    public final Optional<RevisionAwareXPath> getWhenCondition() {
+        return Optional.empty();
+    }
+}
index b524271f1479c0cb1eec23667a54fabed2df7451..1078cf4c4fdce4b28dad322ce2c3e691b9805ff2 100644 (file)
  */
 package org.opendaylight.yangtools.yang.data.util;
 
-import com.google.common.collect.ImmutableSet;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import javax.annotation.Nonnull;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
-import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
-import org.opendaylight.yangtools.yang.model.api.MustDefinition;
-import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
-import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.model.api.Status;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.UsesNode;
 
-public final class RpcAsContainer implements ContainerSchemaNode {
-
-    private final RpcDefinition delegate;
-
-    @Override
-    public Optional<String> getDescription() {
-        return delegate.getDescription();
-    }
-
-    @Override
-    public Optional<String> getReference() {
-        return delegate.getReference();
-    }
-
-    @Override
-    public Set<TypeDefinition<?>> getTypeDefinitions() {
-        return delegate.getTypeDefinitions();
-    }
-
-    @Override
-    public Set<GroupingDefinition> getGroupings() {
-        return delegate.getGroupings();
-    }
-
-    @Nonnull
-    @Override
-    public Status getStatus() {
-        return delegate.getStatus();
-    }
-
-    public ContainerSchemaNode getInput() {
-        return delegate.getInput();
-    }
-
-    public ContainerSchemaNode getOutput() {
-        return delegate.getOutput();
-    }
-
-    public RpcAsContainer(final RpcDefinition parentNode) {
-        delegate = parentNode;
-    }
-
-    @Nonnull
-    @Override
-    public QName getQName() {
-        return delegate.getQName();
-    }
-
-    @Nonnull
-    @Override
-    public SchemaPath getPath() {
-        return delegate.getPath();
-    }
-
-    @Nonnull
-    @Override
-    public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public Optional<DataSchemaNode> findDataChildByName(final QName name) {
-        // FIXME: check QNameModule
-        switch (name.getLocalName()) {
-            case "input":
-                return Optional.of(delegate.getInput());
-            case "output":
-                return Optional.of(delegate.getOutput());
-            default:
-                return Optional.empty();
-        }
-    }
-
-    @Override
-    public Set<UsesNode> getUses() {
-        return Collections.emptySet();
-    }
-
-    @Override
-    public Set<AugmentationSchemaNode> getAvailableAugmentations() {
-        return Collections.emptySet();
-    }
-
-    @Override
-    public boolean isPresenceContainer() {
-        return false;
-    }
-
-    @Override
-    public Collection<DataSchemaNode> getChildNodes() {
-        final List<DataSchemaNode> ret = new ArrayList<>();
-        final ContainerSchemaNode input = getInput();
-        final ContainerSchemaNode output = getOutput();
-        if (input != null) {
-            ret.add(input);
-        }
-        if (output != null) {
-            ret.add(output);
-        }
-        return ret;
-    }
-
-    @Deprecated
-    @Override
-    public boolean isAugmenting() {
-        return false;
-    }
-
-    @Deprecated
-    @Override
-    public boolean isAddedByUses() {
-        return false;
-    }
-
-    @Override
-    public boolean isConfiguration() {
-        return false;
-    }
-
-    @Override
-    public Set<ActionDefinition> getActions() {
-        return ImmutableSet.of();
-    }
-
-    @Override
-    public Set<NotificationDefinition> getNotifications() {
-        return ImmutableSet.of();
-    }
-
-    @Override
-    public Collection<MustDefinition> getMustConstraints() {
-        return ImmutableSet.of();
-    }
-
-    @Override
-    public Optional<RevisionAwareXPath> getWhenCondition() {
-        return Optional.empty();
+// FIXME: 3.0.0: Rename this to "OperationAsContainer"
+@Deprecated
+public final class RpcAsContainer extends OperationAsContainer {
+    public RpcAsContainer(final RpcDefinition delegate) {
+        super(delegate);
     }
 }