View Javadoc

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              // Read in the parameters...
67              final List params = pipe.read();
68  
69              // Don't read the operation in until after reading. Otherwise
70              // it won't work for document style services.
71              final Operation operation = pipe.getOperation();
72  
73              // invoke the service method...
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 }