[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