View Javadoc

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 }