package org.jboss.seam.async; import java.lang.reflect.Method; import org.jboss.seam.Component; import org.jboss.seam.intercept.InvocationContext; import org.jboss.seam.log.LogProvider; import org.jboss.seam.log.Logging; import org.jboss.seam.util.Reflections; /** * An asynchronous method invocation. * * @author Gavin King * */ public class AsynchronousInvocation extends Asynchronous { static final long serialVersionUID = 7426196491669891310L; private static transient LogProvider log = Logging.getLogProvider(AsynchronousInvocation.class); private String methodName; private Class[] argTypes; private Object[] args; private String componentName; public AsynchronousInvocation(Method method, String componentName, Object[] args) { this.methodName = method.getName(); this.argTypes = method.getParameterTypes(); this.args = args==null ? new Object[0] : args; this.componentName = componentName; } public AsynchronousInvocation(InvocationContext invocation, Component component) { this( invocation.getMethod(), component.getName(), invocation.getParameters() ); } @Override public void execute(Object timer) { new ContextualAsynchronousRequest(timer) { @Override protected void process() { Object target = Component.getInstance(componentName); Method method; try { method = target.getClass().getMethod(methodName, argTypes); } catch (NoSuchMethodException nsme) { throw new IllegalStateException(nsme); } Reflections.invokeAndWrap(method, target, args); } }.run(); } @Override public String toString() { return "AsynchronousInvocation(" + componentName + '.' + methodName + "())"; } @Override protected void handleException(final Exception exception, Object timer) { new ContextualAsynchronousRequest(timer) { @Override protected void process() { Object target = Component.getInstance(componentName); try { Method method = target.getClass().getMethod("handleAsynchronousException", Exception.class); log.trace("Using asynchronous exception handler " + componentName + ".handleAsynchronsException;"); method.invoke(target, exception); } catch (Exception e) { log.trace("Using default asynchronous exception handler"); AsynchronousExceptionHandler.instance().handleException(exception); } } }.run(); } }