19536df9c20213ba84d29c6f9b29bd293a7968a7
[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 startContainerNode(final NodeIdentifier name, final int childSizeHint) {
89         LOG.debug("{}{}(container)", ind(), name);
90         incIndent();
91     }
92
93     @Override
94     public void startChoiceNode(final NodeIdentifier name, final int childSizeHint) {
95         LOG.debug("{}{}(choice)", ind(), name);
96         incIndent();
97     }
98
99     @Override
100     public void startAugmentationNode(final AugmentationIdentifier identifier) {
101         LOG.debug("{}{}(augmentation)", ind(), identifier);
102         incIndent();
103     }
104
105     @Override
106     public void leafSetEntryNode(final Object value) {
107         LOG.debug("{}{}({}) ", ind(), value, value.getClass().getSimpleName());
108     }
109
110     @Override
111     public void leafNode(final NodeIdentifier name, final Object value) {
112         if (value == null) {
113             LOG.debug("{}{}(leaf(null))=null", ind(), name);
114         } else {
115             LOG.debug("{}{}(leaf({}))={}", ind(), name, value.getClass().getSimpleName(), value);
116         }
117     }
118
119     @Override
120     public void endNode() {
121         decIndent();
122         LOG.debug("{}(end)", ind());
123     }
124
125     @Override
126     public void anyxmlNode(final NodeIdentifier name, final Object value) {
127         LOG.debug("{}{}(anyxml)=", ind(), name, value);
128     }
129
130     @Override
131     public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) {
132         LOG.debug("{}{}(yangModeledAnyXml)", ind(), name);
133         incIndent();
134     }
135
136     @Override
137     public void flush() {
138         LOG.trace("<<FLUSH>>");
139     }
140
141     @Override
142     public void close() {
143         LOG.debug("<<END-OF-STREAM>>");
144     }
145 }