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 }