1 package org.codehaus.xfire.xmlbeans; 2 3 import java.lang.reflect.Method; 4 import java.util.Collection; 5 import java.util.Iterator; 6 7 import org.apache.xmlbeans.XmlObject; 8 import org.codehaus.xfire.MessageContext; 9 import org.codehaus.xfire.fault.XFireFault; 10 import org.codehaus.xfire.java.JavaService; 11 import org.codehaus.xfire.java.Operation; 12 13 /*** 14 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a> 15 */ 16 public class XMLBeansServiceHandler 17 extends AbstractXMLBeansHandler 18 { 19 public XmlObject[] invoke(XmlObject[] request, MessageContext context) 20 throws Exception 21 { 22 JavaService service = (JavaService) context.getService(); 23 24 Object serviceObject = service.getServiceObject(context); 25 26 Method method = findMethod(service, request); 27 28 Object res = method.invoke(serviceObject, (Object[]) request); 29 30 if ( res.getClass().isArray() ) 31 return (XmlObject[]) res; 32 else 33 return new XmlObject[] { (XmlObject) res }; 34 } 35 36 /*** 37 * @param serviceClass 38 * @throws XFireFault 39 */ 40 private Method findMethod(JavaService service, XmlObject[] request) 41 throws XFireFault 42 { 43 Collection operations = service.getOperations(); 44 45 for ( Iterator itr = operations.iterator(); itr.hasNext(); ) 46 { 47 Operation op = (Operation) itr.next(); 48 49 boolean found = true; 50 51 Class[] params = op.getMethod().getParameterTypes(); 52 if ( params.length == request.length ) 53 { 54 for ( int j = 0; j < params.length; j++ ) 55 { 56 if ( !params[j].isAssignableFrom(request[j].getClass()) ) 57 found = false; 58 } 59 } 60 else 61 { 62 System.out.println("not matching params"); 63 found = false; 64 } 65 66 if ( found ) 67 return op.getMethod(); 68 } 69 70 throw new XFireFault("Couldn't find an appropriate operation!", XFireFault.SENDER); 71 } 72 73 }