From ff82ec63615eb4a06850c854fd7036036902648d Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Fri, 15 Sep 2023 06:32:01 +0200 Subject: [PATCH] [MNG-7880] Trim down consumer POM --- .../ConsumerPomArtifactTransformer.java | 118 ++++++++++++------ 1 file changed, 82 insertions(+), 36 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/internal/transformation/ConsumerPomArtifactTransformer.java b/maven-core/src/main/java/org/apache/maven/internal/transformation/ConsumerPomArtifactTransformer.java index 2b4bc627a3f..6416e3ebf39 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/transformation/ConsumerPomArtifactTransformer.java +++ b/maven-core/src/main/java/org/apache/maven/internal/transformation/ConsumerPomArtifactTransformer.java @@ -32,11 +32,17 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; +import java.util.stream.Collectors; +import org.apache.maven.api.Repository; import org.apache.maven.api.feature.Features; +import org.apache.maven.api.model.DistributionManagement; import org.apache.maven.api.model.Model; +import org.apache.maven.api.model.ModelBase; +import org.apache.maven.api.model.Profile; import org.apache.maven.model.building.FileModelSource; import org.apache.maven.model.building.ModelBuilder; import org.apache.maven.model.building.ModelBuildingRequest; @@ -212,49 +218,67 @@ void transform(Path src, Path dest, Model model) { Model consumer = null; String version; - // This is a bit of a hack, but all models are cached, so not sure why we'd need to parse it again - ModelCache cache = DefaultModelCache.newInstance(session); - Object modelData = cache.get(new FileModelSource(src.toFile()), "raw"); - if (modelData != null) { - try { - Method getModel = modelData.getClass().getMethod("getModel"); - getModel.setAccessible(true); - org.apache.maven.model.Model cachedModel = - (org.apache.maven.model.Model) getModel.invoke(modelData); - consumer = cachedModel.getDelegate(); - } catch (Exception e) { - throw new RuntimeException(e); + String packaging = model.getPackaging(); + if (POM_PACKAGING.equals(packaging)) { + // This is a bit of a hack, but all models are cached, so not sure why we'd need to parse it again + ModelCache cache = DefaultModelCache.newInstance(session); + Object modelData = cache.get(new FileModelSource(src.toFile()), "raw"); + if (modelData != null) { + try { + Method getModel = modelData.getClass().getMethod("getModel"); + getModel.setAccessible(true); + org.apache.maven.model.Model cachedModel = + (org.apache.maven.model.Model) getModel.invoke(modelData); + consumer = cachedModel.getDelegate(); + } catch (Exception e) { + throw new RuntimeException(e); + } } - } - if (consumer == null) { - TransformerContext context = - (TransformerContext) session.getData().get(TransformerContext.KEY); - Result result = modelBuilder.buildRawModel( - src.toFile(), ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL, false, context); - if (result.hasErrors()) { - throw new IllegalStateException( - "Unable to build POM " + src, - result.getProblems().iterator().next().getException()); + if (consumer == null) { + TransformerContext context = + (TransformerContext) session.getData().get(TransformerContext.KEY); + Result result = modelBuilder.buildRawModel( + src.toFile(), ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL, false, context); + if (result.hasErrors()) { + throw new IllegalStateException( + "Unable to build POM " + src, + result.getProblems().iterator().next().getException()); + } + consumer = result.get().getDelegate(); } - consumer = result.get().getDelegate(); - } - // raw to consumer transform - if (BOM_PACKAGING.equals(consumer.getPackaging())) { - consumer = consumer.withPackaging(POM_PACKAGING); - } - consumer = consumer.withRoot(false).withModules(null); - if (consumer.getParent() != null) { - consumer = consumer.withParent(consumer.getParent().withRelativePath(null)); - } + // raw to consumer transform + consumer = consumer.withRoot(false).withModules(null); + if (consumer.getParent() != null) { + consumer = consumer.withParent(consumer.getParent().withRelativePath(null)); + } - if (!consumer.isPreserveModelVersion()) { - consumer = consumer.withPreserveModelVersion(false); + if (!consumer.isPreserveModelVersion()) { + consumer = consumer.withPreserveModelVersion(false); + version = new MavenModelVersion().getModelVersion(consumer); + consumer = consumer.withModelVersion(version); + } else { + version = consumer.getModelVersion(); + } + } else { + Model.Builder builder = prune( + Model.newBuilder(model, true) + .preserveModelVersion(false) + .root(false) + .parent(null) + .build(null), + model); + boolean isBom = BOM_PACKAGING.equals(packaging); + if (isBom) { + builder.packaging(POM_PACKAGING); + } + builder.profiles(model.getProfiles().stream() + .map(p -> prune(Profile.newBuilder(p, true), p).build()) + .collect(Collectors.toList())); + consumer = builder.build(); version = new MavenModelVersion().getModelVersion(consumer); consumer = consumer.withModelVersion(version); - } else { - version = consumer.getModelVersion(); } try { @@ -271,4 +295,26 @@ void transform(Path src, Path dest, Model model) { } } } + + private static T prune(T builder, ModelBase model) { + builder.properties(null).reporting(null); + if (model.getDistributionManagement() != null + && model.getDistributionManagement().getRelocation() != null) { + // keep relocation only + builder.distributionManagement(DistributionManagement.newBuilder() + .relocation(model.getDistributionManagement().getRelocation()) + .build()); + } + // only keep repositories others than 'central' + builder.pluginRepositories(pruneRepositories(model.getPluginRepositories())); + builder.repositories(pruneRepositories(model.getRepositories())); + return builder; + } + + private static List pruneRepositories( + List repositories) { + return repositories.stream() + .filter(r -> !Repository.CENTRAL_ID.equals(r.getId())) + .collect(Collectors.toList()); + } }