GetLatestVersionMojo.java
/*
* Copyright 2013 1&1.
*
* 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.
*/
package net.oneandone.maven.plugins.attachqars;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.IOUtil;
/**
* Retrieves the latest version of the project from Artifactory and put it into a property
* for later usage in other plugins.
*
* <p>Similar to the
* <a href="http://mojo.codehaus.org/buildnumber-maven-plugin/create-mojo.html">
* <tt>buildnumber:create</tt></a> Mojo.
* Invokes something like
* <tt>http://host/artifactory/api/search/latestVersion?reposname=repo1&g=commons-logging&a=commons-logging&remote=1</tt>.
* For more information take a look at the documention of the
* <a href="http://wiki.jfrog.org/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-ArtifactLatestVersionSearch">
* REST-API</a> of Artifactory.</p>
*
* @author Mirko Friedenhagen
*/
@Mojo(name = "latest-version", aggregator = false, defaultPhase = LifecyclePhase.INSTALL)
public class GetLatestVersionMojo extends AbstractMojo {
/**
* The Maven project.
*/
@Parameter(defaultValue = "${project}", readonly = true)
private final MavenProject project;
/**
* URI pointing to Artifactory, e.g. http://localhost:8081/artifactory/.
*/
@Parameter(property = "attach-qar.artifactory-uri", required = true)
private final URI artifactoryUri;
/**
* Name of the property holding the latest version from the repository.
*/
@Parameter(defaultValue = "latestVersionFromRepository", property = "attach-qar.latest-version-property-name",
required = true)
private final String latestVersionPropertyName;
/**
* Name of the repository for resolution of the latest version.
*/
@Parameter(defaultValue = "libs-release-local", property = "attach-qar.repos-name", required = true)
private final String reposName;
/**
* Constructor for tests.
*
* @param project to inspect.
* @param artifactoryUri see {@link GetLatestVersionMojo#artifactoryUri}.
* @param reposName see {@link GetLatestVersionMojo#reposName}.
*/
GetLatestVersionMojo(MavenProject project, URI artifactoryUri, String reposName) {
this.project = project;
this.artifactoryUri = artifactoryUri;
this.reposName = reposName;
this.latestVersionPropertyName = "latestVersionFromRepository";
}
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
final String groupId = project.getGroupId();
final String artifactId = project.getArtifactId();
final URI searchUri = createUri(groupId, artifactId);
try {
final URL searchUrl = searchUri.toURL();
final HttpURLConnection openConnection = openConnection(searchUrl);
final InputStream in = openConnection.getInputStream();
try {
project.getProperties().setProperty(latestVersionPropertyName, IOUtil.toString(in));
} finally {
in.close();
}
} catch (MalformedURLException ex) {
throw new MojoFailureException("Could not convert " + searchUri + " to URL", ex);
} catch (IOException ex) {
throw new MojoExecutionException("Could not fetch latestVersion: " + searchUri, ex);
}
}
/**
* Creates the search URI.
*
* @param groupId of the project.
* @param artifactId of the project.
* @return complete search URI.
*/
URI createUri(final String groupId, final String artifactId) {
final String searchPart =
"api/search/latestVersion?repos=" + reposName + "&g=" + groupId + "&a=" + artifactId + "&remote=1";
if (artifactoryUri.getPath().endsWith("/")) {
return artifactoryUri.resolve(searchPart);
} else {
return URI.create(artifactoryUri.toString() + "/").resolve(searchPart);
}
}
/**
* Open a connection, used for tests.
* @param searchUrl to connect to.
* @return connection.
* @throws IOException when the connection could not be opened.
*/
HttpURLConnection openConnection(final URL searchUrl) throws IOException {
return (HttpURLConnection) searchUrl.openConnection();
}
}