Skip to content

Commit d0c152b

Browse files
committed
Update XMLEncoder.
1 parent bd0c96f commit d0c152b

File tree

2 files changed

+48
-22
lines changed

2 files changed

+48
-22
lines changed

httprpc/src/main/java/org/httprpc/io/XMLEncoder.java

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.io.Writer;
2121
import java.nio.charset.Charset;
2222
import java.util.Date;
23+
import java.util.LinkedHashMap;
2324
import java.util.Map;
2425

2526
import javax.xml.stream.XMLOutputFactory;
@@ -81,41 +82,58 @@ public void write(Iterable<? extends Map<String, ?>> values, Writer writer) thro
8182
XMLStreamWriter streamWriter = outputFactory.createXMLStreamWriter(writer);
8283

8384
streamWriter.writeStartDocument();
84-
8585
streamWriter.writeStartElement(rootElementName);
8686

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");
89102

90-
for (Map.Entry<String, ?> entry : map.entrySet()) {
91-
String key = entry.getKey();
103+
LinkedHashMap<String, Iterable<?>> collections = new LinkedHashMap<>();
92104

93-
if (key == null) {
94-
continue;
95-
}
105+
for (Map.Entry<String, ?> entry : map.entrySet()) {
106+
String key = entry.getKey();
96107

97-
Object value = entry.getValue();
108+
if (key == null) {
109+
continue;
110+
}
98111

99-
if (value == null) {
100-
continue;
101-
}
112+
Object value = entry.getValue();
102113

103-
// TODO Prepend ancestor keypath
114+
if (value == null) {
115+
continue;
116+
}
104117

118+
if (value instanceof Iterable<?>) {
119+
collections.put(key, (Iterable<? extends Map<String, ?>>)value);
120+
} else if (value instanceof Map<?, ?>) {
121+
// TODO
122+
} else {
105123
encode(key, value, streamWriter);
106124
}
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);
107131

108132
streamWriter.writeEndElement();
109133
}
110134

111135
streamWriter.writeEndElement();
112-
113-
streamWriter.writeEndDocument();
114-
} catch (XMLStreamException exception) {
115-
throw new IOException(exception);
116136
}
117-
118-
writer.flush();
119137
}
120138

121139
private void encode(String key, Object value, XMLStreamWriter streamWriter) throws XMLStreamException {

httprpc/src/test/java/org/httprpc/io/XMLEncoderTest.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ public class XMLEncoderTest extends AbstractTest {
3030
public void testWrite() throws IOException {
3131
String expected = "<?xml version=\"1.0\" ?>"
3232
+ "<test>"
33-
+ "<item a=\"ABC\" b=\"1\" c=\"2.345\" d=\"{e=true}\" f=\"0\" g=\"3\"></item>"
33+
+ "<item a=\"ABC\" b=\"1\" c=\"2.345\" f=\"0\" g=\"3\">"
34+
+ "<d><item e=\"true\"></item><item e=\"false\"></item></d>"
35+
+ "</item>"
3436
+ "<item a=\"DÉF\" b=\"2\" c=\"4.5678\"></item>"
3537
+ "</test>";
3638

@@ -39,8 +41,14 @@ public void testWrite() throws IOException {
3941
entry("a", "ABC"),
4042
entry("b", 1),
4143
entry("c", 2.345),
42-
entry("d", mapOf(
43-
entry("e", true)
44+
entry("d", listOf(
45+
mapOf(entry("e", true)),
46+
mapOf(entry("e", false))
47+
)),
48+
entry("e", mapOf(
49+
entry("f", mapOf(
50+
entry("g", "XYZ")
51+
))
4452
)),
4553
entry("f", new Date(0)),
4654
entry("g", DayOfWeek.THURSDAY)

0 commit comments

Comments
 (0)