View Javadoc

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  }