2 * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.rfc7952.data.util;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.collect.ImmutableMap;
13 import java.io.IOException;
14 import java.util.ArrayDeque;
15 import java.util.Deque;
17 import org.opendaylight.yangtools.rfc7952.data.api.NormalizedMetadata;
18 import org.opendaylight.yangtools.rfc7952.data.api.StreamWriterMetadataExtension;
19 import org.opendaylight.yangtools.yang.common.QName;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
22 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
23 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
24 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
25 import org.opendaylight.yangtools.yang.data.api.schema.stream.ForwardingNormalizedNodeStreamWriter;
26 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
29 * A simple decorator on top of a NormalizedNodeStreamWriter, which attaches NormalizedMetadata to the event stream,
30 * so that the metadata is emitted along with data.
32 final class NormalizedNodeStreamWriterMetadataDecorator extends ForwardingNormalizedNodeStreamWriter {
33 private final Deque<NormalizedMetadata> stack = new ArrayDeque<>();
34 private final StreamWriterMetadataExtension metaWriter;
35 private final NormalizedNodeStreamWriter writer;
36 private final NormalizedMetadata metadata;
38 private int absentDepth = 0;
40 NormalizedNodeStreamWriterMetadataDecorator(final NormalizedNodeStreamWriter writer,
41 final StreamWriterMetadataExtension metaWriter, final NormalizedMetadata metadata) {
42 this.writer = requireNonNull(writer);
43 this.metaWriter = requireNonNull(metaWriter);
44 this.metadata = requireNonNull(metadata);
48 protected NormalizedNodeStreamWriter delegate() {
53 public void startLeafNode(final NodeIdentifier name) throws IOException {
54 super.startLeafNode(name);
55 enterMetadataNode(name);
59 public void startLeafSet(final NodeIdentifier name, final int childSizeHint) throws IOException {
60 super.startLeafSet(name, childSizeHint);
61 enterMetadataNode(name);
65 public void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) throws IOException {
66 super.startOrderedLeafSet(name, childSizeHint);
67 enterMetadataNode(name);
71 public void startLeafSetEntryNode(final NodeWithValue<?> name) throws IOException {
72 super.startLeafSetEntryNode(name);
73 enterMetadataNode(name);
77 public void startContainerNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
78 super.startContainerNode(name, childSizeHint);
79 enterMetadataNode(name);
83 public void startUnkeyedList(final NodeIdentifier name, final int childSizeHint) throws IOException {
84 super.startUnkeyedList(name, childSizeHint);
85 enterMetadataNode(name);
89 public void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint) throws IOException {
90 super.startUnkeyedListItem(name, childSizeHint);
91 enterMetadataNode(name);
95 public void startMapNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
96 super.startMapNode(name, childSizeHint);
97 enterMetadataNode(name);
101 public void startMapEntryNode(final NodeIdentifierWithPredicates identifier, final int childSizeHint)
103 super.startMapEntryNode(identifier, childSizeHint);
104 enterMetadataNode(identifier);
108 public void startOrderedMapNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
109 super.startOrderedMapNode(name, childSizeHint);
110 enterMetadataNode(name);
114 public void startChoiceNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
115 super.startChoiceNode(name, childSizeHint);
116 enterMetadataNode(name);
120 public void startAugmentationNode(final AugmentationIdentifier identifier) throws IOException {
121 super.startAugmentationNode(identifier);
122 enterMetadataNode(identifier);
126 public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
127 super.startAnyxmlNode(name);
128 enterMetadataNode(name);
132 public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
133 super.startYangModeledAnyXmlNode(name, childSizeHint);
134 enterMetadataNode(name);
138 public void endNode() throws IOException {
141 if (absentDepth > 0) {
148 private void enterMetadataNode(final PathArgument name) throws IOException {
149 if (absentDepth > 0) {
154 final NormalizedMetadata current = stack.peek();
155 if (current != null) {
156 final NormalizedMetadata child = current.getChildren().get(name);
163 // Empty stack: enter first entry
164 enterChild(metadata);
168 private void enterChild(final NormalizedMetadata child) throws IOException {
169 final Map<QName, Object> annotations = child.getAnnotations();
170 if (!annotations.isEmpty()) {
171 metaWriter.metadata(ImmutableMap.copyOf(annotations));