1 package org.codehaus.xfire.message;
2
3 import java.lang.reflect.Constructor;
4 import java.util.List;
5
6 import org.apache.commons.logging.Log;
7 import org.apache.commons.logging.LogFactory;
8 import org.codehaus.xfire.MessageContext;
9 import org.codehaus.xfire.XFireRuntimeException;
10 import org.codehaus.xfire.fault.XFireFault;
11 import org.codehaus.xfire.handler.AbstractHandler;
12 import org.codehaus.xfire.handler.EndpointHandler;
13 import org.codehaus.xfire.service.object.Invoker;
14 import org.codehaus.xfire.service.object.ObjectInvoker;
15 import org.codehaus.xfire.service.object.Operation;
16
17 /***
18 * Handles java services.
19 *
20 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse </a>
21 * @since Feb 18, 2004
22 */
23 public class ObjectServiceHandler
24 extends AbstractHandler
25 implements EndpointHandler
26 {
27 private static final Log logger = LogFactory.getLog(ObjectServiceHandler.class.getName());
28
29 public static final String NAME = "java";
30
31 public static final String RESPONSE_VALUE = "xfire.java.response";
32
33 public static final String RESPONSE_PIPE = "xfire.java.responsePipe";
34
35 private final Invoker invoker;
36
37 private final Class bridgeClass;
38
39 public ObjectServiceHandler()
40 {
41 this(new ObjectInvoker());
42 }
43
44 public ObjectServiceHandler(final Invoker invoker)
45 {
46 this.invoker = invoker;
47 this.bridgeClass = null;
48 }
49
50 public ObjectServiceHandler(final Invoker invoker, final Class bridge)
51 {
52 this.invoker = invoker;
53 this.bridgeClass = bridge;
54 }
55
56 /***
57 * @see org.codehaus.xfire.handler.Handler#invoke(org.codehaus.xfire.MessageContext)
58 */
59 public void invoke(final MessageContext context)
60 throws XFireFault
61 {
62 try
63 {
64 MessageBridge pipe = getMessageBridge(context);
65
66
67 final List params = pipe.read();
68
69
70
71 final Operation operation = pipe.getOperation();
72
73
74 final Object value = invoker.invoke(operation.getMethod(), params.toArray(), context);
75
76 context.setProperty(RESPONSE_VALUE, value);
77 context.setProperty(RESPONSE_PIPE, pipe);
78 }
79 catch (XFireRuntimeException e)
80 {
81 logger.warn("Error invoking service.", e);
82 throw new XFireFault("Error invoking service.", e, XFireFault.SENDER);
83 }
84 }
85
86 /***
87 * @return
88 * @throws XFireFault
89 */
90 protected MessageBridge getMessageBridge(MessageContext context)
91 throws XFireFault
92 {
93 if (bridgeClass != null)
94 {
95 try
96 {
97 Constructor constructor =
98 bridgeClass.getConstructor(new Class[] {MessageContext.class});
99
100 return (MessageBridge) constructor.newInstance( new Object[] { context } );
101 }
102 catch (Exception e)
103 {
104 logger.error("Couldn't create message bridge.", e);
105 throw new XFireFault("Couldn't create message bridge", e, XFireFault.RECEIVER);
106 }
107
108 }
109 return MessageBridgeFactory.createMessageBridge(context);
110 }
111
112 public void writeResponse(final MessageContext context)
113 throws XFireFault
114 {
115 final MessageBridge pipe = (MessageBridge) context.getProperty(RESPONSE_PIPE);
116 final Object value = context.getProperty(RESPONSE_VALUE);
117
118 pipe.write(new Object[] { value });
119 }
120 }