1 package org.codehaus.xfire.util;
2
3 import javax.xml.stream.XMLStreamConstants;
4 import javax.xml.stream.XMLStreamException;
5 import javax.xml.stream.XMLStreamReader;
6 import javax.xml.stream.XMLStreamWriter;
7
8 /***
9 * Common StAX utilities.
10 *
11 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
12 * @since Oct 26, 2004
13 */
14 public class STAXUtils
15 {
16 /***
17 * Copies the reader to the writer. The start and end document
18 * methods must be handled on the writer manually.
19 *
20 * TODO: if the namespace on the reader has been declared previously
21 * to where we are in the stream, this probably won't work.
22 *
23 * @param reader
24 * @param writer
25 * @throws XMLStreamException
26 */
27 public static void copy( XMLStreamReader reader, XMLStreamWriter writer )
28 throws XMLStreamException
29 {
30 int read = 0;
31 int event = reader.getEventType();
32
33 while ( true )
34 {
35 switch( event )
36 {
37 case XMLStreamConstants.START_ELEMENT:
38 read++;
39 writeStartElement( reader, writer );
40 break;
41 case XMLStreamConstants.END_ELEMENT:
42 writer.writeEndElement();
43 read--;
44 if ( read <= 0 )
45 return;
46 break;
47 case XMLStreamConstants.CHARACTERS:
48 writer.writeCharacters( reader.getText() );
49 break;
50 case XMLStreamConstants.START_DOCUMENT:
51 case XMLStreamConstants.END_DOCUMENT:
52 case XMLStreamConstants.ATTRIBUTE:
53 case XMLStreamConstants.NAMESPACE:
54 break;
55 default:
56 break;
57 }
58 event = reader.next();
59 }
60 }
61
62 private static void writeStartElement(XMLStreamReader reader, XMLStreamWriter writer)
63 throws XMLStreamException
64 {
65 String prefix = reader.getPrefix();
66 if ( prefix == null )
67 {
68 prefix = "";
69 }
70
71
72 for ( int i = 0; i < reader.getNamespaceCount(); i++ )
73 {
74 String nsPrefix = reader.getNamespacePrefix(i);
75 String nsURI = reader.getNamespaceURI(i);
76
77 if ( nsPrefix != null && nsPrefix.length() > 0 )
78 {
79 writer.setPrefix(nsPrefix, nsURI);
80 }
81 }
82
83 boolean wroteDefault = false;
84 String uri = reader.getNamespaceURI();
85
86
87 if ( uri != null )
88 {
89 String definedNS = writer.getNamespaceContext().getNamespaceURI(prefix);
90 if ( prefix.equals("") )
91 {
92 if ( definedNS == null || !definedNS.equals(uri) )
93 {
94 writer.setDefaultNamespace(uri);
95 writer.writeStartElement( uri, reader.getLocalName() );
96 writer.writeDefaultNamespace( uri );
97 wroteDefault = true;
98 }
99 else
100 {
101 writer.writeStartElement( uri, reader.getLocalName() );
102 }
103 }
104 else
105 {
106 if ( definedNS == null || !definedNS.equals(uri) )
107 writer.setPrefix( prefix, uri );
108
109 writer.writeStartElement(
110 prefix,
111 reader.getLocalName(),
112 uri);
113 }
114 }
115 else
116 {
117 writer.writeStartElement( reader.getLocalName() );
118 }
119
120
121 for ( int i = 0; i < reader.getNamespaceCount(); i++ )
122 {
123 String nsPrefix = reader.getNamespacePrefix(i);
124 String nsURI = reader.getNamespaceURI(i);
125
126 if ( nsPrefix == null || nsPrefix.length() == 0 )
127 {
128 break;
129 }
130
131 writer.writeNamespace(nsPrefix, nsURI);
132 }
133
134
135 for ( int i = 0; i < reader.getAttributeCount(); i++ )
136 {
137 String ns = reader.getAttributeNamespace(i);
138 if ( ns == null || ns.length() == 0 )
139 {
140 writer.writeAttribute(
141 reader.getAttributeLocalName(i),
142 reader.getAttributeValue(i));
143 }
144 else
145 {
146 writer.writeAttribute(
147 reader.getAttributeNamespace(i),
148 reader.getAttributeLocalName(i),
149 reader.getAttributeValue(i));
150 }
151 }
152 }
153 }