com.enonic.cms.core.portal.datasource.el.ExpressionFunctionsExecutor.java Source code

Java tutorial

Introduction

Here is the source code for com.enonic.cms.core.portal.datasource.el.ExpressionFunctionsExecutor.java

Source

/*
 * Copyright 2000-2013 Enonic AS
 * http://www.enonic.com/license
 */

package com.enonic.cms.core.portal.datasource.el;

import java.util.Arrays;
import java.util.List;
import java.util.Properties;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.PropertyAccessor;
import org.springframework.expression.spel.SpelEvaluationException;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

import com.enonic.cms.core.RequestParameters;
import com.enonic.cms.core.portal.VerticalSession;
import com.enonic.cms.core.portal.datasource.el.accessors.CmsAndSitePropertiesAccessor;
import com.enonic.cms.core.portal.datasource.el.accessors.CookieAccessor;
import com.enonic.cms.core.portal.datasource.el.accessors.ParamAccessor;
import com.enonic.cms.core.portal.datasource.el.accessors.ParamsAccessor;
import com.enonic.cms.core.portal.datasource.el.accessors.PortalAccessor;
import com.enonic.cms.core.portal.datasource.el.accessors.SessionAccessor;
import com.enonic.cms.core.portal.datasource.el.accessors.UserAccessor;
import com.enonic.cms.core.structure.SiteProperties;

public final class ExpressionFunctionsExecutor {
    private static final Logger LOG = LoggerFactory.getLogger(ExpressionFunctionsExecutor.class);

    private static final ExpressionParser EXPR_FACTORY = new SpelExpressionParser();

    private static final TemplateParserContext TEMPLATE_PARSER_CONTEXT = new TemplateParserContext();

    private static final List<PropertyAccessor> PROPERTY_ACCESSORS = Arrays
            .<PropertyAccessor>asList(new PropertyAccessorImpl());

    private RequestParameters requestParameters;

    private VerticalSession verticalSession;

    private HttpServletRequest httpRequest;

    private ExpressionContext expressionContext;

    private SiteProperties siteProperties; // site-xx.properties

    private Properties rootProperties; // cms.properties

    public String evaluate(final String expression) {
        final ExpressionRootObject rootObject = new ExpressionRootObject();

        rootObject.setSession(new SessionAccessor(verticalSession));
        rootObject.setCookie(new CookieAccessor(httpRequest));
        rootObject.setProperties(new CmsAndSitePropertiesAccessor(rootProperties, siteProperties));
        rootObject.setPortal(new PortalAccessor(expressionContext));
        rootObject.setUser(new UserAccessor(expressionContext.getUser()));
        rootObject.setParam(new ParamAccessor(requestParameters));
        rootObject.setParams(new ParamsAccessor(requestParameters));

        final String evaluatedString;

        try {
            final StandardEvaluationContext context = new StandardEvaluationContext(rootObject);

            context.setPropertyAccessors(PROPERTY_ACCESSORS);

            ExpressionFunctionsFactory.get().setContext(expressionContext);

            Object result;

            try {
                final Expression exp = EXPR_FACTORY.parseExpression(expression, TEMPLATE_PARSER_CONTEXT);

                result = exp.getValue(context);
            } catch (SpelEvaluationException e) {
                result = null;
            } catch (Exception e) {
                LOG.error(e.getMessage());

                result = "ERROR: " + e.getMessage();
            }

            // must be converted here, because param.x[0] will not work
            if (result instanceof String[]) {
                evaluatedString = StringUtils.join((String[]) result, ',');
            } else {
                evaluatedString = result != null ? result.toString() : null;
            }
        } finally {
            ExpressionFunctionsFactory.get().removeContext();
        }

        return evaluatedString;
    }

    public void setRequestParameters(RequestParameters requestParameters) {
        this.requestParameters = requestParameters;
    }

    public void setExpressionContext(ExpressionContext expressionContext) {
        this.expressionContext = expressionContext;
    }

    public void setVerticalSession(VerticalSession verticalSession) {
        this.verticalSession = verticalSession;
    }

    public void setHttpRequest(HttpServletRequest httpRequest) {
        this.httpRequest = httpRequest;
    }

    public void setSiteProperties(final SiteProperties siteProperties) {
        this.siteProperties = siteProperties;
    }

    public void setRootProperties(final Properties rootProperties) {
        this.rootProperties = rootProperties;
    }
}