@@ -84,7 +84,7 @@ public void write(Iterable<? extends Map<String, ?>> values, Writer writer) thro
8484 streamWriter .writeStartDocument ();
8585 streamWriter .writeStartElement (rootElementName );
8686
87- writeValues (values , streamWriter );
87+ writeSequence (values , streamWriter );
8888
8989 streamWriter .writeEndElement ();
9090 streamWriter .writeEndDocument ();
@@ -95,42 +95,55 @@ public void write(Iterable<? extends Map<String, ?>> values, Writer writer) thro
9595 writer .flush ();
9696 }
9797
98- @ SuppressWarnings ("unchecked" )
99- private void writeValues (Iterable <? extends Map <String , ?>> values , XMLStreamWriter streamWriter ) throws XMLStreamException {
98+ private void writeSequence (Iterable <? extends Map <String , ?>> values , XMLStreamWriter streamWriter ) throws XMLStreamException {
10099 for (Map <String , ?> map : values ) {
101100 streamWriter .writeStartElement ("item" );
102101
103- LinkedHashMap <String , Iterable <?>> collections = new LinkedHashMap <>();
104-
105- for (Map .Entry <String , ?> entry : map .entrySet ()) {
106- String key = entry .getKey ();
102+ writeMap (map , streamWriter );
107103
108- if ( key == null ) {
109- continue ;
110- }
104+ streamWriter . writeEndElement ();
105+ }
106+ }
111107
112- Object value = entry .getValue ();
108+ @ SuppressWarnings ("unchecked" )
109+ private void writeMap (Map <String , ?> map , XMLStreamWriter streamWriter ) throws XMLStreamException {
110+ LinkedHashMap <String , Iterable <?>> sequences = new LinkedHashMap <>();
111+ LinkedHashMap <String , Map <?, ?>> maps = new LinkedHashMap <>();
113112
114- if (value == null ) {
115- continue ;
116- }
113+ for (Map .Entry <String , ?> entry : map .entrySet ()) {
114+ String key = entry .getKey ();
117115
118- if (value instanceof Iterable <?>) {
119- collections .put (key , (Iterable <? extends Map <String , ?>>)value );
120- } else if (value instanceof Map <?, ?>) {
121- // TODO
122- } else {
123- encode (key , value , streamWriter );
124- }
116+ if (key == null ) {
117+ continue ;
125118 }
126119
127- for (Map .Entry <String , Iterable <?>> entry : collections .entrySet ()) {
128- streamWriter .writeStartElement (entry .getKey ());
120+ Object value = entry .getValue ();
129121
130- writeValues ((Iterable <? extends Map <String , ?>>)entry .getValue (), streamWriter );
122+ if (value == null ) {
123+ continue ;
124+ }
131125
132- streamWriter .writeEndElement ();
126+ if (value instanceof Iterable <?>) {
127+ sequences .put (key , (Iterable <? extends Map <String , ?>>)value );
128+ } else if (value instanceof Map <?, ?>) {
129+ maps .put (key , (Map <?, ?>)value );
130+ } else {
131+ encode (key , value , streamWriter );
133132 }
133+ }
134+
135+ for (Map .Entry <String , Iterable <?>> entry : sequences .entrySet ()) {
136+ streamWriter .writeStartElement (entry .getKey ());
137+
138+ writeSequence ((Iterable <? extends Map <String , ?>>)entry .getValue (), streamWriter );
139+
140+ streamWriter .writeEndElement ();
141+ }
142+
143+ for (Map .Entry <String , Map <?, ?>> entry : maps .entrySet ()) {
144+ streamWriter .writeStartElement (entry .getKey ());
145+
146+ writeMap ((Map <String , ?>)entry .getValue (), streamWriter );
134147
135148 streamWriter .writeEndElement ();
136149 }
0 commit comments