/*
* Copyright 2002-2006 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.
* 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.springframework.web.util;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.el.ELException;
import javax.servlet.jsp.el.Expression;
import javax.servlet.jsp.el.ExpressionEvaluator;
import javax.servlet.jsp.el.FunctionMapper;
import javax.servlet.jsp.el.VariableResolver;
import junit.framework.TestCase;
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
*/
public class ExpressionEvaluationUtilsTests extends TestCase {
public void testIsExpressionLanguage() {
assertTrue(ExpressionEvaluationUtils.isExpressionLanguage("${bla}"));
assertTrue(ExpressionEvaluationUtils.isExpressionLanguage("bla${bla}"));
assertFalse(ExpressionEvaluationUtils.isExpressionLanguage("bla{bla"));
assertFalse(ExpressionEvaluationUtils.isExpressionLanguage("bla$b{"));
}
public void testEvaluate() throws Exception {
PageContext ctx = new MockPageContext();
ctx.setAttribute("bla", "blie");
assertEquals("blie", ExpressionEvaluationUtils.evaluate("test", "${bla}", String.class, ctx));
assertEquals("test", ExpressionEvaluationUtils.evaluate("test", "test", String.class, ctx));
try {
ExpressionEvaluationUtils.evaluate("test", "test", Float.class, ctx);
fail("Should have thrown JspException");
}
catch (JspException ex) {
// expected
}
}
public void testEvaluateWithConcatenation() throws Exception {
PageContext ctx = new MockPageContext();
ctx.setAttribute("bla", "blie");
String expr = "text${bla}text${bla}text";
Object o = ExpressionEvaluationUtils.evaluate("test", expr, String.class, ctx);
assertEquals("textblietextblietext", o);
expr = "${bla}text${bla}text";
o = ExpressionEvaluationUtils.evaluate("test", expr, String.class, ctx);
assertEquals("blietextblietext", o);
expr = "${bla}text${bla}";
o = ExpressionEvaluationUtils.evaluate("test", expr, String.class, ctx);
assertEquals("blietextblie", o);
expr = "${bla}text${bla}";
o = ExpressionEvaluationUtils.evaluate("test", expr, Object.class, ctx);
assertEquals("blietextblie", o);
try {
expr = "${bla}text${bla";
ExpressionEvaluationUtils.evaluate("test", expr, Object.class, ctx);
fail("Should have thrown JspException");
}
catch (JspException ex) {
// expected
}
try {
expr = "${bla}text${bla}";
ExpressionEvaluationUtils.evaluate("test", expr, Float.class, ctx);
fail("Should have thrown JspException");
}
catch (JspException ex) {
// expected
}
}
public void testEvaluateString() throws Exception {
PageContext ctx = new MockPageContext();
ctx.setAttribute("bla", "blie");
assertEquals("blie", ExpressionEvaluationUtils.evaluateString("test", "${bla}", ctx));
assertEquals("blie", ExpressionEvaluationUtils.evaluateString("test", "blie", ctx));
}
public void testEvaluateStringWithConcatenation() throws Exception {
PageContext ctx = new MockPageContext();
ctx.setAttribute("bla", "blie");
String expr = "text${bla}text${bla}text";
String s = ExpressionEvaluationUtils.evaluateString("test", expr, ctx);
assertEquals("textblietextblietext", s);
expr = "${bla}text${bla}text";
s = ExpressionEvaluationUtils.evaluateString("test", expr, ctx);
assertEquals("blietextblietext", s);
expr = "${bla}text${bla}";
s = ExpressionEvaluationUtils.evaluateString("test", expr, ctx);
assertEquals("blietextblie", s);
expr = "${bla}text${bla}";
s = ExpressionEvaluationUtils.evaluateString("test", expr, ctx);
assertEquals("blietextblie", s);
try {
expr = "${bla}text${bla";
ExpressionEvaluationUtils.evaluateString("test", expr, ctx);
fail("Should have thrown JspException");
}
catch (JspException ex) {
// expected
}
}
public void testEvaluateInteger() throws Exception {
PageContext ctx = new MockPageContext();
ctx.setAttribute("bla", new Integer(1));
assertEquals(1, ExpressionEvaluationUtils.evaluateInteger("test", "${bla}", ctx));
assertEquals(21, ExpressionEvaluationUtils.evaluateInteger("test", "21", ctx));
}
public void testEvaluateBoolean() throws Exception {
PageContext ctx = new MockPageContext();
ctx.setAttribute("bla", new Boolean(true));
assertTrue(ExpressionEvaluationUtils.evaluateBoolean("test", "${bla}", ctx));
assertTrue(ExpressionEvaluationUtils.evaluateBoolean("test", "true", ctx));
}
public void testEvaluateWithoutCaching() throws Exception {
PageContext ctx = new CountingMockPageContext();
CountingMockExpressionEvaluator eval = (CountingMockExpressionEvaluator) ctx.getExpressionEvaluator();
ctx.setAttribute("bla", "blie");
ctx.setAttribute("blo", "blue");
assertEquals("blie", ExpressionEvaluationUtils.evaluate("test", "${bla}", String.class, ctx));
assertEquals(1, eval.evaluateCount);
assertEquals("blue", ExpressionEvaluationUtils.evaluate("test", "${blo}", String.class, ctx));
assertEquals(2, eval.evaluateCount);
assertEquals("blie", ExpressionEvaluationUtils.evaluate("test", "${bla}", String.class, ctx));
assertEquals(3, eval.evaluateCount);
assertEquals("blue", ExpressionEvaluationUtils.evaluate("test", "${blo}", String.class, ctx));
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 {
PageContext ctx = new CountingMockPageContext();
CountingMockExpressionEvaluator eval = (CountingMockExpressionEvaluator) ctx.getExpressionEvaluator();
ctx.setAttribute("bla", "blie");
ctx.setAttribute("blo", "blue");
String expr = "text${bla}text${blo}text";
Object o = ExpressionEvaluationUtils.evaluate("test", expr, String.class, ctx);
assertEquals("textblietextbluetext", o);
assertEquals(2, eval.evaluateCount);
expr = "${bla}text${blo}text";
o = ExpressionEvaluationUtils.evaluate("test", expr, String.class, ctx);
assertEquals("blietextbluetext", o);
assertEquals(4, eval.evaluateCount);
expr = "${bla}text${blo}";
o = ExpressionEvaluationUtils.evaluate("test", expr, String.class, ctx);
assertEquals("blietextblue", o);
assertEquals(6, eval.evaluateCount);
expr = "${bla}text${blo}";
o = ExpressionEvaluationUtils.evaluate("test", expr, Object.class, ctx);
assertEquals("blietextblue", o);
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 {
private ExpressionEvaluator eval = new CountingMockExpressionEvaluator(this);
public ExpressionEvaluator getExpressionEvaluator() {
return eval;
}
}
private static class CountingMockExpressionEvaluator extends MockExpressionEvaluator {
public int parseExpressionCount = 0;
public int evaluateCount = 0;
public CountingMockExpressionEvaluator(PageContext pageContext) {
super(pageContext);
}
public Expression parseExpression(String expression, Class expectedType, FunctionMapper functionMapper) throws ELException {
this.parseExpressionCount++;
return super.parseExpression(expression, expectedType, functionMapper);
}
public Object evaluate(String expression, Class expectedType, VariableResolver variableResolver, FunctionMapper functionMapper) throws ELException {
this.evaluateCount++;
return super.evaluate(expression, expectedType, variableResolver, functionMapper);
}
}
}