From 1c4f23b99656a534256945f56ecbafa71daae5c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Pin=C4=8Duk?= Date: Mon, 17 Jun 2024 01:33:11 +0300 Subject: [PATCH] Add non-caching Jar URL stream handler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Alexander PinĨuk --- .../server/AppLibClassLoaderServiceImpl.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/nucleus/core/kernel/src/main/java/com/sun/enterprise/v3/server/AppLibClassLoaderServiceImpl.java b/nucleus/core/kernel/src/main/java/com/sun/enterprise/v3/server/AppLibClassLoaderServiceImpl.java index 7b81e948a4f..ac6b37eccba 100644 --- a/nucleus/core/kernel/src/main/java/com/sun/enterprise/v3/server/AppLibClassLoaderServiceImpl.java +++ b/nucleus/core/kernel/src/main/java/com/sun/enterprise/v3/server/AppLibClassLoaderServiceImpl.java @@ -32,9 +32,12 @@ import java.lang.System.Logger; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; +import java.net.URLConnection; +import java.net.URLStreamHandler; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; @@ -47,6 +50,7 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.jar.JarFile; import org.glassfish.api.event.EventListener; import org.glassfish.api.event.Events; @@ -216,6 +220,8 @@ private void addDelegates(Collection libURIs, DelegatingClassLoader holder) */ private static class URLClassFinder extends GlassfishUrlClassLoader implements ClassFinder { + private static final URLStreamHandler urlStreamHandler = new NonCachingURLStreamHandler(); + private final Set notFoundResources = ConcurrentHashMap.newKeySet(); URLClassFinder(URL url, ClassLoader parent) { @@ -266,6 +272,13 @@ public URL findResource(String name) { return null; } URL resourceURL = super.findResource(name); + if (resourceURL != null) { + try { + resourceURL = new URL(resourceURL, resourceURL.toExternalForm(), urlStreamHandler); + } catch (MalformedURLException e) { + resourceURL = null; + } + } if (resourceURL == null){ notFoundResources.add(name); } @@ -286,6 +299,55 @@ public Enumeration findResources(String name) { } } + /** + * Non-caching {@link URLStreamHandler}. + */ + private static class NonCachingURLStreamHandler extends URLStreamHandler { + + @Override + protected URLConnection openConnection(URL url) throws IOException { + return new NonCachedURLConnection(url); + } + } + + /** + * Non-cached {@link JarURLConnection}. + */ + private static class NonCachedURLConnection extends JarURLConnection { + + private JarURLConnection jarURLConnection; + + public NonCachedURLConnection(URL url) throws MalformedURLException { + super(url); + } + + @Override + public void connect() throws IOException { + if (jarURLConnection == null) { + URLConnection urlConnection = new URL(url.toExternalForm()).openConnection(); + urlConnection.setUseCaches(false); + jarURLConnection = (JarURLConnection) urlConnection; + } + } + + @Override + public JarFile getJarFile() throws IOException { + connect(); + return jarURLConnection.getJarFile(); + } + + @Override + public InputStream getInputStream() throws IOException { + connect(); + return jarURLConnection.getInputStream(); + } + + @Override + public void setUseCaches(boolean useCaches) { + // do nothing + } + } + /** * This class loader has a list of class loaders called as delegates * that it uses to find resources and classes.