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