This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/main by this push:
     new a2a9e48  Add first part of generics for EL 5.0 API
a2a9e48 is described below

commit a2a9e48348173478a82e18b6119524ee1adb21f9
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Tue May 25 14:39:47 2021 +0100

    Add first part of generics for EL 5.0 API
    
    There are more generics changes to implement around ValueExpression but
    I want to do some more research as I think the current EL 5.0 API might
    need some additional generics to get the full benefit.
---
 java/jakarta/el/BeanELResolver.java                |  2 +-
 java/jakarta/el/CompositeELResolver.java           |  4 +-
 java/jakarta/el/ELContext.java                     |  4 +-
 java/jakarta/el/ELResolver.java                    |  2 +-
 java/jakarta/el/ExpressionFactory.java             |  2 +-
 java/jakarta/el/TypeConverter.java                 |  3 +-
 java/org/apache/el/ExpressionFactoryImpl.java      |  2 +-
 java/org/apache/el/lang/ELSupport.java             | 45 +++++++++++++++-------
 java/org/apache/el/lang/EvaluationContext.java     |  2 +-
 .../apache/jasper/runtime/JspContextWrapper.java   |  5 ++-
 test/jakarta/el/TesterELResolverOne.java           |  6 ++-
 test/jakarta/el/TesterELResolverTwo.java           |  6 ++-
 12 files changed, 53 insertions(+), 30 deletions(-)

diff --git a/java/jakarta/el/BeanELResolver.java 
b/java/jakarta/el/BeanELResolver.java
index 7525e06..8eed486 100644
--- a/java/jakarta/el/BeanELResolver.java
+++ b/java/jakarta/el/BeanELResolver.java
@@ -137,7 +137,7 @@ public class BeanELResolver extends ELResolver {
 
         ExpressionFactory factory = ELManager.getExpressionFactory();
 
-        String methodName = (String) factory.coerceToType(method, 
String.class);
+        String methodName = factory.coerceToType(method, String.class);
 
         // Find the matching method
         Method matchingMethod =
diff --git a/java/jakarta/el/CompositeELResolver.java 
b/java/jakarta/el/CompositeELResolver.java
index d144f2c..2ff04fa 100644
--- a/java/jakarta/el/CompositeELResolver.java
+++ b/java/jakarta/el/CompositeELResolver.java
@@ -151,11 +151,11 @@ public class CompositeELResolver extends ELResolver {
     }
 
     @Override
-    public Object convertToType(ELContext context, Object obj, Class<?> type) {
+    public <T> T convertToType(ELContext context, Object obj, Class<T> type) {
         context.setPropertyResolved(false);
         int sz = this.size;
         for (int i = 0; i < sz; i++) {
-            Object result = this.resolvers[i].convertToType(context, obj, 
type);
+            T result = this.resolvers[i].convertToType(context, obj, type);
             if (context.isPropertyResolved()) {
                 return result;
             }
diff --git a/java/jakarta/el/ELContext.java b/java/jakarta/el/ELContext.java
index c58037a..d406a12 100644
--- a/java/jakarta/el/ELContext.java
+++ b/java/jakarta/el/ELContext.java
@@ -299,14 +299,14 @@ public abstract class ELContext {
      *
      * @since EL 3.0
      */
-    public Object convertToType(Object obj, Class<?> type) {
+    public <T> T convertToType(Object obj, Class<T> type) {
 
         boolean originalResolved = isPropertyResolved();
         setPropertyResolved(false);
         try {
             ELResolver resolver = getELResolver();
             if (resolver != null) {
-                Object result = resolver.convertToType(this, obj, type);
+                T result = resolver.convertToType(this, obj, type);
                 if (isPropertyResolved()) {
                     return result;
                 }
diff --git a/java/jakarta/el/ELResolver.java b/java/jakarta/el/ELResolver.java
index 5c3a928..43479e8 100644
--- a/java/jakarta/el/ELResolver.java
+++ b/java/jakarta/el/ELResolver.java
@@ -135,7 +135,7 @@ public abstract class ELResolver {
      *
      * @since EL 3.0
      */
-    public Object convertToType(ELContext context, Object obj, Class<?> type) {
+    public <T> T convertToType(ELContext context, Object obj, Class<T> type) {
         context.setPropertyResolved(false);
         return null;
     }
diff --git a/java/jakarta/el/ExpressionFactory.java 
b/java/jakarta/el/ExpressionFactory.java
index 67b3556..825386f 100644
--- a/java/jakarta/el/ExpressionFactory.java
+++ b/java/jakarta/el/ExpressionFactory.java
@@ -226,7 +226,7 @@ public abstract class ExpressionFactory {
      * @throws ELException
      *              If the conversion fails
      */
-    public abstract Object coerceToType(Object obj, Class<?> expectedType);
+    public abstract <T> T coerceToType(Object obj, Class<T> expectedType);
 
     /**
      * @return This default implementation returns null
diff --git a/java/jakarta/el/TypeConverter.java 
b/java/jakarta/el/TypeConverter.java
index 8acfddc..abbae0e 100644
--- a/java/jakarta/el/TypeConverter.java
+++ b/java/jakarta/el/TypeConverter.java
@@ -57,6 +57,5 @@ public abstract class TypeConverter extends ELResolver {
     }
 
     @Override
-    public abstract Object convertToType(ELContext context, Object obj,
-            Class<?> type);
+    public abstract <T> T convertToType(ELContext context, Object obj, 
Class<T> type);
 }
diff --git a/java/org/apache/el/ExpressionFactoryImpl.java 
b/java/org/apache/el/ExpressionFactoryImpl.java
index d85ed93..7f41d8c 100644
--- a/java/org/apache/el/ExpressionFactoryImpl.java
+++ b/java/org/apache/el/ExpressionFactoryImpl.java
@@ -37,7 +37,7 @@ import org.apache.el.util.MessageFactory;
 public class ExpressionFactoryImpl extends ExpressionFactory {
 
     @Override
-    public Object coerceToType(Object obj, Class<?> type) {
+    public <T> T coerceToType(Object obj, Class<T> type) {
         return ELSupport.coerceToType(null, obj, type);
     }
 
diff --git a/java/org/apache/el/lang/ELSupport.java 
b/java/org/apache/el/lang/ELSupport.java
index 16fd4db..7a81015 100644
--- a/java/org/apache/el/lang/ELSupport.java
+++ b/java/org/apache/el/lang/ELSupport.java
@@ -488,13 +488,13 @@ public class ELSupport {
         }
     }
 
-    public static final Object coerceToType(final ELContext ctx, final Object 
obj,
-            final Class<?> type) throws ELException {
+    public static final <T> T coerceToType(final ELContext ctx, final Object 
obj,
+            final Class<T> type) throws ELException {
 
         if (ctx != null) {
             boolean originalIsPropertyResolved = ctx.isPropertyResolved();
             try {
-                Object result = ctx.getELResolver().convertToType(ctx, obj, 
type);
+                T result = ctx.getELResolver().convertToType(ctx, obj, type);
                 if (ctx.isPropertyResolved()) {
                     return result;
                 }
@@ -505,7 +505,9 @@ public class ELSupport {
 
         if (type == null || Object.class.equals(type) ||
                 (obj != null && type.isAssignableFrom(obj.getClass()))) {
-            return obj;
+            @SuppressWarnings("unchecked")
+            T result = (T) obj;
+            return result;
         }
 
         if (!COERCE_TO_ZERO) {
@@ -516,24 +518,35 @@ public class ELSupport {
         }
 
         if (String.class.equals(type)) {
-            return coerceToString(ctx, obj);
+            @SuppressWarnings("unchecked")
+            T result = (T) coerceToString(ctx, obj);
+            return result;
         }
         if (ELArithmetic.isNumberType(type)) {
-            return coerceToNumber(ctx, obj, type);
+            @SuppressWarnings("unchecked")
+            T result = (T) coerceToNumber(ctx, obj, type);
+            return result;
         }
         if (Character.class.equals(type) || Character.TYPE == type) {
-            return coerceToCharacter(ctx, obj);
+            @SuppressWarnings("unchecked")
+            T result = (T) coerceToCharacter(ctx, obj);
+            return result;
         }
         if (Boolean.class.equals(type) || Boolean.TYPE == type) {
-            return coerceToBoolean(ctx, obj, Boolean.TYPE == type);
+            @SuppressWarnings("unchecked")
+            T result = (T) coerceToBoolean(ctx, obj, Boolean.TYPE == type);
+            return result;
         }
         if (type.isEnum()) {
-            return coerceToEnum(ctx, obj, type);
+            @SuppressWarnings("unchecked")
+            T result = (T) coerceToEnum(ctx, obj, type);
+            return result;
         }
 
         // new to spec
-        if (obj == null)
+        if (obj == null) {
             return null;
+        }
         if (obj instanceof String) {
             String str = (String) obj;
             PropertyEditor editor = PropertyEditorManager.findEditor(type);
@@ -546,7 +559,9 @@ public class ELSupport {
             } else {
                 try {
                     editor.setAsText(str);
-                    return editor.getValue();
+                    @SuppressWarnings("unchecked")
+                    T result = (T) editor.getValue();
+                    return result;
                 } catch (RuntimeException e) {
                     if (str.isEmpty()) {
                         return null;
@@ -561,12 +576,16 @@ public class ELSupport {
         // for an empty map. The parser will always parse {} as an empty set.
         if (obj instanceof Set && type == Map.class &&
                 ((Set<?>) obj).isEmpty()) {
-            return Collections.EMPTY_MAP;
+            @SuppressWarnings("unchecked")
+            T result = (T) Collections.EMPTY_MAP;
+            return result;
         }
 
         // Handle arrays
         if (type.isArray() && obj.getClass().isArray()) {
-            return coerceToArray(ctx, obj, type);
+            @SuppressWarnings("unchecked")
+            T result = (T) coerceToArray(ctx, obj, type);
+            return result;
         }
 
         throw new ELException(MessageFactory.get("error.convert",
diff --git a/java/org/apache/el/lang/EvaluationContext.java 
b/java/org/apache/el/lang/EvaluationContext.java
index 6f39efc..a853b04 100644
--- a/java/org/apache/el/lang/EvaluationContext.java
+++ b/java/org/apache/el/lang/EvaluationContext.java
@@ -148,7 +148,7 @@ public final class EvaluationContext extends ELContext {
     }
 
     @Override
-    public Object convertToType(Object obj, Class<?> type) {
+    public <T> T convertToType(Object obj, Class<T> type) {
         return elContext.convertToType(obj, type);
     }
 }
diff --git a/java/org/apache/jasper/runtime/JspContextWrapper.java 
b/java/org/apache/jasper/runtime/JspContextWrapper.java
index 746be09..718c803 100644
--- a/java/org/apache/jasper/runtime/JspContextWrapper.java
+++ b/java/org/apache/jasper/runtime/JspContextWrapper.java
@@ -496,8 +496,9 @@ public class JspContextWrapper extends PageContext 
implements VariableResolver {
      */
     private String findAlias(String varName) {
 
-        if (aliases == null)
+        if (aliases == null) {
             return varName;
+        }
 
         String alias = aliases.get(varName);
         if (alias == null) {
@@ -644,7 +645,7 @@ public class JspContextWrapper extends PageContext 
implements VariableResolver {
         }
 
         @Override
-        public Object convertToType(Object obj, Class<?> type) {
+        public <T> T convertToType(Object obj, Class<T> type) {
             return wrapped.convertToType(obj, type);
         }
 
diff --git a/test/jakarta/el/TesterELResolverOne.java 
b/test/jakarta/el/TesterELResolverOne.java
index 07427f7..478fe28 100644
--- a/test/jakarta/el/TesterELResolverOne.java
+++ b/test/jakarta/el/TesterELResolverOne.java
@@ -19,10 +19,12 @@ package jakarta.el;
 public class TesterELResolverOne extends TypeConverter {
 
     @Override
-    public Object convertToType(ELContext context, Object obj, Class<?> type) {
+    public <T> T convertToType(ELContext context, Object obj, Class<T> type) {
         if ("1".equals(obj) && type == String.class) {
             context.setPropertyResolved(obj, type);
-            return "ONE";
+            @SuppressWarnings("unchecked")
+            T result = (T) "ONE";
+            return result;
         }
         return null;
     }
diff --git a/test/jakarta/el/TesterELResolverTwo.java 
b/test/jakarta/el/TesterELResolverTwo.java
index 1e4c977..c9a9c96 100644
--- a/test/jakarta/el/TesterELResolverTwo.java
+++ b/test/jakarta/el/TesterELResolverTwo.java
@@ -19,10 +19,12 @@ package jakarta.el;
 public class TesterELResolverTwo extends TypeConverter {
 
     @Override
-    public Object convertToType(ELContext context, Object obj, Class<?> type) {
+    public <T> T convertToType(ELContext context, Object obj, Class<T> type) {
         if ("2".equals(obj) && type == String.class) {
             context.setPropertyResolved(obj, type);
-            return "TWO";
+            @SuppressWarnings("unchecked")
+            T result = (T) "TWO";
+            return result;
         }
         return null;
     }

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to