package org.jtwig.property.resolver;
import com.google.common.base.Optional;
import org.jtwig.property.resolver.request.PropertyResolveRequest;
import org.jtwig.property.strategy.method.ArgumentsConverter;
import org.jtwig.reflection.model.Value;
import org.jtwig.reflection.model.java.JavaMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.InvocationTargetException;
public class MethodPropertyResolver implements PropertyResolver {
private static final Logger logger = LoggerFactory.getLogger(MethodPropertyResolver.class);
private final JavaMethod javaMethod;
private final ArgumentsConverter argumentsConverter;
public MethodPropertyResolver(JavaMethod javaMethod, ArgumentsConverter argumentsConverter) {
this.javaMethod = javaMethod;
this.argumentsConverter = argumentsConverter;
}
@Override
public Optional<Value> resolve(PropertyResolveRequest request) {
if (request.getContext() == null) return Optional.absent();
Object[] arguments = request.getArguments().toArray();
Optional<Object[]> convert = argumentsConverter.convert(javaMethod, arguments);
if (convert.isPresent()) {
try {
return Optional.of(new Value(javaMethod.invoke(request.getContext(), convert.get())));
} catch (InvocationTargetException | IllegalAccessException | IllegalArgumentException e) {
logger.debug("Unable to retrieve value from method {} with arguments {}", javaMethod, request.getArguments(), e);
return Optional.absent();
}
} else {
logger.debug("Cannot convert arguments provided {} to defined method arguments types {}.", arguments, javaMethod.arguments());
return Optional.absent();
}
}
}