package org.jtwig.property.selection; import com.google.common.base.Optional; import org.jtwig.property.resolver.EmptyPropertyResolver; import org.jtwig.property.resolver.PropertyResolver; import org.jtwig.property.strategy.PropertyResolverStrategy; import org.jtwig.reflection.model.Value; import org.jtwig.value.Undefined; import java.util.Collection; public class BaseSelectionPropertyResolver implements SelectionPropertyResolver { private final Collection<PropertyResolverStrategy> strategies; private final SelectionPropertyResolveService selectionPropertyResolveService; public BaseSelectionPropertyResolver(Collection<PropertyResolverStrategy> strategies, SelectionPropertyResolveService selectionPropertyResolveService) { this.strategies = strategies; this.selectionPropertyResolveService = selectionPropertyResolveService; } @Override public SelectionResult resolve(SelectionRequest request) { Object leftValue = request.getEnvironment().getRenderEnvironment().getCalculateExpressionService() .calculate(request, request.getLeftExpression()); if (leftValue == null || leftValue == Undefined.UNDEFINED) return new SelectionResult(Optional.<PropertyResolver>absent(), Optional.<Value>absent()); PropertyResolverStrategy.Request strategyRequest = new PropertyResolverStrategy.Request( request, leftValue, request.getRightExpression() ); for (PropertyResolverStrategy strategy : strategies) { Optional<PropertyResolver> strategyResult = strategy.select(strategyRequest); if (strategyResult.isPresent()) { return selectionPropertyResolveService.resolve(strategyResult.get(), request, leftValue); } } return new SelectionResult(Optional.<PropertyResolver>of(EmptyPropertyResolver.instance()), Optional.<Value>absent()); } }