diff --git a/pom.xml b/pom.xml index c05ba39..4da995d 100644 --- a/pom.xml +++ b/pom.xml @@ -83,12 +83,6 @@ 1 - - org.codehaus.plexus - plexus-utils - 3.5.1 - - org.ow2.asm asm diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtils.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtils.java index 20f1652..29cd9b5 100644 --- a/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtils.java +++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtils.java @@ -19,16 +19,18 @@ package org.apache.maven.shared.dependency.analyzer; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; - -import org.codehaus.plexus.util.DirectoryScanner; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Utility to visit classes in a library given either as a jar file or an exploded directory. @@ -42,11 +44,9 @@ private ClassFileVisitorUtils() { } /** - *

accept.

- * - * @param url a {@link java.net.URL} object. - * @param visitor a {@link org.apache.maven.shared.dependency.analyzer.ClassFileVisitor} object. - * @throws java.io.IOException if any. + * @param url a {@link java.net.URL} object + * @param visitor a {@link org.apache.maven.shared.dependency.analyzer.ClassFileVisitor} object + * @throws java.io.IOException if any */ public static void accept(URL url, ClassFileVisitor visitor) throws IOException { if (url.getPath().endsWith(".jar")) { @@ -77,45 +77,39 @@ private static void acceptJar(URL url, ClassFileVisitor visitor) throws IOExcept String name = entry.getName(); // ignore files like package-info.class and module-info.class if (name.endsWith(".class") && name.indexOf('-') == -1) { - visitClass(name, in, visitor); + // Jars(ZIP) always use / as the separator character + visitClass(name, in, visitor, '/'); } } } } private static void acceptDirectory(File directory, ClassFileVisitor visitor) throws IOException { - if (!directory.isDirectory()) { - throw new IllegalArgumentException("File is not a directory"); - } - - DirectoryScanner scanner = new DirectoryScanner(); - - scanner.setBasedir(directory); - scanner.setIncludes(new String[] {"**/*.class"}); - - scanner.scan(); - String[] paths = scanner.getIncludedFiles(); - - for (String path : paths) { - path = path.replace(File.separatorChar, '/'); - - File file = new File(directory, path); + List classFiles; + try (Stream walk = Files.walk(directory.toPath())) { + classFiles = walk.filter(path -> path.getFileName().toString().endsWith(".class")) + .collect(Collectors.toList()); + } - try (InputStream in = new FileInputStream(file)) { - visitClass(path, in, visitor); + for (Path path : classFiles) { + try (InputStream in = Files.newInputStream(path)) { + visitClass(directory, path, in, visitor); } } } - private static void visitClass(String path, InputStream in, ClassFileVisitor visitor) { - if (!path.endsWith(".class")) { - throw new IllegalArgumentException("Path is not a class"); - } + private static void visitClass(File baseDirectory, Path path, InputStream in, ClassFileVisitor visitor) { + // getPath() returns a String, not a java.nio.file.Path + String stringPath = + path.toFile().getPath().substring(baseDirectory.getPath().length() + 1); + visitClass(stringPath, in, visitor, File.separatorChar); + } - String className = path.substring(0, path.length() - 6); + private static void visitClass(String stringPath, InputStream in, ClassFileVisitor visitor, char separator) { + String className = stringPath.substring(0, stringPath.length() - 6); - className = className.replace('/', '.'); + className = className.replace(separator, '.'); visitor.visitClass(className, in); } diff --git a/src/test/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtilsTest.java b/src/test/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtilsTest.java index e92e48d..1502c8b 100644 --- a/src/test/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtilsTest.java +++ b/src/test/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitorUtilsTest.java @@ -33,7 +33,6 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; -import org.junit.Before; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -46,9 +45,9 @@ * @see ClassFileVisitorUtils */ public class ClassFileVisitorUtilsTest { - private MockVisitor visitor; + private TestVisitor visitor = new TestVisitor(); - private static class MockVisitor implements ClassFileVisitor { + private static class TestVisitor implements ClassFileVisitor { final List classNames = new ArrayList<>(); final List data = new ArrayList<>(); @@ -64,11 +63,6 @@ public void visitClass(String className, InputStream in) { } } - @Before - public void setUp() { - visitor = new MockVisitor(); - } - @Test public void testAcceptJar() throws IOException { File file = File.createTempFile("test", ".jar");