package org.codehaus.mojo.versions;
import java.util.Collection;
import java.util.Iterator;
import javax.xml.stream.XMLStreamException;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
import org.apache.maven.model.Dependency;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.codehaus.mojo.versions.api.ArtifactVersions;
import org.codehaus.mojo.versions.api.PomHelper;
import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader;
/**
*
* @author Dan Arcari
* @since 2.3
*/
@Mojo(name = "use-dep-version", requiresProject = true, requiresDirectInvocation = true)
public class UseDepVersionMojo extends AbstractVersionsDependencyUpdaterMojo {
/**
* The exact version to be applied for the included dependencies
*/
@Parameter(property = "depVersion", required = true)
protected String depVersion;
/**
* If set to true, will use whatever version is supplied without attempting to validate that such a version is obtainable from the repository chain.
* @parameter property="forceVersion" required="false" default-value="false"
*/
@Parameter(property = "forceVersion", defaultValue = "false")
protected boolean forceVersion;
@SuppressWarnings("unchecked")
@Override
protected void update(ModifiedPomXMLEventReader pom) throws MojoExecutionException, MojoFailureException,
XMLStreamException, ArtifactMetadataRetrievalException {
if (depVersion == null || depVersion.equals("")) {
throw new IllegalArgumentException("depVersion must be supplied with use-specific-version, and cannot be blank.");
}
if (!forceVersion && !hasIncludes()) {
throw new IllegalArgumentException("The use-specific-version goal is intended to be used with a single artifact. Please specify a value for the 'includes' parameter, or use -DforceVersion=true to override this check.");
}
try {
if (getProject().getDependencyManagement() != null && isProcessingDependencyManagement()) {
useDepVersion(pom, getProject().getDependencyManagement().getDependencies());
}
if (isProcessingDependencies()) {
useDepVersion(pom, getProject().getDependencies());
}
}
catch (ArtifactMetadataRetrievalException e) {
throw new MojoExecutionException( e.getMessage(), e );
}
}
private void useDepVersion(ModifiedPomXMLEventReader pom, Collection<Dependency> dependencies)
throws MojoExecutionException, XMLStreamException, ArtifactMetadataRetrievalException {
Iterator<Dependency> itr = dependencies.iterator();
while (itr.hasNext()) {
Dependency dep = (Dependency)itr.next();
if (isExcludeReactor() && isProducedByReactor(dep)) {
getLog().info( "Ignoring reactor dependency: " + toString(dep));
continue;
}
Artifact artifact = this.toArtifact(dep);
if (isIncluded(artifact)) {
if (!forceVersion) {
ArtifactVersions versions = getHelper().lookupArtifactVersions(artifact, false);
if (!versions.containsVersion(depVersion)) {
throw new MojoExecutionException(String.format("Version %s is not available for artifact %s:%s",
depVersion, artifact.getGroupId(), artifact.getArtifactId()));
}
}
String version = dep.getVersion();
if (PomHelper.setDependencyVersion(pom, dep.getGroupId(), dep.getArtifactId(), version, depVersion)) {
getLog().info("Updated " + toString(dep) + " to version " + depVersion);
}
}
}
}
}