You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2024/11/01 10:02:33 UTC
(tomcat) branch 11.0.x updated: Fix BZ 69406 StringInterpreterEnum should throw IAE for invalid Enum
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch 11.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/11.0.x by this push:
new 3576a6a8d7 Fix BZ 69406 StringInterpreterEnum should throw IAE for invalid Enum
3576a6a8d7 is described below
commit 3576a6a8d7efb6aa1637d866025686337d965fe1
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Fri Nov 1 09:55:05 2024 +0000
Fix BZ 69406 StringInterpreterEnum should throw IAE for invalid Enum
https://bz.apache.org/bugzilla/show_bug.cgi?id=69406
Patch provided by John Engebretson
---
.../optimizations/StringInterpreterEnum.java | 20 ++++++++++----
.../optimizations/TestStringInterpreterEnum.java | 31 ++++++++++++----------
webapps/docs/changelog.xml | 6 +++++
3 files changed, 38 insertions(+), 19 deletions(-)
diff --git a/java/org/apache/jasper/optimizations/StringInterpreterEnum.java b/java/org/apache/jasper/optimizations/StringInterpreterEnum.java
index b85f33947e..9312117730 100644
--- a/java/org/apache/jasper/optimizations/StringInterpreterEnum.java
+++ b/java/org/apache/jasper/optimizations/StringInterpreterEnum.java
@@ -16,20 +16,30 @@
*/
package org.apache.jasper.optimizations;
+import org.apache.jasper.compiler.Localizer;
import org.apache.jasper.compiler.StringInterpreterFactory.DefaultStringInterpreter;
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
/**
- * Provides an optimised conversion of string values to Enums. It bypasses the
- * check for registered PropertyEditor.
+ * Provides an optimised conversion of string values to Enums. It bypasses the check for registered PropertyEditor.
*/
public class StringInterpreterEnum extends DefaultStringInterpreter {
+ // Can't be static
+ private final Log log = LogFactory.getLog(ELInterpreterTagSetters.class);
+
@Override
protected String coerceToOtherType(Class<?> c, String s, boolean isNamedAttribute) {
if (c.isEnum() && !isNamedAttribute) {
- @SuppressWarnings({ "unchecked", "rawtypes" })
- Enum<?> enumValue = Enum.valueOf((Class<? extends Enum>) c, s);
- return c.getName() + "." + enumValue.name();
+ try {
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ Enum<?> enumValue = Enum.valueOf((Class<? extends Enum>) c, s);
+ return c.getName() + "." + enumValue.name();
+ } catch (IllegalArgumentException iae) {
+ log.debug(Localizer.getMessage("jsp.error.typeConversion", s, "Enum[" + c.getName() + "]"), iae);
+ // Continue and resolve the value at runtime
+ }
}
return null;
diff --git a/java/org/apache/jasper/optimizations/StringInterpreterEnum.java b/test/org/apache/jasper/optimizations/TestStringInterpreterEnum.java
similarity index 57%
copy from java/org/apache/jasper/optimizations/StringInterpreterEnum.java
copy to test/org/apache/jasper/optimizations/TestStringInterpreterEnum.java
index b85f33947e..b22cd36581 100644
--- a/java/org/apache/jasper/optimizations/StringInterpreterEnum.java
+++ b/test/org/apache/jasper/optimizations/TestStringInterpreterEnum.java
@@ -16,22 +16,25 @@
*/
package org.apache.jasper.optimizations;
-import org.apache.jasper.compiler.StringInterpreterFactory.DefaultStringInterpreter;
+import java.util.concurrent.TimeUnit;
-/**
- * Provides an optimised conversion of string values to Enums. It bypasses the
- * check for registered PropertyEditor.
- */
-public class StringInterpreterEnum extends DefaultStringInterpreter {
+import org.junit.Test;
+
+public class TestStringInterpreterEnum {
+
+ private static class TestInterpreter extends StringInterpreterEnum {
- @Override
- protected String coerceToOtherType(Class<?> c, String s, boolean isNamedAttribute) {
- if (c.isEnum() && !isNamedAttribute) {
- @SuppressWarnings({ "unchecked", "rawtypes" })
- Enum<?> enumValue = Enum.valueOf((Class<? extends Enum>) c, s);
- return c.getName() + "." + enumValue.name();
+ public String evaluate(Class<?> enumType, String term) {
+ return coerceToOtherType(enumType, term, false);
}
+ }
+
- return null;
+ @Test
+ public void testBadTerms() {
+ String[] badTerms = new String[] { "", "mis format", "fudge", ";", ".", "\"", " " };
+ for (String badTerm : badTerms) {
+ new TestInterpreter().evaluate(TimeUnit.class, badTerm);
+ }
}
-}
+}
\ No newline at end of file
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 7e67283949..75b70bc519 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -272,6 +272,12 @@
<code>PageContextImpl</code>. Based on a suggestion by John Engebretson.
(markt)
</fix>
+ <fix>
+ <bug>69406</bug>: When using <code>StringInterpreterEnum</code>, do not
+ throw an <code>IllegalArgumentException</code> when an invalid
+ <code>Enum</code> is encountered. Instead, resolve the value at runtime.
+ Patch provided by John Engebretson. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Other">
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org