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();
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 }