2 * Copyright (c) 2021 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.netconf.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 javax.xml.stream.XMLStreamWriter;
18 import org.eclipse.jdt.annotation.NonNull;
19 import org.opendaylight.yangtools.rfc7952.data.api.NormalizedMetadata;
20 import org.opendaylight.yangtools.rfc7952.data.api.StreamWriterMetadataExtension;
21 import org.opendaylight.yangtools.yang.common.QName;
22 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
23 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
24 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
26 import org.opendaylight.yangtools.yang.data.api.schema.stream.ForwardingNormalizedNodeStreamWriter;
27 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
30 * This class extends capability of {@link EmptyListXmlWriter} delegate to write metadata
31 * using {@link StreamWriterMetadataExtension} the same way as
32 * {@link org.opendaylight.yangtools.rfc7952.data.util.NormalizedNodeStreamWriterMetadataDecorator}.
34 final class EmptyListXmlMetadataWriter extends ForwardingNormalizedNodeStreamWriter {
35 private final Deque<NormalizedMetadata> stack = new ArrayDeque<>();
36 private final EmptyListXmlWriter dataWriterDelegate;
37 private final StreamWriterMetadataExtension metaWriter;
38 private final NormalizedMetadata metadata;
40 private int absentDepth = 0;
42 EmptyListXmlMetadataWriter(final @NonNull NormalizedNodeStreamWriter writer,
43 final @NonNull XMLStreamWriter xmlStreamWriter, final @NonNull StreamWriterMetadataExtension metaWriter,
44 final @NonNull NormalizedMetadata metadata) {
45 this.dataWriterDelegate = new EmptyListXmlWriter(requireNonNull(writer), requireNonNull(xmlStreamWriter));
46 this.metaWriter = requireNonNull(metaWriter);
47 this.metadata = requireNonNull(metadata);
51 protected NormalizedNodeStreamWriter delegate() {
52 return dataWriterDelegate.delegate();
56 public void startLeafNode(final NodeIdentifier name) throws IOException {
57 dataWriterDelegate.startLeafNode(name);
58 enterMetadataNode(name);
62 public void startLeafSet(final NodeIdentifier name, final int childSizeHint) throws IOException {
63 dataWriterDelegate.startLeafSet(name, childSizeHint);
64 enterMetadataNode(name);
68 public void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) throws IOException {
69 dataWriterDelegate.startOrderedLeafSet(name, childSizeHint);
70 enterMetadataNode(name);
74 public void startLeafSetEntryNode(final YangInstanceIdentifier.NodeWithValue<?> name) throws IOException {
75 dataWriterDelegate.startLeafSetEntryNode(name);
76 enterMetadataNode(name);
80 public void startContainerNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
81 dataWriterDelegate.startContainerNode(name, childSizeHint);
82 enterMetadataNode(name);
86 public void startUnkeyedList(final NodeIdentifier name, final int childSizeHint) throws IOException {
87 dataWriterDelegate.startUnkeyedList(name, childSizeHint);
88 enterMetadataNode(name);
92 public void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint) throws IOException {
93 dataWriterDelegate.startUnkeyedListItem(name, childSizeHint);
94 enterMetadataNode(name);
98 public void startMapNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
99 dataWriterDelegate.startMapNode(name, childSizeHint);
100 enterMetadataNode(name);
104 public void startMapEntryNode(final NodeIdentifierWithPredicates identifier, final int childSizeHint)
106 dataWriterDelegate.startMapEntryNode(identifier, childSizeHint);
107 enterMetadataNode(identifier);
111 public void startOrderedMapNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
112 dataWriterDelegate.startOrderedMapNode(name, childSizeHint);
113 enterMetadataNode(name);
117 public void startChoiceNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
118 dataWriterDelegate.startChoiceNode(name, childSizeHint);
119 enterMetadataNode(name);
123 public void startAugmentationNode(final AugmentationIdentifier identifier) throws IOException {
124 dataWriterDelegate.startAugmentationNode(identifier);
125 enterMetadataNode(identifier);
129 public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
130 final boolean ret = dataWriterDelegate.startAnyxmlNode(name, objectModel);
132 enterMetadataNode(name);
138 public void endNode() throws IOException {
139 dataWriterDelegate.endNode();
141 if (absentDepth > 0) {
148 private void enterMetadataNode(final YangInstanceIdentifier.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));