94cc7f5e34636306fcb2b211e5ea6a222f4164c7
[yangtools.git] / data / yang-data-api / src / main / java / org / opendaylight / yangtools / yang / data / api / schema / stream / FormattingNormalizedNodeStreamWriter.java
1 /*
2  * Copyright (c) 2022 PANTHEON.tech, s.r.o. 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 static com.google.common.base.Preconditions.checkState;
11
12 import com.google.common.annotations.Beta;
13 import org.eclipse.jdt.annotation.NonNull;
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.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
18
19 /**
20  * A {@link NormalizedNodeStreamWriter} which formats events into a String, available via #result().
21  */
22 @Beta
23 public final class FormattingNormalizedNodeStreamWriter extends AbstractIndentingNormalizedNodeStreamWriter {
24     private final StringBuilder sb = new StringBuilder();
25
26     private boolean closed;
27
28     public FormattingNormalizedNodeStreamWriter() {
29         // Default constructor
30     }
31
32     public FormattingNormalizedNodeStreamWriter(final int indentSize) {
33         super(indentSize);
34     }
35
36     /**
37      * Return the formatted String result capturing the events which have been streamed into this writer.
38      *
39      * @return Formatted string
40      * @throws IllegalStateException if this writer was not {@link #close()}d
41      */
42     public @NonNull String result() {
43         checkState(closed, "Attempted to access the result of unclosed writer");
44         return sb.toString();
45     }
46
47     @Override
48     public void flush() {
49         // No-op
50     }
51
52     @Override
53     public void close() {
54         closed = true;
55     }
56
57     @Override
58     void enterUnkeyedListItem(final NodeIdentifier name, final String indent) {
59         sb.append(indent).append(name).append("[](no key)\n");
60     }
61
62     @Override
63     void enterUnkeyedList(final NodeIdentifier name, final String indent) {
64         sb.append(indent).append(name).append("(no key)\n");
65     }
66
67     @Override
68     void enterMapNode(final NodeIdentifier name, final String indent) {
69         sb.append(indent).append(name).append("(key)\n");
70     }
71
72     @Override
73     void enterMapEntryNode(final NodeIdentifierWithPredicates identifier, final String indent) {
74         sb.append(indent).append(identifier).append("[](key)\n");
75     }
76
77     @Override
78     void enterLeafSet(final NodeIdentifier name, final String indent) {
79         sb.append(indent).append(name).append("(leaf-list)\n");
80     }
81
82     @Override
83     void enterContainerNode(final NodeIdentifier name, final String indent) {
84         sb.append(indent).append(name).append("(container)\n");
85     }
86
87     @Override
88     void enterChoiceNode(final NodeIdentifier name, final String indent) {
89         sb.append(indent).append(name).append("(choice)\n");
90     }
91
92     @Override
93     void enterAugmentationNode(final AugmentationIdentifier identifier, final String indent) {
94         sb.append(indent).append(identifier).append("(augmentation)\n");
95     }
96
97     @Override
98     void enterLeafSetEntryNode(final NodeWithValue<?> name, final String indent) {
99         sb.append(indent).append(name.getNodeType()).append("(entry)\n");
100     }
101
102     @Override
103     void enterLeafNode(final NodeIdentifier name, final String indent) {
104         sb.append(indent).append(name).append("(leaf)\n");
105     }
106
107     @Override
108     void enterAnyxmlNode(final NodeIdentifier name, final String indent) {
109         sb.append(indent).append(name).append("(anyxml)\n");
110     }
111
112     @Override
113     void enterAnydataNode(final NodeIdentifier name, final String indent) {
114         sb.append(indent).append(name).append("(anydata)\n");
115     }
116
117     @Override
118     void exitNode(final String indent) {
119         sb.append(indent).append("(end)\n");
120     }
121
122     @Override
123     void scalarValue(final Object value, final String indent) {
124         sb.append(indent).append('(').append(value.getClass().getSimpleName()).append(")=").append(value).append('\n');
125     }
126 }