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 }