Skip to content

Commit bcf5c0c

Browse files
authored
[MNG-8527] Re-enable consumer POM, remove unwanted managed dependencies, developers, contributors, mailing lists and issue management (#2058)
* re-enable consumer POM for 4.0.0 and 4.1.0 models * remove unwanted managed dependencies * remove plugin repositories, developers, contributors, mailing lists and issue management
1 parent 3761953 commit bcf5c0c

File tree

9 files changed

+383
-27
lines changed

9 files changed

+383
-27
lines changed

impl/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomArtifactTransformer.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636

3737
import org.apache.maven.api.feature.Features;
3838
import org.apache.maven.api.model.Model;
39-
import org.apache.maven.api.services.ModelBuilder;
4039
import org.apache.maven.api.services.ModelBuilderException;
4140
import org.apache.maven.internal.transformation.ConsumerPomArtifactTransformer;
4241
import org.apache.maven.model.v4.MavenStaxWriter;
@@ -77,8 +76,7 @@ public void injectTransformedArtifacts(RepositorySystemSession session, MavenPro
7776
// If there is no build POM there is no reason to inject artifacts for the consumer POM.
7877
return;
7978
}
80-
boolean isModel40 = ModelBuilder.MODEL_VERSION_4_0_0.equals(project.getModelVersion());
81-
if (Features.consumerPom(session.getUserProperties(), !isModel40)) {
79+
if (Features.consumerPom(session.getUserProperties(), true)) {
8280
Path buildDir =
8381
project.getBuild() != null ? Paths.get(project.getBuild().getDirectory()) : null;
8482
if (buildDir != null) {

impl/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java

Lines changed: 104 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,15 @@
2323

2424
import java.nio.file.Path;
2525
import java.util.ArrayList;
26+
import java.util.LinkedHashMap;
2627
import java.util.List;
28+
import java.util.Map;
29+
import java.util.function.Function;
2730
import java.util.stream.Collectors;
2831

32+
import org.apache.maven.api.ArtifactCoordinates;
33+
import org.apache.maven.api.Node;
34+
import org.apache.maven.api.PathScope;
2935
import org.apache.maven.api.SessionData;
3036
import org.apache.maven.api.model.Dependency;
3137
import org.apache.maven.api.model.DependencyManagement;
@@ -77,20 +83,100 @@ public Model build(RepositorySystemSession session, MavenProject project, Path s
7783

7884
protected Model buildPom(RepositorySystemSession session, MavenProject project, Path src)
7985
throws ModelBuilderException {
80-
ModelBuilderResult result = buildModel(session, project, src);
86+
ModelBuilderResult result = buildModel(session, src);
8187
Model model = result.getRawModel();
8288
return transform(model, project);
8389
}
8490

8591
protected Model buildNonPom(RepositorySystemSession session, MavenProject project, Path src)
8692
throws ModelBuilderException {
87-
ModelBuilderResult result = buildModel(session, project, src);
88-
Model model = result.getEffectiveModel();
93+
Model model = buildEffectiveModel(session, src);
8994
return transform(model, project);
9095
}
9196

92-
private ModelBuilderResult buildModel(RepositorySystemSession session, MavenProject project, Path src)
93-
throws ModelBuilderException {
97+
private Model buildEffectiveModel(RepositorySystemSession session, Path src) throws ModelBuilderException {
98+
InternalSession iSession = InternalSession.from(session);
99+
ModelBuilderResult result = buildModel(session, src);
100+
Model model = result.getEffectiveModel();
101+
102+
if (model.getDependencyManagement() != null
103+
&& !model.getDependencyManagement().getDependencies().isEmpty()) {
104+
ArtifactCoordinates artifact = iSession.createArtifactCoordinates(
105+
model.getGroupId(), model.getArtifactId(), model.getVersion(), null);
106+
Node node = iSession.collectDependencies(
107+
iSession.createDependencyCoordinates(artifact), PathScope.TEST_RUNTIME);
108+
109+
Map<String, Node> nodes = node.stream()
110+
.collect(Collectors.toMap(n -> getDependencyKey(n.getDependency()), Function.identity()));
111+
Map<String, Dependency> directDependencies = model.getDependencies().stream()
112+
.filter(dependency -> !"import".equals(dependency.getScope()))
113+
.collect(Collectors.toMap(
114+
DefaultConsumerPomBuilder::getDependencyKey,
115+
Function.identity(),
116+
this::merge,
117+
LinkedHashMap::new));
118+
Map<String, Dependency> managedDependencies = model.getDependencyManagement().getDependencies().stream()
119+
.filter(dependency ->
120+
nodes.containsKey(getDependencyKey(dependency)) && !"import".equals(dependency.getScope()))
121+
.collect(Collectors.toMap(
122+
DefaultConsumerPomBuilder::getDependencyKey,
123+
Function.identity(),
124+
this::merge,
125+
LinkedHashMap::new));
126+
127+
// for each managed dep in the model:
128+
// * if there is no corresponding node in the tree, discard the managed dep
129+
// * if there's a direct dependency, apply the managed dependency to it and discard the managed dep
130+
// * else keep the managed dep
131+
managedDependencies.keySet().retainAll(nodes.keySet());
132+
133+
directDependencies.replaceAll((key, dependency) -> {
134+
var managedDependency = managedDependencies.get(key);
135+
if (managedDependency != null) {
136+
if (dependency.getVersion() == null && managedDependency.getVersion() != null) {
137+
dependency = dependency.withVersion(managedDependency.getVersion());
138+
}
139+
if (dependency.getScope() == null && managedDependency.getScope() != null) {
140+
dependency = dependency.withScope(managedDependency.getScope());
141+
}
142+
if (dependency.getOptional() == null && managedDependency.getOptional() != null) {
143+
dependency = dependency.withOptional(managedDependency.getOptional());
144+
}
145+
if (dependency.getExclusions().isEmpty()
146+
&& !managedDependency.getExclusions().isEmpty()) {
147+
dependency = dependency.withExclusions(managedDependency.getExclusions());
148+
}
149+
}
150+
return dependency;
151+
});
152+
managedDependencies.keySet().removeAll(directDependencies.keySet());
153+
154+
model = model.withDependencyManagement(
155+
managedDependencies.isEmpty()
156+
? null
157+
: model.getDependencyManagement().withDependencies(managedDependencies.values()))
158+
.withDependencies(directDependencies.isEmpty() ? null : directDependencies.values());
159+
}
160+
161+
return model;
162+
}
163+
164+
private Dependency merge(Dependency dep1, Dependency dep2) {
165+
throw new IllegalArgumentException("Duplicate dependency: " + dep1);
166+
}
167+
168+
private static String getDependencyKey(org.apache.maven.api.Dependency dependency) {
169+
return dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + dependency.getType() + ":"
170+
+ dependency.getClassifier();
171+
}
172+
173+
private static String getDependencyKey(Dependency dependency) {
174+
return dependency.getGroupId() + ":" + dependency.getArtifactId() + ":"
175+
+ (dependency.getType() != null ? dependency.getType() : "") + ":"
176+
+ (dependency.getClassifier() != null ? dependency.getClassifier() : "");
177+
}
178+
179+
private ModelBuilderResult buildModel(RepositorySystemSession session, Path src) throws ModelBuilderException {
94180
InternalSession iSession = InternalSession.from(session);
95181
ModelBuilderRequest.ModelBuilderRequestBuilder request = ModelBuilderRequest.builder();
96182
request.requestType(ModelBuilderRequest.RequestType.BUILD_CONSUMER);
@@ -102,7 +188,8 @@ private ModelBuilderResult buildModel(RepositorySystemSession session, MavenProj
102188
request.lifecycleBindingsInjector(lifecycleBindingsInjector::injectLifecycleBindings);
103189
ModelBuilder.ModelBuilderSession mbSession =
104190
iSession.getData().get(SessionData.key(ModelBuilder.ModelBuilderSession.class));
105-
return mbSession.build(request.build());
191+
ModelBuilderResult result = mbSession.build(request.build());
192+
return result;
106193
}
107194

108195
static Model transform(Model model, MavenProject project) {
@@ -148,12 +235,16 @@ static Model transform(Model model, MavenProject project) {
148235
model = model.withModelVersion(modelVersion);
149236
} else {
150237
Model.Builder builder = prune(
151-
Model.newBuilder(model, true)
152-
.preserveModelVersion(false)
153-
.root(false)
154-
.parent(null)
155-
.build(null),
156-
model);
238+
Model.newBuilder(model, true)
239+
.preserveModelVersion(false)
240+
.root(false)
241+
.parent(null)
242+
.build(null),
243+
model)
244+
.developers(null)
245+
.contributors(null)
246+
.mailingLists(null)
247+
.issueManagement(null);
157248
builder.profiles(prune(model.getProfiles()));
158249

159250
model = builder.build();
@@ -210,8 +301,8 @@ private static <T extends ModelBase.Builder> T prune(T builder, ModelBase model)
210301
.build());
211302
}
212303
// only keep repositories other than 'central'
213-
builder.pluginRepositories(pruneRepositories(model.getPluginRepositories()));
214304
builder.repositories(pruneRepositories(model.getRepositories()));
305+
builder.pluginRepositories(null);
215306
return builder;
216307
}
217308

impl/maven-core/src/test/java/org/apache/maven/internal/transformation/AbstractRepositoryTestCase.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.apache.maven.impl.DefaultRepositoryFactory;
3131
import org.apache.maven.impl.InternalSession;
3232
import org.apache.maven.impl.model.DefaultInterpolator;
33+
import org.apache.maven.impl.resolver.scopes.Maven4ScopeManagerConfiguration;
3334
import org.apache.maven.internal.impl.DefaultSession;
3435
import org.codehaus.plexus.PlexusContainer;
3536
import org.codehaus.plexus.testing.PlexusTest;
@@ -40,6 +41,7 @@
4041
import org.eclipse.aether.internal.impl.DefaultChecksumPolicyProvider;
4142
import org.eclipse.aether.internal.impl.DefaultRemoteRepositoryManager;
4243
import org.eclipse.aether.internal.impl.DefaultUpdatePolicyAnalyzer;
44+
import org.eclipse.aether.internal.impl.scope.ScopeManagerImpl;
4345
import org.eclipse.aether.repository.LocalRepository;
4446
import org.eclipse.aether.repository.RemoteRepository;
4547
import org.eclipse.aether.transfer.TransferListener;
@@ -67,8 +69,9 @@ protected PlexusContainer getContainer() {
6769
return container;
6870
}
6971

70-
public static RepositorySystemSession newMavenRepositorySystemSession(RepositorySystem system) {
72+
public RepositorySystemSession newMavenRepositorySystemSession(RepositorySystem system) {
7173
DefaultRepositorySystemSession rsession = new DefaultRepositorySystemSession(h -> false);
74+
rsession.setScopeManager(new ScopeManagerImpl(Maven4ScopeManagerConfiguration.INSTANCE));
7275

7376
LocalRepository localRepo = new LocalRepository("target/local-repo");
7477
rsession.setLocalRepositoryManager(system.newLocalRepositoryManager(rsession, localRepo));
@@ -78,21 +81,20 @@ public static RepositorySystemSession newMavenRepositorySystemSession(Repository
7881

7982
DefaultMavenExecutionRequest request = new DefaultMavenExecutionRequest();
8083
MavenSession mavenSession = new MavenSession(rsession, request, new DefaultMavenExecutionResult());
81-
DefaultSession session = new DefaultSession(
82-
mavenSession,
83-
null,
84-
null,
85-
null,
86-
new SimpleLookup(List.of(
87-
new DefaultRepositoryFactory(new DefaultRemoteRepositoryManager(
88-
new DefaultUpdatePolicyAnalyzer(), new DefaultChecksumPolicyProvider())),
89-
new DefaultInterpolator())),
90-
null);
84+
DefaultSession session =
85+
new DefaultSession(mavenSession, null, null, null, new SimpleLookup(getSessionServices()), null);
9186
InternalSession.associate(rsession, session);
9287

9388
return rsession;
9489
}
9590

91+
protected List<Object> getSessionServices() {
92+
return List.of(
93+
new DefaultRepositoryFactory(new DefaultRemoteRepositoryManager(
94+
new DefaultUpdatePolicyAnalyzer(), new DefaultChecksumPolicyProvider())),
95+
new DefaultInterpolator());
96+
}
97+
9698
public static RemoteRepository newTestRepository() throws MalformedURLException {
9799
return new RemoteRepository.Builder(
98100
"repo",

impl/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomBuilderTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,38 @@
2222

2323
import java.nio.file.Path;
2424
import java.nio.file.Paths;
25+
import java.util.ArrayList;
2526
import java.util.List;
2627
import java.util.function.Consumer;
2728

29+
import org.apache.maven.api.DependencyCoordinates;
30+
import org.apache.maven.api.Node;
31+
import org.apache.maven.api.PathScope;
2832
import org.apache.maven.api.RemoteRepository;
2933
import org.apache.maven.api.Session;
3034
import org.apache.maven.api.SessionData;
3135
import org.apache.maven.api.model.Model;
36+
import org.apache.maven.api.services.DependencyResolver;
37+
import org.apache.maven.api.services.DependencyResolverResult;
3238
import org.apache.maven.api.services.ModelBuilder;
3339
import org.apache.maven.api.services.ModelBuilderRequest;
3440
import org.apache.maven.api.services.ModelSource;
3541
import org.apache.maven.api.services.model.ModelResolver;
3642
import org.apache.maven.api.services.model.ModelResolverException;
3743
import org.apache.maven.di.Injector;
3844
import org.apache.maven.execution.MavenExecutionRequest;
45+
import org.apache.maven.impl.DefaultArtifactCoordinatesFactory;
46+
import org.apache.maven.impl.DefaultDependencyCoordinatesFactory;
47+
import org.apache.maven.impl.DefaultModelVersionParser;
48+
import org.apache.maven.impl.DefaultVersionParser;
3949
import org.apache.maven.impl.InternalSession;
50+
import org.apache.maven.impl.resolver.MavenVersionScheme;
4051
import org.apache.maven.internal.impl.InternalMavenSession;
4152
import org.apache.maven.internal.transformation.AbstractRepositoryTestCase;
4253
import org.apache.maven.project.MavenProject;
4354
import org.junit.jupiter.api.BeforeEach;
4455
import org.junit.jupiter.api.Test;
56+
import org.mockito.Mockito;
4557

4658
import static org.junit.jupiter.api.Assertions.assertNotNull;
4759
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -63,6 +75,30 @@ void setupTransformerContext() throws Exception {
6375
iSession.getData().set(SessionData.key(ModelResolver.class), new MyModelResolver());
6476
}
6577

78+
@Override
79+
protected List<Object> getSessionServices() {
80+
List<Object> services = new ArrayList<>(super.getSessionServices());
81+
82+
DependencyResolver dependencyResolver = Mockito.mock(DependencyResolver.class);
83+
DependencyResolverResult resolverResult = Mockito.mock(DependencyResolverResult.class);
84+
Mockito.when(dependencyResolver.collect(
85+
Mockito.any(Session.class),
86+
Mockito.any(DependencyCoordinates.class),
87+
Mockito.any(PathScope.class)))
88+
.thenReturn(resolverResult);
89+
Node node = Mockito.mock(Node.class);
90+
Mockito.when(resolverResult.getRoot()).thenReturn(node);
91+
Node child = Mockito.mock(Node.class);
92+
Mockito.when(node.getChildren()).thenReturn(List.of(child));
93+
94+
services.addAll(List.of(
95+
new DefaultArtifactCoordinatesFactory(),
96+
new DefaultDependencyCoordinatesFactory(),
97+
new DefaultVersionParser(new DefaultModelVersionParser(new MavenVersionScheme())),
98+
dependencyResolver));
99+
return services;
100+
}
101+
66102
@Test
67103
void testTrivialConsumer() throws Exception {
68104
InternalMavenSession.from(InternalSession.from(session))

0 commit comments

Comments
 (0)