| /******************************************************************************* |
| * Copyright (c) 2010, 2012 Sonatype, Inc. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Sonatype, Inc. - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.aether.ant; |
| |
| 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.eclipse.aether.RepositorySystem; |
| import org.eclipse.aether.RepositorySystemSession; |
| import org.eclipse.aether.artifact.Artifact; |
| import org.eclipse.aether.artifact.DefaultArtifact; |
| import org.eclipse.aether.impl.RemoteRepositoryManager; |
| import org.eclipse.aether.repository.RemoteRepository; |
| import org.eclipse.aether.repository.RepositoryPolicy; |
| import org.eclipse.aether.resolution.ArtifactRequest; |
| import org.eclipse.aether.resolution.ArtifactResolutionException; |
| |
| /** |
| * 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. |
| * |
| */ |
| class AntModelResolver |
| implements ModelResolver |
| { |
| |
| private final RepositorySystemSession session; |
| |
| private final String context; |
| |
| private List<org.eclipse.aether.repository.RemoteRepository> repositories; |
| |
| private final RepositorySystem repoSys; |
| |
| private final RemoteRepositoryManager remoteRepositoryManager; |
| |
| private final Set<String> repositoryIds; |
| |
| public AntModelResolver( RepositorySystemSession session, String context, RepositorySystem repoSys, |
| RemoteRepositoryManager remoteRepositoryManager, List<RemoteRepository> repositories ) |
| { |
| this.session = session; |
| this.context = context; |
| this.repoSys = repoSys; |
| this.remoteRepositoryManager = remoteRepositoryManager; |
| this.repositories = repositories; |
| this.repositoryIds = new HashSet<String>(); |
| } |
| |
| private AntModelResolver( AntModelResolver original ) |
| { |
| this.session = original.session; |
| this.context = original.context; |
| this.repoSys = original.repoSys; |
| 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( convert( repository ) ); |
| |
| this.repositories = |
| remoteRepositoryManager.aggregateRepositories( session, repositories, newRepositories, true ); |
| } |
| |
| static RemoteRepository convert( Repository repository ) |
| { |
| RemoteRepository.Builder builder = |
| new RemoteRepository.Builder( repository.getId(), repository.getLayout(), repository.getUrl() ); |
| builder.setSnapshotPolicy( convert( repository.getSnapshots() ) ); |
| builder.setReleasePolicy( convert( repository.getReleases() ) ); |
| return builder.build(); |
| } |
| |
| private static RepositoryPolicy convert( org.apache.maven.model.RepositoryPolicy policy ) |
| { |
| boolean enabled = true; |
| String checksums = RepositoryPolicy.CHECKSUM_POLICY_WARN; |
| String updates = RepositoryPolicy.UPDATE_POLICY_DAILY; |
| |
| if ( policy != null ) |
| { |
| enabled = policy.isEnabled(); |
| if ( policy.getUpdatePolicy() != null ) |
| { |
| updates = policy.getUpdatePolicy(); |
| } |
| if ( policy.getChecksumPolicy() != null ) |
| { |
| checksums = policy.getChecksumPolicy(); |
| } |
| } |
| |
| return new RepositoryPolicy( enabled, updates, checksums ); |
| } |
| |
| public ModelResolver newCopy() |
| { |
| return new AntModelResolver( 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 ); |
| pomArtifact = repoSys.resolveArtifact( session, request ).getArtifact(); |
| } |
| catch ( ArtifactResolutionException e ) |
| { |
| throw new UnresolvableModelException( "Failed to resolve POM for " + groupId + ":" + artifactId + ":" |
| + version + " due to " + e.getMessage(), groupId, artifactId, version, e ); |
| } |
| |
| File pomFile = pomArtifact.getFile(); |
| |
| return new FileModelSource( pomFile ); |
| } |
| |
| } |