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/07/16 14:20:21 UTC
(maven-dependency-analyzer) branch 243 created (now 02c73d0)
This is an automated email from the ASF dual-hosted git repository.
elharo pushed a change to branch 243
in repository https://gitbox.apache.org/repos/asf/maven-dependency-analyzer.git
at 02c73d0 Catch exceptions on all paths
This branch includes the following new commits:
new 02c73d0 Catch exceptions on all paths
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(maven-dependency-analyzer) 01/01: Catch exceptions on all paths
Posted by el...@apache.org.
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 <el...@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: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();