Refactor implementations to hide XMLStreamWriter
[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 java.io.IOException;
11 import java.util.ArrayDeque;
12 import java.util.Collections;
13 import java.util.Deque;
14 import java.util.Map;
15 import javax.xml.stream.XMLStreamException;
16 import javax.xml.stream.XMLStreamWriter;
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.PathArgument;
21
22 final class SchemalessXMLStreamNormalizedNodeStreamWriter extends XMLStreamNormalizedNodeStreamWriter<Object> {
23     private enum ContainerType {
24         CONTAINER,
25         LEAF_SET,
26         LIST,
27         LIST_ITEM,
28         ANY_XML,
29         CHOICE,
30         AUGMENTATION
31     }
32
33     private final Deque<ContainerType> containerTypeStack = new ArrayDeque<>();
34
35     SchemalessXMLStreamNormalizedNodeStreamWriter(final XMLStreamWriter writer) {
36         super(writer);
37     }
38
39     @Override
40     public void leafNode(final NodeIdentifier name, final Object value, final Map<QName, String> attributes)
41             throws IOException {
42         writeElement(name.getNodeType(), value, attributes, null);
43     }
44
45     @Override
46     public void leafNode(final NodeIdentifier name, final Object value) throws IOException {
47         writeElement(name.getNodeType(), value, Collections.emptyMap(), null);
48     }
49
50     @Override
51     public void leafSetEntryNode(final QName name, final Object value, final Map<QName, String> attributes)
52             throws IOException {
53         writeElement(name, value, attributes, null);
54     }
55
56     @Override
57     public void leafSetEntryNode(final QName name, final Object value) throws IOException {
58         writeElement(name, value, Collections.emptyMap(), null);
59     }
60
61     @Override
62     public void startLeafSet(final NodeIdentifier name, final int childSizeHint) throws IOException {
63         containerTypeStack.push(ContainerType.LEAF_SET);
64     }
65
66     @Override
67     public void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) throws IOException {
68         containerTypeStack.push(ContainerType.LEAF_SET);
69     }
70
71     @Override
72     public void startContainerNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
73         containerTypeStack.push(ContainerType.CONTAINER);
74         startElement(name.getNodeType());
75     }
76
77     @Override
78     public void startChoiceNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
79         containerTypeStack.push(ContainerType.CHOICE);
80     }
81
82     @Override
83     public void startAugmentationNode(final AugmentationIdentifier identifier) throws IOException {
84         containerTypeStack.push(ContainerType.AUGMENTATION);
85     }
86
87     @Override
88     public void anyxmlNode(final NodeIdentifier name, final Object value) throws IOException {
89         anyxmlNode(name.getNodeType(), value);
90     }
91
92     @Override
93     public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
94         containerTypeStack.push(ContainerType.ANY_XML);
95         startElement(name.getNodeType());
96     }
97
98     @Override
99     void writeValue(final XMLStreamWriter xmlWriter, final QName qname, final Object value, final Object context)
100             throws XMLStreamException {
101         xmlWriter.writeCharacters(value.toString());
102     }
103
104     @Override
105     void startList(final NodeIdentifier name) {
106         containerTypeStack.push(ContainerType.LIST);
107     }
108
109     @Override
110     void startListItem(final PathArgument name) throws IOException {
111         containerTypeStack.push(ContainerType.LIST_ITEM);
112         startElement(name.getNodeType());
113     }
114
115     @Override
116     public void endNode() throws IOException {
117         ContainerType type = containerTypeStack.pop();
118         switch (type) {
119             case CONTAINER:
120             case LIST_ITEM:
121             case ANY_XML:
122                 endElement();
123                 break;
124             default:
125                 break;
126         }
127     }
128 }