/* * ============================================================================= * * Copyright (c) 2011-2016, The THYMELEAF team (http://www.thymeleaf.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * ============================================================================= */ package org.thymeleaf.standard.expression; import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; import org.thymeleaf.context.IExpressionContext; import org.thymeleaf.context.ITemplateContext; import org.thymeleaf.context.IWebContext; import org.thymeleaf.expression.Aggregates; import org.thymeleaf.expression.Arrays; import org.thymeleaf.expression.Bools; import org.thymeleaf.expression.Calendars; import org.thymeleaf.expression.Conversions; import org.thymeleaf.expression.Dates; import org.thymeleaf.expression.ExecutionInfo; import org.thymeleaf.expression.IExpressionObjectFactory; import org.thymeleaf.expression.Ids; import org.thymeleaf.expression.Lists; import org.thymeleaf.expression.Maps; import org.thymeleaf.expression.Messages; import org.thymeleaf.expression.Numbers; import org.thymeleaf.expression.Objects; import org.thymeleaf.expression.Sets; import org.thymeleaf.expression.Strings; import org.thymeleaf.expression.Uris; /** * <p> * Builds the expression objects to be used by Standard dialects. * </p> * * @author Daniel Fernández * * @since 3.0.0 * */ public class StandardExpressionObjectFactory implements IExpressionObjectFactory { /* * Any new objects added here should also be added to the "ALL_EXPRESSION_OBJECT_NAMES" See below. */ public static final String CONTEXT_EXPRESSION_OBJECT_NAME = "ctx"; public static final String ROOT_EXPRESSION_OBJECT_NAME = "root"; public static final String VARIABLES_EXPRESSION_OBJECT_NAME = "vars"; public static final String SELECTION_TARGET_EXPRESSION_OBJECT_NAME = "object"; public static final String LOCALE_EXPRESSION_OBJECT_NAME = "locale"; public static final String REQUEST_EXPRESSION_OBJECT_NAME = "request"; public static final String RESPONSE_EXPRESSION_OBJECT_NAME = "response"; public static final String SESSION_EXPRESSION_OBJECT_NAME = "session"; public static final String SERVLET_CONTEXT_EXPRESSION_OBJECT_NAME = "servletContext"; public static final String CONVERSIONS_EXPRESSION_OBJECT_NAME = "conversions"; public static final String URIS_EXPRESSION_OBJECT_NAME = "uris"; public static final String CALENDARS_EXPRESSION_OBJECT_NAME = "calendars"; public static final String DATES_EXPRESSION_OBJECT_NAME = "dates"; public static final String BOOLS_EXPRESSION_OBJECT_NAME = "bools"; public static final String NUMBERS_EXPRESSION_OBJECT_NAME = "numbers"; public static final String OBJECTS_EXPRESSION_OBJECT_NAME = "objects"; public static final String STRINGS_EXPRESSION_OBJECT_NAME = "strings"; public static final String ARRAYS_EXPRESSION_OBJECT_NAME = "arrays"; public static final String LISTS_EXPRESSION_OBJECT_NAME = "lists"; public static final String SETS_EXPRESSION_OBJECT_NAME = "sets"; public static final String MAPS_EXPRESSION_OBJECT_NAME = "maps"; public static final String AGGREGATES_EXPRESSION_OBJECT_NAME = "aggregates"; public static final String MESSAGES_EXPRESSION_OBJECT_NAME = "messages"; public static final String IDS_EXPRESSION_OBJECT_NAME = "ids"; public static final String EXECUTION_INFO_OBJECT_NAME = "execInfo"; /* * These two objects, "#httpServletRequest" and "#httpSession" are still supported but deprecated * since Thymeleaf 3.0. They will start issuing warnings in 3.1, and disappear in 3.2. * They have been replaced by the simpler names "#request" and "#session". */ public static final String HTTP_SERVLET_REQUEST_EXPRESSION_OBJECT_NAME = "httpServletRequest"; public static final String HTTP_SESSION_EXPRESSION_OBJECT_NAME = "httpSession"; protected static final Set<String> ALL_EXPRESSION_OBJECT_NAMES = Collections.unmodifiableSet(new LinkedHashSet<String>(java.util.Arrays.asList( new String[]{ CONTEXT_EXPRESSION_OBJECT_NAME, ROOT_EXPRESSION_OBJECT_NAME, VARIABLES_EXPRESSION_OBJECT_NAME, SELECTION_TARGET_EXPRESSION_OBJECT_NAME, LOCALE_EXPRESSION_OBJECT_NAME, REQUEST_EXPRESSION_OBJECT_NAME, RESPONSE_EXPRESSION_OBJECT_NAME, SESSION_EXPRESSION_OBJECT_NAME, SERVLET_CONTEXT_EXPRESSION_OBJECT_NAME, CONVERSIONS_EXPRESSION_OBJECT_NAME, URIS_EXPRESSION_OBJECT_NAME, CALENDARS_EXPRESSION_OBJECT_NAME, DATES_EXPRESSION_OBJECT_NAME, BOOLS_EXPRESSION_OBJECT_NAME, NUMBERS_EXPRESSION_OBJECT_NAME, OBJECTS_EXPRESSION_OBJECT_NAME, STRINGS_EXPRESSION_OBJECT_NAME, ARRAYS_EXPRESSION_OBJECT_NAME, LISTS_EXPRESSION_OBJECT_NAME, SETS_EXPRESSION_OBJECT_NAME, MAPS_EXPRESSION_OBJECT_NAME, AGGREGATES_EXPRESSION_OBJECT_NAME, MESSAGES_EXPRESSION_OBJECT_NAME, IDS_EXPRESSION_OBJECT_NAME, EXECUTION_INFO_OBJECT_NAME, HTTP_SERVLET_REQUEST_EXPRESSION_OBJECT_NAME, HTTP_SESSION_EXPRESSION_OBJECT_NAME } ))); private static final Uris URIS_EXPRESSION_OBJECT = new Uris(); private static final Bools BOOLS_EXPRESSION_OBJECT = new Bools(); private static final Objects OBJECTS_EXPRESSION_OBJECT = new Objects(); private static final Arrays ARRAYS_EXPRESSION_OBJECT = new Arrays(); private static final Lists LISTS_EXPRESSION_OBJECT = new Lists(); private static final Sets SETS_EXPRESSION_OBJECT = new Sets(); private static final Maps MAPS_EXPRESSION_OBJECT = new Maps(); private static final Aggregates AGGREGATES_EXPRESSION_OBJECT = new Aggregates(); public StandardExpressionObjectFactory() { super(); } public Set<String> getAllExpressionObjectNames() { return ALL_EXPRESSION_OBJECT_NAMES; } public boolean isCacheable(final String expressionObjectName) { // Only #object is non-cacheable (template-scope) return (expressionObjectName != null && !expressionObjectName.equals(SELECTION_TARGET_EXPRESSION_OBJECT_NAME)); } public Object buildObject( final IExpressionContext context, final String expressionObjectName) { if (SELECTION_TARGET_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { if (context instanceof ITemplateContext) { final ITemplateContext templateContext = (ITemplateContext) context; if (templateContext.hasSelectionTarget()) { return templateContext.getSelectionTarget(); } } return context; } if (ROOT_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return context; } if (VARIABLES_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return context; } if (CONTEXT_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return context; } if (LOCALE_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return context.getLocale(); } if (REQUEST_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { if (context instanceof IWebContext) { return ((IWebContext) context).getRequest(); } return null; } if (RESPONSE_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { if (context instanceof IWebContext) { return ((IWebContext) context).getResponse(); } return null; } if (SESSION_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { if (context instanceof IWebContext) { return ((IWebContext) context).getSession(); } return null; } if (SERVLET_CONTEXT_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { if (context instanceof IWebContext) { return ((IWebContext) context).getServletContext(); } return null; } if (HTTP_SERVLET_REQUEST_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { /* * NOTE "#httpServletRequest" is still usable, but deprecated since Thymeleaf 3.0. * Its usage will issue warnings in 3.1, and the object will be removed in 3.2 */ if (context instanceof IWebContext) { return ((IWebContext) context).getRequest(); } return null; } if (HTTP_SESSION_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { /* * NOTE "#httpSession" is still usable, but deprecated since Thymeleaf 3.0. * Its usage will issue warnings in 3.1, and the object will be removed in 3.2 */ if (context instanceof IWebContext) { return ((IWebContext) context).getSession(); } return null; } if (CONVERSIONS_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return new Conversions(context); } if (URIS_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return URIS_EXPRESSION_OBJECT; } if (CALENDARS_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return new Calendars(context.getLocale()); } if (DATES_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return new Dates(context.getLocale()); } if (BOOLS_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return BOOLS_EXPRESSION_OBJECT; } if (NUMBERS_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return new Numbers(context.getLocale()); } if (OBJECTS_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return OBJECTS_EXPRESSION_OBJECT; } if (STRINGS_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return new Strings(context.getLocale()); } if (ARRAYS_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return ARRAYS_EXPRESSION_OBJECT; } if (LISTS_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return LISTS_EXPRESSION_OBJECT; } if (SETS_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return SETS_EXPRESSION_OBJECT; } if (MAPS_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return MAPS_EXPRESSION_OBJECT; } if (AGGREGATES_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { return AGGREGATES_EXPRESSION_OBJECT; } if (MESSAGES_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { if (context instanceof ITemplateContext) { return new Messages((ITemplateContext) context); } return null; } if (IDS_EXPRESSION_OBJECT_NAME.equals(expressionObjectName)) { if (context instanceof ITemplateContext) { return new Ids((ITemplateContext) context); } return null; } if (EXECUTION_INFO_OBJECT_NAME.equals(expressionObjectName)) { if (context instanceof ITemplateContext) { return new ExecutionInfo((ITemplateContext) context); } return null; } return null; } }