package org.jtwig.property.strategy; import com.google.common.base.Optional; import org.jtwig.model.expression.Expression; import org.jtwig.model.expression.FunctionExpression; import org.jtwig.property.resolver.PropertyResolver; import org.jtwig.property.strategy.method.FunctionArgumentCalculator; import org.jtwig.property.strategy.method.MethodPropertyResolverFactory; import org.jtwig.property.strategy.method.finder.PropertyMethodFinder; import org.jtwig.reflection.model.java.JavaClass; import org.jtwig.reflection.model.java.JavaClassManager; import org.jtwig.reflection.model.java.JavaMethod; import java.util.List; public class FunctionMethodPropertyResolverStrategy implements PropertyResolverStrategy { private final JavaClassManager classManager; private final PropertyMethodFinder propertyMethodFinder; private final MethodPropertyResolverFactory methodPropertyResolverFactory; private final FunctionArgumentCalculator functionArgumentCalculator; public FunctionMethodPropertyResolverStrategy(JavaClassManager classManager, PropertyMethodFinder propertyMethodFinder, MethodPropertyResolverFactory methodPropertyResolverFactory, FunctionArgumentCalculator functionArgumentCalculator) { this.classManager = classManager; this.propertyMethodFinder = propertyMethodFinder; this.methodPropertyResolverFactory = methodPropertyResolverFactory; this.functionArgumentCalculator = functionArgumentCalculator; } @Override public Optional<PropertyResolver> select(Request request) { if (request.getRightExpression() instanceof FunctionExpression) { FunctionExpression functionExpression = (FunctionExpression) request.getRightExpression(); String identifier = functionExpression.getFunctionIdentifier(); List<Expression> arguments = functionExpression.getArguments(); List<Object> calculatedArguments = functionArgumentCalculator.calculate(request, arguments); JavaClass javaClass = classManager.metadata(request.getLeftValue().getClass()); Optional<JavaMethod> method = propertyMethodFinder.find(javaClass, identifier, calculatedArguments); return methodPropertyResolverFactory.create(method); } return Optional.absent(); } }