View Javadoc

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; // number of elements read in
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          // Declare which prefixes we're using.
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          // Write out the element name and possible the default namespace
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         // Write out the namespaces
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         // Write out attributes
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 }