Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 62f85a4

Browse files
authored
[MNG-8396] Add a cache layer to the filtered dependency graph (apache#1944)
1 parent a58551d commit 62f85a4

File tree

1 file changed

+23
-2
lines changed

1 file changed

+23
-2
lines changed

impl/maven-core/src/main/java/org/apache/maven/graph/FilteredProjectDependencyGraph.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.List;
2525
import java.util.Map;
2626
import java.util.Objects;
27+
import java.util.concurrent.ConcurrentHashMap;
2728

2829
import org.apache.maven.execution.ProjectDependencyGraph;
2930
import 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

Comments
 (0)