package io.muoncore.spring.methodinvocation; import io.muoncore.spring.mapping.MuonMappingException; import io.muoncore.spring.methodinvocation.parameterhandlers.MethodArgumentTransformer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; abstract public class AbstractMuonMethodInvocation<T> { protected final Method method; protected final Object bean; final List<MethodArgumentTransformer> argumentTransformers; private Logger log = LoggerFactory.getLogger(AbstractMuonMethodInvocation.class.getName()); public AbstractMuonMethodInvocation(Object bean, Method method) { this.bean = bean; this.method = method; argumentTransformers = new ArrayList<>(method.getParameterCount()); } public Object invoke(T arg) { try { log.debug("Executing method " + method + " with event " + arg); return method.invoke(bean, transformArguments(arg)); } catch (IllegalAccessException | InvocationTargetException e) { throw new MuonMappingException(e); } } private Object[] transformArguments(T muonResourceEvent) { Object[] arguments = new Object[method.getParameterCount()]; for (int i = 0; i < method.getParameterCount(); i++) { arguments[i] = argumentTransformers.get(i).extractArgument(muonResourceEvent); } return arguments; } }