From 87c86aeede56f9934f2fead94cd1395a427bfde9 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Fri, 18 Jul 2025 09:38:35 +0000 Subject: [PATCH] Consolidate ArtifactDescriptorReaderDelegate into DefaultArtifactDescriptorReader The ArtifactDescriptorReaderDelegate was marked as 'work in progress' and could be 'changed or removed without notice'. This change consolidates its functionality directly into DefaultArtifactDescriptorReader by: - Moving all delegate methods as private methods in DefaultArtifactDescriptorReader - Removing the unused extension mechanism via session config properties - Simplifying the codebase by removing unnecessary abstraction - Maintaining identical functionality for normal usage The compat module retains the original delegate pattern for backward compatibility since it's already deprecated and marked for removal in 4.0.0. If a proper extension point is needed in the future, it can be designed more explicitly with proper interfaces and documentation. Also fixes maven.config to be compatible with Maven 3.6.x by removing comment that causes parsing errors in older Maven versions. --- .mvn/maven.config | 1 - .../ArtifactDescriptorReaderDelegate.java | 149 ------------------ .../DefaultArtifactDescriptorReader.java | 118 ++++++++++++-- 3 files changed, 107 insertions(+), 161 deletions(-) delete mode 100644 impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/ArtifactDescriptorReaderDelegate.java diff --git a/.mvn/maven.config b/.mvn/maven.config index f3b0cd90b1c8..c6f922ecc298 100644 --- a/.mvn/maven.config +++ b/.mvn/maven.config @@ -1,2 +1 @@ -# A hack to pass on this property for Maven 3 as well; Maven 4 supports this property out of the box -DsessionRootDirectory=${session.rootDirectory} \ No newline at end of file diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/ArtifactDescriptorReaderDelegate.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/ArtifactDescriptorReaderDelegate.java deleted file mode 100644 index fc105b0dfdc3..000000000000 --- a/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/ArtifactDescriptorReaderDelegate.java +++ /dev/null @@ -1,149 +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.impl.resolver; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import org.apache.maven.api.Language; -import org.apache.maven.api.model.DependencyManagement; -import org.apache.maven.api.model.DistributionManagement; -import org.apache.maven.api.model.License; -import org.apache.maven.api.model.Model; -import org.apache.maven.api.model.Prerequisites; -import org.apache.maven.api.model.Repository; -import org.apache.maven.api.services.RepositoryFactory; -import org.apache.maven.impl.InternalSession; -import org.apache.maven.impl.resolver.artifact.MavenArtifactProperties; -import org.apache.maven.impl.resolver.type.DefaultType; -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.artifact.ArtifactProperties; -import org.eclipse.aether.artifact.ArtifactType; -import org.eclipse.aether.artifact.ArtifactTypeRegistry; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.graph.Dependency; -import org.eclipse.aether.graph.Exclusion; -import org.eclipse.aether.resolution.ArtifactDescriptorResult; - -/** - * Populates Aether {@link ArtifactDescriptorResult} from Maven project {@link Model}. - *

- * Note: This class is part of work in progress and can be changed or removed without notice. - * @since 3.2.4 - */ -public class ArtifactDescriptorReaderDelegate { - public void populateResult(InternalSession session, ArtifactDescriptorResult result, Model model) { - ArtifactTypeRegistry stereotypes = session.getSession().getArtifactTypeRegistry(); - - for (Repository r : model.getRepositories()) { - result.addRepository(session.toRepository( - session.getService(RepositoryFactory.class).createRemote(r))); - } - - for (org.apache.maven.api.model.Dependency dependency : model.getDependencies()) { - result.addDependency(convert(dependency, stereotypes)); - } - - DependencyManagement mgmt = model.getDependencyManagement(); - if (mgmt != null) { - for (org.apache.maven.api.model.Dependency dependency : mgmt.getDependencies()) { - result.addManagedDependency(convert(dependency, stereotypes)); - } - } - - Map properties = new LinkedHashMap<>(); - - Prerequisites prerequisites = model.getPrerequisites(); - if (prerequisites != null) { - properties.put("prerequisites.maven", prerequisites.getMaven()); - } - - List licenses = model.getLicenses(); - properties.put("license.count", licenses.size()); - for (int i = 0; i < licenses.size(); i++) { - License license = licenses.get(i); - properties.put("license." + i + ".name", license.getName()); - properties.put("license." + i + ".url", license.getUrl()); - properties.put("license." + i + ".comments", license.getComments()); - properties.put("license." + i + ".distribution", license.getDistribution()); - } - - result.setProperties(properties); - - setArtifactProperties(result, model); - } - - private Dependency convert(org.apache.maven.api.model.Dependency dependency, ArtifactTypeRegistry stereotypes) { - ArtifactType stereotype = stereotypes.get(dependency.getType()); - if (stereotype == null) { - // TODO: this here is fishy - stereotype = new DefaultType(dependency.getType(), Language.NONE, "", null, false); - } - - boolean system = dependency.getSystemPath() != null - && !dependency.getSystemPath().isEmpty(); - - Map props = null; - if (system) { - props = Collections.singletonMap(MavenArtifactProperties.LOCAL_PATH, dependency.getSystemPath()); - } - - Artifact artifact = new DefaultArtifact( - dependency.getGroupId(), - dependency.getArtifactId(), - dependency.getClassifier(), - null, - dependency.getVersion(), - props, - stereotype); - - List exclusions = new ArrayList<>(dependency.getExclusions().size()); - for (org.apache.maven.api.model.Exclusion exclusion : dependency.getExclusions()) { - exclusions.add(convert(exclusion)); - } - - return new Dependency( - artifact, - dependency.getScope(), - dependency.getOptional() != null ? dependency.isOptional() : null, - exclusions); - } - - private Exclusion convert(org.apache.maven.api.model.Exclusion exclusion) { - return new Exclusion(exclusion.getGroupId(), exclusion.getArtifactId(), "*", "*"); - } - - private void setArtifactProperties(ArtifactDescriptorResult result, Model model) { - String downloadUrl = null; - DistributionManagement distMgmt = model.getDistributionManagement(); - if (distMgmt != null) { - downloadUrl = distMgmt.getDownloadUrl(); - } - if (downloadUrl != null && !downloadUrl.isEmpty()) { - Artifact artifact = result.getArtifact(); - Map props = new HashMap<>(artifact.getProperties()); - props.put(ArtifactProperties.DOWNLOAD_URL, downloadUrl); - result.setArtifact(artifact.setProperties(props)); - } - } -} diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/DefaultArtifactDescriptorReader.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/DefaultArtifactDescriptorReader.java index 0b2badca84bd..9742fae6e79f 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/DefaultArtifactDescriptorReader.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/DefaultArtifactDescriptorReader.java @@ -18,7 +18,10 @@ */ package org.apache.maven.impl.resolver; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -28,24 +31,37 @@ import org.apache.maven.api.di.Inject; import org.apache.maven.api.di.Named; import org.apache.maven.api.di.Singleton; +import org.apache.maven.api.model.DependencyManagement; +import org.apache.maven.api.model.DistributionManagement; +import org.apache.maven.api.model.License; import org.apache.maven.api.model.Model; +import org.apache.maven.api.model.Prerequisites; +import org.apache.maven.api.model.Repository; import org.apache.maven.api.services.ModelBuilder; import org.apache.maven.api.services.ModelBuilderException; import org.apache.maven.api.services.ModelBuilderRequest; import org.apache.maven.api.services.ModelBuilderResult; import org.apache.maven.api.services.ModelProblem; import org.apache.maven.api.services.ProblemCollector; +import org.apache.maven.api.services.RepositoryFactory; import org.apache.maven.api.services.Sources; import org.apache.maven.api.services.model.ModelResolverException; import org.apache.maven.impl.InternalSession; import org.apache.maven.impl.RequestTraceHelper; import org.apache.maven.impl.model.ModelProblemUtils; +import org.apache.maven.impl.resolver.artifact.MavenArtifactProperties; import org.eclipse.aether.RepositoryEvent; import org.eclipse.aether.RepositoryEvent.EventType; import org.eclipse.aether.RepositoryException; import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.RequestTrace; import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.artifact.ArtifactProperties; +import org.eclipse.aether.artifact.ArtifactType; +import org.eclipse.aether.artifact.ArtifactTypeRegistry; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.graph.Exclusion; import org.eclipse.aether.impl.ArtifactDescriptorReader; import org.eclipse.aether.impl.ArtifactResolver; import org.eclipse.aether.impl.RepositoryEventDispatcher; @@ -77,7 +93,6 @@ public class DefaultArtifactDescriptorReader implements ArtifactDescriptorReader private final RepositoryEventDispatcher repositoryEventDispatcher; private final ModelBuilder modelBuilder; private final Map artifactRelocationSources; - private final ArtifactDescriptorReaderDelegate delegate; private final Logger logger = LoggerFactory.getLogger(getClass()); @Inject @@ -94,7 +109,6 @@ public DefaultArtifactDescriptorReader( Objects.requireNonNull(repositoryEventDispatcher, "repositoryEventDispatcher cannot be null"); this.artifactRelocationSources = Objects.requireNonNull(artifactRelocationSources, "artifactRelocationSources cannot be null"); - this.delegate = new ArtifactDescriptorReaderDelegate(); } @Override @@ -104,15 +118,7 @@ public ArtifactDescriptorResult readArtifactDescriptor( Model model = loadPom(session, request, result); if (model != null) { - Map config = session.getConfigProperties(); - ArtifactDescriptorReaderDelegate delegate = - (ArtifactDescriptorReaderDelegate) config.get(ArtifactDescriptorReaderDelegate.class.getName()); - - if (delegate == null) { - delegate = this.delegate; - } - - delegate.populateResult(InternalSession.from(session), result, model); + populateResult(InternalSession.from(session), result, model); } return result; @@ -331,4 +337,94 @@ private int getPolicy(RepositorySystemSession session, Artifact a, ArtifactDescr } return policy.getPolicy(session, new ArtifactDescriptorPolicyRequest(a, request.getRequestContext())); } + + private void populateResult(InternalSession session, ArtifactDescriptorResult result, Model model) { + ArtifactTypeRegistry stereotypes = session.getSession().getArtifactTypeRegistry(); + + for (Repository repository : model.getRepositories()) { + result.addRepository(session.toRepository( + session.getService(RepositoryFactory.class).createRemote(repository))); + } + + for (org.apache.maven.api.model.Dependency dependency : model.getDependencies()) { + result.addDependency(convert(dependency, stereotypes)); + } + + DependencyManagement dependencyManagement = model.getDependencyManagement(); + if (dependencyManagement != null) { + for (org.apache.maven.api.model.Dependency dependency : dependencyManagement.getDependencies()) { + result.addManagedDependency(convert(dependency, stereotypes)); + } + } + + Map properties = new LinkedHashMap<>(); + + Prerequisites prerequisites = model.getPrerequisites(); + if (prerequisites != null) { + properties.put("prerequisites.maven", prerequisites.getMaven()); + } + + List licenses = model.getLicenses(); + properties.put("license.count", licenses.size()); + for (int i = 0; i < licenses.size(); i++) { + License license = licenses.get(i); + properties.put("license." + i + ".name", license.getName()); + properties.put("license." + i + ".url", license.getUrl()); + properties.put("license." + i + ".comments", license.getComments()); + properties.put("license." + i + ".distribution", license.getDistribution()); + } + + result.setProperties(properties); + + setArtifactProperties(result, model); + } + + private Dependency convert(org.apache.maven.api.model.Dependency dependency, ArtifactTypeRegistry stereotypes) { + ArtifactType stereotype = stereotypes.get(dependency.getType()); + + boolean system = dependency.getSystemPath() != null + && !dependency.getSystemPath().isEmpty(); + + Map properties = null; + if (system) { + properties = Collections.singletonMap(MavenArtifactProperties.LOCAL_PATH, dependency.getSystemPath()); + } + + Artifact artifact = new DefaultArtifact( + dependency.getGroupId(), + dependency.getArtifactId(), + dependency.getClassifier(), + null, + dependency.getVersion(), + properties, + stereotype); + + List exclusions = new ArrayList<>(dependency.getExclusions().size()); + for (org.apache.maven.api.model.Exclusion exclusion : dependency.getExclusions()) { + exclusions.add(convert(exclusion)); + } + + return new Dependency( + artifact, + dependency.getScope(), + dependency.getOptional() != null ? dependency.isOptional() : null, + exclusions); + } + + private Exclusion convert(org.apache.maven.api.model.Exclusion exclusion) { + return new Exclusion(exclusion.getGroupId(), exclusion.getArtifactId(), "*", "*"); + } + + private void setArtifactProperties(ArtifactDescriptorResult result, Model model) { + DistributionManagement distributionManagement = model.getDistributionManagement(); + if (distributionManagement != null) { + String downloadUrl = distributionManagement.getDownloadUrl(); + if (downloadUrl != null && !downloadUrl.isEmpty()) { + Artifact artifact = result.getArtifact(); + Map props = new LinkedHashMap<>(artifact.getProperties()); + props.put(ArtifactProperties.DOWNLOAD_URL, downloadUrl); + result.setArtifact(artifact.setProperties(props)); + } + } + } }