package org.jtwig.property.configuration;
import org.jtwig.macro.render.MacroRender;
import org.jtwig.model.expression.Expression;
import org.jtwig.property.resolver.PropertyResolver;
import org.jtwig.property.selection.cache.SelectionPropertyResolverPersistentCache;
import org.jtwig.property.strategy.*;
import org.jtwig.property.strategy.method.ArgumentsConverter;
import org.jtwig.property.strategy.method.FunctionArgumentCalculator;
import org.jtwig.property.strategy.method.MethodArgumentsMatcher;
import org.jtwig.property.strategy.method.MethodPropertyResolverFactory;
import org.jtwig.property.strategy.method.argument.AssignableTypes;
import org.jtwig.property.strategy.method.argument.IsNativeType;
import org.jtwig.property.strategy.method.argument.group.GroupingArgumentsService;
import org.jtwig.property.strategy.method.convert.NativeTypeConverter;
import org.jtwig.property.strategy.method.finder.CompositePropertyMethodFinder;
import org.jtwig.property.strategy.method.finder.ExactMethodNamePropertyMethodFinder;
import org.jtwig.property.strategy.method.finder.PrefixedMethodNamePropertyMethodFinder;
import org.jtwig.reflection.model.java.JavaClassManager;
import java.util.concurrent.ConcurrentHashMap;
import static java.util.Arrays.asList;
public class DefaultPropertyResolverConfiguration extends PropertyResolverConfiguration {
public DefaultPropertyResolverConfiguration() {
super(new SelectionPropertyResolverPersistentCache(new ConcurrentHashMap<Expression, PropertyResolver>()), asList(
new MacroPropertyResolverStrategy(new MacroRender()),
new MapPropertyResolverStrategy(),
new ValueContextPropertyResolverStrategy(),
new FunctionMethodPropertyResolverStrategy(JavaClassManager.classManager(), new CompositePropertyMethodFinder(asList(
new ExactMethodNamePropertyMethodFinder(new MethodArgumentsMatcher(new ArgumentsConverter(new NativeTypeConverter(IsNativeType.instance(), new AssignableTypes(IsNativeType.instance())), new GroupingArgumentsService()))),
new PrefixedMethodNamePropertyMethodFinder("get"),
new PrefixedMethodNamePropertyMethodFinder("is"),
new PrefixedMethodNamePropertyMethodFinder("has")
)), new MethodPropertyResolverFactory(new ArgumentsConverter(new NativeTypeConverter(IsNativeType.instance(), new AssignableTypes(IsNativeType.instance())), new GroupingArgumentsService())), new FunctionArgumentCalculator()),
new VariableMethodPropertyResolverStrategy(JavaClassManager.classManager(), new CompositePropertyMethodFinder(asList(
new ExactMethodNamePropertyMethodFinder(new MethodArgumentsMatcher(new ArgumentsConverter(new NativeTypeConverter(IsNativeType.instance(), new AssignableTypes(IsNativeType.instance())), new GroupingArgumentsService()))),
new PrefixedMethodNamePropertyMethodFinder("get"),
new PrefixedMethodNamePropertyMethodFinder("is"),
new PrefixedMethodNamePropertyMethodFinder("has")
)), new MethodPropertyResolverFactory(new ArgumentsConverter(new NativeTypeConverter(IsNativeType.instance(), new AssignableTypes(IsNativeType.instance())), new GroupingArgumentsService()))),
new FieldPropertyResolverStrategy(JavaClassManager.classManager()),
new GetMethodPropertyResolverStrategy(JavaClassManager.classManager())
));
}
}