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();