1 package org.codehaus.xfire.soap.handler;
2
3 import javax.xml.stream.XMLStreamException;
4 import javax.xml.stream.XMLStreamReader;
5
6 import org.codehaus.xfire.MessageContext;
7 import org.codehaus.xfire.exchange.InMessage;
8 import org.codehaus.xfire.exchange.MessageSerializer;
9 import org.codehaus.xfire.fault.XFireFault;
10 import org.codehaus.xfire.handler.AbstractHandler;
11 import org.codehaus.xfire.handler.Phase;
12 import org.codehaus.yom.Element;
13 import org.codehaus.yom.stax.StaxBuilder;
14
15 public class ReadHeadersHandler
16 extends AbstractHandler
17 {
18 public String getPhase()
19 {
20 return Phase.PARSE;
21 }
22
23 public void invoke(MessageContext context)
24 throws Exception
25 {
26 InMessage message = context.getInMessage();
27 if (message.hasHeader()) return;
28
29 XMLStreamReader reader = message.getXMLStreamReader();
30
31 boolean end = !reader.hasNext();
32 while (!end && reader.hasNext())
33 {
34 int event = reader.next();
35 switch (event)
36 {
37 case XMLStreamReader.START_DOCUMENT:
38 String encoding = reader.getCharacterEncodingScheme();
39 message.setEncoding(encoding);
40 break;
41 case XMLStreamReader.END_DOCUMENT:
42 end = true;
43 return;
44 case XMLStreamReader.END_ELEMENT:
45 break;
46 case XMLStreamReader.START_ELEMENT:
47 if (reader.getLocalName().equals("Header"))
48 {
49 readHeaders(context);
50 }
51 else if (reader.getLocalName().equals("Body"))
52 {
53 seekToWhitespaceEnd(reader);
54
55 checkForFault(context, message, reader);
56
57 return;
58 }
59 else if (reader.getLocalName().equals("Envelope"))
60 {
61 message.setSoapVersion(reader.getNamespaceURI());
62 }
63 break;
64 default:
65 break;
66 }
67 }
68 }
69
70 protected void checkForFault(MessageContext context, InMessage msg, XMLStreamReader reader)
71 throws XFireFault
72 {
73 if (reader.getEventType() == XMLStreamReader.START_ELEMENT)
74 {
75 if (reader.getName().equals(msg.getSoapVersion().getFault()))
76 {
77 MessageSerializer serializer = context.getService().getFaultSerializer();
78
79 serializer.readMessage(msg, context);
80
81 throw (XFireFault) msg.getBody();
82 }
83 }
84 }
85
86 private void seekToWhitespaceEnd(XMLStreamReader reader)
87 throws XMLStreamException
88 {
89 int event = reader.next();
90 if (event != XMLStreamReader.SPACE) return;
91
92 do
93 {
94 event = reader.next();
95 }
96 while (event == XMLStreamReader.SPACE);
97
98 return;
99 }
100
101 /***
102 * Read in the headers as a YOM Element and create a response Header.
103 *
104 * @param context
105 * @throws XMLStreamException
106 */
107 protected void readHeaders(MessageContext context)
108 throws XMLStreamException
109 {
110 StaxBuilder builder = new StaxBuilder();
111
112 Element header = builder.buildElement(null, context.getInMessage().getXMLStreamReader());
113
114 context.getInMessage().setHeader(header);
115 }
116 }