From 404b90cdf055e2b5cefc9b521902253dfe3b57a4 Mon Sep 17 00:00:00 2001 From: Stephan Schroevers Date: Sat, 21 Feb 2015 18:21:24 +0100 Subject: [PATCH] Restore JarFileScanner support for parents with a trailing slash. --- .../server/internal/scanning/JarFileScanner.java | 15 +++------------ .../internal/scanning/JarFileScannerTest.java | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/core-server/src/main/java/org/glassfish/jersey/server/internal/scanning/JarFileScanner.java b/core-server/src/main/java/org/glassfish/jersey/server/internal/scanning/JarFileScanner.java index bea871bfa8..e47788669b 100644 --- a/core-server/src/main/java/org/glassfish/jersey/server/internal/scanning/JarFileScanner.java +++ b/core-server/src/main/java/org/glassfish/jersey/server/internal/scanning/JarFileScanner.java @@ -75,7 +75,7 @@ public final class JarFileScanner implements ResourceFinder { */ public JarFileScanner(final InputStream inputStream, final String parent, final boolean recursive) throws IOException { this.jarInputStream = new JarInputStream(inputStream); - this.parent = parent; + this.parent = (parent.isEmpty() || parent.endsWith(String.valueOf(JAR_FILE_SEPARATOR))) ? parent : parent + JAR_FILE_SEPARATOR; this.recursive = recursive; } @@ -91,17 +91,8 @@ public boolean hasNext() { break; } if (!next.isDirectory() && next.getName().startsWith(parent)) { - final String suffix = next.getName().substring(parent.length()); - if (recursive) { - // accept any entries with the prefix - if (parent.isEmpty() || suffix.indexOf(JAR_FILE_SEPARATOR) == 0) { - break; - } - } else { - // accept only entries directly in the folder. - if (suffix.lastIndexOf(JAR_FILE_SEPARATOR) == (parent.isEmpty() ? -1 : 0)) { - break; - } + if (recursive || next.getName().substring(parent.length()).indexOf(JAR_FILE_SEPARATOR) == -1) { + break; } } } while (true); diff --git a/core-server/src/test/java/org/glassfish/jersey/server/internal/scanning/JarFileScannerTest.java b/core-server/src/test/java/org/glassfish/jersey/server/internal/scanning/JarFileScannerTest.java index 9af3ea6e10..a5d6fe8466 100644 --- a/core-server/src/test/java/org/glassfish/jersey/server/internal/scanning/JarFileScannerTest.java +++ b/core-server/src/test/java/org/glassfish/jersey/server/internal/scanning/JarFileScannerTest.java @@ -108,6 +108,20 @@ public void testNonRecursiveClassEnumerationWithExistantPackage() throws IOExcep assertThat("Failed to enumerate package 'javax.ws.rs' of javax.ws.rs-api", scannedEntries, equalTo(actualEntries)); } + @Test + public void testRecursiveClassEnumerationWithOptionalTrailingSlash() throws IOException { + final int scannedEntriesWithoutSlash = countJarEntriesUsingScanner("javax/ws/rs", true); + final int scannedEntriesWithSlash = countJarEntriesUsingScanner("javax/ws/rs/", true); + assertThat("Adding a trailing slash incorrectly affects recursive scanning", scannedEntriesWithSlash, equalTo(scannedEntriesWithoutSlash)); + } + + @Test + public void testNonRecursiveClassEnumerationWithOptionalTrailingSlash() throws IOException { + final int scannedEntriesWithoutSlash = countJarEntriesUsingScanner("javax/ws/rs", false); + final int scannedEntriesWithSlash = countJarEntriesUsingScanner("javax/ws/rs/", false); + assertThat("Adding a trailing slash incorrectly affects recursive scanning", scannedEntriesWithSlash, equalTo(scannedEntriesWithoutSlash)); + } + private int countJarEntriesByPattern(final Pattern pattern) throws IOException { int matchingEntries = 0;