001    package com.mockrunner.mock.web;
002    
003    import java.util.HashMap;
004    import java.util.Map;
005    
006    import javax.servlet.jsp.el.ELException;
007    import javax.servlet.jsp.el.Expression;
008    import javax.servlet.jsp.el.ExpressionEvaluator;
009    import javax.servlet.jsp.el.FunctionMapper;
010    import javax.servlet.jsp.el.VariableResolver;
011    
012    /**
013     * Mock implementation of <code>ExpressionEvaluator</code>.
014     */
015    public class MockExpressionEvaluator extends ExpressionEvaluator
016    {
017        private Map expressions = new HashMap();
018        
019        /**
020         * Adds an object as a result for the specified expression.
021         * @param expression the expression
022         * @param object the object
023         */
024        public void addObject(String expression, Object object)
025        {
026            expressions.put(expression, object);
027        }
028        
029        /**
030         * Clears all expressions and corresponding objects.
031         */
032        public void clearObjects()
033        {
034            expressions.clear();
035        }
036    
037        public Object evaluate(String expression, Class expectedType, VariableResolver resolver, FunctionMapper mapper) throws ELException
038        {
039            Object object = expressions.get(expression);
040            if(null == object)
041            {
042                throw new ELException("No object for expression " + expression + " defined.");
043            }
044            if(!object.getClass().equals(expectedType))
045            {
046                throw new ELException("Expected type " + expectedType + " for expression " + expression + " but actual type is " + object.getClass());
047            }
048            return object;
049        }
050    
051        public Expression parseExpression(String expression, Class expectedType, FunctionMapper mapper) throws ELException
052        {
053            return new MockExpression(this, expression, expectedType, mapper);
054        }
055    }