// ========================================================================
// $Id: RuntimeDependencyResolver.java 397 2006-03-23 18:44:41Z janb $
// Copyright 2000-2004 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// Licensed 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.
// ========================================================================
//
// File modified by William Bernardet for the japi-checker project.
//
package com.googlecode.japi.checker.maven.plugin;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.logging.Logger;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.artifact.resolver.ResolutionListener;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.artifact.InvalidDependencyVersionException;
import org.apache.maven.project.artifact.MavenMetadataSource;
/**
* RuntimeDependencyResolver
* This class is able to pull down a remote pom, find all of it's
* dependencies and transitively resolve them.
*/
public class RuntimeDependencyResolver {
private static Logger LOGGER = Logger.getLogger(RuntimeDependencyResolver.class.getCanonicalName());
private ArtifactFactory artifactFactory;
private ArtifactResolver artifactResolver;
private ArtifactMetadataSource metadataSource;
private ArtifactRepository localRepository;
private List<ArtifactRepository> remoteRepositories;
/**
* RuntimeResolutionListener
* Just for debug printing of transitive resolution steps
*/
static class RuntimeResolutionListener implements ResolutionListener {
public void testArtifact(Artifact arg0) {
}
public void startProcessChildren(Artifact arg0) {
}
public void endProcessChildren(Artifact arg0) {
}
public void includeArtifact(Artifact arg0) {
}
public void omitForNearer(Artifact arg0, Artifact arg1) {
}
public void updateScope(Artifact arg0, String arg1) {
}
public void manageArtifact(Artifact arg0, Artifact arg1) {
}
public void omitForCycle(Artifact arg0) {
}
public void updateScopeCurrentPom(Artifact arg0, String arg1) {
}
public void selectVersionFromRange(Artifact arg0) {
}
public void restrictRange(Artifact arg0, Artifact arg1, VersionRange arg2) {
}
}
public RuntimeDependencyResolver(ArtifactFactory artifactFactory, ArtifactResolver artifactResolver,
ArtifactMetadataSource metadataSource, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories) {
this.artifactFactory = artifactFactory;
this.artifactResolver = artifactResolver;
this.metadataSource = metadataSource;
this.localRepository = localRepository;
this.remoteRepositories = new ArrayList<ArtifactRepository>();
if (remoteRepositories != null) {
this.remoteRepositories.addAll(remoteRepositories);
}
}
/**
* Download (if necessary) a pom, and load it as a MavenProject, transitively resolving any
* dependencies therein.
*
* @param projectBuilder
* @param groupId
* @param artifactId
* @param versionId
* @return a Set of Artifacts representing the transitively resolved dependencies.
* @throws MalformedURLException
* @throws ProjectBuildingException
* @throws InvalidDependencyVersionException
* @throws ArtifactResolutionException
* @throws ArtifactNotFoundException
*/
public Set<Artifact> transitivelyResolvePomDependencies(MavenProjectBuilder projectBuilder, String groupId,
String artifactId, String versionId, boolean resolveProjectArtifact) throws MalformedURLException,
ProjectBuildingException, InvalidDependencyVersionException, ArtifactResolutionException,
ArtifactNotFoundException {
Artifact pomArtifact = getPomArtifact(groupId, artifactId, versionId);
MavenProject project = loadPomAsProject(projectBuilder, pomArtifact);
@SuppressWarnings("rawtypes")
List dependencies = project.getDependencies();
@SuppressWarnings("unchecked")
Set<Artifact> dependencyArtifacts = MavenMetadataSource.createArtifacts(artifactFactory, dependencies, null, null, null);
dependencyArtifacts.add(project.getArtifact());
@SuppressWarnings("rawtypes")
List listeners = Collections.EMPTY_LIST;
ArtifactResolutionResult result =
artifactResolver.resolveTransitively(dependencyArtifacts, pomArtifact, Collections.EMPTY_MAP,
localRepository, remoteRepositories, metadataSource, null, listeners);
@SuppressWarnings("unchecked")
Set<Artifact> artifacts = result.getArtifacts();
LOGGER.fine("RESOLVED " + artifacts.size() + " ARTIFACTS");
Iterator<Artifact> itor = artifacts.iterator();
while (itor.hasNext()) {
Artifact a = (Artifact) itor.next();
LOGGER.fine(a.getFile().toURI().toURL().toString());
}
return artifacts;
}
public MavenProject loadPomAsProject(MavenProjectBuilder projectBuilder, Artifact pomArtifact)
throws ProjectBuildingException {
return projectBuilder.buildFromRepository(pomArtifact, remoteRepositories, localRepository);
}
public Artifact getArtifact(String groupId, String artifactId, String versionId, String type) {
return this.artifactFactory.createBuildArtifact(groupId, artifactId, versionId, type);
}
public Artifact getPomArtifact(String groupId, String artifactId, String versionId) {
return this.artifactFactory.createBuildArtifact(groupId, artifactId, versionId, "pom");
}
public void removeDependency(Set<Artifact> artifacts, String groupId, String artifactId, String versionId, String type) {
if ((artifacts == null) || artifacts.isEmpty())
return;
Iterator<Artifact> itor = artifacts.iterator();
while (itor.hasNext()) {
Artifact a = (Artifact) itor.next();
if (a.getGroupId().equals(groupId) && a.getArtifactId().equals(artifactId) && a.getType().equals(type)) {
// remove if the versions match, or there was no version specified
if (versionId == null)
itor.remove();
else if (a.getVersion().equals(versionId))
itor.remove();
}
}
}
public void addDependency(Set<Artifact> artifacts, String groupId, String artifactId, String versionId, String type)
throws ArtifactResolutionException, ArtifactNotFoundException {
Artifact a = getArtifact(groupId, artifactId, versionId, type);
artifactResolver.resolve(a, remoteRepositories, localRepository);
artifacts.add(a);
}
}