Remove Augmentation{Identifier,Node}
[yangtools.git] / data / yang-data-api / src / main / java / org / opendaylight / yangtools / yang / data / api / schema / stream / AbstractIndentingNormalizedNodeStreamWriter.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.data.api.schema.stream;
9
10 import static java.util.Objects.requireNonNull;
11
12 import java.util.ArrayDeque;
13 import java.util.Deque;
14 import javax.xml.transform.dom.DOMSource;
15 import org.eclipse.jdt.annotation.NonNull;
16 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
18 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
19
20 /**
21  * A {@link NormalizedNodeStreamWriter} which maintains some amount of indentation.
22  */
23 // FIXME: implement MetadataExtension and MountPointExtension
24 abstract class AbstractIndentingNormalizedNodeStreamWriter implements NormalizedNodeStreamWriter {
25     private static final int DEFAULT_INDENT_SIZE = 2;
26
27     private final Deque<String> indent = new ArrayDeque<>();
28     private final String indentStr;
29
30     AbstractIndentingNormalizedNodeStreamWriter() {
31         this(DEFAULT_INDENT_SIZE);
32     }
33
34     AbstractIndentingNormalizedNodeStreamWriter(final int indentSize) {
35         indentStr = " ".repeat(indentSize);
36         indent.push("");
37     }
38
39     private String ind() {
40         return indent.peek();
41     }
42
43     private void decIndent() {
44         indent.pop();
45     }
46
47     private void incIndent() {
48         indent.push(ind() + indentStr);
49     }
50
51     @Override
52     public final void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint) {
53         enterUnkeyedListItem(name, ind());
54         incIndent();
55     }
56
57     abstract void enterUnkeyedListItem(NodeIdentifier name, String indent);
58
59     @Override
60     public final void startUnkeyedList(final NodeIdentifier name, final int childSizeHint) {
61         enterUnkeyedList(name, ind());
62         incIndent();
63     }
64
65     abstract void enterUnkeyedList(NodeIdentifier name, String indent);
66
67     @Override
68     public final void startOrderedMapNode(final NodeIdentifier name, final int childSizeHint) {
69         startMapNode(name, childSizeHint);
70     }
71
72     @Override
73     public final void startMapNode(final NodeIdentifier name, final int childSizeHint) {
74         enterMapNode(name, ind());
75         incIndent();
76     }
77
78     abstract void enterMapNode(NodeIdentifier name, String indent);
79
80     @Override
81     public final void startMapEntryNode(final NodeIdentifierWithPredicates identifier, final int childSizeHint) {
82         enterMapEntryNode(identifier, ind());
83         incIndent();
84     }
85
86     abstract void enterMapEntryNode(NodeIdentifierWithPredicates identifier, String indent);
87
88     @Override
89     public final void startLeafSet(final NodeIdentifier name, final int childSizeHint) {
90         enterLeafSet(name, ind());
91         incIndent();
92     }
93
94     abstract void enterLeafSet(NodeIdentifier name, String indent);
95
96     @Override
97     public final void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) {
98         startLeafSet(name, childSizeHint);
99     }
100
101     @Override
102     public final void startContainerNode(final NodeIdentifier name, final int childSizeHint) {
103         enterContainerNode(name, ind());
104         incIndent();
105     }
106
107     abstract void enterContainerNode(NodeIdentifier name, String indent);
108
109     @Override
110     public final void startChoiceNode(final NodeIdentifier name, final int childSizeHint) {
111         enterChoiceNode(name, ind());
112         incIndent();
113     }
114
115     abstract void enterChoiceNode(NodeIdentifier name, String indent);
116
117     @Override
118     public final void startLeafSetEntryNode(final NodeWithValue<?> name) {
119         enterLeafSetEntryNode(name, ind());
120         incIndent();
121     }
122
123     abstract void enterLeafSetEntryNode(NodeWithValue<?> name, String indent);
124
125     @Override
126     public final void startLeafNode(final NodeIdentifier name) {
127         enterLeafNode(name, ind());
128         incIndent();
129     }
130
131     abstract void enterLeafNode(NodeIdentifier name, String indent);
132
133     @Override
134     public final boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) {
135         enterAnyxmlNode(name, ind());
136         incIndent();
137         return true;
138     }
139
140     abstract void enterAnyxmlNode(NodeIdentifier name, String indent);
141
142     @Override
143     public final boolean startAnydataNode(final NodeIdentifier name, final Class<?> objectModel) {
144         enterAnydataNode(name, ind());
145         incIndent();
146         return true;
147     }
148
149     abstract void enterAnydataNode(NodeIdentifier name, String indent);
150
151     @Override
152     public final void endNode() {
153         decIndent();
154         exitNode(ind());
155     }
156
157     abstract void exitNode(String indent);
158
159     @Override
160     public final void scalarValue(final Object value) {
161         scalarValue(value, ind());
162     }
163
164     abstract void scalarValue(@NonNull Object value, String indent);
165
166     @Override
167     public final void domSourceValue(final DOMSource value) {
168         scalarValue(requireNonNull(value));
169     }
170 }