View Javadoc

1   package org.codehaus.xfire.handler;
2   
3   import javax.xml.stream.XMLStreamException;
4   import javax.xml.stream.XMLStreamReader;
5   import javax.xml.stream.XMLStreamWriter;
6   
7   import org.codehaus.xfire.MessageContext;
8   
9   /***
10   * Delegates the SOAP Body and Header to appropriate handlers.
11   * 
12   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
13   * @since Oct 28, 2004
14   */
15  public class SoapHandler 
16      extends AbstractHandler
17  {
18      private Handler bodyHandler;
19      private Handler headerHandler;
20  
21      public SoapHandler( Handler bodyHandler )
22      {
23          this.bodyHandler = bodyHandler;
24      }
25      
26      public SoapHandler( Handler bodyHandler, Handler headerHandler )
27      {
28          this.bodyHandler = bodyHandler;
29          this.headerHandler = headerHandler;
30      }
31      
32      /***
33       * Invoke the Header and Body Handlers for the SOAP message.
34       */
35      public void invoke(MessageContext context, XMLStreamReader reader)
36              throws Exception
37      {
38          XMLStreamWriter writer = null;
39          String encoding = null;
40          
41          boolean end = false;
42          while ( !end && reader.hasNext() )
43          {
44              int event = reader.next();
45              switch( event )
46              {
47              case XMLStreamReader.START_DOCUMENT:
48                  encoding = reader.getCharacterEncodingScheme();
49                  break;
50              case XMLStreamReader.END_DOCUMENT:
51                  end = true;
52                  break;
53              case XMLStreamReader.END_ELEMENT:
54                  break;
55              case XMLStreamReader.START_ELEMENT:
56                  if( reader.getLocalName().equals("Header") && headerHandler != null )
57                  {
58                      writer.writeStartElement("soap", "Header", context.getSoapVersion());
59                      reader.nextTag();
60                      headerHandler.invoke(context, reader);
61                      writer.writeEndElement();
62                  }
63                  else if ( reader.getLocalName().equals("Body") )
64                  {
65                      writer.writeStartElement("soap", "Body", context.getSoapVersion());
66                      reader.nextTag();
67                      bodyHandler.invoke(context, reader);
68                      writer.writeEndElement();
69                  }
70                  else if ( reader.getLocalName().equals("Envelope") )
71                  {
72                      writer = createResponseEnvelope(context, reader, encoding);
73                  }
74                  break;
75              default:
76                  break;
77              }
78          }
79  
80          writer.writeEndElement();  // Envelope
81  
82          writer.writeEndDocument();
83          writer.close();
84      }
85  
86      /***
87       * @param context
88       * @param reader
89       * @throws XMLStreamException
90       */
91      private XMLStreamWriter createResponseEnvelope(MessageContext context, 
92                                                     XMLStreamReader reader,
93                                                     String encoding)
94          throws XMLStreamException
95      {
96          XMLStreamWriter writer = getXMLStreamWriter(context);
97          if ( encoding == null )
98              writer.writeStartDocument("UTF-8", "1.0");
99          else
100             writer.writeStartDocument(encoding, "1.0");
101         
102         String soapVersion = reader.getNamespaceURI();
103         context.setSoapVersion(soapVersion);
104  
105         writer.setPrefix("soap", soapVersion);
106         writer.writeStartElement("soap", "Envelope", soapVersion);
107         writer.writeNamespace("soap", soapVersion);
108         
109         return writer;
110     }
111 }