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
99
100
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 }