24
24
import java .util .List ;
25
25
import java .util .Map ;
26
26
import java .util .Objects ;
27
+ import java .util .concurrent .ConcurrentHashMap ;
27
28
28
29
import org .apache .maven .execution .ProjectDependencyGraph ;
29
30
import org .apache .maven .project .MavenProject ;
@@ -40,6 +41,10 @@ class FilteredProjectDependencyGraph implements ProjectDependencyGraph {
40
41
41
42
private final List <MavenProject > sortedProjects ;
42
43
44
+ private final Map <Key , List <MavenProject >> cache = new ConcurrentHashMap <>();
45
+
46
+ private record Key (MavenProject project , boolean transitive , boolean upstream ) {}
47
+
43
48
/**
44
49
* Creates a new project dependency graph from the specified graph.
45
50
*
@@ -74,12 +79,28 @@ public List<MavenProject> getSortedProjects() {
74
79
75
80
@ Override
76
81
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 ;
78
91
}
79
92
80
93
@ Override
81
94
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 ;
83
104
}
84
105
85
106
/**
0 commit comments