[MRESOLVER-93] PathRecordingDependencyVisitor to handle 3 cycles
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/visitor/PathRecordingDependencyVisitor.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/visitor/PathRecordingDependencyVisitor.java
index 463668c..3f1c8e2 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/visitor/PathRecordingDependencyVisitor.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/visitor/PathRecordingDependencyVisitor.java
@@ -21,9 +21,7 @@
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.IdentityHashMap;
import java.util.List;
-import java.util.Map;
import org.eclipse.aether.graph.DependencyFilter;
import org.eclipse.aether.graph.DependencyNode;
@@ -42,8 +40,6 @@
private final Stack<DependencyNode> parents;
- private final Map<DependencyNode, Object> visited;
-
private final boolean excludeChildrenOfMatches;
/**
@@ -72,7 +68,6 @@
this.excludeChildrenOfMatches = excludeChildrenOfMatches;
paths = new ArrayList<>();
parents = new Stack<>();
- visited = new IdentityHashMap<>( 128 );
}
/**
@@ -101,6 +96,7 @@
{
boolean accept = filter == null || filter.accept( node, parents );
+ boolean hasDuplicateNodeInParent = parents.contains( node );
parents.push( node );
if ( accept )
@@ -118,18 +114,12 @@
}
}
- if ( visited.put( node, Boolean.TRUE ) != null )
- {
- return false;
- }
-
- return true;
+ return !hasDuplicateNodeInParent;
}
public boolean visitLeave( DependencyNode node )
{
parents.pop();
- visited.remove( node );
return true;
}
diff --git a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/visitor/PathRecordingDependencyVisitorTest.java b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/visitor/PathRecordingDependencyVisitorTest.java
index cd766a0..a759d88 100644
--- a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/visitor/PathRecordingDependencyVisitorTest.java
+++ b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/visitor/PathRecordingDependencyVisitorTest.java
@@ -135,6 +135,20 @@
assertPath( paths.get( 3 ), "a", "x", "x" );
}
+ @Test
+ public void testGetPaths_HandlesCycles_threePaths()
+ throws Exception
+ {
+ DependencyNode root = parse( "cycle-3paths.txt" );
+
+ PathRecordingDependencyVisitor visitor = new PathRecordingDependencyVisitor( new ArtifactMatcher() );
+ root.accept( visitor );
+
+ List<List<DependencyNode>> paths = visitor.getPaths();
+ assertEquals( paths.toString(), 1, paths.size() );
+ assertPath( paths.get( 0 ), "a", "b");
+ }
+
private static class ArtifactMatcher
implements DependencyFilter
{
diff --git a/maven-resolver-util/src/test/resources/visitor/path-recorder/cycle-3paths.txt b/maven-resolver-util/src/test/resources/visitor/path-recorder/cycle-3paths.txt
new file mode 100644
index 0000000..11dd250
--- /dev/null
+++ b/maven-resolver-util/src/test/resources/visitor/path-recorder/cycle-3paths.txt
@@ -0,0 +1,8 @@
+gid:a:1 (1)
++- gid:b:0
+| \- ^1
++- gid:b:1
+| \- ^1
++- gid:b:2
+| \- ^1
+\- match:b:3