This is an automated email from the ASF dual-hosted git repository. elharo pushed a commit to branch 243 in repository https://gitbox.apache.org/repos/asf/maven-dependency-analyzer.git
commit 02c73d0253ec093869c7cbfb87f9ea82fa7a7529 Author: Elliotte Rusty Harold <elh...@ibiblio.org> AuthorDate: Wed Jul 16 10:20:11 2025 -0400 Catch exceptions on all paths --- .../dependency/analyzer/ClassFileVisitor.java | 7 +--- .../dependency/analyzer/ClassFileVisitorUtils.java | 44 +++++++++++++--------- .../analyzer/asm/DependencyClassFileVisitor.java | 16 +++++--- 3 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitor.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitor.java index 27d1d1b..981cf59 100644 --- a/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitor.java +++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/ClassFileVisitor.java @@ -26,11 +26,6 @@ import java.io.InputStream; * @author <a href="mailto:markhob...@gmail.com">Mark Hobson</a> */ public interface ClassFileVisitor { - /** - * <p>visitClass.</p> - * - * @param className a {@link java.lang.String} object. - * @param in a {@link java.io.InputStream} object. - */ + void visitClass(String className, InputStream in); } 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 b2211c3..89589e8 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 @@ -21,6 +21,7 @@ package org.apache.maven.shared.dependency.analyzer; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.io.UncheckedIOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; @@ -32,6 +33,8 @@ import java.util.jar.JarInputStream; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.maven.shared.dependency.analyzer.asm.VisitClassException; + /** * Utility to visit classes in a library given either as a jar file or an exploded directory. * @@ -44,9 +47,9 @@ public final class ClassFileVisitorUtils { } /** - * @param url a {@link java.net.URL} object + * @param url the URL of the jar file or directory to visit * @param visitor a {@link org.apache.maven.shared.dependency.analyzer.ClassFileVisitor} object - * @throws java.io.IOException if any + * @throws java.io.IOException I/O error or corrupt class file */ public static void accept(URL url, ClassFileVisitor visitor) throws IOException { if (url.getPath().endsWith(".jar")) { @@ -85,38 +88,43 @@ public final class ClassFileVisitorUtils { } private static void acceptDirectory(File directory, ClassFileVisitor visitor) throws IOException { - - List<Path> classFiles; try (Stream<Path> walk = Files.walk(directory.toPath())) { - classFiles = walk.filter(path -> path.getFileName().toString().endsWith(".class")) + List<Path> classFiles = walk.filter( + path -> path.getFileName().toString().endsWith(".class")) .collect(Collectors.toList()); - } - - for (Path path : classFiles) { - try (InputStream in = Files.newInputStream(path)) { - try { - visitClass(directory, path, in, visitor); - } catch (RuntimeException e) { - // visitClass throws RuntimeException - throw new RuntimeException( - String.format("%s from directory = %s, path = %s", e.getMessage(), directory, path), e); + for (Path path : classFiles) { + try (InputStream in = Files.newInputStream(path)) { + try { + visitClass(directory, path, in, visitor); + } catch (IOException e) { + throw new IOException( + String.format("%s from directory = %s, path = %s", e.getMessage(), directory, path), e); + } } } } } - private static void visitClass(File baseDirectory, Path path, InputStream in, ClassFileVisitor visitor) { + private static void visitClass(File baseDirectory, Path path, InputStream in, ClassFileVisitor visitor) + throws IOException { // 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); } - private static void visitClass(String stringPath, InputStream in, ClassFileVisitor visitor, char separator) { + private static void visitClass(String stringPath, InputStream in, ClassFileVisitor visitor, char separator) + throws IOException { String className = stringPath.substring(0, stringPath.length() - 6); className = className.replace(separator, '.'); - visitor.visitClass(className, in); + try { + visitor.visitClass(className, in); + } catch (UncheckedIOException e) { + throw e.getCause(); + } catch (VisitClassException e) { + throw new IOException(e); + } } } diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyClassFileVisitor.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyClassFileVisitor.java index f8930b8..f59bdd8 100644 --- a/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyClassFileVisitor.java +++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyClassFileVisitor.java @@ -52,7 +52,6 @@ public class DependencyClassFileVisitor implements ClassFileVisitor { * <p>Constructor for DependencyClassFileVisitor.</p> */ public DependencyClassFileVisitor(ClassesPatterns excludedClasses) { - this.excludedClasses = excludedClasses; } @@ -63,7 +62,14 @@ public class DependencyClassFileVisitor implements ClassFileVisitor { this(new ClassesPatterns()); } - /** {@inheritDoc} */ + /** + * Visits a class. + * + * @param className the name of the class being visited + * @param in the {@link java.io.InputStream} to read the byte code from + * @throws VisitClassException if the .class file is corrupt + * @throws UncheckedIOException if an I/O error occurs while reading the class file + */ @Override public void visitClass(String className, InputStream in) { try { @@ -83,10 +89,10 @@ public class DependencyClassFileVisitor implements ClassFileVisitor { AnnotationVisitor annotationVisitor = new DefaultAnnotationVisitor(resultCollector, className); SignatureVisitor signatureVisitor = new DefaultSignatureVisitor(resultCollector, className); FieldVisitor fieldVisitor = new DefaultFieldVisitor(annotationVisitor, resultCollector, className); - MethodVisitor mv = + MethodVisitor methodVisitor = new DefaultMethodVisitor(annotationVisitor, signatureVisitor, resultCollector, className); ClassVisitor classVisitor = new DefaultClassVisitor( - signatureVisitor, annotationVisitor, fieldVisitor, mv, resultCollector, className); + signatureVisitor, annotationVisitor, fieldVisitor, methodVisitor, resultCollector, className); reader.accept(classVisitor, 0); } catch (IOException exception) { @@ -123,7 +129,7 @@ public class DependencyClassFileVisitor implements ClassFileVisitor { * <p>getDependencyUsages.</p> * * @return the set of classes referenced by visited class files, paired with - * classes declaring the references. + * classes declaring the references */ public Set<DependencyUsage> getDependencyUsages() { return resultCollector.getDependencyUsages();