1 package org.codehaus.xfire.xmlbeans;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.xml.stream.XMLStreamReader;
7
8 import org.apache.xmlbeans.XmlObject;
9 import org.codehaus.xfire.MessageContext;
10 import org.codehaus.xfire.handler.AbstractHandler;
11 import org.codehaus.xfire.util.STAXUtils;
12
13 /***
14 * An XMLBeans handler which can be used in SOAP and REST services.
15 * Override handleRequest and getResponse to add in your service
16 * logic.
17 *
18 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
19 * @since Oct 31, 2004
20 */
21 public abstract class AbstractXMLBeansHandler
22 extends AbstractHandler
23 {
24 public abstract XmlObject[] invoke( XmlObject[] request, MessageContext context )
25 throws Exception;
26
27 public void invoke(MessageContext context, XMLStreamReader reader) throws Exception
28 {
29 List params = new ArrayList();
30
31 int event = reader.getEventType();
32 boolean end = false;
33 while ( !end )
34 {
35 switch( event )
36 {
37 case XMLStreamReader.START_ELEMENT:
38 XmlObject param = XmlObject.Factory.parse(reader);
39 params.add(param);
40 break;
41 case XMLStreamReader.END_ELEMENT:
42 end = true;
43 break;
44 case XMLStreamReader.END_DOCUMENT:
45 end = true;
46 break;
47 default:
48 break;
49 }
50
51 if ( !end )
52 event = reader.next();
53 }
54
55 XmlObject[] response =
56 invoke( (XmlObject[]) params.toArray(new XmlObject[params.size()]), context );
57
58 if ( response != null )
59 {
60 for ( int i = 0; i < response.length; i++ )
61 {
62 STAXUtils.copy(response[i].newXMLStreamReader(), getXMLStreamWriter(context));
63 }
64 }
65 }
66 }