A servlet-api/src/jsr245/src/share/javax/el/TypeCache.java Index: servlet-api/src/jsr245/src/share/javax/el/BeanELResolver.java =================================================================== RCS file: /cvs/glassfish/servlet-api/src/jsr245/src/share/javax/el/BeanELResolver.java,v retrieving revision 1.9 diff -u -r1.9 BeanELResolver.java --- servlet-api/src/jsr245/src/share/javax/el/BeanELResolver.java 17 Feb 2006 23:04:49 -0000 1.9 +++ servlet-api/src/jsr245/src/share/javax/el/BeanELResolver.java 5 Oct 2006 01:14:28 -0000 @@ -26,6 +26,8 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.beans.FeatureDescriptor; import java.beans.BeanInfo; import java.beans.Introspector; @@ -271,6 +273,10 @@ Object value; try { value = method.invoke(base, new Object[0]); + Type type = method.getGenericReturnType(); + if (type instanceof ParameterizedType) { + TypeCache.putTypeOf(context, value, (ParameterizedType) type); + } context.setPropertyResolved(true); } catch (ELException ex) { throw ex; Index: servlet-api/src/jsr245/src/share/javax/el/ListELResolver.java =================================================================== RCS file: /cvs/glassfish/servlet-api/src/jsr245/src/share/javax/el/ListELResolver.java,v retrieving revision 1.5 diff -u -r1.5 ListELResolver.java --- servlet-api/src/jsr245/src/share/javax/el/ListELResolver.java 17 Feb 2006 23:04:51 -0000 1.5 +++ servlet-api/src/jsr245/src/share/javax/el/ListELResolver.java 5 Oct 2006 06:06:20 -0000 @@ -23,11 +23,14 @@ package javax.el; +import java.util.ArrayList; import java.util.List; import java.util.Iterator; import java.util.Collections; import java.util.ArrayList; import java.beans.FeatureDescriptor; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; /** @@ -118,6 +121,19 @@ if (index < 0 || index >= list.size()) { throw new PropertyNotFoundException(); } + Type [] actualTypes = TypeCache.getTypeArgsOf(context, base, List.class); + if (actualTypes != null) { + Type elemType = actualTypes[0]; + if (elemType instanceof Class) { + return (Class) elemType; + } + else if (elemType instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) elemType; + if (pt.getRawType() instanceof Class) { + return (Class) pt.getRawType(); + } + } + } return Object.class; } return null; @@ -168,7 +184,15 @@ if (index < 0 || index >= list.size()) { return null; } - return list.get(index); + Object value = list.get(index); + Type [] actualTypes = TypeCache.getTypeArgsOf(context, base, List.class); + if (actualTypes != null) { + Type elemType = actualTypes[0]; + if (elemType != null && elemType instanceof ParameterizedType) { + TypeCache.putTypeOf(context, value, (ParameterizedType) elemType); + } + } + return value; } return null; } Index: servlet-api/src/jsr245/src/share/javax/el/MapELResolver.java =================================================================== RCS file: /cvs/glassfish/servlet-api/src/jsr245/src/share/javax/el/MapELResolver.java,v retrieving revision 1.8 diff -u -r1.8 MapELResolver.java --- servlet-api/src/jsr245/src/share/javax/el/MapELResolver.java 4 May 2006 21:31:33 -0000 1.8 +++ servlet-api/src/jsr245/src/share/javax/el/MapELResolver.java 5 Oct 2006 06:13:58 -0000 @@ -30,6 +30,9 @@ import java.util.HashMap; import java.util.List; import java.util.ArrayList; +import java.util.logging.Logger; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; /** * Defines property resolution behavior on instances of {@link java.util.Map}. @@ -54,6 +57,7 @@ * @since JSP 2.1 */ public class MapELResolver extends ELResolver { + private static final Logger logger = Logger.getLogger(MapELResolver.class.getName()); /** * Creates a new read/write MapELResolver. @@ -111,6 +115,27 @@ if (base != null && base instanceof Map) { context.setPropertyResolved(true); + Type [] actualTypes = TypeCache.getTypeArgsOf(context, base, Map.class); + if (actualTypes != null) { + Type valueType = actualTypes[1]; + if (valueType instanceof Class) { + logger.info("getType returning " + valueType); + return (Class) valueType; + } + else if (valueType instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) valueType; + if (pt.getRawType() instanceof Class) { + logger.info("getType returning " + pt.getRawType()); + return (Class) pt.getRawType(); + } + } + else if (valueType != null) { + logger.info("getType valueType is (" + valueType.getClass() + ") " + valueType); + } + else { + logger.info("getType no map valueType for base class " + base.getClass().getName()); + } + } return Object.class; } return null; @@ -161,7 +186,15 @@ if (base != null && base instanceof Map) { context.setPropertyResolved(true); Map map = (Map) base; - return map.get(property); + Object value = map.get(property); + Type [] actualTypes = TypeCache.getTypeArgsOf(context, base, Map.class); + if (actualTypes != null) { + Type valueType = actualTypes[1]; + if (valueType != null && valueType instanceof ParameterizedType) { + TypeCache.putTypeOf(context, value, (ParameterizedType) valueType); + } + } + return value; } return null; } @@ -369,6 +402,19 @@ public Class getCommonPropertyType(ELContext context, Object base) { if (base != null && base instanceof Map) { + Type [] actualTypes = TypeCache.getTypeArgsOf(context, base, Map.class); + if (actualTypes != null) { + Type keyType = actualTypes[0]; + if (keyType instanceof Class) { + return (Class) keyType; + } + else if (keyType instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) keyType; + if (pt.getRawType() instanceof Class) { + return (Class) pt.getRawType(); + } + } + } return Object.class; } return null;