package ee.telekom.workflow.graph.node.expression; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import ee.telekom.workflow.graph.WorkflowException; import ee.telekom.workflow.util.MethodUtil; /** * {@link Expression} implementation that executes a method with given name on a given object. */ public class SimpleMethodCallExpression<T> implements Expression<T>{ private Object target; private String methodName; public SimpleMethodCallExpression( Object target, String methodName ){ this.target = target; this.methodName = methodName; } public Object getTarget(){ return target; } public String getMethodName(){ return methodName; } @Override public T execute( Object... arguments ){ Method method = getMethod( target.getClass(), arguments ); try{ @SuppressWarnings("unchecked") T result = (T)method.invoke( target, arguments ); return result; } catch( IllegalAccessException e ){ throw new WorkflowException( "Invoking method '" + method.getName() + "' on class '" + target.getClass().getName() + "' failed", e ); } catch( IllegalArgumentException e ){ throw new WorkflowException( "Invoking method '" + method.getName() + "' on class '" + target.getClass().getName() + "' failed", e ); } catch( InvocationTargetException e ){ throw new WorkflowException( "Invoking method '" + method.getName() + "' on class '" + target.getClass().getName() + "' failed", e ); } } private Method getMethod( Class<?> clazz, Object... arguments ){ return MethodUtil.findMethod( clazz, methodName, MethodUtil.getArgumentClasses( arguments ) ); } }