Populate parser/ hierarchy
[yangtools.git] / yang / rfc7952-data-util / src / main / java / org / opendaylight / yangtools / rfc7952 / data / util / NormalizedNodeStreamWriterMetadataDecorator.java
index 69a52a1685624e890515cd69bc34f95cf5bbee1c..cf8b61fd68d88beaa318f1344d575bb169bf3bed 100644 (file)
@@ -14,9 +14,8 @@ import java.io.IOException;
 import java.util.ArrayDeque;
 import java.util.Deque;
 import java.util.Map;
-import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.rfc7952.data.api.NormalizedMetadata;
-import org.opendaylight.yangtools.rfc7952.data.api.NormalizedMetadataStreamWriter;
+import org.opendaylight.yangtools.rfc7952.data.api.StreamWriterMetadataExtension;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
@@ -32,12 +31,14 @@ import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStre
  */
 final class NormalizedNodeStreamWriterMetadataDecorator extends ForwardingNormalizedNodeStreamWriter {
     private final Deque<NormalizedMetadata> stack = new ArrayDeque<>();
-    private final NormalizedMetadataStreamWriter metaWriter;
+    private final StreamWriterMetadataExtension metaWriter;
     private final NormalizedNodeStreamWriter writer;
     private final NormalizedMetadata metadata;
 
+    private int absentDepth = 0;
+
     NormalizedNodeStreamWriterMetadataDecorator(final NormalizedNodeStreamWriter writer,
-            final NormalizedMetadataStreamWriter metaWriter, final NormalizedMetadata metadata) {
+            final StreamWriterMetadataExtension metaWriter, final NormalizedMetadata metadata) {
         this.writer = requireNonNull(writer);
         this.metaWriter = requireNonNull(metaWriter);
         this.metadata = requireNonNull(metadata);
@@ -122,43 +123,50 @@ final class NormalizedNodeStreamWriterMetadataDecorator extends ForwardingNormal
     }
 
     @Override
-    public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
-        super.startAnyxmlNode(name);
-        enterMetadataNode(name);
-    }
-
-    @Override
-    public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
-        super.startYangModeledAnyXmlNode(name, childSizeHint);
-        enterMetadataNode(name);
+    public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+        final boolean ret = super.startAnyxmlNode(name, objectModel);
+        if (ret) {
+            enterMetadataNode(name);
+        }
+        return ret;
     }
 
     @Override
     public void endNode() throws IOException {
         super.endNode();
-        stack.pop();
+
+        if (absentDepth > 0) {
+            absentDepth--;
+        } else {
+            stack.pop();
+        }
     }
 
     private void enterMetadataNode(final PathArgument name) throws IOException {
-        final NormalizedMetadata child = findMetadata(name);
-        if (child != null) {
-            emitAnnotations(child.getAnnotations());
+        if (absentDepth > 0) {
+            absentDepth++;
+            return;
         }
-        stack.push(child);
-    }
 
-    private @Nullable NormalizedMetadata findMetadata(final PathArgument name) {
         final NormalizedMetadata current = stack.peek();
-        if (current == null) {
-            // This may either be the first entry or unattached metadata nesting
-            return stack.isEmpty() ? metadata : null;
+        if (current != null) {
+            final NormalizedMetadata child = current.getChildren().get(name);
+            if (child != null) {
+                enterChild(child);
+            } else {
+                absentDepth = 1;
+            }
+        } else {
+            // Empty stack: enter first entry
+            enterChild(metadata);
         }
-        return current.getChildren().get(name);
     }
 
-    private void emitAnnotations(final Map<QName, Object> annotations) throws IOException {
+    private void enterChild(final NormalizedMetadata child) throws IOException {
+        final Map<QName, Object> annotations = child.getAnnotations();
         if (!annotations.isEmpty()) {
             metaWriter.metadata(ImmutableMap.copyOf(annotations));
         }
+        stack.push(child);
     }
 }