BUG 2973 - correction of output for empty yang type
[yangtools.git] / yang / yang-data-api / src / main / java / org / opendaylight / yangtools / yang / data / api / schema / stream / LoggingNormalizedNodeStreamWriter.java
1 package org.opendaylight.yangtools.yang.data.api.schema.stream;
2
3 import com.google.common.annotations.Beta;
4 import com.google.common.base.Strings;
5 import java.util.ArrayDeque;
6 import java.util.Deque;
7 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
8 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
9 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
10 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory;
12
13 /**
14  * A {@link NormalizedNodeStreamWriter} which logs the events into a {@link Logger}.
15  */
16 @Beta
17 public final class LoggingNormalizedNodeStreamWriter implements NormalizedNodeStreamWriter {
18     private static final Logger LOG = LoggerFactory.getLogger(LoggingNormalizedNodeStreamWriter.class);
19     private static final int DEFAULT_INDENT_SIZE = 2;
20
21     private final Deque<String> indent = new ArrayDeque<>();
22     private final String indentStr;
23
24     public LoggingNormalizedNodeStreamWriter() {
25         this(DEFAULT_INDENT_SIZE);
26     }
27
28     public LoggingNormalizedNodeStreamWriter(final int indentSize) {
29         this.indentStr = Strings.repeat(" ", indentSize);
30         indent.push("");
31     }
32
33     private String ind() {
34         return indent.peek();
35     }
36
37     private void decIndent() {
38         indent.pop();
39     }
40
41     private void incIndent() {
42         indent.push(ind() + indentStr);
43     }
44
45     @Override
46     public void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint) {
47         LOG.debug("{}{}[](no key)", ind(), name);
48         incIndent();
49     }
50
51     @Override
52     public void startUnkeyedList(final NodeIdentifier name, final int childSizeHint) {
53         LOG.debug("{}{}(no key)", ind(), name);
54         incIndent();
55     }
56
57     @Override
58     public void startOrderedMapNode(final NodeIdentifier name, final int childSizeHint) {
59
60     }
61
62     @Override
63     public void startMapNode(final NodeIdentifier name, final int childSizeHint) {
64         LOG.debug("{}{}(key)", ind(), name);
65         incIndent();
66     }
67
68     @Override
69     public void startMapEntryNode(final NodeIdentifierWithPredicates identifier, final int childSizeHint) {
70         LOG.debug("{}{}[](key)", ind(), identifier);
71         incIndent();
72     }
73
74     @Override
75     public void startLeafSet(final NodeIdentifier name, final int childSizeHint) {
76         LOG.debug("{}{}(leaf-list)", ind(), name);
77         incIndent();
78     }
79
80     @Override
81     public void startContainerNode(final NodeIdentifier name, final int childSizeHint) {
82         LOG.debug("{}{}(container)", ind(), name);
83         incIndent();
84     }
85
86     @Override
87     public void startChoiceNode(final NodeIdentifier name, final int childSizeHint) {
88         LOG.debug("{}{}(choice)", ind(), name);
89         incIndent();
90     }
91
92     @Override
93     public void startAugmentationNode(final AugmentationIdentifier identifier) {
94         LOG.debug("{}{}(augmentation)", ind(), identifier);
95         incIndent();
96     }
97
98     @Override
99     public void leafSetEntryNode(final Object value) {
100         LOG.debug("{}{}({}) ", ind(), value, value.getClass().getSimpleName());
101     }
102
103     @Override
104     public void leafNode(final NodeIdentifier name, final Object value) {
105         if (value == null) {
106             LOG.debug("{}{}(leaf(null))=null", ind(), name);
107         } else {
108             LOG.debug("{}{}(leaf({}))={}", ind(), name, value.getClass().getSimpleName(), value);
109         }
110     }
111
112     @Override
113     public void endNode() throws IllegalStateException {
114         decIndent();
115         LOG.debug("{}(end)", ind());
116     }
117
118     @Override
119     public void anyxmlNode(final NodeIdentifier name, final Object value) {
120         LOG.debug("{}{}(anyxml)=", ind(), name, value);
121     }
122
123     @Override
124     public void flush() {
125         LOG.trace("<<FLUSH>>");
126     }
127
128     @Override
129     public void close() {
130         LOG.debug("<<END-OF-STREAM>>");
131     }
132 }