You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by el...@apache.org on 2025/08/07 05:46:58 UTC

(maven-dependency-analyzer) branch master updated: Catch exceptions on all paths (#245)

This is an automated email from the ASF dual-hosted git repository.

elharo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-dependency-analyzer.git


The following commit(s) were added to refs/heads/master by this push:
     new 68afbd9  Catch exceptions on all paths (#245)
68afbd9 is described below

commit 68afbd9303515b3efae8efda08c7a550e27601ee
Author: Elliotte Rusty Harold <el...@users.noreply.github.com>
AuthorDate: Thu Aug 7 05:46:53 2025 +0000

    Catch exceptions on all paths (#245)
---
 .../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:markhobson@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();