View Javadoc

1   package org.codehaus.xfire.aegis;
2   
3   import java.lang.reflect.InvocationTargetException;
4   import java.lang.reflect.Method;
5   import java.util.HashMap;
6   import java.util.Map;
7   import org.codehaus.xfire.MessageContext;
8   import org.codehaus.xfire.aegis.operation.WrappedOperation;
9   import org.codehaus.xfire.fault.XFireFault;
10  import org.codehaus.xfire.handler.dom.AbstractDOMHandler;
11  import org.codehaus.xfire.handler.dom.DOMHandler;
12  import org.codehaus.xfire.handler.dom.Message;
13  import org.dom4j.Element;
14  
15  /***
16   * AegisServiceProvider
17   * 
18   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
19   */
20  public class AegisServiceHandler
21  	extends AbstractDOMHandler
22      implements DOMHandler
23  {
24  	public static final String NAME = "aegis";
25      
26      /***
27       * @see org.codehaus.xfire.handler.dom.DOMHandler#invoke(org.codehaus.xfire.MessageContext, org.codehaus.xfire.handler.dom.Message, org.codehaus.xfire.handler.dom.Message)
28       */
29      public void invoke( MessageContext context, 
30                          Message request, 
31                          Message response ) 
32          throws Exception
33      {
34  		AegisService service = (AegisService) context.getService();
35          
36          Object serviceOb = service.createServiceObject();
37  
38          WrappedOperation op = service.getOperation( getPayload(request).getQName() );
39          
40          if ( op == null )
41          {
42          	throw new XFireFault("No such operation.", XFireFault.SENDER);
43          }
44          
45          Map mapContext = new HashMap();
46          
47          op.read( request, mapContext);
48          
49          Map responseVars = null;
50          try
51  		{
52              Method m = serviceOb.getClass().getMethod( op.getQName().getName(), new Class[] { Map.class } );
53              
54  			responseVars =  (Map) m.invoke( serviceOb, new Object[] { mapContext } );
55  		}
56          catch( InvocationTargetException e )
57          {
58              // ITEs are such a pain.
59              Throwable t = e.getTargetException();
60          	if ( t instanceof Exception )
61              {
62          		throw new XFireFault("Error invoking method.",
63                                       (Exception) t,
64                                       XFireFault.RECEIVER);
65              }
66              
67              throw e;
68          }
69          
70          op.write(response, responseVars);
71  	}
72  
73  	public Element getPayload( Message request )
74      {
75          return (Element) request.getBody().elements().get(0);
76      } 
77  }