2ea9cc83417325fcbfa9bea2ae0b78138d4cefff
[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 edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
13 import java.util.ArrayDeque;
14 import java.util.Deque;
15 import org.opendaylight.yangtools.yang.common.QName;
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.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
21
22 /**
23  * A {@link NormalizedNodeStreamWriter} which logs the events into a {@link Logger}.
24  */
25 @Beta
26 public final class LoggingNormalizedNodeStreamWriter implements NormalizedNodeStreamWriter {
27     private static final Logger LOG = LoggerFactory.getLogger(LoggingNormalizedNodeStreamWriter.class);
28     private static final int DEFAULT_INDENT_SIZE = 2;
29
30     private final Deque<String> indent = new ArrayDeque<>();
31     private final String indentStr;
32
33     public LoggingNormalizedNodeStreamWriter() {
34         this(DEFAULT_INDENT_SIZE);
35     }
36
37     public LoggingNormalizedNodeStreamWriter(final int indentSize) {
38         this.indentStr = Strings.repeat(" ", indentSize);
39         indent.push("");
40     }
41
42     private String ind() {
43         return indent.peek();
44     }
45
46     private void decIndent() {
47         indent.pop();
48     }
49
50     private void incIndent() {
51         indent.push(ind() + indentStr);
52     }
53
54     @Override
55     public void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint) {
56         LOG.debug("{}{}[](no key)", ind(), name);
57         incIndent();
58     }
59
60     @Override
61     public void startUnkeyedList(final NodeIdentifier name, final int childSizeHint) {
62         LOG.debug("{}{}(no key)", ind(), name);
63         incIndent();
64     }
65
66     @Override
67     public void startOrderedMapNode(final NodeIdentifier name, final int childSizeHint) {
68
69     }
70
71     @Override
72     public void startMapNode(final NodeIdentifier name, final int childSizeHint) {
73         LOG.debug("{}{}(key)", ind(), name);
74         incIndent();
75     }
76
77     @Override
78     public void startMapEntryNode(final NodeIdentifierWithPredicates identifier, final int childSizeHint) {
79         LOG.debug("{}{}[](key)", ind(), identifier);
80         incIndent();
81     }
82
83     @Override
84     public void startLeafSet(final NodeIdentifier name, final int childSizeHint) {
85         LOG.debug("{}{}(leaf-list)", ind(), name);
86         incIndent();
87     }
88
89     @Override
90     public void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) {
91         LOG.debug("{}{}(leaf-list)", ind(), name);
92         incIndent();
93     }
94
95     @Override
96     public void startContainerNode(final NodeIdentifier name, final int childSizeHint) {
97         LOG.debug("{}{}(container)", ind(), name);
98         incIndent();
99     }
100
101     @Override
102     public void startChoiceNode(final NodeIdentifier name, final int childSizeHint) {
103         LOG.debug("{}{}(choice)", ind(), name);
104         incIndent();
105     }
106
107     @Override
108     public void startAugmentationNode(final AugmentationIdentifier identifier) {
109         LOG.debug("{}{}(augmentation)", ind(), identifier);
110         incIndent();
111     }
112
113     @Override
114     @SuppressFBWarnings("SLF4J_SIGN_ONLY_FORMAT")
115     public void leafSetEntryNode(final QName name, final Object value) {
116         LOG.debug("{}{}({}) ", ind(), value, value.getClass().getSimpleName());
117     }
118
119     @Override
120     public void leafNode(final NodeIdentifier name, final Object value) {
121         if (value == null) {
122             LOG.debug("{}{}(leaf(null))=null", ind(), name);
123         } else {
124             LOG.debug("{}{}(leaf({}))={}", ind(), name, value.getClass().getSimpleName(), value);
125         }
126     }
127
128     @Override
129     public void endNode() {
130         decIndent();
131         LOG.debug("{}(end)", ind());
132     }
133
134     @Override
135     public void anyxmlNode(final NodeIdentifier name, final Object value) {
136         LOG.debug("{}{}(anyxml)={}", ind(), name, value);
137     }
138
139     @Override
140     public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) {
141         LOG.debug("{}{}(yangModeledAnyXml)", ind(), name);
142         incIndent();
143     }
144
145     @Override
146     public void flush() {
147         LOG.trace("<<FLUSH>>");
148     }
149
150     @Override
151     public void close() {
152         LOG.debug("<<END-OF-STREAM>>");
153     }
154 }