You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2025/03/20 21:17:41 UTC

(tomcat) branch 11.0.x updated (0ac2126609 -> beac6b0157)

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

remm pushed a change to branch 11.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


    from 0ac2126609 Add missing logic to set the allowPostAsGet initialisation parameter
     new ea8e7f4b18 Cleanups for EL and JSP
     new beac6b0157 Java 17 fix

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 java/org/apache/el/MethodExpressionImpl.java       |  2 +-
 java/org/apache/el/ValueExpressionLiteral.java     |  2 +
 java/org/apache/el/lang/ELSupport.java             | 33 +++++----
 java/org/apache/el/lang/ExpressionBuilder.java     |  4 +-
 java/org/apache/el/lang/FunctionMapperImpl.java    |  2 +
 java/org/apache/el/lang/VariableMapperImpl.java    |  2 +
 java/org/apache/el/parser/AstValue.java            | 12 +--
 java/org/apache/el/parser/SimpleNode.java          |  3 +-
 java/org/apache/el/stream/Stream.java              |  9 +--
 java/org/apache/el/util/ExceptionUtils.java        |  6 +-
 java/org/apache/el/util/ReflectionUtil.java        | 86 ++++++----------------
 java/org/apache/jasper/Constants.java              |  6 +-
 java/org/apache/jasper/EmbeddedServletOptions.java |  4 +-
 java/org/apache/jasper/JasperException.java        |  3 +
 java/org/apache/jasper/JspCompilationContext.java  |  4 +-
 java/org/apache/jasper/compiler/Collector.java     |  6 +-
 java/org/apache/jasper/compiler/Compiler.java      | 23 +++---
 java/org/apache/jasper/compiler/ELNode.java        |  2 +-
 .../apache/jasper/compiler/EncodingDetector.java   | 10 +--
 .../apache/jasper/compiler/ErrorDispatcher.java    |  2 +-
 java/org/apache/jasper/compiler/Generator.java     | 13 ++--
 .../apache/jasper/compiler/JspDocumentParser.java  | 10 ++-
 java/org/apache/jasper/compiler/JspReader.java     |  4 +-
 .../apache/jasper/compiler/JspRuntimeContext.java  |  6 +-
 java/org/apache/jasper/compiler/Mark.java          |  5 +-
 java/org/apache/jasper/compiler/Node.java          |  6 +-
 java/org/apache/jasper/compiler/PageDataImpl.java  |  2 +-
 java/org/apache/jasper/compiler/PageInfo.java      |  2 +-
 java/org/apache/jasper/compiler/Parser.java        |  7 +-
 .../apache/jasper/compiler/ParserController.java   |  4 +-
 java/org/apache/jasper/compiler/SmapInput.java     | 21 +-----
 java/org/apache/jasper/compiler/SmapStratum.java   |  2 +-
 .../jasper/compiler/StringInterpreterFactory.java  |  2 +-
 .../apache/jasper/compiler/TagFileProcessor.java   |  4 +-
 java/org/apache/jasper/compiler/TldCache.java      |  2 +-
 java/org/apache/jasper/compiler/Validator.java     |  7 +-
 .../compiler/tagplugin/TagPluginContext.java       |  6 +-
 java/org/apache/jasper/el/JasperELResolver.java    |  2 +-
 java/org/apache/jasper/el/JspELException.java      |  3 +
 .../jasper/el/JspMethodNotFoundException.java      |  3 +
 .../jasper/el/JspPropertyNotFoundException.java    |  3 +
 .../jasper/el/JspPropertyNotWritableException.java |  3 +
 .../org/apache/jasper/runtime/BodyContentImpl.java |  6 +-
 java/org/apache/jasper/runtime/HttpJspBase.java    |  2 +
 java/org/apache/jasper/runtime/JspWriterImpl.java  |  6 +-
 .../apache/jasper/servlet/JasperInitializer.java   |  2 +-
 .../apache/jasper/servlet/JspCServletContext.java  |  6 +-
 java/org/apache/jasper/servlet/JspServlet.java     |  6 +-
 .../apache/jasper/servlet/JspServletWrapper.java   | 23 +++---
 .../jasper/tagplugins/jstl/core/ForEach.java       |  2 +-
 .../apache/jasper/tagplugins/jstl/core/Param.java  |  2 +-
 .../apache/jasper/tagplugins/jstl/core/Set.java    |  2 +-
 .../apache/jasper/tagplugins/jstl/core/When.java   |  2 +-
 53 files changed, 169 insertions(+), 228 deletions(-)


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


(tomcat) 02/02: Java 17 fix

Posted by re...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

remm pushed a commit to branch 11.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit beac6b0157d2187b7e0c8d4455b0be6dc1c03072
Author: remm <re...@apache.org>
AuthorDate: Thu Mar 20 22:17:27 2025 +0100

    Java 17 fix
---
 java/org/apache/el/lang/ELSupport.java | 31 ++++++++++++++++---------------
 1 file changed, 16 insertions(+), 15 deletions(-)

diff --git a/java/org/apache/el/lang/ELSupport.java b/java/org/apache/el/lang/ELSupport.java
index e9a6ad4ac5..f80ddd15fb 100644
--- a/java/org/apache/el/lang/ELSupport.java
+++ b/java/org/apache/el/lang/ELSupport.java
@@ -457,22 +457,23 @@ public class ELSupport {
             }
         }
 
-        return switch (obj) {
-            case null -> "";
-            case String s -> s;
-            case Enum<?> anEnum -> anEnum.name();
-            default -> {
-                try {
-                    yield obj.toString();
-                } catch (ELException e) {
-                    // Unlikely but you never know
-                    throw e;
-                } catch (Throwable t) {
-                    ExceptionUtils.handleThrowable(t);
-                    throw new ELException(t);
-                }
+        if (obj == null) {
+            return "";
+        } else if (obj instanceof String) {
+            return (String) obj;
+        } else if (obj instanceof Enum<?>) {
+            return ((Enum<?>) obj).name();
+        } else {
+            try {
+                return obj.toString();
+            } catch (ELException e) {
+                // Unlikely but you never know
+                throw e;
+            } catch (Throwable t) {
+                ExceptionUtils.handleThrowable(t);
+                throw new ELException(t);
             }
-        };
+        }
     }
 
     public static <T> T coerceToType(final ELContext ctx, final Object obj, final Class<T> type)


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


(tomcat) 01/02: Cleanups for EL and JSP

Posted by re...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

remm pushed a commit to branch 11.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit ea8e7f4b18fc3c690da3c020be4b3cb4aca848fb
Author: remm <re...@apache.org>
AuthorDate: Thu Mar 20 22:10:45 2025 +0100

    Cleanups for EL and JSP
---
 java/org/apache/el/MethodExpressionImpl.java       |  2 +-
 java/org/apache/el/ValueExpressionLiteral.java     |  2 +
 java/org/apache/el/lang/ELSupport.java             | 64 ++++++++--------
 java/org/apache/el/lang/ExpressionBuilder.java     |  4 +-
 java/org/apache/el/lang/FunctionMapperImpl.java    |  2 +
 java/org/apache/el/lang/VariableMapperImpl.java    |  2 +
 java/org/apache/el/parser/AstValue.java            | 12 +--
 java/org/apache/el/parser/SimpleNode.java          |  3 +-
 java/org/apache/el/stream/Stream.java              |  9 +--
 java/org/apache/el/util/ExceptionUtils.java        |  6 +-
 java/org/apache/el/util/ReflectionUtil.java        | 86 ++++++----------------
 java/org/apache/jasper/Constants.java              |  6 +-
 java/org/apache/jasper/EmbeddedServletOptions.java |  4 +-
 java/org/apache/jasper/JasperException.java        |  3 +
 java/org/apache/jasper/JspCompilationContext.java  |  4 +-
 java/org/apache/jasper/compiler/Collector.java     |  6 +-
 java/org/apache/jasper/compiler/Compiler.java      | 23 +++---
 java/org/apache/jasper/compiler/ELNode.java        |  2 +-
 .../apache/jasper/compiler/EncodingDetector.java   | 10 +--
 .../apache/jasper/compiler/ErrorDispatcher.java    |  2 +-
 java/org/apache/jasper/compiler/Generator.java     | 13 ++--
 .../apache/jasper/compiler/JspDocumentParser.java  | 10 ++-
 java/org/apache/jasper/compiler/JspReader.java     |  4 +-
 .../apache/jasper/compiler/JspRuntimeContext.java  |  6 +-
 java/org/apache/jasper/compiler/Mark.java          |  5 +-
 java/org/apache/jasper/compiler/Node.java          |  6 +-
 java/org/apache/jasper/compiler/PageDataImpl.java  |  2 +-
 java/org/apache/jasper/compiler/PageInfo.java      |  2 +-
 java/org/apache/jasper/compiler/Parser.java        |  7 +-
 .../apache/jasper/compiler/ParserController.java   |  4 +-
 java/org/apache/jasper/compiler/SmapInput.java     | 21 +-----
 java/org/apache/jasper/compiler/SmapStratum.java   |  2 +-
 .../jasper/compiler/StringInterpreterFactory.java  |  2 +-
 .../apache/jasper/compiler/TagFileProcessor.java   |  4 +-
 java/org/apache/jasper/compiler/TldCache.java      |  2 +-
 java/org/apache/jasper/compiler/Validator.java     |  7 +-
 .../compiler/tagplugin/TagPluginContext.java       |  6 +-
 java/org/apache/jasper/el/JasperELResolver.java    |  2 +-
 java/org/apache/jasper/el/JspELException.java      |  3 +
 .../jasper/el/JspMethodNotFoundException.java      |  3 +
 .../jasper/el/JspPropertyNotFoundException.java    |  3 +
 .../jasper/el/JspPropertyNotWritableException.java |  3 +
 .../org/apache/jasper/runtime/BodyContentImpl.java |  6 +-
 java/org/apache/jasper/runtime/HttpJspBase.java    |  2 +
 java/org/apache/jasper/runtime/JspWriterImpl.java  |  6 +-
 .../apache/jasper/servlet/JasperInitializer.java   |  2 +-
 .../apache/jasper/servlet/JspCServletContext.java  |  6 +-
 java/org/apache/jasper/servlet/JspServlet.java     |  6 +-
 .../apache/jasper/servlet/JspServletWrapper.java   | 23 +++---
 .../jasper/tagplugins/jstl/core/ForEach.java       |  2 +-
 .../apache/jasper/tagplugins/jstl/core/Param.java  |  2 +-
 .../apache/jasper/tagplugins/jstl/core/Set.java    |  2 +-
 .../apache/jasper/tagplugins/jstl/core/When.java   |  2 +-
 53 files changed, 184 insertions(+), 244 deletions(-)

diff --git a/java/org/apache/el/MethodExpressionImpl.java b/java/org/apache/el/MethodExpressionImpl.java
index c9174d5796..4a0bac0aa7 100644
--- a/java/org/apache/el/MethodExpressionImpl.java
+++ b/java/org/apache/el/MethodExpressionImpl.java
@@ -53,7 +53,7 @@ import org.apache.el.util.ReflectionUtil;
  * This provides the <code>base</code> object on which the method appears. If the <code>base</code> object is null, a
  * <code>NullPointerException</code> must be thrown. At the last resolution, the final <code>property</code> is then
  * coerced to a <code>String</code>, which provides the name of the method to be found. A method matching the name and
- * expected parameters provided at parse time is found and it is either queried or invoked (depending on the method
+ * expected parameters provided at parse time is found, and it is either queried or invoked (depending on the method
  * called on this <code>MethodExpression</code>).
  * </p>
  * <p>
diff --git a/java/org/apache/el/ValueExpressionLiteral.java b/java/org/apache/el/ValueExpressionLiteral.java
index ab6d0c18dc..426a6e4892 100644
--- a/java/org/apache/el/ValueExpressionLiteral.java
+++ b/java/org/apache/el/ValueExpressionLiteral.java
@@ -20,6 +20,7 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.io.Serial;
 
 import jakarta.el.ELContext;
 import jakarta.el.PropertyNotWritableException;
@@ -31,6 +32,7 @@ import org.apache.el.util.ReflectionUtil;
 
 public final class ValueExpressionLiteral extends ValueExpression implements Externalizable {
 
+    @Serial
     private static final long serialVersionUID = 1L;
 
     private Object value;
diff --git a/java/org/apache/el/lang/ELSupport.java b/java/org/apache/el/lang/ELSupport.java
index 2c3ca445ee..e9a6ad4ac5 100644
--- a/java/org/apache/el/lang/ELSupport.java
+++ b/java/org/apache/el/lang/ELSupport.java
@@ -177,8 +177,8 @@ public class ELSupport {
     }
 
     /*
-     * Going to have to have some casts /raw types somewhere so doing it here keeps them all in one place. There might
-     * be a neater / better solution but I couldn't find it.
+     * Going to have some casts /raw types somewhere so doing it here keeps them all in one place. There might
+     * be a neater / better solution, but I couldn't find it.
      */
     @SuppressWarnings("unchecked")
     public static Enum<?> coerceToEnum(final ELContext ctx, final Object obj,
@@ -457,23 +457,22 @@ public class ELSupport {
             }
         }
 
-        if (obj == null) {
-            return "";
-        } else if (obj instanceof String) {
-            return (String) obj;
-        } else if (obj instanceof Enum<?>) {
-            return ((Enum<?>) obj).name();
-        } else {
-            try {
-                return obj.toString();
-            } catch (ELException e) {
-                // Unlikely but you never know
-                throw e;
-            } catch (Throwable t) {
-                ExceptionUtils.handleThrowable(t);
-                throw new ELException(t);
+        return switch (obj) {
+            case null -> "";
+            case String s -> s;
+            case Enum<?> anEnum -> anEnum.name();
+            default -> {
+                try {
+                    yield obj.toString();
+                } catch (ELException e) {
+                    // Unlikely but you never know
+                    throw e;
+                } catch (Throwable t) {
+                    ExceptionUtils.handleThrowable(t);
+                    throw new ELException(t);
+                }
             }
-        }
+        };
     }
 
     public static <T> T coerceToType(final ELContext ctx, final Object obj, final Class<T> type)
@@ -533,8 +532,7 @@ public class ELSupport {
         if (obj == null) {
             return null;
         }
-        if (obj instanceof String) {
-            String str = (String) obj;
+        if (obj instanceof String str) {
             PropertyEditor editor = PropertyEditorManager.findEditor(type);
             if (editor == null) {
                 if (str.isEmpty()) {
@@ -693,19 +691,23 @@ public class ELSupport {
      */
     private static boolean overridesObjectMethod(Method method) {
         // There are three methods that can be overridden
-        if ("equals".equals(method.getName())) {
-            if (method.getReturnType().equals(boolean.class)) {
-                if (method.getParameterCount() == 1) {
-                    return method.getParameterTypes()[0].equals(Object.class);
+        switch (method.getName()) {
+            case "equals" -> {
+                if (method.getReturnType().equals(boolean.class)) {
+                    if (method.getParameterCount() == 1) {
+                        return method.getParameterTypes()[0].equals(Object.class);
+                    }
                 }
             }
-        } else if ("hashCode".equals(method.getName())) {
-            if (method.getReturnType().equals(int.class)) {
-                return method.getParameterCount() == 0;
+            case "hashCode" -> {
+                if (method.getReturnType().equals(int.class)) {
+                    return method.getParameterCount() == 0;
+                }
             }
-        } else if ("toString".equals(method.getName())) {
-            if (method.getReturnType().equals(String.class)) {
-                return method.getParameterCount() == 0;
+            case "toString" -> {
+                if (method.getReturnType().equals(String.class)) {
+                    return method.getParameterCount() == 0;
+                }
             }
         }
 
@@ -714,6 +716,6 @@ public class ELSupport {
 
 
     private ELSupport() {
-        // Uility class - hide default constructor;
+        // Utility class - hide default constructor;
     }
 }
diff --git a/java/org/apache/el/lang/ExpressionBuilder.java b/java/org/apache/el/lang/ExpressionBuilder.java
index 4b462fe137..06a6c1ee77 100644
--- a/java/org/apache/el/lang/ExpressionBuilder.java
+++ b/java/org/apache/el/lang/ExpressionBuilder.java
@@ -166,9 +166,7 @@ public final class ExpressionBuilder implements NodeVisitor {
 
     @Override
     public void visit(Node node) throws ELException {
-        if (node instanceof AstFunction) {
-
-            AstFunction funcNode = (AstFunction) node;
+        if (node instanceof AstFunction funcNode) {
 
             Method m = null;
 
diff --git a/java/org/apache/el/lang/FunctionMapperImpl.java b/java/org/apache/el/lang/FunctionMapperImpl.java
index ba35e56b4b..8fcb802c53 100644
--- a/java/org/apache/el/lang/FunctionMapperImpl.java
+++ b/java/org/apache/el/lang/FunctionMapperImpl.java
@@ -20,6 +20,7 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.io.Serial;
 import java.lang.reflect.Method;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -35,6 +36,7 @@ import org.apache.el.util.ReflectionUtil;
  */
 public class FunctionMapperImpl extends FunctionMapper implements Externalizable {
 
+    @Serial
     private static final long serialVersionUID = 1L;
 
     protected ConcurrentMap<String,Function> functions = new ConcurrentHashMap<>();
diff --git a/java/org/apache/el/lang/VariableMapperImpl.java b/java/org/apache/el/lang/VariableMapperImpl.java
index f20d1a8955..e22adb4408 100644
--- a/java/org/apache/el/lang/VariableMapperImpl.java
+++ b/java/org/apache/el/lang/VariableMapperImpl.java
@@ -20,6 +20,7 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.io.Serial;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -28,6 +29,7 @@ import jakarta.el.VariableMapper;
 
 public class VariableMapperImpl extends VariableMapper implements Externalizable {
 
+    @Serial
     private static final long serialVersionUID = 1L;
 
     private Map<String,ValueExpression> vars = new HashMap<>();
diff --git a/java/org/apache/el/parser/AstValue.java b/java/org/apache/el/parser/AstValue.java
index 248591ec5b..936245a0ae 100644
--- a/java/org/apache/el/parser/AstValue.java
+++ b/java/org/apache/el/parser/AstValue.java
@@ -94,7 +94,8 @@ public final class AstValue extends SimpleNode {
                 i += 2;
 
                 if (property == null) {
-                    throw new PropertyNotFoundException(MessageFactory.get("error.unreachable.property", property));
+                    throw new PropertyNotFoundException(
+                            MessageFactory.get("error.unreachable.property", this.children[i].getImage()));
                 }
             } else if (i + 1 < propCount) {
                 // Object with property not at end of expression
@@ -110,11 +111,13 @@ public final class AstValue extends SimpleNode {
                 i++;
 
                 if (property == null) {
-                    throw new PropertyNotFoundException(MessageFactory.get("error.unreachable.property", property));
+                    throw new PropertyNotFoundException(
+                            MessageFactory.get("error.unreachable.property", this.children[i].getImage()));
                 }
             }
             if (base == null) {
-                throw new PropertyNotFoundException(MessageFactory.get("error.unreachable.property", property));
+                throw new PropertyNotFoundException(
+                        MessageFactory.get("error.unreachable.property", this.children[i].getImage()));
             }
         }
 
@@ -133,8 +136,7 @@ public final class AstValue extends SimpleNode {
         ELResolver resolver = ctx.getELResolver();
         while (base != null && i < propCount) {
             suffix = this.children[i].getValue(ctx);
-            if (i + 1 < propCount && (this.children[i + 1] instanceof AstMethodParameters)) {
-                AstMethodParameters mps = (AstMethodParameters) this.children[i + 1];
+            if (i + 1 < propCount && (this.children[i + 1] instanceof AstMethodParameters mps)) {
                 if (base instanceof Optional && "orElseGet".equals(suffix) && mps.jjtGetNumChildren() == 1) {
                     Node paramFoOptional = mps.jjtGetChild(0);
                     if (!(paramFoOptional instanceof AstLambdaExpression ||
diff --git a/java/org/apache/el/parser/SimpleNode.java b/java/org/apache/el/parser/SimpleNode.java
index 13415caba4..6799ad8562 100644
--- a/java/org/apache/el/parser/SimpleNode.java
+++ b/java/org/apache/el/parser/SimpleNode.java
@@ -176,10 +176,9 @@ public abstract class SimpleNode implements Node {
         if (this == obj) {
             return true;
         }
-        if (!(obj instanceof SimpleNode)) {
+        if (!(obj instanceof SimpleNode other)) {
             return false;
         }
-        SimpleNode other = (SimpleNode) obj;
         if (id != other.id) {
             return false;
         }
diff --git a/java/org/apache/el/stream/Stream.java b/java/org/apache/el/stream/Stream.java
index 3660802705..3b3f32e31a 100644
--- a/java/org/apache/el/stream/Stream.java
+++ b/java/org/apache/el/stream/Stream.java
@@ -460,14 +460,7 @@ public class Stream {
     }
 
 
-    private static class LambdaExpressionComparator implements Comparator<Object> {
-
-        private final LambdaExpression le;
-
-        LambdaExpressionComparator(LambdaExpression le) {
-            this.le = le;
-        }
-
+    private record LambdaExpressionComparator(LambdaExpression le) implements Comparator<Object> {
         @Override
         public int compare(Object o1, Object o2) {
             return ELSupport.coerceToNumber(null, le.invoke(o1, o2), Integer.class).intValue();
diff --git a/java/org/apache/el/util/ExceptionUtils.java b/java/org/apache/el/util/ExceptionUtils.java
index f8e7dafb10..85c7786a3c 100644
--- a/java/org/apache/el/util/ExceptionUtils.java
+++ b/java/org/apache/el/util/ExceptionUtils.java
@@ -17,7 +17,7 @@
 package org.apache.el.util;
 
 /**
- * Utilities for handling Throwables and Exceptions.
+ * Utilities for handling Throwable and Exceptions.
  */
 /*
  * Copied from o.a.t.u.ExceptionUtils
@@ -42,8 +42,8 @@ public class ExceptionUtils {
 
 
     /**
-     * NO-OP method provided to enable simple pre-loading of this class. Since the class is used extensively in error
-     * handling, it is prudent to pre-load it to avoid any failure to load this class masking the true problem during
+     * NO-OP method provided to enable simple preloading of this class. Since the class is used extensively in error
+     * handling, it is prudent to preload it to avoid any failure to load this class masking the true problem during
      * error handling.
      */
     public static void preload() {
diff --git a/java/org/apache/el/util/ReflectionUtil.java b/java/org/apache/el/util/ReflectionUtil.java
index 423798cf29..ae3095a115 100644
--- a/java/org/apache/el/util/ReflectionUtil.java
+++ b/java/org/apache/el/util/ReflectionUtil.java
@@ -290,7 +290,7 @@ public class ReflectionUtil {
             }
         }
         if (multiple) {
-            if (bestMatch.getExactCount() == paramCount - 1) {
+            if (bestMatch.exactCount() == paramCount - 1) {
                 // Only one parameter is not an exact match - try using the
                 // super class
                 match = resolveAmbiguousMethod(candidates.keySet(), paramTypes);
@@ -425,8 +425,7 @@ public class ReflectionUtil {
      * This class duplicates code in jakarta.el.Util. When making changes keep the code in sync.
      */
     private static boolean isCoercibleFrom(EvaluationContext ctx, Object src, Class<?> target) {
-        // TODO: This isn't pretty but it works. Significant refactoring would
-        // be required to avoid the exception.
+        // TODO: This isn't pretty but it works. Significant refactoring would be required to avoid the exception.
         try {
             ELSupport.coerceToType(ctx, src, target);
         } catch (ELException e) {
@@ -495,68 +494,29 @@ public class ReflectionUtil {
     /*
      * This class duplicates code in jakarta.el.Util. When making changes keep the code in sync.
      */
-    private static class MatchResult implements Comparable<MatchResult> {
-
-        private final boolean varArgs;
-        private final int exactCount;
-        private final int assignableCount;
-        private final int coercibleCount;
-        private final int varArgsCount;
-        private final boolean bridge;
-
-        MatchResult(boolean varArgs, int exactCount, int assignableCount, int coercibleCount, int varArgsCount,
-                boolean bridge) {
-            this.varArgs = varArgs;
-            this.exactCount = exactCount;
-            this.assignableCount = assignableCount;
-            this.coercibleCount = coercibleCount;
-            this.varArgsCount = varArgsCount;
-            this.bridge = bridge;
-        }
-
-        public boolean isVarArgs() {
-            return varArgs;
-        }
-
-        public int getExactCount() {
-            return exactCount;
-        }
-
-        public int getAssignableCount() {
-            return assignableCount;
-        }
-
-        public int getCoercible() {
-            return coercibleCount;
-        }
-
-        public int getVarArgsCount() {
-            return varArgsCount;
-        }
-
-        public boolean isBridge() {
-            return bridge;
-        }
+    private record MatchResult(boolean varArgs, int exactCount, int assignableCount,
+                               int coercibleCount, int varArgsCount,
+                               boolean bridge) implements Comparable<MatchResult> {
 
         @Override
         public int compareTo(MatchResult o) {
             // Non-varArgs always beats varArgs
-            int cmp = Boolean.compare(o.isVarArgs(), this.isVarArgs());
+            int cmp = Boolean.compare(o.varArgs(), this.varArgs());
             if (cmp == 0) {
-                cmp = Integer.compare(this.getExactCount(), o.getExactCount());
+                cmp = Integer.compare(this.exactCount(), o.exactCount());
                 if (cmp == 0) {
-                    cmp = Integer.compare(this.getAssignableCount(), o.getAssignableCount());
+                    cmp = Integer.compare(this.assignableCount(), o.assignableCount());
                     if (cmp == 0) {
-                        cmp = Integer.compare(this.getCoercible(), o.getCoercible());
+                        cmp = Integer.compare(this.coercibleCount(), o.coercibleCount());
                         if (cmp == 0) {
                             // Fewer var args matches are better
-                            cmp = Integer.compare(o.getVarArgsCount(), this.getVarArgsCount());
+                            cmp = Integer.compare(o.varArgsCount(), this.varArgsCount());
                             if (cmp == 0) {
                                 // The nature of bridge methods is such that it actually
                                 // doesn't matter which one we pick as long as we pick
                                 // one. That said, pick the 'right' one (the non-bridge
                                 // one) anyway.
-                                cmp = Boolean.compare(o.isBridge(), this.isBridge());
+                                cmp = Boolean.compare(o.bridge(), this.bridge());
                             }
                         }
                     }
@@ -568,24 +528,24 @@ public class ReflectionUtil {
         @Override
         public boolean equals(Object o) {
             return o == this || (null != o && this.getClass().equals(o.getClass()) &&
-                    ((MatchResult) o).getExactCount() == this.getExactCount() &&
-                    ((MatchResult) o).getAssignableCount() == this.getAssignableCount() &&
-                    ((MatchResult) o).getCoercible() == this.getCoercible() &&
-                    ((MatchResult) o).getVarArgsCount() == this.getVarArgsCount() &&
-                    ((MatchResult) o).isVarArgs() == this.isVarArgs() &&
-                    ((MatchResult) o).isBridge() == this.isBridge());
+                    ((MatchResult) o).exactCount() == this.exactCount() &&
+                    ((MatchResult) o).assignableCount() == this.assignableCount() &&
+                    ((MatchResult) o).coercibleCount() == this.coercibleCount() &&
+                    ((MatchResult) o).varArgsCount() == this.varArgsCount() &&
+                    ((MatchResult) o).varArgs() == this.varArgs() &&
+                    ((MatchResult) o).bridge() == this.bridge());
         }
 
         @Override
         public int hashCode() {
             final int prime = 31;
             int result = 1;
-            result = prime * result + assignableCount;
-            result = prime * result + (bridge ? 1231 : 1237);
-            result = prime * result + coercibleCount;
-            result = prime * result + exactCount;
-            result = prime * result + (varArgs ? 1231 : 1237);
-            result = prime * result + varArgsCount;
+            result = prime * result + assignableCount();
+            result = prime * result + (bridge() ? 1231 : 1237);
+            result = prime * result + coercibleCount();
+            result = prime * result + exactCount();
+            result = prime * result + (varArgs() ? 1231 : 1237);
+            result = prime * result + varArgsCount();
             return result;
         }
     }
diff --git a/java/org/apache/jasper/Constants.java b/java/org/apache/jasper/Constants.java
index 9cf3b4fc38..b1ddf0bb02 100644
--- a/java/org/apache/jasper/Constants.java
+++ b/java/org/apache/jasper/Constants.java
@@ -16,8 +16,6 @@
  */
 package org.apache.jasper;
 
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
 /**
@@ -35,10 +33,8 @@ public class Constants {
     /**
      * These classes/packages are automatically imported by the generated code.
      */
-    private static final String[] PRIVATE_STANDARD_IMPORTS =
-            { "jakarta.servlet.*", "jakarta.servlet.http.*", "jakarta.servlet.jsp.*" };
     public static final List<String> STANDARD_IMPORTS =
-            Collections.unmodifiableList(Arrays.asList(PRIVATE_STANDARD_IMPORTS));
+            List.of("jakarta.servlet.*", "jakarta.servlet.http.*", "jakarta.servlet.jsp.*");
 
     /**
      * Default size of the JSP buffer.
diff --git a/java/org/apache/jasper/EmbeddedServletOptions.java b/java/org/apache/jasper/EmbeddedServletOptions.java
index 6e246a8d41..16852f93d4 100644
--- a/java/org/apache/jasper/EmbeddedServletOptions.java
+++ b/java/org/apache/jasper/EmbeddedServletOptions.java
@@ -876,11 +876,11 @@ public final class EmbeddedServletOptions implements Options {
             }
         }
 
-        // Setup the global Tag Libraries location cache for this
+        // Set up the global Tag Libraries location cache for this
         // web-application.
         tldCache = TldCache.getInstance(context);
 
-        // Setup the jsp config info for this web app.
+        // Set up the jsp config info for this web app.
         jspConfig = new JspConfig(context);
 
         // Create a Tag plugin instance
diff --git a/java/org/apache/jasper/JasperException.java b/java/org/apache/jasper/JasperException.java
index b65bb2979a..13b18ade5e 100644
--- a/java/org/apache/jasper/JasperException.java
+++ b/java/org/apache/jasper/JasperException.java
@@ -16,6 +16,8 @@
  */
 package org.apache.jasper;
 
+import java.io.Serial;
+
 /**
  * Base class for all exceptions generated by the JSP engine. Makes it convenient to catch just this at the top-level.
  *
@@ -23,6 +25,7 @@ package org.apache.jasper;
  */
 public class JasperException extends jakarta.servlet.ServletException {
 
+    @Serial
     private static final long serialVersionUID = 1L;
 
     public JasperException(String reason) {
diff --git a/java/org/apache/jasper/JspCompilationContext.java b/java/org/apache/jasper/JspCompilationContext.java
index 63741bb59b..dc9f1a2104 100644
--- a/java/org/apache/jasper/JspCompilationContext.java
+++ b/java/org/apache/jasper/JspCompilationContext.java
@@ -43,7 +43,7 @@ import org.apache.tomcat.Jar;
 import org.apache.tomcat.util.descriptor.tld.TldResourcePath;
 
 /**
- * A place holder for various things that are used through out the JSP engine. This is a per-request/per-context data
+ * A placeholder for various things that are used throughout the JSP engine. This is a per-request/per-context data
  * structure. Some of the instance variables are set at different points. Most of the path-related stuff is here -
  * mangling names, versions, dirs, loading resources and dealing with uris.
  *
@@ -187,7 +187,7 @@ public class JspCompilationContext {
 
     /**
      * The output directory to generate code into. The output directory is make up of the scratch directory, which is
-     * provide in Options, plus the directory derived from the package name.
+     * provided in Options, plus the directory derived from the package name.
      *
      * @return the output directory in which the generated sources are placed
      */
diff --git a/java/org/apache/jasper/compiler/Collector.java b/java/org/apache/jasper/compiler/Collector.java
index e3d4a7063a..df7e3c3417 100644
--- a/java/org/apache/jasper/compiler/Collector.java
+++ b/java/org/apache/jasper/compiler/Collector.java
@@ -107,8 +107,7 @@ class Collector {
             hasScriptingVars = false;
 
             // Scan attribute list for expressions
-            if (n instanceof Node.CustomTag) {
-                Node.CustomTag ct = (Node.CustomTag) n;
+            if (n instanceof Node.CustomTag ct) {
                 Node.JspAttribute[] attrs = ct.getJspAttributes();
                 for (int i = 0; attrs != null && i < attrs.length; i++) {
                     if (attrs[i].isExpression()) {
@@ -120,8 +119,7 @@ class Collector {
 
             visitBody(n);
 
-            if ((n instanceof Node.CustomTag) && !hasScriptingVars) {
-                Node.CustomTag ct = (Node.CustomTag) n;
+            if ((n instanceof Node.CustomTag ct) && !hasScriptingVars) {
                 hasScriptingVars = ct.getVariableInfos().length > 0 || ct.getTagVariableInfos().length > 0;
             }
 
diff --git a/java/org/apache/jasper/compiler/Compiler.java b/java/org/apache/jasper/compiler/Compiler.java
index 905fab96e1..94eab9d081 100644
--- a/java/org/apache/jasper/compiler/Compiler.java
+++ b/java/org/apache/jasper/compiler/Compiler.java
@@ -108,9 +108,10 @@ public abstract class Compiler {
      */
     protected Map<String,SmapStratum> generateJava() throws Exception {
 
-        long t1, t2, t3, t4;
-
-        t1 = t2 = t3 = t4 = 0;
+        long t1 = 0;
+        long t2 = 0;
+        long t3 = 0;
+        long t4;
 
         if (log.isDebugEnabled()) {
             t1 = System.currentTimeMillis();
@@ -244,9 +245,9 @@ public abstract class Compiler {
                 Generator.generate(writer, this, pageNodes);
             }
 
-            // The writer is only used during the compile, dereference
+            // The writer is only used during compile, dereference
             // it in the JspCompilationContext when done to allow it
-            // to be GC'd and save memory.
+            // to be GCed and save memory.
             ctxt.setWriter(null);
 
             if (log.isTraceEnabled()) {
@@ -276,7 +277,7 @@ public abstract class Compiler {
             ctxt.getRuntimeContext().getSmaps().putAll(smaps);
         }
 
-        // If any proto type .java and .class files was generated,
+        // If any prototype .java and .class files was generated,
         // the prototype .java may have been replaced by the current
         // compilation (if the tag file is self referencing), but the
         // .class file need to be removed, to make sure that javac would
@@ -288,7 +289,7 @@ public abstract class Compiler {
 
     private ServletWriter setupContextWriter(String javaFileName) throws FileNotFoundException, JasperException {
         ServletWriter writer;
-        // Setup the ServletWriter
+        // Set up the ServletWriter
         String javaEncoding = ctxt.getOptions().getJavaEncoding();
         OutputStreamWriter osw = null;
 
@@ -332,7 +333,7 @@ public abstract class Compiler {
     }
 
     /**
-     * Compile the jsp file from the current engine context. As an side- effect, tag files that are referenced by this
+     * Compile the jsp file from the current engine context. As a side effect, tag files that are referenced by this
      * page are also compiled.
      *
      * @param compileClass If true, generate both .java and .class file If false, generate only .java file
@@ -346,7 +347,7 @@ public abstract class Compiler {
     }
 
     /**
-     * Compile the jsp file from the current engine context. As an side- effect, tag files that are referenced by this
+     * Compile the jsp file from the current engine context. As a side effect, tag files that are referenced by this
      * page are also compiled.
      *
      * @param compileClass If true, generate both .java and .class file If false, generate only .java file
@@ -389,7 +390,7 @@ public abstract class Compiler {
             }
             // Make sure these object which are only used during the
             // generation and compilation of the JSP page get
-            // dereferenced so that they can be GC'd and reduce the
+            // dereferenced so that they can be GCed and reduce the
             // memory footprint.
             tfp = null;
             errDispatcher = null;
@@ -416,7 +417,7 @@ public abstract class Compiler {
     /**
      * Determine if a compilation is necessary by checking the time stamp of the JSP page with that of the corresponding
      * .class or .java file. If the page has dependencies, the check is also extended to its dependents, and so on. This
-     * method can by overridden by a subclasses of Compiler.
+     * method can be overridden by a subclasses of Compiler.
      *
      * @param checkClass If true, check against .class file, if false, check against .java file.
      *
diff --git a/java/org/apache/jasper/compiler/ELNode.java b/java/org/apache/jasper/compiler/ELNode.java
index a1568d484b..6730a59b5e 100644
--- a/java/org/apache/jasper/compiler/ELNode.java
+++ b/java/org/apache/jasper/compiler/ELNode.java
@@ -31,7 +31,7 @@ import org.apache.jasper.JasperException;
  * @author Kin-man Chung
  */
 
-abstract class ELNode {
+public abstract class ELNode {
 
     public abstract void accept(Visitor v) throws JasperException;
 
diff --git a/java/org/apache/jasper/compiler/EncodingDetector.java b/java/org/apache/jasper/compiler/EncodingDetector.java
index aff864dca9..d65d1a4c68 100644
--- a/java/org/apache/jasper/compiler/EncodingDetector.java
+++ b/java/org/apache/jasper/compiler/EncodingDetector.java
@@ -201,14 +201,6 @@ class EncodingDetector {
     }
 
 
-    private static class BomResult {
-
-        public final String encoding;
-        public final int skip;
-
-        BomResult(String encoding, int skip) {
-            this.encoding = encoding;
-            this.skip = skip;
-        }
+    private record BomResult(String encoding, int skip) {
     }
 }
diff --git a/java/org/apache/jasper/compiler/ErrorDispatcher.java b/java/org/apache/jasper/compiler/ErrorDispatcher.java
index 436ae5354a..16ec6b76dd 100644
--- a/java/org/apache/jasper/compiler/ErrorDispatcher.java
+++ b/java/org/apache/jasper/compiler/ErrorDispatcher.java
@@ -250,7 +250,7 @@ public class ErrorDispatcher {
                     file = where.getFile();
                 }
             } else {
-                // Get the context-relative resource path, so as to not disclose any local file system details
+                // Get the context-relative resource path, to avoid disclosing any local file system details
                 file = where.getFile();
             }
             line = where.getLineNumber();
diff --git a/java/org/apache/jasper/compiler/Generator.java b/java/org/apache/jasper/compiler/Generator.java
index e708247824..c31d5d4980 100644
--- a/java/org/apache/jasper/compiler/Generator.java
+++ b/java/org/apache/jasper/compiler/Generator.java
@@ -2385,8 +2385,7 @@ class Generator {
             List<Object> vec = n.getScriptingVars(scope);
             if (vec != null) {
                 for (Object elem : vec) {
-                    if (elem instanceof VariableInfo) {
-                        VariableInfo varInfo = (VariableInfo) elem;
+                    if (elem instanceof VariableInfo varInfo) {
                         out.printin(varInfo.getClassName());
                         out.print(" ");
                         out.print(varInfo.getVarName());
@@ -2425,7 +2424,7 @@ class Generator {
                 // JspFragment, because a fragment is always scriptless.
                 // Thus, there is no need to save/ restore/ sync them.
                 // Note, that JspContextWrapper.syncFoo() methods will take
-                // care of saving/ restoring/ sync'ing of JspContext attributes.
+                // care of saving/ restoring/ syncing of JspContext attributes.
                 return;
             }
 
@@ -2497,7 +2496,7 @@ class Generator {
                 // JspFragment, because a fragment is always scriptless.
                 // Thus, there is no need to save/ restore/ sync them.
                 // Note, that JspContextWrapper.syncFoo() methods will take
-                // care of saving/ restoring/ sync'ing of JspContext attributes.
+                // care of saving/ restoring/ syncing of JspContext attributes.
                 return;
             }
 
@@ -2563,7 +2562,7 @@ class Generator {
                 // JspFragment, because a fragment is always scriptless.
                 // Thus, there is no need to save/ restore/ sync them.
                 // Note, that JspContextWrapper.syncFoo() methods will take
-                // care of saving/ restoring/ sync'ing of JspContext attributes.
+                // care of saving/ restoring/ syncing of JspContext attributes.
                 return;
             }
 
@@ -2957,7 +2956,7 @@ class Generator {
             fragmentHelperClass.closeFragment(fragment, methodNesting);
             // XXX - Need to change pageContext to jspContext if
             // we're not in a place where pageContext is defined (e.g.
-            // in a fragment or in a tag file.
+            // in a fragment or in a tag file).
             out.print("new " + fragmentHelperClass.getClassName() + "( " + fragment.getId() + ", _jspx_page_context, " +
                     tagHandlerVar + ", " + pushBodyCountVar + ")");
         }
@@ -3701,7 +3700,7 @@ class Generator {
         /*
          * For a CustomTag, the codes that are generated at the beginning of the tag may not be in the same buffer as
          * those for the body of the tag. Two fields are used here to keep this straight. For codes that do not
-         * corresponds to any JSP lines, they should be null.
+         * correspond to any JSP lines, they should be null.
          */
         private final Node node;
 
diff --git a/java/org/apache/jasper/compiler/JspDocumentParser.java b/java/org/apache/jasper/compiler/JspDocumentParser.java
index 5b6eb84da4..11c464abfa 100644
--- a/java/org/apache/jasper/compiler/JspDocumentParser.java
+++ b/java/org/apache/jasper/compiler/JspDocumentParser.java
@@ -19,6 +19,7 @@ package org.apache.jasper.compiler;
 import java.io.CharArrayWriter;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.Serial;
 import java.util.Collection;
 
 import javax.xml.parsers.SAXParser;
@@ -361,7 +362,7 @@ class JspDocumentParser extends DefaultHandler2 implements TagConstants {
      *
      * The SAX does not call this method with all of the template text, but may invoke this method with chunks of it.
      * This is a problem when we try to determine if the text contains only whitespaces, or when we are looking for an
-     * EL expression string. Therefore it is necessary to buffer and concatenate the chunks and process the concatenated
+     * EL expression string. Therefore, it is necessary to buffer and concatenate the chunks and process the concatenated
      * text later (at beginTag and endTag)
      *
      * @param buf The characters
@@ -532,12 +533,12 @@ class JspDocumentParser extends DefaultHandler2 implements TagConstants {
                     continue;
                 }
                 // Ignore any whitespace (including spaces, carriage returns,
-                // line feeds, and tabs, that appear at the beginning and at
+                // line feeds, and tabs) that appear at the beginning and at
                 // the end of the body of the <jsp:attribute> action, if the
                 // action's 'trim' attribute is set to TRUE (default).
                 // In addition, any textual nodes in the <jsp:attribute> that
-                // have only white space are dropped from the document, with
-                // the exception of leading and trailing white-space-only
+                // have only white space are dropped from the document,
+                // except for leading and trailing white-space-only
                 // textual nodes in a <jsp:attribute> whose 'trim' attribute
                 // is set to FALSE, which must be kept verbatim.
                 if (i == 0) {
@@ -1064,6 +1065,7 @@ class JspDocumentParser extends DefaultHandler2 implements TagConstants {
      */
     private static class EnableDTDValidationException extends SAXParseException {
 
+        @Serial
         private static final long serialVersionUID = 1L;
 
         EnableDTDValidationException(String message, Locator loc) {
diff --git a/java/org/apache/jasper/compiler/JspReader.java b/java/org/apache/jasper/compiler/JspReader.java
index 95e20ad5c5..c5ad96aab0 100644
--- a/java/org/apache/jasper/compiler/JspReader.java
+++ b/java/org/apache/jasper/compiler/JspReader.java
@@ -30,7 +30,7 @@ import org.apache.tomcat.Jar;
 
 /**
  * JspReader is an input buffer for the JSP parser. It should allow unlimited lookahead and pushback. It also has a
- * bunch of parsing utility methods for understanding htmlesque thingies.
+ * bunch of parsing utility methods for understanding html style content.
  *
  * @author Anil K. Vijendran
  * @author Anselm Baird-Smith
@@ -599,7 +599,7 @@ class JspReader {
 
     /**
      * Parse utils - Is current character a token delimiter ? Delimiters are currently defined to be =, &gt;, &lt;, ",
-     * and ' or any any space character as defined by <code>isSpace</code>.
+     * and ' or any space character as defined by <code>isSpace</code>.
      *
      * @return A boolean.
      */
diff --git a/java/org/apache/jasper/compiler/JspRuntimeContext.java b/java/org/apache/jasper/compiler/JspRuntimeContext.java
index 49808b5bc4..d659c0ad83 100644
--- a/java/org/apache/jasper/compiler/JspRuntimeContext.java
+++ b/java/org/apache/jasper/compiler/JspRuntimeContext.java
@@ -300,7 +300,7 @@ public final class JspRuntimeContext {
 
 
     /**
-     * Method used by background thread to check the JSP dependencies registered with this class for JSP's.
+     * Method used by background thread to check the JSP dependencies registered with this class for JSPs.
      */
     public void checkCompile() {
 
@@ -349,7 +349,7 @@ public final class JspRuntimeContext {
             try {
                 if (jsw.isTagFile()) {
                     // Although this is a public method, all other paths to this
-                    // method use this sync and it is required to prevent race
+                    // method use this sync, and it is required to prevent race
                     // conditions during the reload.
                     synchronized (this) {
                         jsw.loadTagFile();
@@ -449,7 +449,7 @@ public final class JspRuntimeContext {
 
 
     /**
-     * Method used by background thread to check if any JSP's should be unloaded.
+     * Method used by background thread to check if any JSPs should be unloaded.
      */
     public void checkUnload() {
 
diff --git a/java/org/apache/jasper/compiler/Mark.java b/java/org/apache/jasper/compiler/Mark.java
index a53cd7bb03..3b4fb67982 100644
--- a/java/org/apache/jasper/compiler/Mark.java
+++ b/java/org/apache/jasper/compiler/Mark.java
@@ -26,7 +26,7 @@ import org.apache.jasper.JspCompilationContext;
  *
  * @author Anil K. Vijendran
  */
-final class Mark {
+public final class Mark {
 
     // position within current stream
     int cursor, line, col;
@@ -125,8 +125,7 @@ final class Mark {
 
     @Override
     public boolean equals(Object other) {
-        if (other instanceof Mark) {
-            Mark m = (Mark) other;
+        if (other instanceof Mark m) {
             return this.cursor == m.cursor && this.line == m.line && this.col == m.col;
         }
         return false;
diff --git a/java/org/apache/jasper/compiler/Node.java b/java/org/apache/jasper/compiler/Node.java
index 90af48e7f2..abfb7d27ef 100644
--- a/java/org/apache/jasper/compiler/Node.java
+++ b/java/org/apache/jasper/compiler/Node.java
@@ -49,7 +49,7 @@ import org.xml.sax.Attributes;
  * @author Mark Roth
  */
 
-abstract class Node implements TagConstants {
+public abstract class Node implements TagConstants {
 
     private static final VariableInfo[] ZERO_VARIABLE_INFO = {};
 
@@ -346,7 +346,7 @@ abstract class Node implements TagConstants {
     }
 
     /**
-     * Selects and invokes a method in the visitor class based on the node type. This is abstract and should be overrode
+     * Selects and invokes a method in the visitor class based on the node type. This is abstract and should be overridden
      * by the extending classes.
      *
      * @param v The visitor class
@@ -2191,7 +2191,7 @@ abstract class Node implements TagConstants {
 
         /**
          * This method provides a place to put actions that are common to all nodes. Override this in the child visitor
-         * class if need to.
+         * class if needed.
          *
          * @param n The node to visit
          */
diff --git a/java/org/apache/jasper/compiler/PageDataImpl.java b/java/org/apache/jasper/compiler/PageDataImpl.java
index 8327b72f23..853e2420da 100644
--- a/java/org/apache/jasper/compiler/PageDataImpl.java
+++ b/java/org/apache/jasper/compiler/PageDataImpl.java
@@ -77,7 +77,7 @@ class PageDataImpl extends PageData implements TagConstants {
     }
 
     /*
-     * First-pass Visitor for JspRoot nodes (representing jsp:root elements) and TablibDirective nodes, ignoring any
+     * First-pass Visitor for JspRoot nodes (representing jsp:root elements) and TaglibDirective nodes, ignoring any
      * other nodes.
      *
      * The purpose of this Visitor is to collect the attributes of the top-level jsp:root and those of the jsp:root
diff --git a/java/org/apache/jasper/compiler/PageInfo.java b/java/org/apache/jasper/compiler/PageInfo.java
index 9dceee1f0a..f84102f557 100644
--- a/java/org/apache/jasper/compiler/PageInfo.java
+++ b/java/org/apache/jasper/compiler/PageInfo.java
@@ -39,7 +39,7 @@ import org.apache.jasper.JspCompilationContext;
  * @author Kin-man Chung
  */
 
-class PageInfo {
+public class PageInfo {
 
     private final List<String> imports;
     private final Map<String,Long> dependants;
diff --git a/java/org/apache/jasper/compiler/Parser.java b/java/org/apache/jasper/compiler/Parser.java
index 5c0b5a5aa9..435bd333a0 100644
--- a/java/org/apache/jasper/compiler/Parser.java
+++ b/java/org/apache/jasper/compiler/Parser.java
@@ -562,7 +562,7 @@ class Parser implements TagConstants {
     }
 
     /*
-     * Parses a attribute directive with the following syntax: AttributeDirective ::= ( S Attribute)*
+     * Parses an attribute directive with the following syntax: AttributeDirective ::= ( S Attribute)*
      */
     private void parseAttributeDirective(Node parent) throws JasperException {
         Attributes attrs = parseAttributes();
@@ -955,8 +955,7 @@ class Parser implements TagConstants {
         boolean result = false;
 
         if (reader.matchesOptionalSpacesFollowedBy("<jsp:attribute")) {
-            // May be an EmptyBody, depending on whether
-            // There's a "<jsp:body" before the ETag
+            // It may be an EmptyBody, depending on whether there's a "<jsp:body" before the ETag
 
             // First, parse <jsp:attribute> elements:
             parseNamedAttributes(parent);
@@ -1121,7 +1120,7 @@ class Parser implements TagConstants {
         // 'CustomActionJSPContent', or 'CustomActionScriptlessContent'.
         // depending on body-content in TLD.
 
-        // Looking for a body, it still can be empty; but if there is a
+        // Looking for a body, it still can be empty; but if there is
         // a tag body, its syntax would be dependent on the type of
         // body content declared in the TLD.
         String bc;
diff --git a/java/org/apache/jasper/compiler/ParserController.java b/java/org/apache/jasper/compiler/ParserController.java
index 6fefdbcfdc..5f90f621b5 100644
--- a/java/org/apache/jasper/compiler/ParserController.java
+++ b/java/org/apache/jasper/compiler/ParserController.java
@@ -40,7 +40,7 @@ import org.xml.sax.Attributes;
  * @author Pierre Delisle
  * @author Jan Luehe
  */
-class ParserController implements TagConstants {
+public class ParserController implements TagConstants {
 
     private static final String CHARSET = "charset=";
     private static final String TAGS_IN_JAR_LOCATION = "/META-INF/tags/";
@@ -197,7 +197,7 @@ class ParserController implements TagConstants {
             /*
              * An included file is being parsed that was included from the standard location for tag files in JAR but
              * tries to escape that location to either somewhere in the JAR not under the standard location or outside
-             * of the JAR. Neither of these are permitted.
+             * the JAR. Neither of these are permitted.
              */
             err.jspError("jsp.error.invalid.includeInTagFileJar", inFileName, jar.getJarFileURL().toString());
         }
diff --git a/java/org/apache/jasper/compiler/SmapInput.java b/java/org/apache/jasper/compiler/SmapInput.java
index 858c0522ce..32bac1bdb1 100644
--- a/java/org/apache/jasper/compiler/SmapInput.java
+++ b/java/org/apache/jasper/compiler/SmapInput.java
@@ -16,24 +16,5 @@
  */
 package org.apache.jasper.compiler;
 
-public class SmapInput {
-
-    private final String fileName;
-    private final int lineNumber;
-
-
-    public SmapInput(String fileName, int lineNumber) {
-        this.fileName = fileName;
-        this.lineNumber = lineNumber;
-    }
-
-
-    public String getFileName() {
-        return fileName;
-    }
-
-
-    public int getLineNumber() {
-        return lineNumber;
-    }
+public record SmapInput(String fileName, int lineNumber) {
 }
diff --git a/java/org/apache/jasper/compiler/SmapStratum.java b/java/org/apache/jasper/compiler/SmapStratum.java
index 8eab419f9e..6adcf1d1c3 100644
--- a/java/org/apache/jasper/compiler/SmapStratum.java
+++ b/java/org/apache/jasper/compiler/SmapStratum.java
@@ -30,7 +30,7 @@ public class SmapStratum {
     /**
      * Represents a single LineSection in an SMAP, associated with a particular stratum.
      */
-    static class LineInfo {
+    public static class LineInfo {
         private int inputStartLine = -1;
         private int outputStartLine = -1;
         private int lineFileID = 0;
diff --git a/java/org/apache/jasper/compiler/StringInterpreterFactory.java b/java/org/apache/jasper/compiler/StringInterpreterFactory.java
index 22d7dea62e..45c637dab6 100644
--- a/java/org/apache/jasper/compiler/StringInterpreterFactory.java
+++ b/java/org/apache/jasper/compiler/StringInterpreterFactory.java
@@ -153,7 +153,7 @@ public class StringInterpreterFactory {
 
 
         /**
-         * Intended to be used by sub-classes that don't need/want to re-implement the logic in
+         * Intended to be used by subclasses that don't need/want to re-implement the logic in
          * {@link #convertString(Class, String, String, Class, boolean)}.
          *
          * @param c                unused
diff --git a/java/org/apache/jasper/compiler/TagFileProcessor.java b/java/org/apache/jasper/compiler/TagFileProcessor.java
index 92d08c8656..146a059653 100644
--- a/java/org/apache/jasper/compiler/TagFileProcessor.java
+++ b/java/org/apache/jasper/compiler/TagFileProcessor.java
@@ -46,7 +46,7 @@ import org.apache.tomcat.util.descriptor.tld.TldResourcePath;
  * @author Kin-man Chung
  */
 
-class TagFileProcessor {
+public class TagFileProcessor {
 
     private List<Compiler> tempVector;
 
@@ -625,7 +625,7 @@ class TagFileProcessor {
     /**
      * Removed the java and class files for the tag prototype generated from the current compilation.
      *
-     * @param classFileName If non-null, remove only the class file with with this name.
+     * @param classFileName If non-null, remove only the class file with this name.
      */
     public void removeProtoTypeFiles(String classFileName) {
         for (Compiler c : tempVector) {
diff --git a/java/org/apache/jasper/compiler/TldCache.java b/java/org/apache/jasper/compiler/TldCache.java
index f2106493f8..c1f8014c2e 100644
--- a/java/org/apache/jasper/compiler/TldCache.java
+++ b/java/org/apache/jasper/compiler/TldCache.java
@@ -35,7 +35,7 @@ import org.xml.sax.SAXException;
 
 /**
  * This class caches parsed instances of TLD files to remove the need for the same TLD to be parsed for each JSP that
- * references it. It does not protect against multiple threads processing the same, new TLD but it does ensure that each
+ * references it. It does not protect against multiple threads processing the same new TLD, but it does ensure that each
  * all threads will use the same TLD object after parsing.
  */
 public class TldCache {
diff --git a/java/org/apache/jasper/compiler/Validator.java b/java/org/apache/jasper/compiler/Validator.java
index e1fc3acdc3..96725d4a45 100644
--- a/java/org/apache/jasper/compiler/Validator.java
+++ b/java/org/apache/jasper/compiler/Validator.java
@@ -1120,10 +1120,10 @@ class Validator {
         /**
          * Preprocess attributes that can be expressions. Expression delimiters are stripped.
          * <p>
-         * If value is null, checks if there are any NamedAttribute subelements in the tree node, and if so, constructs
+         * If value is null, checks if there are any NamedAttribute sub elements in the tree node, and if so, constructs
          * a JspAttribute out of a child NamedAttribute node.
          *
-         * @param el EL expression, if already parsed by the caller (so that we can skip re-parsing it)
+         * @param el EL expression, if already parsed by the caller (so that we can skip reparsing it)
          */
         private Node.JspAttribute getJspAttribute(TagAttributeInfo tai, String qName, String uri, String localName,
                 String value, Node n, ELNode.Nodes el, boolean dynamic) throws JasperException {
@@ -1610,10 +1610,9 @@ class Validator {
 
         for (Object o : compiler.getPageInfo().getTaglibs()) {
 
-            if (!(o instanceof TagLibraryInfoImpl)) {
+            if (!(o instanceof TagLibraryInfoImpl tli)) {
                 continue;
             }
-            TagLibraryInfoImpl tli = (TagLibraryInfoImpl) o;
 
             ValidationMessage[] errors = tli.validate(xmlView);
             if ((errors != null) && (errors.length != 0)) {
diff --git a/java/org/apache/jasper/compiler/tagplugin/TagPluginContext.java b/java/org/apache/jasper/compiler/tagplugin/TagPluginContext.java
index 7f6ad2c098..38d9383a57 100644
--- a/java/org/apache/jasper/compiler/tagplugin/TagPluginContext.java
+++ b/java/org/apache/jasper/compiler/tagplugin/TagPluginContext.java
@@ -81,7 +81,7 @@ public interface TagPluginContext {
     String getConstantAttribute(String attribute);
 
     /**
-     * Generate codes to evaluate value of a attribute in the custom tag The codes is a Java expression. NOTE: Currently
+     * Generate codes to evaluate value of an attribute in the custom tag The codes is a Java expression. NOTE: Currently
      * cannot handle attributes that are fragments.
      *
      * @param attribute The specified attribute
@@ -101,10 +101,10 @@ public interface TagPluginContext {
 
     /**
      * Get the PluginContext for the parent of this custom tag. NOTE: The operations available for PluginContext so
-     * obtained is limited to getPluginAttribute and setPluginAttribute, and queries (e.g. isScriptless(). There should
+     * obtained is limited to getPluginAttribute and setPluginAttribute, and queries (e.g. isScriptless()). There should
      * be no calls to generate*().
      *
-     * @return The pluginContext for the parent node. null if the parent is not a custom tag, or if the pluginContext if
+     * @return The pluginContext for the parent node. null if the parent is not a custom tag, or if the pluginContext is
      *             not available (because useTagPlugin is false, e.g).
      */
     TagPluginContext getParentContext();
diff --git a/java/org/apache/jasper/el/JasperELResolver.java b/java/org/apache/jasper/el/JasperELResolver.java
index 6e46b30e8b..83ea9a9edf 100644
--- a/java/org/apache/jasper/el/JasperELResolver.java
+++ b/java/org/apache/jasper/el/JasperELResolver.java
@@ -107,7 +107,7 @@ public class JasperELResolver extends CompositeELResolver {
             // call implicit and app resolvers
             int index = 1 /* implicit */ + appResolversSize;
             for (int i = 0; i < index; i++) {
-                result = resolvers[i].getValue(context, base, property);
+                result = resolvers[i].getValue(context, null, property);
                 if (context.isPropertyResolved()) {
                     return result;
                 }
diff --git a/java/org/apache/jasper/el/JspELException.java b/java/org/apache/jasper/el/JspELException.java
index a881dd33bb..e1e6468c8d 100644
--- a/java/org/apache/jasper/el/JspELException.java
+++ b/java/org/apache/jasper/el/JspELException.java
@@ -16,10 +16,13 @@
  */
 package org.apache.jasper.el;
 
+import java.io.Serial;
+
 import jakarta.el.ELException;
 
 public class JspELException extends ELException {
 
+    @Serial
     private static final long serialVersionUID = 1L;
 
     public JspELException(String mark, ELException e) {
diff --git a/java/org/apache/jasper/el/JspMethodNotFoundException.java b/java/org/apache/jasper/el/JspMethodNotFoundException.java
index 2827b19807..6034da3740 100644
--- a/java/org/apache/jasper/el/JspMethodNotFoundException.java
+++ b/java/org/apache/jasper/el/JspMethodNotFoundException.java
@@ -16,10 +16,13 @@
  */
 package org.apache.jasper.el;
 
+import java.io.Serial;
+
 import jakarta.el.MethodNotFoundException;
 
 public class JspMethodNotFoundException extends MethodNotFoundException {
 
+    @Serial
     private static final long serialVersionUID = 1L;
 
     public JspMethodNotFoundException(String mark, MethodNotFoundException e) {
diff --git a/java/org/apache/jasper/el/JspPropertyNotFoundException.java b/java/org/apache/jasper/el/JspPropertyNotFoundException.java
index 8842906033..cf3b5a87f2 100644
--- a/java/org/apache/jasper/el/JspPropertyNotFoundException.java
+++ b/java/org/apache/jasper/el/JspPropertyNotFoundException.java
@@ -16,10 +16,13 @@
  */
 package org.apache.jasper.el;
 
+import java.io.Serial;
+
 import jakarta.el.PropertyNotFoundException;
 
 public final class JspPropertyNotFoundException extends PropertyNotFoundException {
 
+    @Serial
     private static final long serialVersionUID = 1L;
 
     public JspPropertyNotFoundException(String mark, PropertyNotFoundException e) {
diff --git a/java/org/apache/jasper/el/JspPropertyNotWritableException.java b/java/org/apache/jasper/el/JspPropertyNotWritableException.java
index 43654bb931..4e975cf0de 100644
--- a/java/org/apache/jasper/el/JspPropertyNotWritableException.java
+++ b/java/org/apache/jasper/el/JspPropertyNotWritableException.java
@@ -16,10 +16,13 @@
  */
 package org.apache.jasper.el;
 
+import java.io.Serial;
+
 import jakarta.el.PropertyNotWritableException;
 
 public class JspPropertyNotWritableException extends PropertyNotWritableException {
 
+    @Serial
     private static final long serialVersionUID = 1L;
 
     public JspPropertyNotWritableException(String mark, PropertyNotWritableException e) {
diff --git a/java/org/apache/jasper/runtime/BodyContentImpl.java b/java/org/apache/jasper/runtime/BodyContentImpl.java
index 4a3cd0960f..8ff21e212b 100644
--- a/java/org/apache/jasper/runtime/BodyContentImpl.java
+++ b/java/org/apache/jasper/runtime/BodyContentImpl.java
@@ -27,8 +27,8 @@ import jakarta.servlet.jsp.tagext.BodyContent;
 import org.apache.jasper.compiler.Localizer;
 
 /**
- * Write text to a character-output stream, buffering characters so as to provide for the efficient writing of single
- * characters, arrays, and strings. Provide support for discarding for the output that has been buffered.
+ * Write text to a character-output stream, buffering characters to provide efficient writing of single
+ * characters, arrays, and strings. Provide support for discarding the output that has been buffered.
  *
  * @author Rajiv Mordani
  * @author Jan Luehe
@@ -341,7 +341,7 @@ public class BodyContentImpl extends BodyContent {
     public void writeOut(Writer out) throws IOException {
         if (writer == null) {
             out.write(cb, 0, nextChar);
-            // Flush not called as the writer passed could be a BodyContent and
+            // Flush not called as the writer passed could be a BodyContent, and
             // it doesn't allow to flush.
         }
     }
diff --git a/java/org/apache/jasper/runtime/HttpJspBase.java b/java/org/apache/jasper/runtime/HttpJspBase.java
index 331c5dacf3..3b810d8367 100644
--- a/java/org/apache/jasper/runtime/HttpJspBase.java
+++ b/java/org/apache/jasper/runtime/HttpJspBase.java
@@ -17,6 +17,7 @@
 package org.apache.jasper.runtime;
 
 import java.io.IOException;
+import java.io.Serial;
 
 import jakarta.servlet.ServletConfig;
 import jakarta.servlet.ServletException;
@@ -35,6 +36,7 @@ import org.apache.jasper.compiler.Localizer;
  */
 public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {
 
+    @Serial
     private static final long serialVersionUID = 1L;
 
     protected HttpJspBase() {
diff --git a/java/org/apache/jasper/runtime/JspWriterImpl.java b/java/org/apache/jasper/runtime/JspWriterImpl.java
index f69ab08a03..f43da63928 100644
--- a/java/org/apache/jasper/runtime/JspWriterImpl.java
+++ b/java/org/apache/jasper/runtime/JspWriterImpl.java
@@ -27,8 +27,8 @@ import org.apache.jasper.Constants;
 import org.apache.jasper.compiler.Localizer;
 
 /**
- * Write text to a character-output stream, buffering characters so as to provide for the efficient writing of single
- * characters, arrays, and strings. Provide support for discarding for the output that has been buffered. This needs
+ * Write text to a character-output stream, buffering characters to provide efficient writing of single
+ * characters, arrays, and strings. Provide support for discarding the output that has been buffered. This needs
  * revisiting when the buffering problems in the JSP spec are fixed -akv
  *
  * @author Anil K. Vijendran
@@ -202,7 +202,7 @@ public class JspWriterImpl extends JspWriter {
     }
 
     /**
-     * Our own little min method, to avoid loading java.lang.Math if we've run out of file descriptors and we're trying
+     * Our own little min method, to avoid loading java.lang.Math if we've run out of file descriptors, and we're trying
      * to print a stack trace.
      */
     private static int min(int a, int b) {
diff --git a/java/org/apache/jasper/servlet/JasperInitializer.java b/java/org/apache/jasper/servlet/JasperInitializer.java
index 9d41424d8e..c813721467 100644
--- a/java/org/apache/jasper/servlet/JasperInitializer.java
+++ b/java/org/apache/jasper/servlet/JasperInitializer.java
@@ -59,7 +59,7 @@ public class JasperInitializer implements ServletContainerInitializer {
             log.debug(Localizer.getMessage(MSG + ".onStartup", context.getServletContextName()));
         }
 
-        // Setup a simple default Instance Manager
+        // Set up a simple default Instance Manager
         if (context.getAttribute(InstanceManager.class.getName()) == null) {
             context.setAttribute(InstanceManager.class.getName(), new SimpleInstanceManager());
         }
diff --git a/java/org/apache/jasper/servlet/JspCServletContext.java b/java/org/apache/jasper/servlet/JspCServletContext.java
index edf7f07852..eb035bab95 100644
--- a/java/org/apache/jasper/servlet/JspCServletContext.java
+++ b/java/org/apache/jasper/servlet/JspCServletContext.java
@@ -187,11 +187,7 @@ public class JspCServletContext implements ServletContext {
         List<URL> resourceJars = new ArrayList<>();
         // Build list of potential resource JARs. Use same ordering as ContextConfig
         Set<WebXml> resourceFragments = new LinkedHashSet<>(orderedFragments);
-        for (WebXml fragment : fragments) {
-            if (!resourceFragments.contains(fragment)) {
-                resourceFragments.add(fragment);
-            }
-        }
+        resourceFragments.addAll(fragments);
 
         for (WebXml resourceFragment : resourceFragments) {
             try (Jar jar = JarFactory.newInstance(resourceFragment.getURL())) {
diff --git a/java/org/apache/jasper/servlet/JspServlet.java b/java/org/apache/jasper/servlet/JspServlet.java
index 1c1d376198..d4dad0274d 100644
--- a/java/org/apache/jasper/servlet/JspServlet.java
+++ b/java/org/apache/jasper/servlet/JspServlet.java
@@ -18,6 +18,7 @@ package org.apache.jasper.servlet;
 
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.Serial;
 import java.lang.reflect.Constructor;
 import java.net.MalformedURLException;
 
@@ -40,8 +41,8 @@ import org.apache.tomcat.PeriodicEventListener;
 import org.apache.tomcat.util.security.Escape;
 
 /**
- * The JSP engine (a.k.a Jasper). The servlet container is responsible for providing a URLClassLoader for the web
- * application context Jasper is being used in. Jasper will try get the Tomcat ServletContext attribute for its
+ * The Jasper JSP engine. The servlet container is responsible for providing a URLClassLoader for the web
+ * application context Jasper is being used in. Jasper will try to get the Tomcat ServletContext attribute for its
  * ServletContext class loader, if that fails, it uses the parent class loader. In either case, it must be a
  * URLClassLoader.
  *
@@ -53,6 +54,7 @@ import org.apache.tomcat.util.security.Escape;
  */
 public class JspServlet extends HttpServlet implements PeriodicEventListener {
 
+    @Serial
     private static final long serialVersionUID = 1L;
 
     // Logger
diff --git a/java/org/apache/jasper/servlet/JspServletWrapper.java b/java/org/apache/jasper/servlet/JspServletWrapper.java
index 2b98fe6a8f..cecbba20b7 100644
--- a/java/org/apache/jasper/servlet/JspServletWrapper.java
+++ b/java/org/apache/jasper/servlet/JspServletWrapper.java
@@ -49,8 +49,8 @@ import org.apache.tomcat.InstanceManager;
 import org.apache.tomcat.Jar;
 
 /**
- * The JSP engine (a.k.a Jasper). The servlet container is responsible for providing a URLClassLoader for the web
- * application context Jasper is being used in. Jasper will try get the Tomcat ServletContext attribute for its
+ * The Jasper JSP engine. The servlet container is responsible for providing a URLClassLoader for the web
+ * application context Jasper is being used in. Jasper will try to get the Tomcat ServletContext attribute for its
  * ServletContext class loader, if that fails, it uses the parent class loader. In either case, it must be a
  * URLClassLoader.
  *
@@ -81,8 +81,8 @@ public class JspServletWrapper {
     private final ServletConfig config;
     private final Options options;
     /*
-     * The servlet / tag file needs a compilation check on first access. Use a separate flag (rather then theServlet ==
-     * null / tagHandlerClass == null as it avoids the potentially expensive isOutDated() calls in ctxt.compile() if
+     * The servlet / tag file needs a compilation check on first access. Use a separate flag (rather than theServlet ==
+     * null / tagHandlerClass == null) as it avoids the potentially expensive isOutDated() calls in ctxt.compile() if
      * there are multiple concurrent requests for the servlet / tag before the class has been loaded.
      */
     private volatile boolean mustCompile = true;
@@ -273,7 +273,7 @@ public class JspServletWrapper {
 
     /**
      * Compile and load a prototype for the Tag file. This is needed when compiling tag files with circular
-     * dependencies. A prototype (skeleton) with no dependencies on other other tag files is generated and compiled.
+     * dependencies. A prototype (skeleton) with no dependencies on other tag files is generated and compiled.
      *
      * @return the loaded class
      *
@@ -513,8 +513,7 @@ public class JspServletWrapper {
      * Attempts to construct a JasperException that contains helpful information about what went wrong. Uses the JSP
      * compiler system to translate the line number in the generated servlet that originated the exception to a line
      * number in the JSP. Then constructs an exception containing that information, and a snippet of the JSP to help
-     * debugging. Please see https://bz.apache.org/bugzilla/show_bug.cgi?id=37062 and http://www.tfenne.com/jasper/ for
-     * more details.
+     * debugging. Please see <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=37062">BZ 37062</a> for more details.
      * </p>
      *
      * @param ex the exception that was the cause of the problem.
@@ -549,7 +548,7 @@ public class JspServletWrapper {
 
             if (smap == null) {
                 // If we couldn't find a frame in the stack trace corresponding
-                // to the generated servlet class or we don't have a copy of the
+                // to the generated servlet class, or we don't have a copy of the
                 // smap to hand, we can't really add anything
                 return new JasperException(ex);
             }
@@ -560,16 +559,16 @@ public class JspServletWrapper {
 
             // If the line number is less than one we couldn't find out
             // where in the JSP things went wrong
-            if (source.getLineNumber() < 1) {
+            if (source.lineNumber() < 1) {
                 throw new JasperException(ex);
             }
 
             JavacErrorDetail detail = new JavacErrorDetail(jspFrame.getMethodName(), javaLineNumber,
-                    source.getFileName(), source.getLineNumber(), null, ctxt);
+                    source.fileName(), source.lineNumber(), null, ctxt);
 
             if (options.getDisplaySourceFragment()) {
                 return new JasperException(
-                        Localizer.getMessage("jsp.exception", detail.getJspFileName(), "" + source.getLineNumber()) +
+                        Localizer.getMessage("jsp.exception", detail.getJspFileName(), "" + source.lineNumber()) +
                                 System.lineSeparator() + System.lineSeparator() + detail.getJspExtract() +
                                 System.lineSeparator() + System.lineSeparator() + "Stacktrace:",
                         ex);
@@ -577,7 +576,7 @@ public class JspServletWrapper {
             }
 
             return new JasperException(
-                    Localizer.getMessage("jsp.exception", detail.getJspFileName(), "" + source.getLineNumber()), ex);
+                    Localizer.getMessage("jsp.exception", detail.getJspFileName(), "" + source.lineNumber()), ex);
         } catch (Exception je) {
             // If anything goes wrong, just revert to the original behaviour
             if (ex instanceof JasperException) {
diff --git a/java/org/apache/jasper/tagplugins/jstl/core/ForEach.java b/java/org/apache/jasper/tagplugins/jstl/core/ForEach.java
index b3d318f034..7a6634153d 100644
--- a/java/org/apache/jasper/tagplugins/jstl/core/ForEach.java
+++ b/java/org/apache/jasper/tagplugins/jstl/core/ForEach.java
@@ -71,7 +71,7 @@ public final class ForEach implements TagPlugin {
     }
 
     /**
-     * Generate codes for Collections The pseudo code is:
+     * Generate codes for Collections The pseudocode is:
      */
     private void doCollection(TagPluginContext ctxt) {
 
diff --git a/java/org/apache/jasper/tagplugins/jstl/core/Param.java b/java/org/apache/jasper/tagplugins/jstl/core/Param.java
index d182cf118c..e9028b7c21 100644
--- a/java/org/apache/jasper/tagplugins/jstl/core/Param.java
+++ b/java/org/apache/jasper/tagplugins/jstl/core/Param.java
@@ -33,7 +33,7 @@ public class Param implements TagPlugin {
         String encName = ctxt.getTemporaryVariableName();
         String index = ctxt.getTemporaryVariableName();
 
-        // if the param tag has no parents, throw a exception
+        // if the param tag has no parents, throw an exception
         TagPluginContext parent = ctxt.getParentContext();
         if (parent == null) {
             ctxt.generateJavaSource(
diff --git a/java/org/apache/jasper/tagplugins/jstl/core/Set.java b/java/org/apache/jasper/tagplugins/jstl/core/Set.java
index 1d02507fb4..501402a531 100644
--- a/java/org/apache/jasper/tagplugins/jstl/core/Set.java
+++ b/java/org/apache/jasper/tagplugins/jstl/core/Set.java
@@ -63,7 +63,7 @@ public class Set implements TagPlugin {
         // get the iScope according to the strScope
         iScope = Util.getScope(strScope);
 
-        String jspCtxt = null;
+        String jspCtxt;
         if (ctxt.isTagFile()) {
             jspCtxt = "this.getJspContext()";
         } else {
diff --git a/java/org/apache/jasper/tagplugins/jstl/core/When.java b/java/org/apache/jasper/tagplugins/jstl/core/When.java
index b6568003e7..5bc75db74a 100644
--- a/java/org/apache/jasper/tagplugins/jstl/core/When.java
+++ b/java/org/apache/jasper/tagplugins/jstl/core/When.java
@@ -42,7 +42,7 @@ public final class When implements TagPlugin {
         ctxt.generateBody();
 
         // We don't generate the closing "}" for the "if" here because there
-        // may be whitespaces in between <c:when>'s. Instead we delay
+        // may be whitespaces in between <c:when>'s. Instead, we delay
         // generating it until the next <c:when> or <c:otherwise> or
         // <c:choose>
     }


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