/******************************************************************************* * Copyright (c) 2010, 2014 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.internal.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 ); } }