Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51177
authormarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Mon, 9 May 2011 16:31:03 +0000 (16:31 +0000)
committermarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Mon, 9 May 2011 16:31:03 +0000 (16:31 +0000)
MapElResolver should always return Object.class for getType()

git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1101094 13f79535-47bb-0310-9956-ffa450edef68

java/javax/el/MapELResolver.java
test/org/apache/el/TestValueExpressionImpl.java
webapps/docs/changelog.xml

index e7aa462..118301e 100644 (file)
@@ -64,8 +64,7 @@ public class MapELResolver extends ELResolver {
 
         if (base instanceof Map<?,?>) {
             context.setPropertyResolved(true);
-            Object obj = ((Map<?,?>) base).get(property);
-            return (obj != null) ? obj.getClass() : null;
+            return Object.class;
         }
         
         return null;
index b2decc1..5aaca58 100644 (file)
@@ -17,6 +17,9 @@
 
 package org.apache.el;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import javax.el.ELContext;
 import javax.el.ExpressionFactory;
 import javax.el.ValueExpression;
@@ -104,4 +107,30 @@ public class TestValueExpressionImpl extends TestCase {
         String result2 = (String) ve2.getValue(context);
         assertEquals("fooAPPLEbar", result2);
     }
+
+    public void testBug51177ObjectMap() {
+        ExpressionFactory factory = ExpressionFactory.newInstance();
+        ELContext context = new ELContextImpl();
+        
+        Object o1 = "String value";
+        Object o2 = new Integer(32);
+
+        Map<Object,Object> map = new HashMap<Object,Object>();
+        map.put("key1", o1);
+        map.put("key2", o2);
+        
+        ValueExpression var =
+            factory.createValueExpression(map, Map.class);
+        context.getVariableMapper().setVariable("map", var);
+
+        ValueExpression ve1 = factory.createValueExpression(
+                context, "${map.key1}", Object.class);
+        ve1.setValue(context, o2);
+        assertEquals(o2, ve1.getValue(context));
+        
+        ValueExpression ve2 = factory.createValueExpression(
+                context, "${map.key2}", Object.class);
+        ve2.setValue(context, o1);
+        assertEquals(o1, ve2.getValue(context));
+    }
 }
index 48f3abf..a18dd66 100644 (file)
         Ensure session cookie paths end in <code>/</code> so that session
         cookies created for a context with a path of <code>/foo</code> do not
         get returned with requests mapped to a context with a path of
-        <code>/foobar</code>. (markt)  
+        <code>/foobar</code>. (markt)
+      </fix>
+    </changelog>
+  </subsection>
+  <subsection name="Jasper">
+    <changelog>
+      <fix>
+        <bug>51177</bug>: Ensure Tomcat&apos;s MapElResolver always returns
+        <code>Object.class</code> for <code>getType()</code> as required by the
+        EL specification. (markt)
       </fix>
     </changelog>
   </subsection>