2424import java .util .List ;
2525import java .util .Map ;
2626import java .util .Objects ;
27+ import java .util .concurrent .ConcurrentHashMap ;
2728
2829import org .apache .maven .execution .ProjectDependencyGraph ;
2930import org .apache .maven .project .MavenProject ;
@@ -40,6 +41,10 @@ class FilteredProjectDependencyGraph implements ProjectDependencyGraph {
4041
4142 private final List <MavenProject > sortedProjects ;
4243
44+ private final Map <Key , List <MavenProject >> cache = new ConcurrentHashMap <>();
45+
46+ private record Key (MavenProject project , boolean transitive , boolean upstream ) {}
47+
4348 /**
4449 * Creates a new project dependency graph from the specified graph.
4550 *
@@ -74,12 +79,28 @@ public List<MavenProject> getSortedProjects() {
7479
7580 @ Override
7681 public List <MavenProject > getDownstreamProjects (MavenProject project , boolean transitive ) {
77- return applyFilter (projectDependencyGraph .getDownstreamProjects (project , transitive ), transitive , false );
82+ Key key = new Key (project , transitive , false );
83+ // Do not use computeIfAbsent here, as the computation is recursive
84+ // and this is not supported by computeIfAbsent.
85+ List <MavenProject > list = cache .get (key );
86+ if (list == null ) {
87+ list = applyFilter (projectDependencyGraph .getDownstreamProjects (project , transitive ), transitive , false );
88+ cache .put (key , list );
89+ }
90+ return list ;
7891 }
7992
8093 @ Override
8194 public List <MavenProject > getUpstreamProjects (MavenProject project , boolean transitive ) {
82- return applyFilter (projectDependencyGraph .getUpstreamProjects (project , transitive ), transitive , true );
95+ Key key = new Key (project , transitive , true );
96+ // Do not use computeIfAbsent here, as the computation is recursive
97+ // and this is not supported by computeIfAbsent.
98+ List <MavenProject > list = cache .get (key );
99+ if (list == null ) {
100+ list = applyFilter (projectDependencyGraph .getUpstreamProjects (project , transitive ), transitive , true );
101+ cache .put (key , list );
102+ }
103+ return list ;
83104 }
84105
85106 /**
0 commit comments