Skip to content

Commit

Permalink
[MNG-7880] Trim down consumer POM (#1247)
Browse files Browse the repository at this point in the history
  • Loading branch information
gnodet authored Sep 26, 2023
1 parent 10fa5c7 commit 558dfc9
Showing 1 changed file with 82 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<? extends org.apache.maven.model.Model> 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<? extends org.apache.maven.model.Model> 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 {
Expand All @@ -271,4 +295,26 @@ void transform(Path src, Path dest, Model model) {
}
}
}

private static <T extends ModelBase.Builder> 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<org.apache.maven.api.model.Repository> pruneRepositories(
List<org.apache.maven.api.model.Repository> repositories) {
return repositories.stream()
.filter(r -> !Repository.CENTRAL_ID.equals(r.getId()))
.collect(Collectors.toList());
}
}

0 comments on commit 558dfc9

Please sign in to comment.