Rename Any{Data,Xml}SchemaNode to Any{data,xml}SchemaNode
[yangtools.git] / yang / yang-data-codec-xml / src / main / java / org / opendaylight / yangtools / yang / data / codec / xml / SchemalessXMLStreamNormalizedNodeStreamWriter.java
1 /*
2  * Copyright (c) 2016 Brocade Communications 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.codec.xml;
9
10 import static com.google.common.base.Preconditions.checkState;
11
12 import java.io.IOException;
13 import java.util.ArrayDeque;
14 import java.util.Deque;
15 import javax.xml.stream.XMLStreamWriter;
16 import javax.xml.transform.dom.DOMSource;
17 import org.opendaylight.yangtools.yang.common.QName;
18 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
19 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
22
23 final class SchemalessXMLStreamNormalizedNodeStreamWriter extends XMLStreamNormalizedNodeStreamWriter<Object> {
24     private enum NodeType {
25         CONTAINER,
26         LEAF_SET,
27         LIST,
28         LIST_ITEM,
29         YANG_MODELED_ANY_XML,
30         CHOICE,
31         AUGMENTATION,
32         SCALAR,
33         ANY_XML,
34         ANYDATA,
35     }
36
37     private final Deque<NodeType> nodeTypeStack = new ArrayDeque<>();
38
39     SchemalessXMLStreamNormalizedNodeStreamWriter(final XMLStreamWriter writer) {
40         super(writer);
41     }
42
43     @Override
44     public void startLeafNode(final NodeIdentifier name) throws IOException {
45         nodeTypeStack.push(NodeType.SCALAR);
46         startElement(name.getNodeType());
47     }
48
49     @Override
50     public void startLeafSetEntryNode(final NodeWithValue<?> name) throws IOException {
51         nodeTypeStack.push(NodeType.SCALAR);
52         startElement(name.getNodeType());
53     }
54
55     @Override
56     public void startLeafSet(final NodeIdentifier name, final int childSizeHint) throws IOException {
57         nodeTypeStack.push(NodeType.LEAF_SET);
58     }
59
60     @Override
61     public void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) throws IOException {
62         nodeTypeStack.push(NodeType.LEAF_SET);
63     }
64
65     @Override
66     public void startContainerNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
67         nodeTypeStack.push(NodeType.CONTAINER);
68         startElement(name.getNodeType());
69     }
70
71     @Override
72     public void startChoiceNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
73         nodeTypeStack.push(NodeType.CHOICE);
74     }
75
76     @Override
77     public void startAugmentationNode(final AugmentationIdentifier identifier) throws IOException {
78         nodeTypeStack.push(NodeType.AUGMENTATION);
79     }
80
81     @Override
82     public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
83         nodeTypeStack.push(NodeType.ANY_XML);
84         startElement(name.getNodeType());
85     }
86
87     @Override
88     public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
89         nodeTypeStack.push(NodeType.YANG_MODELED_ANY_XML);
90         startElement(name.getNodeType());
91     }
92
93     @Override
94     String encodeValue(final ValueWriter xmlWriter, final Object value, final Object context) {
95         return value.toString();
96     }
97
98     @Override
99     String encodeAnnotationValue(final ValueWriter xmlWriter, final QName qname, final Object value) {
100         return value.toString();
101     }
102
103     @Override
104     void startList(final NodeIdentifier name) {
105         nodeTypeStack.push(NodeType.LIST);
106     }
107
108     @Override
109     void startListItem(final PathArgument name) throws IOException {
110         nodeTypeStack.push(NodeType.LIST_ITEM);
111         startElement(name.getNodeType());
112     }
113
114     @Override
115     public void scalarValue(final Object value) throws IOException {
116         final NodeType type = nodeTypeStack.peek();
117         if (type == NodeType.SCALAR) {
118             writeValue(value, null);
119         } else if (type == NodeType.ANYDATA) {
120             anydataValue(value);
121         } else {
122             throw new IllegalStateException("Unexpected scalar " + value + " in type " + type);
123         }
124     }
125
126     @Override
127     public void domSourceValue(final DOMSource value) throws IOException {
128         final NodeType type = nodeTypeStack.peek();
129         checkState(type == NodeType.ANY_XML, "Unexpected DOMSource %s in %s", value, type);
130         anyxmlValue(value);
131     }
132
133     @Override
134     public void endNode() throws IOException {
135         NodeType type = nodeTypeStack.pop();
136         switch (type) {
137             case CONTAINER:
138             case LIST_ITEM:
139             case SCALAR:
140             case ANY_XML:
141             case ANYDATA:
142                 endElement();
143                 break;
144             default:
145                 break;
146         }
147     }
148
149     @Override
150     void startAnydata(final NodeIdentifier name) {
151         nodeTypeStack.push(NodeType.ANYDATA);
152     }
153 }