Skip to content

Commit 9079069

Browse files
authored
Adds project specific effective-model mojos (#178)
Adds two new mojos as counterpart to existing gav-effective-model: * effective-model: is aggregator and show model of selected project within reactor * effective-model-all: is not an aggregator and shows effective model of all projects within reactor
1 parent d6938a8 commit 9079069

File tree

8 files changed

+118
-24
lines changed

8 files changed

+118
-24
lines changed

shared/src/main/java/eu/maveniverse/maven/toolbox/shared/ProjectLocator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,5 @@ interface Project {
3131
/**
3232
* Locates project by given artifact. If not present, it means artifact is "external" relative to these projects.
3333
*/
34-
Optional<Project> locateProject(Artifact artifact);
34+
Optional<? extends Project> locateProject(Artifact artifact);
3535
}

shared/src/main/java/eu/maveniverse/maven/toolbox/shared/ReactorLocator.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,35 +9,40 @@
99

1010
import eu.maveniverse.maven.toolbox.shared.internal.Artifacts;
1111
import java.util.List;
12+
import org.apache.maven.model.Model;
1213

1314
/**
1415
* Construction to represent "reactor" abstraction.
1516
*/
1617
public interface ReactorLocator extends ProjectLocator, Artifacts.Source {
18+
interface ReactorProject extends Project {
19+
Model effectiveModel();
20+
}
21+
1722
/**
1823
* Returns "top level" project, never {@code null}.
1924
*/
20-
Project getTopLevelProject();
25+
ReactorProject getTopLevelProject();
2126

2227
/**
2328
* Returns "current" project, never {@code null}.
2429
*/
25-
Project getCurrentProject();
30+
ReactorProject getCurrentProject();
2631

2732
/**
2833
* Returns list of all projects, never {@code null}.
2934
*/
30-
List<Project> getAllProjects();
35+
List<ReactorProject> getAllProjects();
3136

3237
/**
3338
* Locates children projects of given project within reactor, that is projects that refer to passed in project
3439
* as parent.
3540
*/
36-
List<Project> locateChildren(Project project);
41+
List<ReactorProject> locateChildren(Project project);
3742

3843
/**
3944
* Locates children projects of given project within reactor, that is projects that are referred from passed in
4045
* project as modules.
4146
*/
42-
List<Project> locateCollected(Project project);
47+
List<ReactorProject> locateCollected(Project project);
4348
}

shared/src/main/java/eu/maveniverse/maven/toolbox/shared/ToolboxCommando.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,11 @@ Result<List<List<Artifact>>> treeFind(
332332
*/
333333
Result<Model> effectiveModel(ResolutionRoot resolutionRoot) throws Exception;
334334

335+
/**
336+
* Returns the effective model. Requires reactor locator.
337+
*/
338+
Result<Model> effectiveModel(ReactorLocator reactorLocator) throws Exception;
339+
335340
// Search API related commands: they target one single RemoteRepository
336341

337342
/**

shared/src/main/java/eu/maveniverse/maven/toolbox/shared/internal/ToolboxCommandoImpl.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,19 @@ public Result<Model> effectiveModel(ResolutionRoot resolutionRoot) throws Except
976976
return Result.success(response.getEffectiveModel());
977977
}
978978

979+
@Override
980+
public Result<Model> effectiveModel(ReactorLocator reactorLocator) throws Exception {
981+
requireNonNull(reactorLocator);
982+
Result<Model> result = Result.success(reactorLocator.getCurrentProject().effectiveModel());
983+
984+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
985+
MavenXpp3Writer mavenXpp3Writer = new MavenXpp3Writer();
986+
mavenXpp3Writer.write(baos, result.getData().orElseThrow());
987+
output.doTell("Effective model:\n{}", baos.toString(StandardCharsets.UTF_8));
988+
989+
return result;
990+
}
991+
979992
@Override
980993
public Map<String, RemoteRepository> getKnownSearchRemoteRepositories() {
981994
return knownSearchRemoteRepositories;

shared/src/main/java/eu/maveniverse/maven/toolbox/shared/internal/ToolboxResolverImpl.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -337,12 +337,12 @@ public CollectResult parentChildTree(ReactorLocator reactorLocator) {
337337
Optional<Artifact> parentArtifact = currentProject.getParent();
338338
while (parentArtifact.isPresent()) {
339339
Artifact pa = parentArtifact.orElseThrow();
340-
Optional<ProjectLocator.Project> parentProject = reactorLocator.locateProject(pa);
340+
Optional<? extends ProjectLocator.Project> parentProject = reactorLocator.locateProject(pa);
341341
if (parentProject.isPresent()) {
342342
currentProject = parentProject.orElseThrow();
343343
node = new DefaultDependencyNode(new Dependency(source(currentProject), ""));
344344
} else {
345-
Optional<ProjectLocator.Project> external = projectLocator.locateProject(pa);
345+
Optional<? extends ProjectLocator.Project> external = projectLocator.locateProject(pa);
346346
if (external.isPresent()) {
347347
currentProject = external.orElseThrow();
348348
node = new DefaultDependencyNode(new Dependency(source(currentProject), ""));
@@ -362,7 +362,7 @@ public CollectResult parentChildTree(ReactorLocator reactorLocator) {
362362

363363
private void parentChildTree(
364364
DependencyNode parentNode, ReactorLocator reactorLocator, ProjectLocator.Project parent) {
365-
List<ProjectLocator.Project> children = reactorLocator.locateChildren(parent);
365+
List<? extends ProjectLocator.Project> children = reactorLocator.locateChildren(parent);
366366
for (ProjectLocator.Project child : children) {
367367
DependencyNode childNode = new DefaultDependencyNode(new Dependency(source(child), ""));
368368
parentNode.getChildren().add(childNode);
@@ -383,7 +383,7 @@ public CollectResult subprojectTree(ReactorLocator reactorLocator) {
383383

384384
private void subprojectTree(
385385
DependencyNode parentNode, ReactorLocator reactorLocator, ProjectLocator.Project parent) {
386-
List<ProjectLocator.Project> children = reactorLocator.locateCollected(parent);
386+
List<? extends ProjectLocator.Project> children = reactorLocator.locateCollected(parent);
387387
for (ProjectLocator.Project child : children) {
388388
DependencyNode childNode = new DefaultDependencyNode(new Dependency(source(child), ""));
389389
parentNode.getChildren().add(childNode);
@@ -410,7 +410,8 @@ private void projectDependencyTree(
410410
HashSet<String> seen) {
411411
ArrayDeque<DependencyNode> recursiveNodes = new ArrayDeque<>();
412412
for (Dependency dependency : current.dependencies()) {
413-
Optional<ProjectLocator.Project> depProject = reactorLocator.locateProject(dependency.getArtifact());
413+
Optional<? extends ProjectLocator.Project> depProject =
414+
reactorLocator.locateProject(dependency.getArtifact());
414415
String key = ArtifactIdUtils.toId(dependency.getArtifact());
415416
if (seen.add(key)) {
416417
if (depProject.isPresent()) {

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

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.stream.Stream;
2121
import org.apache.maven.RepositoryUtils;
2222
import org.apache.maven.execution.MavenSession;
23+
import org.apache.maven.model.Model;
2324
import org.apache.maven.model.Parent;
2425
import org.apache.maven.project.MavenProject;
2526
import org.eclipse.aether.RepositorySystemSession;
@@ -32,9 +33,9 @@
3233
* Maven project locator.
3334
*/
3435
public class MavenReactorLocator implements ReactorLocator {
35-
private final Project topLevel;
36-
private final Project current;
37-
private final List<Project> allProjects;
36+
private final ReactorProject topLevel;
37+
private final ReactorProject current;
38+
private final List<ReactorProject> allProjects;
3839

3940
public MavenReactorLocator(MavenSession session, String selector) {
4041
requireNonNull(session, "session");
@@ -87,7 +88,7 @@ private Predicate<MavenProject> createSelector(String selector) {
8788
throw new IllegalArgumentException("Unsupported selector expression: '" + selector + "'");
8889
}
8990

90-
private Project convert(RepositorySystemSession session, MavenProject project) {
91+
private ReactorProject convert(RepositorySystemSession session, MavenProject project) {
9192
requireNonNull(project, "project");
9293
Artifact pa = RepositoryUtils.toArtifact(project.getArtifact());
9394
Artifact pp = null;
@@ -101,33 +102,33 @@ private Project convert(RepositorySystemSession session, MavenProject project) {
101102
List<Artifact> collected = project.getCollectedProjects().stream()
102103
.map(p -> RepositoryUtils.toArtifact(p.getArtifact()))
103104
.collect(Collectors.toList());
104-
return new MProject(pa, pp, pd, collected, this);
105+
return new MProject(pa, pp, pd, collected, this, project.getModel());
105106
}
106107

107108
@Override
108-
public Project getTopLevelProject() {
109+
public ReactorProject getTopLevelProject() {
109110
return topLevel;
110111
}
111112

112113
@Override
113-
public Project getCurrentProject() {
114+
public ReactorProject getCurrentProject() {
114115
return current;
115116
}
116117

117118
@Override
118-
public List<Project> getAllProjects() {
119+
public List<ReactorProject> getAllProjects() {
119120
return allProjects;
120121
}
121122

122123
@Override
123-
public Optional<Project> locateProject(Artifact artifact) {
124+
public Optional<ReactorProject> locateProject(Artifact artifact) {
124125
return allProjects.stream()
125126
.filter(p -> ArtifactIdUtils.equalsId(p.artifact(), artifact))
126127
.findFirst();
127128
}
128129

129130
@Override
130-
public List<Project> locateChildren(Project project) {
131+
public List<ReactorProject> locateChildren(Project project) {
131132
return allProjects.stream()
132133
.filter(p -> {
133134
Optional<Artifact> parentArtifact = p.getParent();
@@ -138,7 +139,7 @@ public List<Project> locateChildren(Project project) {
138139
}
139140

140141
@Override
141-
public List<Project> locateCollected(Project project) {
142+
public List<ReactorProject> locateCollected(Project project) {
142143
if (project instanceof MProject) {
143144
MProject mProject = (MProject) project;
144145
List<Project> allOfGrandchildren = mProject.collected().stream()
@@ -169,24 +170,27 @@ public Stream<Artifact> get() {
169170
return getAllProjects().stream().map(Project::artifact);
170171
}
171172

172-
private static final class MProject implements Project {
173+
private static final class MProject implements ReactorProject {
173174
private final Artifact artifact;
174175
private final Artifact parent;
175176
private final List<Dependency> dependencies;
176177
private final List<Artifact> collected;
177178
private final ProjectLocator origin;
179+
private final Model effectiveModel;
178180

179181
private MProject(
180182
Artifact artifact,
181183
Artifact parent,
182184
List<Dependency> dependencies,
183185
List<Artifact> collected,
184-
ProjectLocator origin) {
186+
ProjectLocator origin,
187+
Model effectiveModel) {
185188
this.artifact = requireNonNull(artifact, "artifact");
186189
this.parent = parent; // nullable
187190
this.dependencies = requireNonNull(dependencies, "dependencies");
188191
this.collected = requireNonNull(collected, "collected");
189192
this.origin = origin;
193+
this.effectiveModel = requireNonNull(effectiveModel, "effectiveModel");
190194
}
191195

192196
@Override
@@ -217,6 +221,11 @@ public ProjectLocator origin() {
217221
return origin;
218222
}
219223

224+
@Override
225+
public Model effectiveModel() {
226+
return effectiveModel;
227+
}
228+
220229
@Override
221230
public boolean equals(Object o) {
222231
if (this == o) {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright (c) 2023-2024 Maveniverse Org.
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v2.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-v20.html
7+
*/
8+
package eu.maveniverse.maven.toolbox.plugin.mp;
9+
10+
import eu.maveniverse.maven.toolbox.plugin.MPMojoSupport;
11+
import eu.maveniverse.maven.toolbox.shared.Result;
12+
import eu.maveniverse.maven.toolbox.shared.ToolboxCommando;
13+
import org.apache.maven.model.Model;
14+
import org.apache.maven.plugins.annotations.Mojo;
15+
import org.apache.maven.plugins.annotations.Parameter;
16+
17+
/**
18+
* Shows effective model for project; is aggregator mojo.
19+
*/
20+
@Mojo(name = "effective-model", aggregator = true, threadSafe = true)
21+
public class EffectiveModelAggregatorMojo extends MPMojoSupport {
22+
/**
23+
* Set the project selector, like {@code -rf} Maven command uses it, can be {@code :A} or {@code G:A}. If the
24+
* selector is set, it must match exactly one project within reactor, otherwise it will fail. By default,
25+
* selector is {@code null}, and Maven session "current project" is used.
26+
*/
27+
@Parameter(property = "selector")
28+
private String selector;
29+
30+
@Override
31+
protected Result<Model> doExecute() throws Exception {
32+
ToolboxCommando toolboxCommando = getToolboxCommando();
33+
return toolboxCommando.effectiveModel(getReactorLocator(selector));
34+
}
35+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* Copyright (c) 2023-2024 Maveniverse Org.
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v2.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-v20.html
7+
*/
8+
package eu.maveniverse.maven.toolbox.plugin.mp;
9+
10+
import eu.maveniverse.maven.toolbox.plugin.MPMojoSupport;
11+
import eu.maveniverse.maven.toolbox.shared.Result;
12+
import eu.maveniverse.maven.toolbox.shared.ToolboxCommando;
13+
import org.apache.maven.model.Model;
14+
import org.apache.maven.plugins.annotations.Mojo;
15+
16+
/**
17+
* Shows effective model for project.
18+
*/
19+
@Mojo(name = "effective-model-all", threadSafe = true)
20+
public class EffectiveModelMojo extends MPMojoSupport {
21+
@Override
22+
protected Result<Model> doExecute() throws Exception {
23+
ToolboxCommando toolboxCommando = getToolboxCommando();
24+
return toolboxCommando.effectiveModel(getReactorLocator(null));
25+
}
26+
}

0 commit comments

Comments
 (0)