1   package org.codehaus.xfire.handler;
2   
3   import javax.xml.stream.XMLStreamConstants;
4   import javax.xml.stream.XMLStreamReader;
5   import javax.xml.stream.XMLStreamWriter;
6   import org.codehaus.xfire.MessageContext;
7   import org.codehaus.xfire.XFireRuntimeException;
8   import org.codehaus.xfire.fault.XFireFault;
9   
10  /***
11   * A handler which echoes the SOAP Body back.
12   * 
13   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
14   * @since Feb 18, 2004
15   */
16  public class EchoHandler
17      extends AbstractHandler
18  {
19      /***
20       * @see org.codehaus.xfire.handler.Handler#invoke(org.codehaus.xfire.MessageContext, javax.xml.stream.XMLStreamReader)
21       */
22      public void invoke( MessageContext context, XMLStreamReader parser ) 
23          throws XFireFault
24      {
25          XMLStreamWriter writer = null;
26          try
27          {
28              writer = getXMLStreamWriter(context);
29              
30              boolean done = false;
31              int attribute = 0;
32              int namespace = 0;
33              
34              while ( !done )
35              {
36                  int event = parser.next();
37                  switch( event )
38                  {
39                      case XMLStreamConstants.START_DOCUMENT:
40                          writer.writeStartDocument();
41                          break;
42                      case XMLStreamConstants.END_DOCUMENT:            
43                          writer.writeEndDocument();
44                          done = true;
45                          break;
46                      case XMLStreamConstants.ATTRIBUTE:
47                          break;
48                      case XMLStreamConstants.NAMESPACE:
49                          break;
50                      case XMLStreamConstants.START_ELEMENT:
51                          writer.writeStartElement( 
52                                  parser.getPrefix(),
53                                  parser.getLocalName(),
54                                  parser.getNamespaceURI());
55  
56                          for ( int i = 0; i < parser.getAttributeCount(); i++ )
57                          {
58                              writer.writeAttribute(
59                                      parser.getAttributeNamespace(i),
60                                      parser.getAttributeLocalName(i),
61                                      parser.getAttributeValue(i));
62                          }
63                          
64                          for ( int i = 0; i < parser.getAttributeCount(); i++ )
65                          {
66                              writer.writeNamespace(
67                                  parser.getNamespacePrefix(i),
68                                  parser.getNamespaceURI(i));
69                          }
70                          
71                          break;
72                      case XMLStreamConstants.END_ELEMENT:
73                          writer.writeEndElement();
74                          break;
75                      case XMLStreamConstants.CHARACTERS:
76                          writer.writeCharacters( parser.getText() );  
77                          break;
78                      default:
79                          break;
80                  }
81              }
82          }
83          catch (Exception e)
84          {
85              throw new XFireRuntimeException("Error processing document.", e);
86          }
87          finally
88          {
89              if ( writer != null )
90              {
91                  try
92                  {
93                      writer.close();
94                      context.getResponseStream().flush();
95                  }
96                  catch (Exception e)
97                  {
98                      throw new XFireRuntimeException("Error closing stream.", e);
99                  }
100             }
101             
102         }
103     }
104 }