Skip to content

Commit 9e4abc8

Browse files
committed
Fix aggregating mojos
Changes: * parent-child-tree made aggregator * subproject-tree made agregator * project-dependency-tree made aggregator Former two should be run from same spot from where you'd invoke 'full build', while latter allows targeting project using `-Dselector=` where value may be `:A`, `:A:V`, `G:A` or `G:A:V`. Selector must match exactly 1 project, otherwise (0 or 2+ matches) it will fail.
1 parent 903b3ac commit 9e4abc8

File tree

5 files changed

+66
-7
lines changed

5 files changed

+66
-7
lines changed

toolbox/src/main/java/eu/maveniverse/maven/toolbox/plugin/MPMojoSupport.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,4 +108,12 @@ protected boolean isReactorDependency(Dependency dependency) {
108108
protected ReactorLocator getReactorLocator() {
109109
return new MavenReactorLocator(mavenSession);
110110
}
111+
112+
protected ReactorLocator getReactorLocatorWithSelector(String selector) {
113+
if (selector == null || selector.trim().isEmpty()) {
114+
return getReactorLocator();
115+
} else {
116+
return new MavenReactorLocator(mavenSession, selector);
117+
}
118+
}
111119
}

toolbox/src/main/java/eu/maveniverse/maven/toolbox/plugin/MavenReactorLocator.java

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111

1212
import eu.maveniverse.maven.toolbox.shared.ProjectLocator;
1313
import eu.maveniverse.maven.toolbox.shared.ReactorLocator;
14+
import java.util.Arrays;
1415
import java.util.List;
1516
import java.util.Objects;
1617
import java.util.Optional;
18+
import java.util.function.Predicate;
1719
import java.util.stream.Collectors;
1820
import java.util.stream.Stream;
1921
import org.apache.maven.RepositoryUtils;
@@ -35,16 +37,58 @@ public class MavenReactorLocator implements ReactorLocator {
3537
private final List<Project> allProjects;
3638

3739
public MavenReactorLocator(MavenSession session) {
40+
this(session, null);
41+
}
42+
43+
public MavenReactorLocator(MavenSession session, String selector) {
3844
requireNonNull(session, "session");
3945
this.allProjects = session.getAllProjects().stream()
4046
.map(p -> convert(session.getRepositorySession(), p))
4147
.collect(Collectors.toList());
4248
this.topLevel = locateProject(
4349
RepositoryUtils.toArtifact(session.getTopLevelProject().getArtifact()))
4450
.orElseThrow();
45-
this.current = locateProject(
46-
RepositoryUtils.toArtifact(session.getCurrentProject().getArtifact()))
47-
.orElseThrow();
51+
if (selector != null) {
52+
List<MavenProject> candidates = session.getAllProjects().stream()
53+
.filter(createSelector(selector))
54+
.collect(Collectors.toList());
55+
if (candidates.size() != 1) {
56+
List<String> matches = candidates.stream()
57+
.map(p -> ArtifactIdUtils.toId(RepositoryUtils.toArtifact(p.getArtifact())))
58+
.collect(Collectors.toList());
59+
throw new IllegalArgumentException("Could not find 1 matching project: " + matches);
60+
}
61+
this.current = locateProject(
62+
RepositoryUtils.toArtifact(candidates.get(0).getArtifact()))
63+
.orElseThrow();
64+
} else {
65+
this.current = locateProject(
66+
RepositoryUtils.toArtifact(session.getCurrentProject().getArtifact()))
67+
.orElseThrow();
68+
}
69+
}
70+
71+
private Predicate<MavenProject> createSelector(String selector) {
72+
String[] elems =
73+
Arrays.stream(selector.split(":", -1)).filter(s -> !s.isEmpty()).toArray(String[]::new);
74+
if (selector.startsWith(":")) {
75+
// :A or :A:V
76+
if (elems.length == 1) {
77+
return p -> p.getArtifactId().equals(elems[0]);
78+
} else if (elems.length == 2) {
79+
return p -> p.getArtifactId().equals(elems[0]) && p.getVersion().equals(elems[1]);
80+
}
81+
} else {
82+
// G:A or G:A:V
83+
if (elems.length == 2) {
84+
return p -> p.getGroupId().equals(elems[0]) && p.getArtifactId().equals(elems[1]);
85+
} else if (elems.length == 3) {
86+
return p -> p.getGroupId().equals(elems[0])
87+
&& p.getArtifactId().equals(elems[1])
88+
&& p.getVersion().equals(elems[2]);
89+
}
90+
}
91+
throw new IllegalArgumentException("Unsupported selector expression: '" + selector + "'");
4892
}
4993

5094
private Project convert(RepositorySystemSession session, MavenProject project) {

toolbox/src/main/java/eu/maveniverse/maven/toolbox/plugin/mp/ParentChildTreeMojo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
/**
1616
* Displays project inheritance of Maven Projects.
1717
*/
18-
@Mojo(name = "parent-child-tree", threadSafe = true)
18+
@Mojo(name = "parent-child-tree", aggregator = true, threadSafe = true)
1919
public class ParentChildTreeMojo extends MPMojoSupport {
2020
@Override
2121
protected Result<CollectResult> doExecute() throws Exception {

toolbox/src/main/java/eu/maveniverse/maven/toolbox/plugin/mp/ProjectDependencyTreeMojo.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
/**
1717
* Displays project interdependencies of Maven Projects.
1818
*/
19-
@Mojo(name = "project-dependency-tree", threadSafe = true)
19+
@Mojo(name = "project-dependency-tree", aggregator = true, threadSafe = true)
2020
public class ProjectDependencyTreeMojo extends MPMojoSupport {
2121

2222
/**
@@ -25,8 +25,15 @@ public class ProjectDependencyTreeMojo extends MPMojoSupport {
2525
@Parameter(property = "showExternal", defaultValue = "false", required = true)
2626
private boolean showExternal;
2727

28+
/**
29+
* Set the project selector, like {@code -rf} Maven command uses it, can be {@code :A} or {@code G:A}. The selector
30+
* string must match ONE project within reactor, otherwise (matches 0 or more than 1) it will fail.
31+
*/
32+
@Parameter(property = "selector")
33+
private String selector;
34+
2835
@Override
2936
protected Result<CollectResult> doExecute() throws Exception {
30-
return getToolboxCommando().projectDependencyTree(getReactorLocator(), showExternal);
37+
return getToolboxCommando().projectDependencyTree(getReactorLocatorWithSelector(selector), showExternal);
3138
}
3239
}

toolbox/src/main/java/eu/maveniverse/maven/toolbox/plugin/mp/SubprojectTreeMojo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
/**
1616
* Displays subproject collection of Maven Projects.
1717
*/
18-
@Mojo(name = "subproject-tree", threadSafe = true)
18+
@Mojo(name = "subproject-tree", aggregator = true, threadSafe = true)
1919
public class SubprojectTreeMojo extends MPMojoSupport {
2020
@Override
2121
protected Result<CollectResult> doExecute() throws Exception {

0 commit comments

Comments
 (0)