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