33
33
import org .culturegraph .mf .util .ResourceUtil ;
34
34
35
35
/**
36
- *
36
+ *
37
37
* writes a stream to XML
38
- *
38
+ *
39
39
* @author Markus Michael Geipel
40
- *
40
+ *
41
41
*/
42
42
@ Description ("writes a stream to xml" )
43
43
@ In (StreamReceiver .class )
44
44
@ Out (String .class )
45
45
public final class SimpleXmlWriter extends DefaultStreamPipe <ObjectReceiver <String >> {
46
+
46
47
public static final String ATTRIBUTE_MARKER = "~" ;
47
- // public static final String TEXT_CONTENT_MARKER = "_text";
48
48
public static final String NAMESPACES = "namespaces" ;
49
- public static final String NEW_LINE = "\n " ;
50
49
51
- private Element element ;
50
+ public static final String DEFAULT_ROOT_TAG = "records" ;
51
+ public static final String DEFAULT_RECORD_TAG = "record" ;
52
+
53
+ private static final String NEW_LINE = "\n " ;
54
+ private static final String INDENT = "\t " ;
55
+
56
+ private static final String BEGIN_ATTRIBUTE = "=\" " ;
57
+ private static final String END_ATTRIBUTE = "\" " ;
58
+ private static final String BEGIN_OPEN_ELEMENT = "<" ;
59
+ private static final String END_OPEN_ELEMENT = ">" ;
60
+ private static final String END_EMPTY_ELEMENT = " />" ;
61
+ private static final String BEGIN_CLOSE_ELEMENT = "</" ;
62
+ private static final String END_CLOSE_ELEMENT = ">" ;
63
+
64
+ private static final String XML_HEADER = "<?xml version=\" 1.0\" encoding=\" UTF-8\" ?>\n " ;
65
+ private static final String XMLNS_MARKER = " xmlns:" ;
66
+
67
+ private String rootTag = DEFAULT_ROOT_TAG ;
68
+ private String recordTag = DEFAULT_RECORD_TAG ;
52
69
private Map <String , String > namespaces = new HashMap <String , String >();
53
- private String recordTag = "record" ;
54
- private String rootTag = "records" ;
55
- private boolean start = true ;
56
- private boolean separateRoots ;
57
70
private boolean writeXmlHeader = true ;
71
+ private boolean separateRoots ;
72
+
73
+ private Element element ;
74
+ private boolean start = true ;
58
75
59
76
public void setRootTag (final String rootTag ) {
60
77
this .rootTag = rootTag ;
61
78
}
62
79
63
- public void setWriteXmlHeader (final boolean writeXmlHeader ) {
64
- this .writeXmlHeader = writeXmlHeader ;
65
- }
66
-
67
- public void setSeparateRoots (final boolean separateRoots ) {
68
- this .separateRoots = separateRoots ;
80
+ public void setRecordTag (final String tag ) {
81
+ recordTag = tag ;
69
82
}
70
83
71
84
public void setNamespaceFile (final String file ) {
72
85
final Properties properties = ResourceUtil .loadProperties (file );
73
- for (Entry <Object , Object > entry : properties .entrySet ()) {
86
+ for (final Entry <Object , Object > entry : properties .entrySet ()) {
74
87
namespaces .put (entry .getKey ().toString (), entry .getValue ().toString ());
75
88
}
76
89
}
77
90
78
- private void writeHeader () {
79
- final StringBuilder builder = new StringBuilder ();
91
+ public void setWriteXmlHeader (final boolean writeXmlHeader ) {
92
+ this .writeXmlHeader = writeXmlHeader ;
93
+ }
80
94
81
- if ( writeXmlHeader ) {
82
- builder . append ( "<?xml version= \" 1.0 \" encoding= \" UTF-8 \" ?> \n " ) ;
83
- }
95
+ public void setSeparateRoots ( final boolean separateRoots ) {
96
+ this . separateRoots = separateRoots ;
97
+ }
84
98
85
- builder .append ("<" );
86
- builder .append (rootTag );
87
- for (Entry <String , String > entry : namespaces .entrySet ()) {
88
- builder .append (" xmlns:" );
89
- builder .append (entry .getKey ());
90
- builder .append ("=\" " );
91
- escape (builder , entry .getValue ());
92
- builder .append ("\" " );
93
- }
94
- builder .append (">" );
95
- getReceiver ().process (builder .toString ());
96
- start = false ;
99
+ public void configure (final MultiMap multimap ) {
100
+ this .namespaces = multimap .getMap (NAMESPACES );
97
101
}
98
102
99
103
@ Override
@@ -108,7 +112,7 @@ public void startRecord(final String identifier) {
108
112
public void endRecord () {
109
113
if (recordTag .isEmpty ()) {
110
114
final StringBuilder builder = new StringBuilder ();
111
- for (Element child : element .getChildren ()) {
115
+ for (final Element child : element .getChildren ()) {
112
116
child .writeToStringBuilder (builder , 1 );
113
117
}
114
118
getReceiver ().process (builder .toString ());
@@ -142,12 +146,10 @@ public void literal(final String name, final String value) {
142
146
}
143
147
}
144
148
145
- public void configure (final MultiMap multimap ) {
146
- this .namespaces = multimap .getMap (NAMESPACES );
147
- }
148
-
149
- public void setRecordTag (final String tag ) {
150
- recordTag = tag ;
149
+ @ Override
150
+ protected void onResetStream () {
151
+ writeFooter ();
152
+ start = true ;
151
153
}
152
154
153
155
@ Override
@@ -157,8 +159,30 @@ protected void onCloseStream() {
157
159
}
158
160
}
159
161
162
+ private void writeHeader () {
163
+
164
+ final StringBuilder builder = new StringBuilder ();
165
+
166
+ if (writeXmlHeader ) {
167
+ builder .append (XML_HEADER );
168
+ }
169
+
170
+ builder .append (BEGIN_OPEN_ELEMENT );
171
+ builder .append (rootTag );
172
+ for (final Entry <String , String > entry : namespaces .entrySet ()) {
173
+ builder .append (XMLNS_MARKER );
174
+ builder .append (entry .getKey ());
175
+ builder .append (BEGIN_ATTRIBUTE );
176
+ escape (builder , entry .getValue ());
177
+ builder .append (END_ATTRIBUTE );
178
+ }
179
+ builder .append (END_OPEN_ELEMENT );
180
+ getReceiver ().process (builder .toString ());
181
+ start = false ;
182
+ }
183
+
160
184
private void writeFooter () {
161
- getReceiver ().process ("</" + rootTag + ">" );
185
+ getReceiver ().process (BEGIN_CLOSE_ELEMENT + rootTag + END_CLOSE_ELEMENT );
162
186
}
163
187
164
188
/**
@@ -190,9 +214,9 @@ public List<Element> getChildren() {
190
214
public void addAttribute (final String name , final String value ) {
191
215
attributes .append (" " );
192
216
attributes .append (name );
193
- attributes .append ("= \" " );
217
+ attributes .append (BEGIN_ATTRIBUTE );
194
218
escape (attributes , value );
195
- attributes .append (" \" " );
219
+ attributes .append (END_ATTRIBUTE );
196
220
}
197
221
198
222
public void setText (final String text ) {
@@ -222,18 +246,18 @@ public String toString() {
222
246
public void writeToStringBuilder (final StringBuilder builder , final int indent ) {
223
247
builder .append (NEW_LINE );
224
248
indent (builder , indent );
225
- builder .append ("<" );
249
+ builder .append (BEGIN_OPEN_ELEMENT );
226
250
builder .append (name );
227
251
builder .append (attributes );
228
252
if (text .isEmpty () && children .isEmpty ()) {
229
- builder .append (" /" );
253
+ builder .append (END_EMPTY_ELEMENT );
254
+ } else {
255
+ builder .append (END_OPEN_ELEMENT );
230
256
}
231
257
232
- builder .append (">" );
233
-
234
258
escape (builder , text );
235
259
236
- for (Element element : children ) {
260
+ for (final Element element : children ) {
237
261
element .writeToStringBuilder (builder , indent + 1 );
238
262
}
239
263
if (text .isEmpty () && !children .isEmpty ()) {
@@ -242,25 +266,19 @@ public void writeToStringBuilder(final StringBuilder builder, final int indent)
242
266
}
243
267
244
268
if (!text .isEmpty () || !children .isEmpty ()) {
245
- builder .append ("</" );
269
+ builder .append (BEGIN_CLOSE_ELEMENT );
246
270
builder .append (name );
247
- builder .append (">" );
271
+ builder .append (END_CLOSE_ELEMENT );
248
272
}
249
273
}
250
274
251
275
private static void indent (final StringBuilder builder , final int indent ) {
252
276
for (int i = 0 ; i < indent ; ++i ) {
253
- builder .append (" \t " );
277
+ builder .append (INDENT );
254
278
}
255
279
}
256
280
}
257
281
258
- @ Override
259
- protected void onResetStream () {
260
- writeFooter ();
261
- start = true ;
262
- }
263
-
264
282
protected static void escape (final StringBuilder builder , final String str ) {
265
283
266
284
final int len = str .length ();
0 commit comments