package org.jtwig.property.selection; import com.google.common.base.Optional; import org.jtwig.property.resolver.PropertyResolver; import org.jtwig.property.selection.cache.SelectionPropertyResolverCache; public class CachedSelectionPropertyResolver implements SelectionPropertyResolver { private final SelectionPropertyResolverCache selectionPropertyResolverCache; private final SelectionPropertyResolver delegate; private final SelectionPropertyResolveService selectionPropertyResolveService; public CachedSelectionPropertyResolver(SelectionPropertyResolverCache selectionPropertyResolverCache, SelectionPropertyResolver delegate, SelectionPropertyResolveService selectionPropertyResolveService) { this.selectionPropertyResolverCache = selectionPropertyResolverCache; this.delegate = delegate; this.selectionPropertyResolveService = selectionPropertyResolveService; } @Override public SelectionResult resolve(SelectionRequest request) { Optional<PropertyResolver> result = selectionPropertyResolverCache.getCachedResolver(request.getRightExpression()); if (result.isPresent()) { PropertyResolver propertyResolver = result.get(); Object leftValue = request.getEnvironment().getRenderEnvironment().getCalculateExpressionService().calculate(request, request.getLeftExpression()); return selectionPropertyResolveService.resolve(propertyResolver, request, leftValue); } else { SelectionResult cacheMissResult = delegate.resolve(request); if (cacheMissResult.getPropertyResolver().isPresent()) { selectionPropertyResolverCache.cacheResolver(request.getRightExpression(), cacheMissResult.getPropertyResolver().get()); } return cacheMissResult; } } }