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