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 <r...@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-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to