Bug 4969: NPE in JSONCodecFactory by attempt to find codec for a leafref
[yangtools.git] / yang / yang-data-api / src / main / java / org / opendaylight / yangtools / yang / data / api / schema / stream / LoggingNormalizedNodeStreamWriter.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 com.google.common.annotations.Beta;
11 import com.google.common.base.Strings;
12 import java.util.ArrayDeque;
13 import java.util.Deque;
14 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
15 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
16 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
17 import org.slf4j.Logger;
18 import org.slf4j.LoggerFactory;
19
20 /**
21  * A {@link NormalizedNodeStreamWriter} which logs the events into a {@link Logger}.
22  */
23 @Beta
24 public final class LoggingNormalizedNodeStreamWriter implements NormalizedNodeStreamWriter {
25     private static final Logger LOG = LoggerFactory.getLogger(LoggingNormalizedNodeStreamWriter.class);
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     public LoggingNormalizedNodeStreamWriter() {
32         this(DEFAULT_INDENT_SIZE);
33     }
34
35     public LoggingNormalizedNodeStreamWriter(final int indentSize) {
36         this.indentStr = Strings.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 void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint) {
54         LOG.debug("{}{}[](no key)", ind(), name);
55         incIndent();
56     }
57
58     @Override
59     public void startUnkeyedList(final NodeIdentifier name, final int childSizeHint) {
60         LOG.debug("{}{}(no key)", ind(), name);
61         incIndent();
62     }
63
64     @Override
65     public void startOrderedMapNode(final NodeIdentifier name, final int childSizeHint) {
66
67     }
68
69     @Override
70     public void startMapNode(final NodeIdentifier name, final int childSizeHint) {
71         LOG.debug("{}{}(key)", ind(), name);
72         incIndent();
73     }
74
75     @Override
76     public void startMapEntryNode(final NodeIdentifierWithPredicates identifier, final int childSizeHint) {
77         LOG.debug("{}{}[](key)", ind(), identifier);
78         incIndent();
79     }
80
81     @Override
82     public void startLeafSet(final NodeIdentifier name, final int childSizeHint) {
83         LOG.debug("{}{}(leaf-list)", ind(), name);
84         incIndent();
85     }
86
87     @Override
88     public void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) {
89         LOG.debug("{}{}(leaf-list)", ind(), name);
90         incIndent();
91     }
92
93     @Override
94     public void startContainerNode(final NodeIdentifier name, final int childSizeHint) {
95         LOG.debug("{}{}(container)", ind(), name);
96         incIndent();
97     }
98
99     @Override
100     public void startChoiceNode(final NodeIdentifier name, final int childSizeHint) {
101         LOG.debug("{}{}(choice)", ind(), name);
102         incIndent();
103     }
104
105     @Override
106     public void startAugmentationNode(final AugmentationIdentifier identifier) {
107         LOG.debug("{}{}(augmentation)", ind(), identifier);
108         incIndent();
109     }
110
111     @Override
112     public void leafSetEntryNode(final Object value) {
113         LOG.debug("{}{}({}) ", ind(), value, value.getClass().getSimpleName());
114     }
115
116     @Override
117     public void leafNode(final NodeIdentifier name, final Object value) {
118         if (value == null) {
119             LOG.debug("{}{}(leaf(null))=null", ind(), name);
120         } else {
121             LOG.debug("{}{}(leaf({}))={}", ind(), name, value.getClass().getSimpleName(), value);
122         }
123     }
124
125     @Override
126     public void endNode() {
127         decIndent();
128         LOG.debug("{}(end)", ind());
129     }
130
131     @Override
132     public void anyxmlNode(final NodeIdentifier name, final Object value) {
133         LOG.debug("{}{}(anyxml)=", ind(), name, value);
134     }
135
136     @Override
137     public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) {
138         LOG.debug("{}{}(yangModeledAnyXml)", ind(), name);
139         incIndent();
140     }
141
142     @Override
143     public void flush() {
144         LOG.trace("<<FLUSH>>");
145     }
146
147     @Override
148     public void close() {
149         LOG.debug("<<END-OF-STREAM>>");
150     }
151 }