|
20 | 20 | import java.io.Writer; |
21 | 21 | import java.nio.charset.Charset; |
22 | 22 | import java.util.Date; |
| 23 | +import java.util.LinkedHashMap; |
23 | 24 | import java.util.Map; |
24 | 25 |
|
25 | 26 | import javax.xml.stream.XMLOutputFactory; |
@@ -81,41 +82,58 @@ public void write(Iterable<? extends Map<String, ?>> values, Writer writer) thro |
81 | 82 | XMLStreamWriter streamWriter = outputFactory.createXMLStreamWriter(writer); |
82 | 83 |
|
83 | 84 | streamWriter.writeStartDocument(); |
84 | | - |
85 | 85 | streamWriter.writeStartElement(rootElementName); |
86 | 86 |
|
87 | | - for (Map<String, ?> map : values) { |
88 | | - streamWriter.writeStartElement("item"); |
| 87 | + writeValues(values, streamWriter); |
| 88 | + |
| 89 | + streamWriter.writeEndElement(); |
| 90 | + streamWriter.writeEndDocument(); |
| 91 | + } catch (XMLStreamException exception) { |
| 92 | + throw new IOException(exception); |
| 93 | + } |
| 94 | + |
| 95 | + writer.flush(); |
| 96 | + } |
| 97 | + |
| 98 | + @SuppressWarnings("unchecked") |
| 99 | + private void writeValues(Iterable<? extends Map<String, ?>> values, XMLStreamWriter streamWriter) throws XMLStreamException { |
| 100 | + for (Map<String, ?> map : values) { |
| 101 | + streamWriter.writeStartElement("item"); |
89 | 102 |
|
90 | | - for (Map.Entry<String, ?> entry : map.entrySet()) { |
91 | | - String key = entry.getKey(); |
| 103 | + LinkedHashMap<String, Iterable<?>> collections = new LinkedHashMap<>(); |
92 | 104 |
|
93 | | - if (key == null) { |
94 | | - continue; |
95 | | - } |
| 105 | + for (Map.Entry<String, ?> entry : map.entrySet()) { |
| 106 | + String key = entry.getKey(); |
96 | 107 |
|
97 | | - Object value = entry.getValue(); |
| 108 | + if (key == null) { |
| 109 | + continue; |
| 110 | + } |
98 | 111 |
|
99 | | - if (value == null) { |
100 | | - continue; |
101 | | - } |
| 112 | + Object value = entry.getValue(); |
102 | 113 |
|
103 | | - // TODO Prepend ancestor keypath |
| 114 | + if (value == null) { |
| 115 | + continue; |
| 116 | + } |
104 | 117 |
|
| 118 | + if (value instanceof Iterable<?>) { |
| 119 | + collections.put(key, (Iterable<? extends Map<String, ?>>)value); |
| 120 | + } else if (value instanceof Map<?, ?>) { |
| 121 | + // TODO |
| 122 | + } else { |
105 | 123 | encode(key, value, streamWriter); |
106 | 124 | } |
| 125 | + } |
| 126 | + |
| 127 | + for (Map.Entry<String, Iterable<?>> entry : collections.entrySet()) { |
| 128 | + streamWriter.writeStartElement(entry.getKey()); |
| 129 | + |
| 130 | + writeValues((Iterable<? extends Map<String, ?>>)entry.getValue(), streamWriter); |
107 | 131 |
|
108 | 132 | streamWriter.writeEndElement(); |
109 | 133 | } |
110 | 134 |
|
111 | 135 | streamWriter.writeEndElement(); |
112 | | - |
113 | | - streamWriter.writeEndDocument(); |
114 | | - } catch (XMLStreamException exception) { |
115 | | - throw new IOException(exception); |
116 | 136 | } |
117 | | - |
118 | | - writer.flush(); |
119 | 137 | } |
120 | 138 |
|
121 | 139 | private void encode(String key, Object value, XMLStreamWriter streamWriter) throws XMLStreamException { |
|
0 commit comments