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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]