/** * Copyright 2015-2017 Linagora, Université Joseph Fourier, Floralis * * The present code is developed in the scope of the joint LINAGORA - * Université Joseph Fourier - Floralis research program and is designated * as a "Result" pursuant to the terms and conditions of the LINAGORA * - Université Joseph Fourier - Floralis research program. Each copyright * holder of Results enumerated here above fully & independently holds complete * ownership of the complete Intellectual Property rights applicable to the whole * of said Results, and may freely exploit it in any manner which does not infringe * the moral rights of the other copyright holders. * * 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.roboconf.core.utils; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author Vincent Zurczak - Linagora */ public final class MavenUtils { /** * Private empty constructor. */ private MavenUtils() { // nothing } /** * Finds the URL of a Roboconf (JAR) Maven artifact. * @param artifactId an artifact ID (not null) * @param version a version (not null) * @return an URL if the resolution worked, null if it was not found * @throws IOException */ public static String findMavenUrlForRoboconf( String artifactId, String version ) throws IOException { return findMavenUrl( "net.roboconf", artifactId, version, "jar" ); } /** * Finds the URL of a Maven artifact. * <p> * This method first tries to find the artifact locally (under ~/.m2). * If it does not find the artifact, it then tries to get it from the Sonatype * API. * </p> * * @param groupId a group ID (not null) * @param artifactId an artifact ID (not null) * @param version a version (not null) * @param extension an extension (not null) * @return an URL if the resolution worked, null if it was not found * @throws IOException */ public static String findMavenUrl( String groupId, String artifactId, String version, String extension ) throws IOException { Logger logger = Logger.getLogger( MavenUtils.class.getName()); String result = null; // 1. Search in the local Maven repository // We assume it is under ~/.m2/repository. // FIXME: we could extract the localRepository parameter... File defaultRepo = new File( System.getProperty( "user.home" ), ".m2/repository" ); if( defaultRepo.exists()) { String fixedVersion = version.replaceAll( "(?i)-snapshot", "-SNAPSHOT" ); StringBuilder sb = new StringBuilder(); sb.append( groupId.replace( '.', '/' )); sb.append( "/" ); sb.append( artifactId ); sb.append( "/" ); sb.append( fixedVersion ); sb.append( "/" ); sb.append( artifactId ); sb.append( "-" ); sb.append( fixedVersion ); sb.append( "." ); sb.append( extension ); File localFile = new File( defaultRepo, sb.toString()); if( localFile.exists()) result = localFile.toURI().toString(); else logger.fine( "Maven resolution: " + localFile + " does not exist (no local artifact)." ); } // 2. Rely on Sonatype if( result == null ) { StringBuilder requestUrl = new StringBuilder(); requestUrl.append( "https://oss.sonatype.org/service/local/artifact/maven/resolve?r=" ); requestUrl.append( version.toLowerCase().endsWith( "-snapshot" ) ? "snapshots" : "releases" ); requestUrl.append( "&g=" ); requestUrl.append( groupId ); requestUrl.append( "&a=" ); requestUrl.append( artifactId ); requestUrl.append( "&v=" ); requestUrl.append( version ); requestUrl.append( "&p=" ); requestUrl.append( extension ); logger.fine( "Maven resolution: requesting the address from " + requestUrl ); URL url = new URL( requestUrl.toString()); ByteArrayOutputStream os = new ByteArrayOutputStream(); Utils.copyStreamSafely( url.openStream(), os ); Pattern p = Pattern.compile( "<repositoryPath>(.*)</repositoryPath>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL ); Matcher m = p.matcher( os.toString( "UTF-8" )); if( m.find()) { StringBuilder sb = new StringBuilder(); sb.append( "https://oss.sonatype.org/content/repositories/" ); sb.append( version.toLowerCase().endsWith( "-snapshot" ) ? "snapshots/" : "releases/" ); sb.append( m.group( 1 )); result = sb.toString(); } } logger.fine( "Maven resolution: the final artifact location is " + result ); return result; } }