/*******************************************************************************
* Copyright (c) 2010, 2013 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 com.liferay.ide.maven.core.aether;
import com.liferay.ide.maven.core.LiferayMavenCore;
import com.liferay.ide.maven.core.MavenUtil;
import java.util.List;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.eclipse.aether.DefaultRepositorySystemSession;
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.repository.LocalRepository;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResolutionException;
import org.eclipse.aether.resolution.ArtifactResult;
import org.eclipse.aether.resolution.VersionRangeRequest;
import org.eclipse.aether.resolution.VersionRangeResolutionException;
import org.eclipse.aether.resolution.VersionRangeResult;
import org.eclipse.aether.version.Version;
import org.eclipse.m2e.core.internal.MavenPluginActivator;
/**
* A helper to boot the repository system and a repository system session.
*/
@SuppressWarnings( "restriction" )
public class AetherUtil
{
public static Artifact getLatestAvailableArtifact( final String gavCoords )
{
Artifact retval = null;
final RepositorySystem system = newRepositorySystem();
final RepositorySystemSession session = newRepositorySystemSession( system );
final String latestVersion = AetherUtil.getLatestVersion( gavCoords, system, session );
final String[] gav = gavCoords.split( ":" );
final Artifact defaultArtifact = new DefaultArtifact( gav[0] + ":" + gav[1] + ":" + latestVersion );
ArtifactRequest artifactRequest = new ArtifactRequest();
artifactRequest.setArtifact( defaultArtifact );
artifactRequest.addRepository( newCentralRepository() );
// artifactRequest.addRepository( newLiferayRepository() );
try
{
ArtifactResult artifactResult = system.resolveArtifact( session, artifactRequest );
retval = artifactResult.getArtifact();
}
catch( ArtifactResolutionException e )
{
LiferayMavenCore.logError( "Unable to get latest Liferay archetype", e );
artifactRequest.setArtifact( new DefaultArtifact( gavCoords ) );
try
{
retval = system.resolveArtifact( session, artifactRequest ).getArtifact();
}
catch( ArtifactResolutionException e1 )
{
LiferayMavenCore.logError( "Unable to get default Liferay archetype", e1 );
}
}
if( retval == null )
{
retval = defaultArtifact;
}
return retval;
}
public static String getLatestVersion( String gavCoords, RepositorySystem system, RepositorySystemSession session )
{
String retval = null;
final String[] gav = gavCoords.split( ":" );
if( gav == null || gav.length != 3 )
{
throw new IllegalArgumentException( "gavCoords should be group:artifactId:version" );
}
final Artifact artifact = new DefaultArtifact( gav[0] + ":" + gav[1] + ":[" + gav[2] + ",)" );
final VersionRangeRequest rangeRequest = new VersionRangeRequest();
rangeRequest.setArtifact( artifact );
rangeRequest.addRepository( newCentralRepository() );
// rangeRequest.addRepository( newLiferayRepository() );
try
{
final VersionRangeResult rangeResult = system.resolveVersionRange( session, rangeRequest );
final Version newestVersion = rangeResult.getHighestVersion();
final List<Version> versions = rangeResult.getVersions();
if( versions.size() > 1 && newestVersion.toString().endsWith( "-SNAPSHOT" ) )
{
retval = versions.get( versions.size() - 2 ).toString();
}
else if( newestVersion != null )
{
retval = newestVersion.toString();
}
}
catch( VersionRangeResolutionException e )
{
LiferayMavenCore.logError( "Unable to get latest artifact version.", e );
}
if( retval == null )
{
retval = gav[2];
}
return retval;
}
public static RemoteRepository newCentralRepository()
{
return new RemoteRepository.Builder( "central", "default", "http://repo1.maven.org/maven2/" ).build();
}
public static RemoteRepository newLiferayRepository()
{
return new RemoteRepository.Builder(
"liferay", "default", "https://repository.liferay.com/nexus/content/groups/public/" ).build();
}
public static RepositorySystem newRepositorySystem()
{
return MavenPluginActivator.getDefault().getRepositorySystem();
}
public static DefaultRepositorySystemSession newRepositorySystemSession( RepositorySystem system )
{
DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
LocalRepository localRepo = new LocalRepository( MavenUtil.getLocalRepositoryDir() );
session.setLocalRepositoryManager( system.newLocalRepositoryManager( session, localRepo ) );
session.setTransferListener( new ConsoleTransferListener() );
session.setRepositoryListener( new ConsoleRepositoryListener() );
// uncomment to generate dirty trees
// session.setDependencyGraphTransformer( null );
return session;
}
}