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
59 Throwable t = e.getTargetException();
60 if ( t instanceof Exception )
61 {
62 if ( t instanceof XFireFault )
63 throw (XFireFault) t;
64
65 throw new XFireFault("Error invoking method.",
66 (Exception) t,
67 XFireFault.RECEIVER);
68 }
69
70 throw e;
71 }
72
73 op.write(response, responseVars);
74 }
75
76 public Element getPayload( Message request )
77 {
78 return (Element) request.getBody().elements().get(0);
79 }
80 }