1 package org.codehaus.plexus.util.xml;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import java.io.File;
20 import java.io.IOException;
21 import java.io.InputStream;
22 import java.io.OutputStream;
23 import java.io.OutputStreamWriter;
24 import java.io.Reader;
25 import java.io.Writer;
26
27 import org.codehaus.plexus.util.ReaderFactory;
28 import org.codehaus.plexus.util.StringUtils;
29 import org.codehaus.plexus.util.WriterFactory;
30 import org.codehaus.plexus.util.xml.pull.MXParser;
31 import org.codehaus.plexus.util.xml.pull.XmlPullParser;
32 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
33
34
35
36
37
38
39
40
41 public class XmlUtil
42 {
43
44 public static final int DEFAULT_INDENTATION_SIZE = 2;
45
46
47 public static final String DEFAULT_LINE_SEPARATOR = System.getProperty( "line.separator" );
48
49
50
51
52
53
54
55 public static boolean isXml( File f )
56 {
57 if ( f == null )
58 {
59 throw new IllegalArgumentException( "f could not be null." );
60 }
61
62 if ( !f.isFile() )
63 {
64 throw new IllegalArgumentException( "The file '" + f.getAbsolutePath() + "' is not a file." );
65 }
66
67 try ( Reader reader = ReaderFactory.newXmlReader( f ) )
68 {
69 XmlPullParser parser = new MXParser();
70 parser.setInput( reader );
71 parser.nextToken();
72 return true;
73 }
74 catch ( Exception e )
75 {
76 return false;
77 }
78 }
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102 public static void prettyFormat( Reader reader, Writer writer )
103 throws IOException
104 {
105 prettyFormat( reader, writer, DEFAULT_INDENTATION_SIZE, DEFAULT_LINE_SEPARATOR );
106 }
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131 public static void prettyFormat( Reader reader, Writer writer, int indentSize, String lineSeparator )
132 throws IOException
133 {
134 if ( reader == null )
135 {
136 throw new IllegalArgumentException( "The reader is null" );
137 }
138 if ( writer == null )
139 {
140 throw new IllegalArgumentException( "The writer is null" );
141 }
142 if ( indentSize < 0 )
143 {
144 indentSize = 0;
145 }
146
147 PrettyPrintXMLWriter xmlWriter = new PrettyPrintXMLWriter( writer );
148 xmlWriter.setLineIndenter( StringUtils.repeat( " ", indentSize ) );
149 xmlWriter.setLineSeparator( lineSeparator );
150
151 XmlPullParser parser = new MXParser();
152 try
153 {
154 parser.setInput( reader );
155
156 prettyFormatInternal( parser, xmlWriter );
157 }
158 catch ( XmlPullParserException e )
159 {
160 throw new IOException( "Unable to parse the XML: " + e.getMessage() );
161 }
162 }
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184 public static void prettyFormat( InputStream is, OutputStream os )
185 throws IOException
186 {
187 prettyFormat( is, os, DEFAULT_INDENTATION_SIZE, DEFAULT_LINE_SEPARATOR );
188 }
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211 public static void prettyFormat( InputStream is, OutputStream os, int indentSize, String lineSeparator )
212 throws IOException
213 {
214 if ( is == null )
215 {
216 throw new IllegalArgumentException( "The is is null" );
217 }
218 if ( os == null )
219 {
220 throw new IllegalArgumentException( "The os is null" );
221 }
222 if ( indentSize < 0 )
223 {
224 indentSize = 0;
225 }
226
227 try ( Reader reader = ReaderFactory.newXmlReader( is );
228 Writer writer = new OutputStreamWriter( os ) )
229 {
230 final PrettyPrintXMLWriter xmlWriter = new PrettyPrintXMLWriter( writer );
231 xmlWriter.setLineIndenter( StringUtils.repeat( " ", indentSize ) );
232 xmlWriter.setLineSeparator( lineSeparator );
233
234 final XmlPullParser parser = new MXParser();
235 parser.setInput( reader );
236
237 prettyFormatInternal( parser, xmlWriter );
238 }
239 catch ( XmlPullParserException e )
240 {
241 throw new IOException( "Unable to parse the XML: " + e.getMessage() );
242 }
243 }
244
245
246
247
248
249
250
251 private static void prettyFormatInternal( XmlPullParser parser, PrettyPrintXMLWriter writer )
252 throws XmlPullParserException, IOException
253 {
254 boolean hasTag = false;
255 boolean hasComment = false;
256 int eventType = parser.getEventType();
257 while ( eventType != XmlPullParser.END_DOCUMENT )
258 {
259 if ( eventType == XmlPullParser.START_TAG )
260 {
261 hasTag = true;
262 if ( hasComment )
263 {
264 writer.writeText( writer.getLineIndenter() );
265 hasComment = false;
266 }
267 writer.startElement( parser.getName() );
268 for ( int i = 0; i < parser.getAttributeCount(); i++ )
269 {
270 String key = parser.getAttributeName( i );
271 String value = parser.getAttributeValue( i );
272 writer.addAttribute( key, value );
273 }
274 }
275 else if ( eventType == XmlPullParser.TEXT )
276 {
277 String text = parser.getText();
278 if ( !text.trim().equals( "" ) )
279 {
280 text = StringUtils.removeDuplicateWhitespace( text );
281 writer.writeText( text );
282 }
283 }
284 else if ( eventType == XmlPullParser.END_TAG )
285 {
286 hasTag = false;
287 writer.endElement();
288 }
289 else if ( eventType == XmlPullParser.COMMENT )
290 {
291 hasComment = true;
292 if ( !hasTag )
293 {
294 writer.writeMarkup( writer.getLineSeparator() );
295 for ( int i = 0; i < writer.getDepth(); i++ )
296 {
297 writer.writeMarkup( writer.getLineIndenter() );
298 }
299 }
300 writer.writeMarkup( "<!--" + parser.getText().trim() + " -->" );
301 if ( !hasTag )
302 {
303 writer.writeMarkup( writer.getLineSeparator() );
304 for ( int i = 0; i < writer.getDepth() - 1; i++ )
305 {
306 writer.writeMarkup( writer.getLineIndenter() );
307 }
308 }
309 }
310 else if ( eventType == XmlPullParser.DOCDECL )
311 {
312 writer.writeMarkup( "<!DOCTYPE" + parser.getText() + ">" );
313 writer.endOfLine();
314 }
315 else if ( eventType == XmlPullParser.PROCESSING_INSTRUCTION )
316 {
317 writer.writeMarkup( "<?" + parser.getText() + "?>" );
318 writer.endOfLine();
319 }
320 else if ( eventType == XmlPullParser.CDSECT )
321 {
322 writer.writeMarkup( "<![CDATA[" + parser.getText() + "]]>" );
323 }
324 else if ( eventType == XmlPullParser.ENTITY_REF )
325 {
326 writer.writeMarkup( "&" + parser.getName() + ";" );
327 }
328
329 eventType = parser.nextToken();
330 }
331 }
332 }