diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderRequest.java index 3d98b50105d0..f03dc4625304 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderRequest.java @@ -38,8 +38,6 @@ * Request used to build a {@link org.apache.maven.api.Project} using * the {@link ProjectBuilder} service. * - * TODO: replace ModelRepositoryHolder with just the enum for the strategy - * * @since 4.0.0 */ @Experimental @@ -128,9 +126,6 @@ enum RepositoryMerging { @Nonnull ModelResolver getModelResolver(); - @Nonnull - Object getModelRepositoryHolder(); - @Nonnull RepositoryMerging getRepositoryMerging(); @@ -189,7 +184,6 @@ class ModelBuilderRequestBuilder { Map systemProperties; Map userProperties; ModelResolver modelResolver; - Object modelRepositoryHolder; RepositoryMerging repositoryMerging; Object listener; ModelBuilderResult interimResult; @@ -209,7 +203,6 @@ class ModelBuilderRequestBuilder { this.systemProperties = request.getSystemProperties(); this.userProperties = request.getUserProperties(); this.modelResolver = request.getModelResolver(); - this.modelRepositoryHolder = request.getModelRepositoryHolder(); this.repositoryMerging = request.getRepositoryMerging(); this.listener = request.getListener(); this.interimResult = request.getInterimResult(); @@ -271,11 +264,6 @@ public ModelBuilderRequestBuilder modelResolver(ModelResolver modelResolver) { return this; } - public ModelBuilderRequestBuilder modelRepositoryHolder(Object modelRepositoryHolder) { - this.modelRepositoryHolder = modelRepositoryHolder; - return this; - } - public ModelBuilderRequestBuilder repositoryMerging(RepositoryMerging repositoryMerging) { this.repositoryMerging = repositoryMerging; return this; @@ -309,7 +297,6 @@ public ModelBuilderRequest build() { systemProperties, userProperties, modelResolver, - modelRepositoryHolder, repositoryMerging, listener, interimResult, @@ -327,7 +314,6 @@ private static class DefaultModelBuilderRequest extends BaseRequest implements M private final Map systemProperties; private final Map userProperties; private final ModelResolver modelResolver; - private final Object modelRepositoryHolder; private final RepositoryMerging repositoryMerging; private final Object listener; private final ModelBuilderResult interimResult; @@ -346,7 +332,6 @@ private static class DefaultModelBuilderRequest extends BaseRequest implements M Map systemProperties, Map userProperties, ModelResolver modelResolver, - Object modelRepositoryHolder, RepositoryMerging repositoryMerging, Object listener, ModelBuilderResult interimResult, @@ -363,7 +348,6 @@ private static class DefaultModelBuilderRequest extends BaseRequest implements M systemProperties != null ? Map.copyOf(systemProperties) : session.getSystemProperties(); this.userProperties = userProperties != null ? Map.copyOf(userProperties) : session.getUserProperties(); this.modelResolver = modelResolver; - this.modelRepositoryHolder = modelRepositoryHolder; this.repositoryMerging = repositoryMerging; this.listener = listener; this.interimResult = interimResult; @@ -421,11 +405,6 @@ public ModelResolver getModelResolver() { return modelResolver; } - @Override - public Object getModelRepositoryHolder() { - return modelRepositoryHolder; - } - @Override public RepositoryMerging getRepositoryMerging() { return repositoryMerging; diff --git a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java index 439cf7463d3e..c11fbfc428df 100644 --- a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java +++ b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java @@ -46,6 +46,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.maven.api.RemoteRepository; import org.apache.maven.api.Session; import org.apache.maven.api.SessionData; import org.apache.maven.api.Type; @@ -69,6 +70,7 @@ import org.apache.maven.api.model.Plugin; import org.apache.maven.api.model.PluginManagement; import org.apache.maven.api.model.Profile; +import org.apache.maven.api.model.Repository; import org.apache.maven.api.services.BuilderProblem; import org.apache.maven.api.services.BuilderProblem.Severity; import org.apache.maven.api.services.ModelBuilder; @@ -81,6 +83,7 @@ import org.apache.maven.api.services.ModelResolverException; import org.apache.maven.api.services.ModelSource; import org.apache.maven.api.services.ModelTransformerException; +import org.apache.maven.api.services.RepositoryFactory; import org.apache.maven.api.services.Source; import org.apache.maven.api.services.SuperPomProvider; import org.apache.maven.api.services.VersionParserException; @@ -108,7 +111,6 @@ import org.apache.maven.api.services.xml.XmlReaderRequest; import org.apache.maven.api.spi.ModelParserException; import org.apache.maven.api.spi.ModelTransformer; -import org.apache.maven.internal.impl.resolver.DefaultModelRepositoryHolder; import org.apache.maven.internal.impl.resolver.DefaultModelResolver; import org.apache.maven.model.v4.MavenTransformer; import org.codehaus.plexus.interpolation.InterpolationException; @@ -219,6 +221,7 @@ protected final class ModelBuilderSession implements ModelProblemCollector { final Map modelByPath; final Map modelByGA; final Map> mappedSources; + final RepositoryHolder repositoryHolder; private String source; private Model sourceModel; @@ -255,7 +258,8 @@ protected final class ModelBuilderSession implements ModelProblemCollector { new Graph(), new ConcurrentHashMap<>(64), new ConcurrentHashMap<>(64), - new ConcurrentHashMap<>(64)); + new ConcurrentHashMap<>(64), + null); } @SuppressWarnings("checkstyle:ParameterNumber") @@ -267,7 +271,8 @@ private ModelBuilderSession( Graph dag, Map modelByPath, Map modelByGA, - Map> mappedSources) { + Map> mappedSources, + RepositoryHolder repositoryHolder) { this.session = session; this.request = request; this.result = result; @@ -276,6 +281,12 @@ private ModelBuilderSession( this.modelByPath = modelByPath; this.modelByGA = modelByGA; this.mappedSources = mappedSources; + this.repositoryHolder = repositoryHolder != null + ? repositoryHolder + : new RepositoryHolder( + request.getRepositories() != null + ? request.getRepositories() + : session.getRemoteRepositories()); this.result.getProblems().forEach(p -> severities.add(p.getSeverity())); } @@ -283,7 +294,8 @@ public ModelBuilderSession derive(ModelBuilderRequest request) { if (session != request.getSession()) { throw new IllegalArgumentException("Session mismatch"); } - return new ModelBuilderSession(session, request, result, cache, dag, modelByPath, modelByGA, mappedSources); + return new ModelBuilderSession( + session, request, result, cache, dag, modelByPath, modelByGA, mappedSources, repositoryHolder); } public ModelBuilderSession derive(ModelSource source) { @@ -634,6 +646,70 @@ public ModelBuilderException newModelBuilderException() { } return new ModelBuilderException(result); } + + List getRepositories() { + return repositoryHolder.getRepositories(); + } + + void mergeRepositories(List repositories, boolean replace) { + repositoryHolder.mergeRepositories(repositories, replace); + } + + class RepositoryHolder { + + List pomRepositories; + List repositories; + List externalRepositories; + + RepositoryHolder(List externalRepositories) { + this.pomRepositories = List.of(); + this.externalRepositories = List.copyOf(externalRepositories); + this.repositories = List.copyOf(externalRepositories); + } + + RepositoryHolder(RepositoryHolder holder) { + this.pomRepositories = List.copyOf(holder.pomRepositories); + this.externalRepositories = List.copyOf(holder.externalRepositories); + this.repositories = List.copyOf(holder.repositories); + } + + public void mergeRepositories(List toAdd, boolean replace) { + List repos = + toAdd.stream().map(session::createRemoteRepository).toList(); + if (replace) { + Set ids = + repos.stream().map(RemoteRepository::getId).collect(Collectors.toSet()); + repositories = repositories.stream() + .filter(r -> !ids.contains(r.getId())) + .toList(); + pomRepositories = pomRepositories.stream() + .filter(r -> !ids.contains(r.getId())) + .toList(); + } else { + Set ids = pomRepositories.stream() + .map(RemoteRepository::getId) + .collect(Collectors.toSet()); + repos = repos.stream().filter(r -> !ids.contains(r.getId())).toList(); + } + + RepositoryFactory repositoryFactory = session.getService(RepositoryFactory.class); + if (request.getRepositoryMerging() == ModelBuilderRequest.RepositoryMerging.REQUEST_DOMINANT) { + repositories = repositoryFactory.aggregate(session, repositories, repos, true); + pomRepositories = repositories; + } else { + pomRepositories = repositoryFactory.aggregate(session, pomRepositories, repos, true); + repositories = repositoryFactory.aggregate(session, pomRepositories, externalRepositories, false); + } + } + + public List getRepositories() { + return repositories; + } + + public RepositoryHolder copy() { + return new RepositoryHolder(this); + } + } } DefaultModelProblemCollector newCollector(DefaultModelBuilderResult result) { @@ -645,16 +721,16 @@ private static ModelBuilderRequest fillRequestDefaults(ModelBuilderRequest reque // if (request.getModelCache() == null) { // builder.modelCache(new DefaultModelCache()); // } - if (getModelRepositoryHolder(request) == null) { - builder.modelRepositoryHolder(new DefaultModelRepositoryHolder( - request.getSession(), - request.getRepositoryMerging() != null - ? request.getRepositoryMerging() - : ModelBuilderRequest.RepositoryMerging.POM_DOMINANT, - request.getRepositories() != null - ? request.getRepositories() - : request.getSession().getRemoteRepositories())); - } + // if (getModelRepositoryHolder(request) == null) { + // builder.modelRepositoryHolder(new DefaultModelRepositoryHolder( + // request.getSession(), + // request.getRepositoryMerging() != null + // ? request.getRepositoryMerging() + // : ModelBuilderRequest.RepositoryMerging.POM_DOMINANT, + // request.getRepositories() != null + // ? request.getRepositories() + // : request.getSession().getRemoteRepositories())); + // } if (request.getModelResolver() == null) { builder.modelResolver(new DefaultModelResolver()); } @@ -801,14 +877,11 @@ private Model readEffectiveModel(final ModelBuilderSession build) throws ModelBu // add repositories specified by the current model so that we can resolve the parent if (!model.getRepositories().isEmpty()) { - DefaultModelRepositoryHolder modelRepositoryHolder = getModelRepositoryHolder(request); - List oldRepos = modelRepositoryHolder.getRepositories().stream() - .map(Object::toString) - .toList(); - modelRepositoryHolder.merge(model.getRepositories(), false); - List newRepos = modelRepositoryHolder.getRepositories().stream() - .map(Object::toString) - .toList(); + List oldRepos = + build.getRepositories().stream().map(Object::toString).toList(); + build.mergeRepositories(model.getRepositories(), false); + List newRepos = + build.getRepositories().stream().map(Object::toString).toList(); if (!Objects.equals(oldRepos, newRepos)) { logger.debug("Merging repositories from " + model.getId() + "\n" + newRepos.stream().map(s -> " " + s).collect(Collectors.joining("\n"))); @@ -868,14 +941,11 @@ private Model readEffectiveModel(final ModelBuilderSession build) throws ModelBu // Now the fully interpolated model is available: reconfigure the resolver if (!resultModel.getRepositories().isEmpty()) { - DefaultModelRepositoryHolder modelRepositoryHolder = getModelRepositoryHolder(request); - List oldRepos = modelRepositoryHolder.getRepositories().stream() - .map(Object::toString) - .toList(); - modelRepositoryHolder.merge(resultModel.getRepositories(), true); - List newRepos = modelRepositoryHolder.getRepositories().stream() - .map(Object::toString) - .toList(); + List oldRepos = + build.getRepositories().stream().map(Object::toString).toList(); + build.mergeRepositories(resultModel.getRepositories(), true); + List newRepos = + build.getRepositories().stream().map(Object::toString).toList(); if (!Objects.equals(oldRepos, newRepos)) { logger.debug("Replacing repositories from " + resultModel.getId() + "\n" + newRepos.stream().map(s -> " " + s).collect(Collectors.joining("\n"))); @@ -1057,7 +1127,11 @@ private DefaultModelBuilderResult asDefaultModelBuilderResult(ModelBuilderResult } Model readFileModel(ModelBuilderSession build) throws ModelBuilderException { - return cache(build.cache, build.request.getSource(), FILE, () -> doReadFileModel(build)); + Model model = cache(build.cache, build.request.getSource(), FILE, () -> doReadFileModel(build)); + if (build.request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM) { + build.putSource(getGroupId(model), model.getArtifactId(), build.request.getSource()); + } + return model; } @SuppressWarnings("checkstyle:methodlength") @@ -1197,10 +1271,6 @@ private Model doReadFileModel(ModelBuilderSession build) throws ModelBuilderExce throw ((ModelProblemCollector) build).newModelBuilderException(); } - if (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM) { - build.putSource(getGroupId(model), model.getArtifactId(), modelSource); - } - return model; } @@ -1529,8 +1599,7 @@ private ModelData resolveAndReadParentExternally(ModelBuilderSession build, Mode ModelSource modelSource; try { AtomicReference modified = new AtomicReference<>(); - modelSource = modelResolver.resolveModel( - request.getSession(), getModelRepositoryHolder(request).getRepositories(), parent, modified); + modelSource = modelResolver.resolveModel(request.getSession(), build.getRepositories(), parent, modified); if (modified.get() != null) { parent = modified.get(); } @@ -1771,10 +1840,7 @@ private Model doLoadDependencyManagement( final ModelSource importSource; try { importSource = modelResolver.resolveModel( - request.getSession(), - getModelRepositoryHolder(request).getRepositories(), - dependency, - new AtomicReference<>()); + request.getSession(), build.getRepositories(), dependency, new AtomicReference<>()); } catch (ModelBuilderException e) { StringBuilder buffer = new StringBuilder(256); buffer.append("Non-resolvable import POM"); @@ -1813,9 +1879,8 @@ private Model doLoadDependencyManagement( .userProperties(request.getUserProperties()) .source(importSource) .modelResolver(modelResolver) - .modelRepositoryHolder(getModelRepositoryHolder(request).copy()) .twoPhaseBuilding(false) - .repositories(getModelRepositoryHolder(request).getRepositories()) + .repositories(build.getRepositories()) .build(); importResult = build(new ModelBuilderSession(importRequest), importIds); } catch (ModelBuilderException e) { @@ -1828,10 +1893,6 @@ private Model doLoadDependencyManagement( return importResult.getEffectiveModel(); } - private static DefaultModelRepositoryHolder getModelRepositoryHolder(ModelBuilderRequest request) { - return (DefaultModelRepositoryHolder) request.getModelRepositoryHolder(); - } - private static T cache( ModelCache cache, String groupId, String artifactId, String version, String tag, Callable supplier) { return cache.computeIfAbsent(groupId, artifactId, version, tag, asSupplier(supplier)); diff --git a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultModelRepositoryHolder.java b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultModelRepositoryHolder.java deleted file mode 100644 index cb9f6bd2aa9e..000000000000 --- a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultModelRepositoryHolder.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.maven.internal.impl.resolver; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import org.apache.maven.api.RemoteRepository; -import org.apache.maven.api.Session; -import org.apache.maven.api.model.Repository; -import org.apache.maven.api.services.ModelBuilderRequest.RepositoryMerging; -import org.apache.maven.api.services.RepositoryFactory; - -public class DefaultModelRepositoryHolder { - - final Session session; - final RepositoryMerging repositoryMerging; - - List pomRepositories; - List repositories; - List externalRepositories; - Set ids; - - public DefaultModelRepositoryHolder( - Session session, RepositoryMerging repositoryMerging, List externalRepositories) { - this.session = session; - this.repositoryMerging = repositoryMerging; - this.pomRepositories = List.of(); - this.externalRepositories = List.copyOf(externalRepositories); - this.repositories = List.copyOf(externalRepositories); - this.ids = new HashSet<>(); - } - - protected DefaultModelRepositoryHolder(DefaultModelRepositoryHolder holder) { - this.session = holder.session; - this.repositoryMerging = holder.repositoryMerging; - this.pomRepositories = List.copyOf(holder.pomRepositories); - this.externalRepositories = List.copyOf(holder.externalRepositories); - this.repositories = List.copyOf(holder.repositories); - } - - public void merge(List toAdd, boolean replace) { - List repos = - toAdd.stream().map(session::createRemoteRepository).toList(); - if (replace) { - Set ids = repos.stream().map(RemoteRepository::getId).collect(Collectors.toSet()); - repositories = - repositories.stream().filter(r -> !ids.contains(r.getId())).toList(); - pomRepositories = pomRepositories.stream() - .filter(r -> !ids.contains(r.getId())) - .toList(); - } else { - Set ids = - pomRepositories.stream().map(RemoteRepository::getId).collect(Collectors.toSet()); - repos = repos.stream().filter(r -> !ids.contains(r.getId())).toList(); - } - - RepositoryFactory repositoryFactory = session.getService(RepositoryFactory.class); - if (repositoryMerging == RepositoryMerging.REQUEST_DOMINANT) { - repositories = repositoryFactory.aggregate(session, repositories, repos, true); - pomRepositories = repositories; - } else { - pomRepositories = repositoryFactory.aggregate(session, pomRepositories, repos, true); - repositories = repositoryFactory.aggregate(session, pomRepositories, externalRepositories, false); - } - } - - public List getRepositories() { - return List.copyOf(repositories); - } - - public DefaultModelRepositoryHolder copy() { - return new DefaultModelRepositoryHolder(this); - } -}