package org.apache.maven.repository.internal; /* * 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. */ import java.io.File; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.maven.model.Repository; import org.apache.maven.model.building.FileModelSource; import org.apache.maven.model.building.ModelSource; import org.apache.maven.model.resolution.InvalidRepositoryException; import org.apache.maven.model.resolution.ModelResolver; import org.apache.maven.model.resolution.UnresolvableModelException; import org.sonatype.aether.RepositorySystemSession; import org.sonatype.aether.RequestTrace; import org.sonatype.aether.artifact.Artifact; import org.sonatype.aether.impl.ArtifactResolver; import org.sonatype.aether.impl.RemoteRepositoryManager; import org.sonatype.aether.repository.RemoteRepository; import org.sonatype.aether.resolution.ArtifactRequest; import org.sonatype.aether.resolution.ArtifactResolutionException; import org.sonatype.aether.util.artifact.DefaultArtifact; /** * A model resolver to assist building of dependency POMs. This resolver gives priority to those repositories that have * been initially specified and repositories discovered in dependency POMs are recessively merged into the search chain. * * @author Benjamin Bentmann * @see DefaultArtifactDescriptorReader */ class DefaultModelResolver implements ModelResolver { private final RepositorySystemSession session; private final RequestTrace trace; private final String context; private List<RemoteRepository> repositories; private final ArtifactResolver resolver; private final RemoteRepositoryManager remoteRepositoryManager; private final Set<String> repositoryIds; public DefaultModelResolver( RepositorySystemSession session, RequestTrace trace, String context, ArtifactResolver resolver, RemoteRepositoryManager remoteRepositoryManager, List<RemoteRepository> repositories ) { this.session = session; this.trace = trace; this.context = context; this.resolver = resolver; this.remoteRepositoryManager = remoteRepositoryManager; this.repositories = repositories; this.repositoryIds = new HashSet<String>(); } private DefaultModelResolver( DefaultModelResolver original ) { this.session = original.session; this.trace = original.trace; this.context = original.context; this.resolver = original.resolver; this.remoteRepositoryManager = original.remoteRepositoryManager; this.repositories = original.repositories; this.repositoryIds = new HashSet<String>( original.repositoryIds ); } public void addRepository( Repository repository ) throws InvalidRepositoryException { if ( !repositoryIds.add( repository.getId() ) ) { return; } List<RemoteRepository> newRepositories = Collections.singletonList( ArtifactDescriptorUtils.toRemoteRepository( repository ) ); this.repositories = remoteRepositoryManager.aggregateRepositories( session, repositories, newRepositories, true ); } public ModelResolver newCopy() { return new DefaultModelResolver( this ); } public ModelSource resolveModel( String groupId, String artifactId, String version ) throws UnresolvableModelException { Artifact pomArtifact = new DefaultArtifact( groupId, artifactId, "", "pom", version ); try { ArtifactRequest request = new ArtifactRequest( pomArtifact, repositories, context ); request.setTrace( trace ); pomArtifact = resolver.resolveArtifact( session, request ).getArtifact(); } catch ( ArtifactResolutionException e ) { throw new UnresolvableModelException( e.getMessage(), groupId, artifactId, version, e ); } File pomFile = pomArtifact.getFile(); return new FileModelSource( pomFile ); } }