1 package org.codehaus.xfire.picocontainer.util; 2 3 import java.lang.reflect.InvocationTargetException; 4 import java.lang.reflect.Method; 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.service.binding.Invoker; 12 import org.picocontainer.PicoContainer; 13 import org.picocontainer.defaults.ObjectReference; 14 15 public class PicoObjectInvoker 16 implements Invoker 17 { 18 19 private static final Log logger = LogFactory.getLog(Invoker.class.getName()); 20 21 private ObjectReference picoReference; 22 23 private Object componentKey; 24 25 public PicoObjectInvoker(ObjectReference picoReference, Object componentKey) 26 { 27 this.picoReference = picoReference; 28 this.componentKey = componentKey; 29 } 30 31 public Object invoke(final Method method, final Object[] params, final MessageContext context) 32 throws XFireFault 33 { 34 try 35 { 36 PicoContainer pico = (PicoContainer) picoReference.get(); 37 final Object serviceObject = pico.getComponentInstance(componentKey); 38 39 return method.invoke(serviceObject, params); 40 } 41 catch (IllegalArgumentException e) 42 { 43 throw new XFireFault("Illegal argument.", e, XFireFault.SENDER); 44 } 45 catch (InvocationTargetException e) 46 { 47 final Throwable t = e.getTargetException(); 48 49 if (t instanceof XFireFault) 50 { 51 throw (XFireFault) t; 52 } 53 else if (t instanceof Exception) 54 { 55 logger.warn("Error invoking service.", t); 56 throw new XFireFault(t, XFireFault.SENDER); 57 } 58 else 59 { 60 logger.warn("Error invoking service.", e); 61 throw new XFireRuntimeException("Error invoking service.", e); 62 } 63 } 64 catch (IllegalAccessException e) 65 { 66 throw new XFireFault("Couldn't access service object.", e, XFireFault.RECEIVER); 67 } 68 } 69 }