ExpressionResolverImpl.java 6.98 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  javax.el.ArrayELResolver
 *  javax.el.BeanELResolver
 *  javax.el.CompositeELResolver
 *  javax.el.ELContext
 *  javax.el.ELResolver
 *  javax.el.ExpressionFactory
 *  javax.el.FunctionMapper
 *  javax.el.ListELResolver
 *  javax.el.MapELResolver
 *  javax.el.ResourceBundleELResolver
 *  javax.el.ValueExpression
 *  javax.el.VariableMapper
 *  javax.servlet.ServletContext
 *  javax.servlet.ServletRequest
 *  javax.servlet.jsp.JspApplicationContext
 *  javax.servlet.jsp.JspContext
 *  javax.servlet.jsp.JspFactory
 *  javax.servlet.jsp.PageContext
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.jackrabbit.util.Text
 *  org.apache.sling.scripting.jsp.jasper.runtime.ProtectedFunctionMapper
 *  org.apache.sling.scripting.jsp.util.TagUtil
 */
package com.adobe.granite.ui.components.impl;

import com.adobe.granite.ui.components.ExpressionResolver;
import com.adobe.granite.ui.components.impl.ExternalImplicitObjectELResolver;
import com.adobe.granite.ui.components.impl.GraniteFunctions;
import com.adobe.granite.ui.components.impl.NullVariableMapper;
import com.adobe.granite.ui.components.impl.QueryStringELResolver;
import com.adobe.granite.ui.components.impl.RequestPathInfoELResolver;
import com.adobe.granite.ui.components.impl.StateELResolver;
import com.adobe.granite.ui.components.impl.TenantELResolver;
import java.util.Locale;
import javax.el.ArrayELResolver;
import javax.el.BeanELResolver;
import javax.el.CompositeELResolver;
import javax.el.ELContext;
import javax.el.ELResolver;
import javax.el.ExpressionFactory;
import javax.el.FunctionMapper;
import javax.el.ListELResolver;
import javax.el.MapELResolver;
import javax.el.ResourceBundleELResolver;
import javax.el.ValueExpression;
import javax.el.VariableMapper;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspApplicationContext;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspFactory;
import javax.servlet.jsp.PageContext;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.apache.jackrabbit.util.Text;
import org.apache.sling.scripting.jsp.jasper.runtime.ProtectedFunctionMapper;
import org.apache.sling.scripting.jsp.util.TagUtil;

/*
 * This class specifies class file version 49.0 but uses Java 6 signatures.  Assumed Java 6.
 */
@Component(metatype=0, immediate=1)
@Service(value={ExpressionResolver.class})
public class ExpressionResolverImpl
implements ExpressionResolver {
    private static final String EX_FACTORY_NAME = ExpressionResolverImpl.class.getName() + ".exfactory";
    private static final String EL_CONTEXT_NAME = ExpressionResolverImpl.class.getName() + ".elcontext";
    private static final VariableMapper VARIABLE_MAPPER = new NullVariableMapper();
    private static final ELResolver EL_RESOLVER;
    private static final FunctionMapper FUNCTION_MAPPER;

    @Override
    public <T> T resolve(String expression, Locale locale, Class<T> expectedType, PageContext pageContext) {
        ExpressionFactory expressionFactory = this.getExpressionFactory(pageContext);
        ELContext ctx = this.getELContext(pageContext);
        ctx.setLocale(locale);
        GraniteFunctions.setRequest(TagUtil.getRequest((PageContext)pageContext));
        ValueExpression e = expressionFactory.createValueExpression(ctx, expression, expectedType);
        return (T)e.getValue(ctx);
    }

    private ExpressionFactory getExpressionFactory(PageContext pageContext) {
        ServletRequest request = pageContext.getRequest();
        ExpressionFactory factory = (ExpressionFactory)request.getAttribute(EX_FACTORY_NAME);
        if (factory == null) {
            factory = JspFactory.getDefaultFactory().getJspApplicationContext(pageContext.getServletContext()).getExpressionFactory();
            request.setAttribute(EX_FACTORY_NAME, (Object)factory);
        }
        return factory;
    }

    private ELContext getELContext(PageContext pageContext) {
        ServletRequest request = pageContext.getRequest();
        ELContext ctx = (ELContext)request.getAttribute(EL_CONTEXT_NAME);
        if (ctx == null) {
            ctx = this.createElContext(pageContext);
            request.setAttribute(EL_CONTEXT_NAME, (Object)ctx);
        }
        ctx.putContext(JspContext.class, (Object)pageContext);
        return ctx;
    }

    private ELContext createElContext(PageContext pageContext) {
        return new ELContext(){

            public ELResolver getELResolver() {
                return EL_RESOLVER;
            }

            public FunctionMapper getFunctionMapper() {
                return FUNCTION_MAPPER;
            }

            public VariableMapper getVariableMapper() {
                return VARIABLE_MAPPER;
            }
        };
    }

    static {
        CompositeELResolver resolver = new CompositeELResolver();
        resolver.add((ELResolver)new MapELResolver(true));
        resolver.add((ELResolver)new ListELResolver(true));
        resolver.add((ELResolver)new ArrayELResolver(true));
        resolver.add((ELResolver)new ResourceBundleELResolver());
        resolver.add((ELResolver)new ExternalImplicitObjectELResolver());
        resolver.add((ELResolver)new QueryStringELResolver());
        resolver.add((ELResolver)new RequestPathInfoELResolver());
        resolver.add((ELResolver)new StateELResolver());
        resolver.add((ELResolver)new TenantELResolver());
        resolver.add((ELResolver)new BeanELResolver(true));
        EL_RESOLVER = resolver;
        ProtectedFunctionMapper mapper = ProtectedFunctionMapper.getInstance();
        mapper.mapFunction("granite:encodeURIComponent", Text.class, "escape", new Class[]{String.class});
        mapper.mapFunction("granite:encodeURIPath", Text.class, "escapePath", new Class[]{String.class});
        mapper.mapFunction("granite:uritemplate", GraniteFunctions.class, "uritemplate", new Class[]{String.class});
        mapper.mapFunction("granite:absUritemplate", GraniteFunctions.class, "uritemplate", new Class[]{String.class, Boolean.TYPE});
        mapper.mapFunction("granite:url", GraniteFunctions.class, "url", new Class[]{String.class});
        mapper.mapFunction("granite:toJSONArray", GraniteFunctions.class, "toJSONArray", new Class[]{String[].class});
        mapper.mapFunction("granite:toQueryString", GraniteFunctions.class, "toQueryString", new Class[]{String.class, String[].class});
        mapper.mapFunction("granite:concat", GraniteFunctions.class, "concat", new Class[]{Object.class, Object.class});
        mapper.mapFunction("granite:relativeParent", GraniteFunctions.class, "getRelativeParent", new Class[]{String.class, Integer.TYPE});
        mapper.mapFunction("granite:contains", GraniteFunctions.class, "contains", new Class[]{String.class, String.class});
        mapper.mapFunction("granite:containsIgnoreCase", GraniteFunctions.class, "containsIgnoreCase", new Class[]{String.class, String.class});
        FUNCTION_MAPPER = mapper;
    }

}