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

rmaucher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/main by this push:
     new 766e61097a Replace various existing patterns with the URLConnection 
wrapper
766e61097a is described below

commit 766e61097adde2a3c1b3328a9f97269772cc495a
Author: remm <[email protected]>
AuthorDate: Fri Jul 3 16:24:13 2026 +0200

    Replace various existing patterns with the URLConnection wrapper
---
 .../catalina/ssi/SSIServletExternalResolver.java   | 40 ++++------------
 .../org/apache/catalina/startup/ContextConfig.java | 31 +++---------
 .../apache/catalina/users/MemoryUserDatabase.java  | 56 +++++++++-------------
 java/org/apache/jasper/JspCompilationContext.java  | 27 ++++-------
 java/org/apache/jasper/compiler/Compiler.java      | 14 +++---
 java/org/apache/jasper/compiler/TldCache.java      | 11 ++---
 java/org/apache/tomcat/Jar.java                    |  1 +
 .../tomcat/util/file/ConfigurationSource.java      | 10 +---
 8 files changed, 61 insertions(+), 129 deletions(-)

diff --git a/java/org/apache/catalina/ssi/SSIServletExternalResolver.java 
b/java/org/apache/catalina/ssi/SSIServletExternalResolver.java
index ec358ac3a4..858f0adf53 100644
--- a/java/org/apache/catalina/ssi/SSIServletExternalResolver.java
+++ b/java/org/apache/catalina/ssi/SSIServletExternalResolver.java
@@ -36,8 +36,8 @@ import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.catalina.connector.Connector;
 import org.apache.catalina.connector.Request;
-import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.buf.B2CConverter;
+import org.apache.tomcat.util.buf.CloseableURLConnection;
 import org.apache.tomcat.util.buf.UDecoder;
 import org.apache.tomcat.util.http.Method;
 import org.apache.tomcat.util.http.RequestUtil;
@@ -600,23 +600,12 @@ public class SSIServletExternalResolver implements 
SSIExternalResolver {
      */
     @Override
     public long getFileLastModified(String path, boolean virtual) throws 
IOException {
-        long lastModified = 0;
-        URLConnection urlConnection = null;
-        try {
-            urlConnection = getURLConnection(path, virtual);
-            lastModified = urlConnection.getLastModified();
-        } catch (IOException ignore) {
+        try (CloseableURLConnection urlConnection = new 
CloseableURLConnection(getURLConnection(path, virtual))) {
+            return urlConnection.getLastModified();
+        } catch (IOException e) {
             // Ignore this. It will always fail for non-file based includes
-        } finally {
-            if (urlConnection != null) {
-                try {
-                    urlConnection.getInputStream().close();
-                } catch (Exception e) {
-                    ExceptionUtils.handleThrowable(e);
-                }
-            }
+            return 0L;
         }
-        return lastModified;
     }
 
 
@@ -632,23 +621,12 @@ public class SSIServletExternalResolver implements 
SSIExternalResolver {
      */
     @Override
     public long getFileSize(String path, boolean virtual) throws IOException {
-        long fileSize = -1;
-        URLConnection urlConnection = null;
-        try {
-            urlConnection = getURLConnection(path, virtual);
-            fileSize = urlConnection.getContentLengthLong();
-        } catch (IOException ignore) {
+        try (CloseableURLConnection urlConnection = new 
CloseableURLConnection(getURLConnection(path, virtual))) {
+            return urlConnection.getContentLengthLong();
+        } catch (IOException e) {
             // Ignore this. It will always fail for non-file based includes
-        } finally {
-            if (urlConnection != null) {
-                try {
-                    urlConnection.getInputStream().close();
-                } catch (Exception e) {
-                    ExceptionUtils.handleThrowable(e);
-                }
-            }
+            return -1L;
         }
-        return fileSize;
     }
 
 
diff --git a/java/org/apache/catalina/startup/ContextConfig.java 
b/java/org/apache/catalina/startup/ContextConfig.java
index 21eaa63365..6d20b1d672 100644
--- a/java/org/apache/catalina/startup/ContextConfig.java
+++ b/java/org/apache/catalina/startup/ContextConfig.java
@@ -85,6 +85,7 @@ import org.apache.tomcat.util.bcel.classfile.ClassParser;
 import org.apache.tomcat.util.bcel.classfile.ElementValue;
 import org.apache.tomcat.util.bcel.classfile.ElementValuePair;
 import org.apache.tomcat.util.bcel.classfile.JavaClass;
+import org.apache.tomcat.util.buf.CloseableURLConnection;
 import org.apache.tomcat.util.buf.UriUtil;
 import org.apache.tomcat.util.descriptor.InputSourceUtil;
 import org.apache.tomcat.util.descriptor.XmlErrorHandler;
@@ -1694,42 +1695,24 @@ public class ContextConfig implements LifecycleListener 
{
         long hostTimeStamp = 0;
 
         if (globalWebXml != null) {
-            URLConnection uc = null;
             try {
                 URI uri = new URI(globalWebXml.getSystemId());
-                URL url = uri.toURL();
-                uc = url.openConnection();
-                globalTimeStamp = uc.getLastModified();
+                try (CloseableURLConnection uc = new 
CloseableURLConnection(uri.toURL())) {
+                    globalTimeStamp = uc.getLastModified();
+                }
             } catch (IOException | URISyntaxException | 
IllegalArgumentException e) {
                 globalTimeStamp = -1;
-            } finally {
-                if (uc != null) {
-                    try {
-                        uc.getInputStream().close();
-                    } catch (Exception e) {
-                        ExceptionUtils.handleThrowable(e);
-                    }
-                }
             }
         }
 
         if (hostWebXml != null) {
-            URLConnection uc = null;
             try {
                 URI uri = new URI(hostWebXml.getSystemId());
-                URL url = uri.toURL();
-                uc = url.openConnection();
-                hostTimeStamp = uc.getLastModified();
+                try (CloseableURLConnection uc = new 
CloseableURLConnection(uri.toURL())) {
+                    hostTimeStamp = uc.getLastModified();
+                }
             } catch (IOException | URISyntaxException | 
IllegalArgumentException e) {
                 hostTimeStamp = -1;
-            } finally {
-                if (uc != null) {
-                    try {
-                        uc.getInputStream().close();
-                    } catch (Exception e) {
-                        ExceptionUtils.handleThrowable(e);
-                    }
-                }
             }
         }
 
diff --git a/java/org/apache/catalina/users/MemoryUserDatabase.java 
b/java/org/apache/catalina/users/MemoryUserDatabase.java
index f958909d74..a6543d818d 100644
--- a/java/org/apache/catalina/users/MemoryUserDatabase.java
+++ b/java/org/apache/catalina/users/MemoryUserDatabase.java
@@ -23,8 +23,6 @@ import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.net.URI;
-import java.net.URL;
-import java.net.URLConnection;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -40,6 +38,7 @@ import org.apache.catalina.User;
 import org.apache.catalina.UserDatabase;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.buf.CloseableURLConnection;
 import org.apache.tomcat.util.digester.AbstractObjectCreationFactory;
 import org.apache.tomcat.util.digester.Digester;
 import org.apache.tomcat.util.file.ConfigFileLoader;
@@ -627,43 +626,34 @@ public class MemoryUserDatabase implements UserDatabase {
         }
 
         URI uri = ConfigFileLoader.getSource().getURI(getPathname());
-        URLConnection uConn = null;
         try {
-            URL url = uri.toURL();
-            uConn = url.openConnection();
-
-            if (this.lastModified != uConn.getLastModified()) {
-                writeLock.lock();
-                try {
-                    long detectedLastModified = uConn.getLastModified();
-                    // Last modified as a resolution of 1s. Ensure that a write
-                    // to the file is not in progress by ensuring that the last
-                    // modified time is at least 2 seconds ago.
-                    if (this.lastModified != detectedLastModified &&
-                            detectedLastModified + 2000 < 
System.currentTimeMillis()) {
-                        log.info(sm.getString("memoryUserDatabase.reload", id, 
uri));
-                        open();
+            try (CloseableURLConnection uConn = new 
CloseableURLConnection(uri.toURL())) {
+                if (this.lastModified != uConn.getLastModified()) {
+                    writeLock.lock();
+                    try {
+                        long detectedLastModified = uConn.getLastModified();
+                        // Last modified as a resolution of 1s. Ensure that a 
write
+                        // to the file is not in progress by ensuring that the 
last
+                        // modified time is at least 2 seconds ago.
+                        if (this.lastModified != detectedLastModified &&
+                                detectedLastModified + 2000 < 
System.currentTimeMillis()) {
+                            log.info(sm.getString("memoryUserDatabase.reload", 
id, uri));
+                            open();
+                        }
+                    } finally {
+                        writeLock.unlock();
                     }
-                } finally {
-                    writeLock.unlock();
                 }
+            } catch (FileNotFoundException fnfe) {
+                // The file doesn't exist.
+                // This has been logged above. No need to log again.
+                // Set the last modified time to avoid repeated log messages
+                this.lastModified = 0;
+            } catch (IOException ioe) {
+                log.warn(sm.getString("memoryUserDatabase.fileClose", 
pathname), ioe);
             }
         } catch (Exception e) {
             log.error(sm.getString("memoryUserDatabase.reloadError", id, uri), 
e);
-        } finally {
-            if (uConn != null) {
-                try {
-                    // Can't close a uConn directly. Have to do it like this.
-                    uConn.getInputStream().close();
-                } catch (FileNotFoundException fnfe) {
-                    // The file doesn't exist.
-                    // This has been logged above. No need to log again.
-                    // Set the last modified time to avoid repeated log 
messages
-                    this.lastModified = 0;
-                } catch (IOException ioe) {
-                    log.warn(sm.getString("memoryUserDatabase.fileClose", 
pathname), ioe);
-                }
-            }
         }
     }
 
diff --git a/java/org/apache/jasper/JspCompilationContext.java 
b/java/org/apache/jasper/JspCompilationContext.java
index f2ad21e9c5..cf4ca6e1e2 100644
--- a/java/org/apache/jasper/JspCompilationContext.java
+++ b/java/org/apache/jasper/JspCompilationContext.java
@@ -40,6 +40,7 @@ import org.apache.jasper.servlet.JspServletWrapper;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.Jar;
+import org.apache.tomcat.util.buf.CloseableURLConnection;
 import org.apache.tomcat.util.descriptor.tld.TldResourcePath;
 
 /**
@@ -448,7 +449,6 @@ public class JspCompilationContext {
      */
     public Long getLastModified(String resource, Jar tagJar) {
         long result = -1;
-        URLConnection uc = null;
         try {
             if (tagJar != null) {
                 if (resource.startsWith("/")) {
@@ -461,32 +461,23 @@ public class JspCompilationContext {
                     incrementRemoved();
                     return Long.valueOf(result);
                 }
-                uc = jspUrl.openConnection();
-                if (uc instanceof JarURLConnection) {
-                    JarEntry jarEntry = ((JarURLConnection) uc).getJarEntry();
-                    if (jarEntry != null) {
-                        result = jarEntry.getTime();
+                try (CloseableURLConnection uc = new 
CloseableURLConnection(jspUrl)) {
+                    if (uc.getConnection() instanceof JarURLConnection) {
+                        JarEntry jarEntry = ((JarURLConnection) 
uc.getConnection()).getJarEntry();
+                        if (jarEntry != null) {
+                            result = jarEntry.getTime();
+                        } else {
+                            result = uc.getLastModified();
+                        }
                     } else {
                         result = uc.getLastModified();
                     }
-                } else {
-                    result = uc.getLastModified();
                 }
             }
         } catch (IOException ioe) {
             if (log.isDebugEnabled()) {
                 log.debug(Localizer.getMessage("jsp.error.lastModified", 
getJspFile()), ioe);
             }
-        } finally {
-            if (uc != null) {
-                try {
-                    uc.getInputStream().close();
-                } catch (Exception e) {
-                    if (log.isDebugEnabled()) {
-                        
log.debug(Localizer.getMessage("jsp.error.lastModified", getJspFile()), e);
-                    }
-                }
-            }
         }
         return Long.valueOf(result);
     }
diff --git a/java/org/apache/jasper/compiler/Compiler.java 
b/java/org/apache/jasper/compiler/Compiler.java
index a46f8bb23c..ad2b1c2ca6 100644
--- a/java/org/apache/jasper/compiler/Compiler.java
+++ b/java/org/apache/jasper/compiler/Compiler.java
@@ -25,7 +25,6 @@ import java.io.UnsupportedEncodingException;
 import java.net.JarURLConnection;
 import java.net.URI;
 import java.net.URL;
-import java.net.URLConnection;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -37,6 +36,7 @@ import org.apache.jasper.servlet.JspServletWrapper;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.Jar;
+import org.apache.tomcat.util.buf.CloseableURLConnection;
 import org.apache.tomcat.util.descriptor.tld.TldResourcePath;
 import org.apache.tomcat.util.scan.JarFactory;
 
@@ -559,13 +559,13 @@ public abstract class Compiler {
                     if (includeUrl == null) {
                         return true;
                     }
-                    URLConnection iuc = includeUrl.openConnection();
-                    if (iuc instanceof JarURLConnection) {
-                        includeLastModified = ((JarURLConnection) 
iuc).getJarEntry().getTime();
-                    } else {
-                        includeLastModified = iuc.getLastModified();
+                    try (CloseableURLConnection iuc = new 
CloseableURLConnection(includeUrl)) {
+                        if (iuc.getConnection() instanceof JarURLConnection) {
+                            includeLastModified = ((JarURLConnection) 
iuc.getConnection()).getJarEntry().getTime();
+                        } else {
+                            includeLastModified = iuc.getLastModified();
+                        }
                     }
-                    iuc.getInputStream().close();
                 }
 
                 if (includeLastModified != include.getValue().longValue()) {
diff --git a/java/org/apache/jasper/compiler/TldCache.java 
b/java/org/apache/jasper/compiler/TldCache.java
index 1e1094d07c..181fc73d62 100644
--- a/java/org/apache/jasper/compiler/TldCache.java
+++ b/java/org/apache/jasper/compiler/TldCache.java
@@ -18,7 +18,6 @@ package org.apache.jasper.compiler;
 
 import java.io.IOException;
 import java.net.URL;
-import java.net.URLConnection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -28,6 +27,7 @@ import jakarta.servlet.ServletContext;
 import org.apache.jasper.Constants;
 import org.apache.jasper.JasperException;
 import org.apache.tomcat.Jar;
+import org.apache.tomcat.util.buf.CloseableURLConnection;
 import org.apache.tomcat.util.descriptor.tld.TaglibXml;
 import org.apache.tomcat.util.descriptor.tld.TldParser;
 import org.apache.tomcat.util.descriptor.tld.TldResourcePath;
@@ -168,13 +168,8 @@ public class TldCache {
                 // webappPath will be null for JARs containing TLDs that are on
                 // the class path but not part of the web application
                 URL url = 
servletContext.getResource(tldResourcePath.getWebappPath());
-                URLConnection conn = url.openConnection();
-                result[0] = conn.getLastModified();
-                if ("file".equals(url.getProtocol())) {
-                    // Reading the last modified time opens an input stream so 
we
-                    // need to make sure it is closed again otherwise the TLD 
file
-                    // will be locked until GC runs.
-                    conn.getInputStream().close();
+                try (CloseableURLConnection conn = new 
CloseableURLConnection(url)) {
+                    result[0] = conn.getLastModified();
                 }
             }
             try (Jar jar = tldResourcePath.openJar()) {
diff --git a/java/org/apache/tomcat/Jar.java b/java/org/apache/tomcat/Jar.java
index 4fbca5db16..0afa18d1c2 100644
--- a/java/org/apache/tomcat/Jar.java
+++ b/java/org/apache/tomcat/Jar.java
@@ -62,6 +62,7 @@ public interface Jar extends AutoCloseable {
         URL jarUrl = getJarFileURL();
         URLConnection urlConn = null;
         try {
+            // Note: this cannot use CloseableURLConnection due to Tomcat JAR 
packaging
             urlConn = jarUrl.openConnection();
             return urlConn.getLastModified();
         } finally {
diff --git a/java/org/apache/tomcat/util/file/ConfigurationSource.java 
b/java/org/apache/tomcat/util/file/ConfigurationSource.java
index 04f778cc4e..fbd4518d61 100644
--- a/java/org/apache/tomcat/util/file/ConfigurationSource.java
+++ b/java/org/apache/tomcat/util/file/ConfigurationSource.java
@@ -24,8 +24,8 @@ import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
-import java.net.URLConnection;
 
+import org.apache.tomcat.util.buf.CloseableURLConnection;
 import org.apache.tomcat.util.buf.UriUtil;
 
 /**
@@ -128,14 +128,8 @@ public interface ConfigurationSource {
      * @throws IOException if an I/O error occurs while fetching the last 
modified time
      */
         public long getLastModified() throws MalformedURLException, 
IOException {
-            URLConnection connection = null;
-            try {
-                connection = uri.toURL().openConnection();
+            try (CloseableURLConnection connection = new 
CloseableURLConnection(uri.toURL())) {
                 return connection.getLastModified();
-            } finally {
-                if (connection != null) {
-                    connection.getInputStream().close();
-                }
             }
         }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to