1 package org.codehaus.xfire.plexus; 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.plexus.component.repository.exception.ComponentLookupException; 9 import org.codehaus.plexus.personality.plexus.lifecycle.phase.ServiceLocator; 10 import org.codehaus.xfire.MessageContext; 11 import org.codehaus.xfire.XFireRuntimeException; 12 import org.codehaus.xfire.fault.XFireFault; 13 import org.codehaus.xfire.service.object.ObjectInvoker; 14 15 /*** 16 * Invokes a Plexus service. 17 * 18 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a> 19 * @since Nov 18, 2004 20 */ 21 public class ServiceInvoker 22 extends ObjectInvoker 23 { 24 private static Log logger = LogFactory.getLog(ServiceInvoker.class.getName()); 25 26 private ServiceLocator locator; 27 28 private boolean hasService = true; 29 private boolean hasChecked = false; 30 31 public ServiceInvoker( ServiceLocator locator ) 32 { 33 this.locator = locator; 34 } 35 36 public Object invoke(Method method, Object[] args, MessageContext context) 37 throws XFireFault 38 { 39 if ( !hasChecked ) 40 { 41 if ( locator.hasComponent(method.getDeclaringClass().getName(), 42 context.getServiceName()) ) 43 { 44 hasService = true; 45 } 46 else 47 { 48 hasService = false; 49 } 50 } 51 52 if ( hasService ) 53 { 54 try 55 { 56 Object component = locator.lookup( 57 method.getDeclaringClass().getName(), 58 context.getServiceName()); 59 60 return method.invoke(component, args); 61 } 62 catch (IllegalArgumentException e) 63 { 64 throw new XFireFault( "Illegal argument.", e, XFireFault.SENDER ); 65 } 66 catch (InvocationTargetException e) 67 { 68 Throwable t = e.getTargetException(); 69 t.getMessage(); 70 71 if ( t instanceof XFireFault ) 72 { 73 throw (XFireFault) t; 74 } 75 else if ( t instanceof Exception ) 76 { 77 logger.warn("Error invoking service.", t); 78 throw new XFireFault( (Exception) t, XFireFault.SENDER ); 79 } 80 else 81 { 82 logger.warn("Error invoking service.", e); 83 throw new XFireRuntimeException( "Error invoking service.", e ); 84 } 85 } 86 catch (IllegalAccessException e) 87 { 88 throw new XFireFault( "Couldn't access service object.", e, XFireFault.RECEIVER ); 89 } 90 catch (ComponentLookupException e) 91 { 92 throw new XFireFault( "Couldn't find plexus service.", e, XFireFault.RECEIVER ); 93 } 94 } 95 else 96 { 97 return super.invoke(method, args, context); 98 } 99 } 100 101 }