From 60665745ebd8f586c9418ade001937ac5e5c4859 Mon Sep 17 00:00:00 2001 From: gregw Date: Wed, 28 Oct 2020 16:12:21 +0100 Subject: [PATCH] Fixes #5521 ResourceCollection NPE Cleanup the vestiges of non existent directories detected by resource ending in / --- .../docs/programming/server/http/HTTPServerDocs.java | 4 ++-- .../eclipse/jetty/util/resource/JarFileResource.java | 9 ++------- .../java/org/eclipse/jetty/util/resource/Resource.java | 2 -- .../jetty/util/resource/ResourceCollection.java | 1 - .../org/eclipse/jetty/util/resource/URLResource.java | 5 ----- .../org/eclipse/jetty/util/resource/ResourceTest.java | 6 +++--- .../org/eclipse/jetty/webapp/MetaInfConfiguration.java | 4 ++-- .../java/org/eclipse/jetty/webapp/WebAppContext.java | 3 +-- .../org/eclipse/jetty/webapp/WebInfConfiguration.java | 10 +++++----- 9 files changed, 15 insertions(+), 29 deletions(-) diff --git a/jetty-documentation/src/main/java/org/eclipse/jetty/docs/programming/server/http/HTTPServerDocs.java b/jetty-documentation/src/main/java/org/eclipse/jetty/docs/programming/server/http/HTTPServerDocs.java index 89e21d7e027e..26a4b255a0dd 100644 --- a/jetty-documentation/src/main/java/org/eclipse/jetty/docs/programming/server/http/HTTPServerDocs.java +++ b/jetty-documentation/src/main/java/org/eclipse/jetty/docs/programming/server/http/HTTPServerDocs.java @@ -658,8 +658,8 @@ public void multipleResourcesHandler() throws Exception // For multiple directories, use ResourceCollection. ResourceCollection directories = new ResourceCollection(); - directories.addPath("/path/to/static/resources/"); - directories.addPath("/another/path/to/static/resources/"); + directories.addPath("/path/to/static/resources"); + directories.addPath("/another/path/to/static/resources"); handler.setBaseResource(directories); // end::multipleResourcesHandler[] diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/JarFileResource.java b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/JarFileResource.java index 736f605df70f..43576a25c0f9 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/JarFileResource.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/JarFileResource.java @@ -144,7 +144,7 @@ public boolean exists() String fileUrl = _urlString.substring(4, _urlString.length() - 2); try { - return newResource(fileUrl).exists(); + return _directory = newResource(fileUrl).exists(); } catch (Exception e) { @@ -236,15 +236,10 @@ else if (entry.isDirectory()) return _exists; } - /** - * Returns true if the represented resource is a container/directory. - * If the resource is not a file, resources ending with "/" are - * considered directories. - */ @Override public boolean isDirectory() { - return _urlString.endsWith("/") || exists() && _directory; + return exists() && _directory; } /** diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/Resource.java b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/Resource.java index 4aa957715393..dd179265bea1 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/Resource.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/Resource.java @@ -320,8 +320,6 @@ public static boolean isContainedIn(Resource r, Resource containingResource) thr /** * @return true if the represented resource is a container/directory. - * if the resource is not a file, resources ending with "/" are - * considered directories. */ public abstract boolean isDirectory(); diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/ResourceCollection.java b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/ResourceCollection.java index f67232b1ab0f..8987a01abc50 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/ResourceCollection.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/ResourceCollection.java @@ -385,7 +385,6 @@ public URI getURI() public boolean isDirectory() { assertResourcesSet(); - return true; } diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/URLResource.java b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/URLResource.java index 3dbd48ffa025..557bf2fbfbbd 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/URLResource.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/URLResource.java @@ -128,11 +128,6 @@ public boolean exists() return _in != null; } - /** - * Returns true if the represented resource is a container/directory. - * If the resource is not a file, resources ending with "/" are - * considered directories. - */ @Override public boolean isDirectory() { diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java index ddb5153ff6b1..d2a639ab411e 100644 --- a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java +++ b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java @@ -215,15 +215,15 @@ public static Stream scenarios() throws Exception cases.addCase(new Scenario(tdata1, "alphabet.txt", EXISTS, !DIR, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")); cases.addCase(new Scenario(tdata2, "alphabet.txt", EXISTS, !DIR, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")); - cases.addCase(new Scenario("jar:file:/somejar.jar!/content/", !EXISTS, DIR)); - cases.addCase(new Scenario("jar:file:/somejar.jar!/", !EXISTS, DIR)); + cases.addCase(new Scenario("jar:file:/somejar.jar!/content/", !EXISTS, !DIR)); + cases.addCase(new Scenario("jar:file:/somejar.jar!/", !EXISTS, !DIR)); String urlRef = cases.uriRef.toASCIIString(); Scenario zdata = new Scenario("jar:" + urlRef + "TestData/test.zip!/", EXISTS, DIR); cases.addCase(zdata); cases.addCase(new Scenario(zdata, "Unknown", !EXISTS, !DIR)); - cases.addCase(new Scenario(zdata, "/Unknown/", !EXISTS, DIR)); + cases.addCase(new Scenario(zdata, "/Unknown/", !EXISTS, !DIR)); cases.addCase(new Scenario(zdata, "subdir", EXISTS, DIR)); cases.addCase(new Scenario(zdata, "/subdir/", EXISTS, DIR)); diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java index 422df3c47a01..41519cf50ecf 100644 --- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java +++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java @@ -766,7 +766,7 @@ protected List findWebInfLibJars(WebAppContext context) return null; List jarResources = new ArrayList(); - Resource webInfLib = webInf.addPath("/lib"); + Resource webInfLib = webInf.addPath("lib"); if (webInfLib.exists() && webInfLib.isDirectory()) { String[] files = webInfLib.list(); @@ -834,7 +834,7 @@ protected Resource findWebInfClassesDir(WebAppContext context) if (webInf != null && webInf.isDirectory()) { // Look for classes directory - Resource classes = webInf.addPath("classes/"); + Resource classes = webInf.addPath("classes"); if (classes.exists()) return classes; } diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java index dafd33f0a08f..da9ab6e3ccf0 100644 --- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java +++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java @@ -31,7 +31,6 @@ import java.util.EventListener; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -835,7 +834,7 @@ public Resource getWebInf() throws IOException return null; // Iw there a WEB-INF directory? - Resource webInf = super.getBaseResource().addPath("WEB-INF/"); + Resource webInf = super.getBaseResource().addPath("WEB-INF"); if (!webInf.exists() || !webInf.isDirectory()) return null; diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebInfConfiguration.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebInfConfiguration.java index 09999ab56d9e..5ee2406420c5 100644 --- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebInfConfiguration.java +++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebInfConfiguration.java @@ -70,12 +70,12 @@ public void configure(WebAppContext context) throws Exception if (webInf != null && webInf.isDirectory() && context.getClassLoader() instanceof WebAppClassLoader) { // Look for classes directory - Resource classes = webInf.addPath("classes/"); + Resource classes = webInf.addPath("classes"); if (classes.exists()) ((WebAppClassLoader)context.getClassLoader()).addClassPath(classes); // Look for jars - Resource lib = webInf.addPath("lib/"); + Resource lib = webInf.addPath("lib"); if (lib.exists() || lib.isDirectory()) ((WebAppClassLoader)context.getClassLoader()).addJars(lib); } @@ -413,13 +413,13 @@ public void unpack(WebAppContext context) throws IOException // Do we need to extract WEB-INF/lib? if (context.isCopyWebInf() && !context.isCopyWebDir()) { - Resource webInf = webApp.addPath("WEB-INF/"); + Resource webInf = webApp.addPath("WEB-INF"); File extractedWebInfDir = new File(context.getTempDirectory(), "webinf"); if (extractedWebInfDir.exists()) IO.delete(extractedWebInfDir); extractedWebInfDir.mkdir(); - Resource webInfLib = webInf.addPath("lib/"); + Resource webInfLib = webInf.addPath("lib"); File webInfDir = new File(extractedWebInfDir, "WEB-INF"); webInfDir.mkdir(); @@ -435,7 +435,7 @@ public void unpack(WebAppContext context) throws IOException webInfLib.copyTo(webInfLibDir); } - Resource webInfClasses = webInf.addPath("classes/"); + Resource webInfClasses = webInf.addPath("classes"); if (webInfClasses.exists()) { File webInfClassesDir = new File(webInfDir, "classes");