View Javadoc

1   package org.codehaus.xfire.xmlbeans.client;
2   
3   import java.util.ArrayList;
4   
5   import javax.xml.stream.XMLStreamException;
6   import javax.xml.stream.XMLStreamReader;
7   import javax.xml.stream.XMLStreamWriter;
8   
9   import org.apache.xmlbeans.XmlException;
10  import org.apache.xmlbeans.XmlObject;
11  import org.apache.xmlbeans.XmlOptions;
12  import org.codehaus.xfire.client.AbstractClientHandler;
13  import org.codehaus.xfire.util.STAXUtils;
14  
15  
16  /***
17   * Handles XmlBeans requests and response for SOAP/REST clients.
18   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
19   * @since Oct 27, 2004
20   */
21  public class XMLBeansClientHandler
22      extends AbstractClientHandler
23  {
24      private XmlObject[] request;
25      private XmlObject[] response;
26      private XmlOptions options;
27      
28      public XMLBeansClientHandler()
29      {
30          options = new XmlOptions();
31          options.setCharacterEncoding("UTF-8");
32      }
33      
34      public XMLBeansClientHandler(XmlOptions options)
35      {
36          this.options = options;
37      }
38      
39      /***
40       * @return Returns the request.
41       */
42      public XmlObject[] getRequest()
43      {
44          return request;
45      }
46      
47      /***
48       * @param request The request to set.
49       */
50      public void setRequest(XmlObject[] request)
51      {
52          this.request = request;
53      }
54      
55      /***
56       * @return Returns the response.
57       */
58      public XmlObject[] getResponse()
59      {
60          return response;
61      }
62      
63      /***
64       * @param response The response to set.
65       */
66      public void setResponse(XmlObject[] response)
67      {
68          this.response = response;
69      }
70  
71      public void writeRequest( XMLStreamWriter writer ) throws XMLStreamException
72      {
73          for ( int i = 0; i < request.length; i++ )
74          {
75              STAXUtils.copy(request[i].newXMLStreamReader(options), writer);
76          }
77      }
78  
79      
80      public void handleResponse(XMLStreamReader reader) throws XMLStreamException
81      {
82          try
83          {
84              ArrayList responseElements = new ArrayList();
85              
86              boolean more = true;
87              int event = reader.getEventType();
88              while ( more )
89              {
90                  switch( event )
91                  {
92                      case XMLStreamReader.END_DOCUMENT:
93                          more = false;
94                          break;
95                      case XMLStreamReader.START_ELEMENT:
96                          responseElements.add(XmlObject.Factory.parse( reader ));
97                      case XMLStreamReader.END_ELEMENT:
98                          // TODO: there should be a more generic way to do this
99                          // so that it works with SOAP and REST at any point
100                         // in any stream.
101                         if ( reader.getLocalName().equals("Envelope") )
102                             more = false;
103                         else if ( reader.getLocalName().equals("Header") )
104                             more = false;
105                         break;
106                     default:
107                         break;
108                 }
109                 
110                 if ( more )
111                     event = reader.next();
112             }
113             
114             response = (XmlObject[]) responseElements.toArray(new XmlObject[responseElements.size()]);
115         }
116         catch (XmlException e)
117         {
118             throw new XMLStreamException("Couldn't parse response.", e);
119         }
120     }
121 }