Support AnydataNode in ParameterAwareNormalizedNodeWriter
[netconf.git] / restconf / restconf-nb-rfc8040 / src / main / java / org / opendaylight / restconf / nb / rfc8040 / jersey / providers / ParameterAwareNormalizedNodeWriter.java
index 87bfbdaccfa33fc1905043e1c21a43b1ec78cd5b..8872e56ae56dbdf35882d787f5394e592b60cc30 100644 (file)
@@ -19,10 +19,11 @@ import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Set;
 import javax.xml.transform.dom.DOMSource;
-import org.opendaylight.restconf.nb.rfc8040.DepthParameter;
+import org.opendaylight.restconf.nb.rfc8040.DepthParam;
 import org.opendaylight.restconf.nb.rfc8040.jersey.providers.api.RestconfNormalizedNodeWriter;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.AnydataNode;
 import org.opendaylight.yangtools.yang.data.api.schema.AnyxmlNode;
 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
@@ -56,7 +57,7 @@ public class ParameterAwareNormalizedNodeWriter implements RestconfNormalizedNod
     protected final List<Set<QName>> fields;
     protected int currentDepth = 0;
 
-    private ParameterAwareNormalizedNodeWriter(final NormalizedNodeStreamWriter writer, final DepthParameter depth,
+    private ParameterAwareNormalizedNodeWriter(final NormalizedNodeStreamWriter writer, final DepthParam depth,
                                                final List<Set<QName>> fields) {
         this.writer = requireNonNull(writer);
         maxDepth = depth == null ? null : depth.value();
@@ -76,13 +77,13 @@ public class ParameterAwareNormalizedNodeWriter implements RestconfNormalizedNod
      * @return A new instance.
      */
     public static ParameterAwareNormalizedNodeWriter forStreamWriter(
-            final NormalizedNodeStreamWriter writer, final DepthParameter maxDepth, final List<Set<QName>> fields) {
+            final NormalizedNodeStreamWriter writer, final DepthParam maxDepth, final List<Set<QName>> fields) {
         return forStreamWriter(writer, true,  maxDepth, fields);
     }
 
     /**
      * Create a new writer backed by a {@link NormalizedNodeStreamWriter}. Unlike the simple
-     * {@link #forStreamWriter(NormalizedNodeStreamWriter, DepthParameter, List)} method, this allows the caller to
+     * {@link #forStreamWriter(NormalizedNodeStreamWriter, DepthParam, List)} method, this allows the caller to
      * switch off RFC6020 XML compliance, providing better throughput. The reason is that the XML mapping rules in
      * RFC6020 require the encoding to emit leaf nodes which participate in a list's key first and in the order in which
      * they are defined in the key. For JSON, this requirement is completely relaxed and leaves can be ordered in any
@@ -97,7 +98,7 @@ public class ParameterAwareNormalizedNodeWriter implements RestconfNormalizedNod
      */
     public static ParameterAwareNormalizedNodeWriter forStreamWriter(final NormalizedNodeStreamWriter writer,
                                                                      final boolean orderKeyLeaves,
-                                                                     final DepthParameter depth,
+                                                                     final DepthParam depth,
                                                                      final List<Set<QName>> fields) {
         return orderKeyLeaves ? new OrderedParameterAwareNormalizedNodeWriter(writer, depth, fields)
                 : new ParameterAwareNormalizedNodeWriter(writer, depth, fields);
@@ -172,8 +173,16 @@ public class ParameterAwareNormalizedNodeWriter implements RestconfNormalizedNod
                     writer.scalarValue(anyxmlNode.body());
                 }
                 writer.endNode();
+                return true;
+            }
+        } else if (node instanceof AnydataNode) {
+            final AnydataNode<?> anydataNode = (AnydataNode<?>)node;
+            final Class<?> objectModel = anydataNode.bodyObjectModel();
+            if (writer.startAnydataNode(anydataNode.getIdentifier(), objectModel)) {
+                writer.scalarValue(anydataNode.body());
+                writer.endNode();
+                return true;
             }
-            return true;
         }
 
         return false;
@@ -273,8 +282,8 @@ public class ParameterAwareNormalizedNodeWriter implements RestconfNormalizedNod
                         write(child);
                     }
                     currentDepth--;
-                    processedAsCompositeNode = true;
                 }
+                processedAsCompositeNode = true;
             }
         } else if (node instanceof MapEntryNode) {
             processedAsCompositeNode = writeMapEntryNode((MapEntryNode) node);
@@ -322,7 +331,7 @@ public class ParameterAwareNormalizedNodeWriter implements RestconfNormalizedNod
     private static final class OrderedParameterAwareNormalizedNodeWriter extends ParameterAwareNormalizedNodeWriter {
         private static final Logger LOG = LoggerFactory.getLogger(OrderedParameterAwareNormalizedNodeWriter.class);
 
-        OrderedParameterAwareNormalizedNodeWriter(final NormalizedNodeStreamWriter writer, final DepthParameter depth,
+        OrderedParameterAwareNormalizedNodeWriter(final NormalizedNodeStreamWriter writer, final DepthParam depth,
                                                   final List<Set<QName>> fields) {
             super(writer, depth, fields);
         }