diff --git a/org.springframework.web/src/main/java/org/springframework/web/util/ExpressionEvaluationUtils.java b/org.springframework.web/src/main/java/org/springframework/web/util/ExpressionEvaluationUtils.java index e03d72a060..11fd01e475 100644 --- a/org.springframework.web/src/main/java/org/springframework/web/util/ExpressionEvaluationUtils.java +++ b/org.springframework.web/src/main/java/org/springframework/web/util/ExpressionEvaluationUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,14 +16,9 @@ package org.springframework.web.util; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import javax.servlet.ServletContext; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.el.ELException; -import javax.servlet.jsp.el.Expression; import org.springframework.util.Assert; @@ -31,12 +26,6 @@ import org.springframework.util.Assert; * Convenience methods for accessing JSP 2.0's * {@link javax.servlet.jsp.el.ExpressionEvaluator}. * - *

This class will by default use standard evaluate calls. - * If your application server happens to be inefficient in that respect, - * consider setting Spring's "cacheJspExpressions" context-param in - * web.xml to "true", which will use parseExpression - * calls with cached Expression objects instead. - * *

The evaluation methods check if the value contains "${" before * invoking the EL evaluator, treating the value as "normal" expression * (i.e. a literal String value) else. @@ -45,28 +34,14 @@ import org.springframework.util.Assert; * @author Alef Arendsen * @since 11.07.2003 * @see javax.servlet.jsp.el.ExpressionEvaluator#evaluate - * @see javax.servlet.jsp.el.ExpressionEvaluator#parseExpression */ public abstract class ExpressionEvaluationUtils { - /** - * JSP 2.0 expression cache parameter at the servlet context level - * (i.e. a context-param in web.xml): "cacheJspExpressions". - */ - public static final String EXPRESSION_CACHE_CONTEXT_PARAM = "cacheJspExpressions"; - public static final String EXPRESSION_PREFIX = "${"; public static final String EXPRESSION_SUFFIX = "}"; - private static final String EXPRESSION_CACHE_FLAG_CONTEXT_ATTR = - ExpressionEvaluationUtils.class.getName() + ".CACHE_JSP_EXPRESSIONS"; - - private static final String EXPRESSION_CACHE_MAP_CONTEXT_ATTR = - ExpressionEvaluationUtils.class.getName() + ".JSP_EXPRESSION_CACHE"; - - /** * Check if the given expression value is an EL expression. * @param value the expression to check @@ -90,7 +65,7 @@ public abstract class ExpressionEvaluationUtils { * the result class */ public static Object evaluate(String attrName, String attrValue, Class resultClass, PageContext pageContext) - throws JspException { + throws JspException { if (isExpressionLanguage(attrValue)) { return doEvaluate(attrName, attrValue, resultClass, pageContext); @@ -113,7 +88,7 @@ public abstract class ExpressionEvaluationUtils { * @throws JspException in case of parsing errors */ public static Object evaluate(String attrName, String attrValue, PageContext pageContext) - throws JspException { + throws JspException { if (isExpressionLanguage(attrValue)) { return doEvaluate(attrName, attrValue, Object.class, pageContext); @@ -132,7 +107,7 @@ public abstract class ExpressionEvaluationUtils { * @throws JspException in case of parsing errors */ public static String evaluateString(String attrName, String attrValue, PageContext pageContext) - throws JspException { + throws JspException { if (isExpressionLanguage(attrValue)) { return (String) doEvaluate(attrName, attrValue, String.class, pageContext); @@ -170,7 +145,7 @@ public abstract class ExpressionEvaluationUtils { * @throws JspException in case of parsing errors */ public static boolean evaluateBoolean(String attrName, String attrValue, PageContext pageContext) - throws JspException { + throws JspException { if (isExpressionLanguage(attrValue)) { return (Boolean) doEvaluate(attrName, attrValue, Boolean.class, pageContext); @@ -202,14 +177,14 @@ public abstract class ExpressionEvaluationUtils { try { if (resultClass.isAssignableFrom(String.class)) { StringBuilder resultValue = null; - int exprPrefixIndex = -1; + int exprPrefixIndex; int exprSuffixIndex = 0; do { exprPrefixIndex = attrValue.indexOf(EXPRESSION_PREFIX, exprSuffixIndex); if (exprPrefixIndex != -1) { int prevExprSuffixIndex = exprSuffixIndex; exprSuffixIndex = attrValue.indexOf(EXPRESSION_SUFFIX, exprPrefixIndex + EXPRESSION_PREFIX.length()); - String expr = null; + String expr; if (exprSuffixIndex != -1) { exprSuffixIndex += EXPRESSION_SUFFIX.length(); expr = attrValue.substring(exprPrefixIndex, exprSuffixIndex); @@ -253,79 +228,8 @@ public abstract class ExpressionEvaluationUtils { private static Object evaluateExpression(String exprValue, Class resultClass, PageContext pageContext) throws ELException { - Map expressionCache = getJspExpressionCache(pageContext); - if (expressionCache != null) { - // We are supposed to explicitly create and cache JSP Expression objects. - ExpressionCacheKey cacheKey = new ExpressionCacheKey(exprValue, resultClass); - Expression expr = expressionCache.get(cacheKey); - if (expr == null) { - expr = pageContext.getExpressionEvaluator().parseExpression(exprValue, resultClass, null); - expressionCache.put(cacheKey, expr); - } - return expr.evaluate(pageContext.getVariableResolver()); - } - else { - // We're simply calling the JSP 2.0 evaluate method straight away. - return pageContext.getExpressionEvaluator().evaluate( - exprValue, resultClass, pageContext.getVariableResolver(), null); - } - } - - /** - * Determine whether JSP 2.0 expressions are supposed to be cached - * and return the corresponding cache Map, or null if - * caching is not enabled. - * @param pageContext current JSP PageContext - * @return the cache Map, or null if caching is disabled - */ - @SuppressWarnings("unchecked") - private static Map getJspExpressionCache(PageContext pageContext) { - ServletContext servletContext = pageContext.getServletContext(); - Map cacheMap = - (Map) servletContext.getAttribute(EXPRESSION_CACHE_MAP_CONTEXT_ATTR); - if (cacheMap == null) { - Boolean cacheFlag = (Boolean) servletContext.getAttribute(EXPRESSION_CACHE_FLAG_CONTEXT_ATTR); - if (cacheFlag == null) { - cacheFlag = Boolean.valueOf(servletContext.getInitParameter(EXPRESSION_CACHE_CONTEXT_PARAM)); - servletContext.setAttribute(EXPRESSION_CACHE_FLAG_CONTEXT_ATTR, cacheFlag); - } - if (cacheFlag) { - cacheMap = Collections.synchronizedMap(new HashMap()); - servletContext.setAttribute(EXPRESSION_CACHE_MAP_CONTEXT_ATTR, cacheMap); - } - } - return cacheMap; - } - - - /** - * Cache key class for JSP 2.0 Expression objects. - */ - private static class ExpressionCacheKey { - - private final String value; - private final Class resultClass; - private final int hashCode; - - public ExpressionCacheKey(String value, Class resultClass) { - this.value = value; - this.resultClass = resultClass; - this.hashCode = this.value.hashCode() * 29 + this.resultClass.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof ExpressionCacheKey)) { - return false; - } - ExpressionCacheKey other = (ExpressionCacheKey) obj; - return (this.value.equals(other.value) && this.resultClass.equals(other.resultClass)); - } - - @Override - public int hashCode() { - return this.hashCode; - } + return pageContext.getExpressionEvaluator().evaluate( + exprValue, resultClass, pageContext.getVariableResolver(), null); } } diff --git a/org.springframework.web/src/test/java/org/springframework/web/util/ExpressionEvaluationUtilsTests.java b/org.springframework.web/src/test/java/org/springframework/web/util/ExpressionEvaluationUtilsTests.java index ed8bce5ba5..ab38e51888 100644 --- a/org.springframework.web/src/test/java/org/springframework/web/util/ExpressionEvaluationUtilsTests.java +++ b/org.springframework.web/src/test/java/org/springframework/web/util/ExpressionEvaluationUtilsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,17 +26,14 @@ import javax.servlet.jsp.el.VariableResolver; import junit.framework.TestCase; -import org.junit.Ignore; import org.springframework.mock.web.MockExpressionEvaluator; import org.springframework.mock.web.MockPageContext; -import org.springframework.mock.web.MockServletContext; /** * @author Aled Arendsen * @author Juergen Hoeller * @since 16.09.2003 */ -@Ignore // calls to deprecated getVariableResolver() are throwing UOEs public class ExpressionEvaluationUtilsTests extends TestCase { public void testIsExpressionLanguage() { @@ -156,7 +153,7 @@ public class ExpressionEvaluationUtilsTests extends TestCase { assertTrue(ExpressionEvaluationUtils.evaluateBoolean("test", "true", ctx)); } - public void testEvaluateWithoutCaching() throws Exception { + public void testRepeatedEvaluate() throws Exception { PageContext ctx = new CountingMockPageContext(); CountingMockExpressionEvaluator eval = (CountingMockExpressionEvaluator) ctx.getExpressionEvaluator(); ctx.setAttribute("bla", "blie"); @@ -175,29 +172,7 @@ public class ExpressionEvaluationUtilsTests extends TestCase { assertEquals(4, eval.evaluateCount); } - public void testEvaluateWithCaching() throws Exception { - PageContext ctx = new CountingMockPageContext(); - CountingMockExpressionEvaluator eval = (CountingMockExpressionEvaluator) ctx.getExpressionEvaluator(); - ctx.setAttribute("bla", "blie"); - ctx.setAttribute("blo", "blue"); - - MockServletContext sc = (MockServletContext) ctx.getServletContext(); - sc.addInitParameter(ExpressionEvaluationUtils.EXPRESSION_CACHE_CONTEXT_PARAM, "true"); - - assertEquals("blie", ExpressionEvaluationUtils.evaluate("test", "${bla}", String.class, ctx)); - assertEquals(1, eval.parseExpressionCount); - - assertEquals("blue", ExpressionEvaluationUtils.evaluate("test", "${blo}", String.class, ctx)); - assertEquals(2, eval.parseExpressionCount); - - assertEquals("blie", ExpressionEvaluationUtils.evaluate("test", "${bla}", String.class, ctx)); - assertEquals(2, eval.parseExpressionCount); - - assertEquals("blue", ExpressionEvaluationUtils.evaluate("test", "${blo}", String.class, ctx)); - assertEquals(2, eval.parseExpressionCount); - } - - public void testEvaluateWithConcatenationWithoutCaching() throws Exception { + public void testEvaluateWithComplexConcatenation() throws Exception { PageContext ctx = new CountingMockPageContext(); CountingMockExpressionEvaluator eval = (CountingMockExpressionEvaluator) ctx.getExpressionEvaluator(); ctx.setAttribute("bla", "blie"); @@ -224,36 +199,6 @@ public class ExpressionEvaluationUtilsTests extends TestCase { assertEquals(8, eval.evaluateCount); } - public void testEvaluateWithConcatenationWithCaching() throws Exception { - PageContext ctx = new CountingMockPageContext(); - CountingMockExpressionEvaluator eval = (CountingMockExpressionEvaluator) ctx.getExpressionEvaluator(); - ctx.setAttribute("bla", "blie"); - ctx.setAttribute("blo", "blue"); - - MockServletContext sc = (MockServletContext) ctx.getServletContext(); - sc.addInitParameter(ExpressionEvaluationUtils.EXPRESSION_CACHE_CONTEXT_PARAM, "true"); - - String expr = "text${bla}text${blo}text"; - Object o = ExpressionEvaluationUtils.evaluate("test", expr, String.class, ctx); - assertEquals("textblietextbluetext", o); - assertEquals(2, eval.parseExpressionCount); - - expr = "${bla}text${blo}text"; - o = ExpressionEvaluationUtils.evaluate("test", expr, String.class, ctx); - assertEquals("blietextbluetext", o); - assertEquals(2, eval.parseExpressionCount); - - expr = "${bla}text${blo}"; - o = ExpressionEvaluationUtils.evaluate("test", expr, String.class, ctx); - assertEquals("blietextblue", o); - assertEquals(2, eval.parseExpressionCount); - - expr = "${bla}text${blo}"; - o = ExpressionEvaluationUtils.evaluate("test", expr, Object.class, ctx); - assertEquals("blietextblue", o); - assertEquals(2, eval.parseExpressionCount); - } - private static class CountingMockPageContext extends MockPageContext {