snapshot resolution. commented out due to issues surrounding pom/artifact pairing

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@163692 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Brett Leslie Porter 2005-03-24 14:52:25 +00:00
parent 895de57874
commit 004c6cbdf3
9 changed files with 254 additions and 192 deletions

View File

@ -17,6 +17,7 @@ package org.apache.maven.artifact;
*/
import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
import java.io.File;
import java.util.List;
@ -68,4 +69,8 @@ public interface Artifact
void addMetadata( ArtifactMetadata metadata );
List getMetadataList();
void setRepository( ArtifactRepository remoteRepository );
ArtifactRepository getRepository();
}

View File

@ -17,6 +17,7 @@ package org.apache.maven.artifact;
*/
import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.codehaus.plexus.util.StringUtils;
import java.io.File;
@ -48,6 +49,8 @@ public class DefaultArtifact
private File file;
private ArtifactRepository repository;
/**
* !!! WARNING !!! Never put <classifier/> in the POM. It is for mojo use
* only. Classifier is for specifying derived artifacts, like ejb-client.
@ -133,6 +136,16 @@ public class DefaultArtifact
return file;
}
public ArtifactRepository getRepository()
{
return repository;
}
public void setRepository( ArtifactRepository repository )
{
this.repository = repository;
}
// ----------------------------------------------------------------------
//
// ----------------------------------------------------------------------
@ -172,13 +185,49 @@ public class DefaultArtifact
public int hashCode()
{
return getId().hashCode();
int result = 17;
result = 37 * result + groupId.hashCode();
result = 37 * result + artifactId.hashCode();
result = 37 * result + type.hashCode();
result = 37 * result + version.hashCode();
result = 37 * result + ( classifier != null ? classifier.hashCode() : 0 );
return result;
}
public boolean equals( Object o )
{
Artifact other = (Artifact) o;
if ( o == this )
{
return true;
}
return getId().equals( other.getId() );
if ( !( o instanceof Artifact ) )
{
return false;
}
Artifact a = (Artifact) o;
if ( !a.getGroupId().equals( groupId ) )
{
return false;
}
else if ( !a.getArtifactId().equals( artifactId ) )
{
return false;
}
else if ( !a.getVersion().equals( version ) )
{
return false;
}
else if ( !a.getType().equals( type ) )
{
return false;
}
else if ( classifier == null ? a.getClassifier() != null : !a.getClassifier().equals( classifier ) )
{
return false;
}
return true;
}
}

View File

@ -168,7 +168,7 @@ public class DefaultWagonManager
}
public void getArtifact( Artifact artifact, List remoteRepositories, File destination )
throws TransferFailedException
throws TransferFailedException, ResourceDoesNotExistException
{
// TODO [BP]: The exception handling here needs some work
boolean successful = false;
@ -176,20 +176,9 @@ public class DefaultWagonManager
{
ArtifactRepository repository = (ArtifactRepository) iter.next();
String remotePath = null;
try
{
remotePath = repository.pathOf( artifact );
}
catch ( ArtifactPathFormatException e )
{
// TODO may be more appropriate to propogate the APFE
throw new TransferFailedException( "Failed to determine path for artifact", e );
}
try
{
getRemoteFile( repository, destination, remotePath );
getArtifact( artifact, repository, destination );
successful = true;
}
@ -204,10 +193,27 @@ public class DefaultWagonManager
if ( !successful )
{
throw new TransferFailedException( "Unable to download the artifact from any repository" );
throw new ResourceDoesNotExistException( "Unable to download the artifact from any repository" );
}
}
public void getArtifact( Artifact artifact, ArtifactRepository repository, File destination )
throws TransferFailedException, ResourceDoesNotExistException
{
String remotePath = null;
try
{
remotePath = repository.pathOf( artifact );
}
catch ( ArtifactPathFormatException e )
{
// TODO may be more appropriate to propogate the APFE
throw new TransferFailedException( "Failed to determine path for artifact", e );
}
getRemoteFile( repository, destination, remotePath );
}
public void getArtifactMetadata( ArtifactMetadata metadata, ArtifactRepository remoteRepository, File destination )
throws TransferFailedException, ResourceDoesNotExistException
{

View File

@ -40,7 +40,10 @@ public interface WagonManager
throws UnsupportedProtocolException;
void getArtifact( Artifact artifact, List remoteRepositories, File destination )
throws TransferFailedException;
throws TransferFailedException, ResourceDoesNotExistException;
public void getArtifact( Artifact artifact, ArtifactRepository repository, File destination )
throws TransferFailedException, ResourceDoesNotExistException;
void putArtifact( File source, Artifact artifact, ArtifactRepository deploymentRepository )
throws TransferFailedException;

View File

@ -40,6 +40,7 @@ import java.util.TimeZone;
*/
public class SnapshotArtifactMetadata
extends AbstractArtifactMetadata
implements Comparable
{
private String timestamp = null;
@ -58,6 +59,19 @@ public class SnapshotArtifactMetadata
super( artifact, filename );
}
public static SnapshotArtifactMetadata readLocalSnapshotMetadata( Artifact artifact,
ArtifactRepository localRepository )
throws ArtifactPathFormatException, IOException
{
SnapshotArtifactMetadata metadata = new SnapshotArtifactMetadata( artifact, SNAPSHOT_VERSION_LOCAL_FILE );
File f = metadata.getLocalRepositoryLocation( localRepository );
if ( f.exists() )
{
metadata.readFromFile( f );
}
return metadata;
}
public static SnapshotArtifactMetadata createLocalSnapshotMetadata( Artifact artifact )
{
return new SnapshotArtifactMetadata( artifact, SNAPSHOT_VERSION_LOCAL_FILE );
@ -77,7 +91,7 @@ public class SnapshotArtifactMetadata
{
timestamp = getUtcDateFormatter().format( new Date() );
}
String path = new File( localRepository.getBasedir(), localRepository.pathOfMetadata( this ) ).getPath();
String path = getLocalRepositoryLocation( localRepository ).getPath();
FileUtils.fileWrite( path, getVersion() );
}
catch ( IOException e )
@ -90,6 +104,12 @@ public class SnapshotArtifactMetadata
}
}
private File getLocalRepositoryLocation( ArtifactRepository localRepository )
throws ArtifactPathFormatException
{
return new File( localRepository.getBasedir(), localRepository.pathOfMetadata( this ) );
}
public String getVersion()
{
String version = artifact.getVersion();
@ -122,17 +142,7 @@ public class SnapshotArtifactMetadata
return;
}
String version = FileUtils.fileRead( destination );
int index = version.lastIndexOf( "-" );
timestamp = version.substring( 0, index );
buildNumber = Integer.valueOf( version.substring( index + 1 ) ).intValue();
index = version.indexOf( "-" );
if ( index >= 0 )
{
// ignore starting version part, will be prepended later
timestamp = timestamp.substring( index + 1 );
}
readFromFile( destination );
}
catch ( TransferFailedException e )
{
@ -144,6 +154,22 @@ public class SnapshotArtifactMetadata
}
}
private void readFromFile( File destination )
throws IOException
{
String version = FileUtils.fileRead( destination );
int index = version.lastIndexOf( "-" );
timestamp = version.substring( 0, index );
buildNumber = Integer.valueOf( version.substring( index + 1 ) ).intValue();
index = version.indexOf( "-" );
if ( index >= 0 )
{
// ignore starting version part, will be prepended later
timestamp = timestamp.substring( index + 1 );
}
}
public String getTimestamp()
{
return timestamp;
@ -161,4 +187,23 @@ public class SnapshotArtifactMetadata
this.buildNumber++;
timestamp = getUtcDateFormatter().format( new Date() );
}
public int compareTo( Object o )
{
SnapshotArtifactMetadata metadata = (SnapshotArtifactMetadata) o;
if ( buildNumber > metadata.buildNumber )
{
return 1;
}
else if ( timestamp == null )
{
return -1;
}
else
{
return timestamp.compareTo( metadata.timestamp );
}
}
}

View File

@ -20,12 +20,14 @@ import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.construction.ArtifactConstructionSupport;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.apache.maven.artifact.manager.WagonManager;
import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.layout.ArtifactPathFormatException;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.artifact.transform.ArtifactTransformation;
import org.apache.maven.wagon.ResourceDoesNotExistException;
import org.apache.maven.wagon.TransferFailedException;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.logging.Logger;
@ -81,7 +83,14 @@ public class DefaultArtifactResolver
for ( Iterator i = artifactTransformations.iterator(); i.hasNext(); )
{
ArtifactTransformation transform = (ArtifactTransformation) i.next();
artifact = transform.transformForResolve( artifact );
try
{
artifact = transform.transformForResolve( artifact, remoteRepositories, localRepository );
}
catch ( ArtifactMetadataRetrievalException e )
{
throw new ArtifactResolutionException( "Unable to transform artifact", e );
}
}
String localPath;
@ -105,11 +114,34 @@ public class DefaultArtifactResolver
try
{
wagonManager.getArtifact( artifact, remoteRepositories, destination );
if ( artifact.getRepository() != null )
{
// the transformations discovered the artifact - so use it exclusively
wagonManager.getArtifact( artifact, artifact.getRepository(), destination );
}
else
{
wagonManager.getArtifact( artifact, remoteRepositories, destination );
}
// must be after the artifact is downloaded
for ( Iterator i = artifact.getMetadataList().iterator(); i.hasNext(); )
{
ArtifactMetadata metadata = (ArtifactMetadata) i.next();
metadata.storeInLocalRepository( localRepository );
}
}
catch ( ResourceDoesNotExistException e )
{
throw new ArtifactResolutionException( artifactNotFound( localPath, remoteRepositories ), e );
}
catch ( TransferFailedException e )
{
throw new ArtifactResolutionException( artifactNotFound( localPath, remoteRepositories ), e );
throw new ArtifactResolutionException( "Error downloading artifact " + artifact, e );
}
catch ( ArtifactMetadataRetrievalException e )
{
throw new ArtifactResolutionException( "Error downloading artifact " + artifact, e );
}
return artifact;

View File

@ -20,6 +20,8 @@ import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
import org.apache.maven.artifact.repository.ArtifactRepository;
import java.util.List;
/**
* @author <a href="mailto:jason@maven.org">Jason van Zyl </a>
* @version $Id: ArtifactTransformation.java,v 1.1 2005/03/03 15:37:25
@ -33,10 +35,14 @@ public interface ArtifactTransformation
* Take in a artifact and return the transformed artifact for locating in the remote repository. If no
* transformation has occured the original artifact is returned.
*
* @param artifact Artifact to be transformed.
* @param artifact Artifact to be transformed.
* @param remoteRepositories the repositories to check
* @param localRepository the local repository
* @return The transformed Artifact
*/
Artifact transformForResolve( Artifact artifact );
public Artifact transformForResolve( Artifact artifact, List remoteRepositories,
ArtifactRepository localRepository )
throws ArtifactMetadataRetrievalException;
/**
* Take in a artifact and return the transformed artifact for locating in the local repository. If no

View File

@ -24,8 +24,10 @@ import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
import org.apache.maven.artifact.metadata.SnapshotArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/**
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
@ -38,165 +40,74 @@ public class SnapshotTransformation
{
private WagonManager wagonManager;
/* TODO: use and remove
public Artifact transform( Artifact artifact, ArtifactRepository localRepository, List repositories,
Map parameters )
throws Exception
/**
* @todo very primitve. Probably we can resolvedArtifactCache artifacts themselves in a central location, as well as reset the flag over time in a long running process.
*/
private static Set resolvedArtifactCache = new HashSet();
public Artifact transformForResolve( Artifact artifact, List remoteRepositories,
ArtifactRepository localRepository )
throws ArtifactMetadataRetrievalException
{
Date localVersion = getLocalVersion( artifact, localRepository );
Date remoteVersion = getRemoteVersion( artifact, repositories, localRepository );
if ( remoteVersion != null )
if ( isSnapshot( artifact ) && !alreadyResolved( artifact ) )
{
//if local version is unknown (null) it means that
//we don't have this file locally. so we will be happy
// to have any snapshot.
// we wil download in two cases:
// a) we don't have any snapot in local repo
// b) we have found newer version in remote repository
if ( localVersion == null || localVersion.before( remoteVersion ) )
// TODO: this mostly works, however...
// - poms and jars are different, so both are checked individually
// - when a pom is downloaded, it prevents the JAR getting downloaded because of the timestamp
// - need to gather first, group them all up by groupId/artifactId, then go after them
/*
SnapshotArtifactMetadata localMetadata;
try
{
// here we know that we have artifact like foo-1.2-SNAPSHOT.jar
// and the remote timestamp is something like 20010304.121212
// so we might as well fetch foo-1.2-20010304.121212.jar
// but we are just going to fetch foo-1.2-SNAPSHOT.jar.
// We can change the strategy which is used here later on
localMetadata = SnapshotArtifactMetadata.readLocalSnapshotMetadata( artifact, localRepository );
}
catch ( ArtifactPathFormatException e )
{
throw new ArtifactMetadataRetrievalException( "Error reading local metadata", e );
}
catch ( IOException e )
{
throw new ArtifactMetadataRetrievalException( "Error reading local metadata", e );
}
// @todo we will delete old file first.
//it is not really a right thing to do. Artifact Dowloader
// should
// fetch to temprary file and replace the old file with the new
// one once download was finished
boolean foundRemote = false;
for ( Iterator i = remoteRepositories.iterator(); i.hasNext(); )
{
ArtifactRepository remoteRepository = (ArtifactRepository) i.next();
artifact.getFile().delete();
SnapshotArtifactMetadata remoteMetadata = SnapshotArtifactMetadata.createRemoteSnapshotMetadata(
artifact );
remoteMetadata.retrieveFromRemoteRepository( remoteRepository, wagonManager );
artifactResolver.resolve( artifact, repositories, localRepository );
File snapshotVersionFile = getSnapshotVersionFile( artifact, localRepository );
String timestamp = getTimestamp( remoteVersion );
// delete old one
if ( snapshotVersionFile.exists() )
if ( remoteMetadata.compareTo( localMetadata ) > 0 )
{
snapshotVersionFile.delete();
// TODO: investigate transforming this in place, in which case resolve can return void
artifact = createArtifactCopy( artifact, remoteMetadata );
artifact.setRepository( remoteRepository );
localMetadata = remoteMetadata;
foundRemote = true;
}
FileUtils.fileWrite( snapshotVersionFile.getPath(), timestamp );
}
}
if ( foundRemote )
{
artifact.addMetadata( localMetadata );
}
*/
resolvedArtifactCache.add( getCacheKey( artifact ) );
}
return artifact;
}
private File getSnapshotVersionFile( Artifact artifact, ArtifactRepository localRepository )
private boolean alreadyResolved( Artifact artifact )
{
return null;
//return new File( localRepository.fullArtifactPath( artifact ) );
return resolvedArtifactCache.contains( getCacheKey( artifact ) );
}
private Date getRemoteVersion( Artifact artifact, List remoteRepositories, ArtifactRepository localRepository )
throws Exception
private static String getCacheKey( Artifact artifact )
{
Date retValue = null;
artifactResolver.resolve( artifact, remoteRepositories, localRepository );
String timestamp = FileUtils.fileRead( artifact.getPath() );
retValue = parseTimestamp( timestamp );
return retValue;
}
private Date getLocalVersion( Artifact artifact, ArtifactRepository localRepository )
{
//assert artifact.exists();
Date retValue = null;
try
{
File file = getSnapshotVersionFile( artifact, localRepository );
if ( file.exists() )
{
String timestamp = FileUtils.fileRead( file );
retValue = parseTimestamp( timestamp );
}
}
catch ( Exception e )
{
// ignore
}
if ( retValue == null )
{
//try "traditional method" used in maven1 for obtaining snapshot
// version
File file = artifact.getFile();
if ( file.exists() )
{
retValue = new Date( file.lastModified() );
//@todo we should "normalize" the time.
//
// TimeZone gmtTimeZone = TimeZone.getTimeZone( "GMT" );
// TimeZone userTimeZone = TimeZone.getDefault(); long diff =
//
}
}
return retValue;
}
private final static String DATE_FORMAT = "yyyyMMdd.HHmmss";
private static SimpleDateFormat getFormatter()
{
SimpleDateFormat formatter = new SimpleDateFormat( DATE_FORMAT );
formatter.setTimeZone( TimeZone.getTimeZone( "GMT" ) );
return formatter;
}
public static String getTimestamp()
{
Date now = new Date();
SimpleDateFormat formatter = getFormatter();
String retValue = formatter.format( now );
return retValue;
}
public static Date parseTimestamp( String timestamp )
throws ParseException
{
Date retValue = getFormatter().parse( timestamp );
return retValue;
}
public static String getTimestamp( Date snapshotVersion )
{
String retValue = getFormatter().format( snapshotVersion );
return retValue;
}
*/
public Artifact transformForResolve( Artifact artifact )
{
// TODO: implement
return artifact;
return artifact.getConflictId();
}
public Artifact transformForInstall( Artifact artifact, ArtifactRepository localRepository )
@ -221,20 +132,26 @@ public class SnapshotTransformation
// TODO: note, we could currently transform this in place, as it is only used through the deploy mojo,
// which creates the artifact and then disposes of it
List list = artifact.getMetadataList();
artifact = new DefaultArtifact( artifact.getGroupId(), artifact.getArtifactId(), metadata.getVersion(),
artifact.getScope(), artifact.getType(), artifact.getClassifier() );
for ( Iterator i = list.iterator(); i.hasNext(); )
{
ArtifactMetadata m = (ArtifactMetadata) i.next();
m.setArtifact( artifact );
artifact.addMetadata( m );
}
artifact = createArtifactCopy( artifact, metadata );
artifact.addMetadata( metadata );
}
return artifact;
}
private Artifact createArtifactCopy( Artifact artifact, SnapshotArtifactMetadata metadata )
{
List list = artifact.getMetadataList();
artifact = new DefaultArtifact( artifact.getGroupId(), artifact.getArtifactId(), metadata.getVersion(),
artifact.getScope(), artifact.getType(), artifact.getClassifier() );
for ( Iterator i = list.iterator(); i.hasNext(); )
{
ArtifactMetadata m = (ArtifactMetadata) i.next();
m.setArtifact( artifact );
artifact.addMetadata( m );
}
return artifact;
}
private static boolean isSnapshot( Artifact artifact )
{
return artifact.getVersion().endsWith( "SNAPSHOT" );

View File

@ -159,10 +159,10 @@ public class DefaultPluginManager
MojoDescriptor mojoDescriptor = mavenMojoDescriptor.getMojoDescriptor();
mojoDescriptors.put( mojoDescriptor.getId(), mojoDescriptor );
String key = constructPluginKey( pluginDescriptor.getGroupId(), pluginDescriptor.getArtifactId() );
pluginDescriptors.put( key, pluginDescriptor );
}
String key = constructPluginKey( pluginDescriptor.getGroupId(), pluginDescriptor.getArtifactId() );
pluginDescriptors.put( key, pluginDescriptor );
}
// ----------------------------------------------------------------------
@ -267,9 +267,8 @@ public class DefaultPluginManager
artifactFactory = (ArtifactFactory) container.lookup( ArtifactFactory.ROLE );
Artifact pluginArtifact = artifactFactory.createArtifact( AbstractPlugin.getDefaultPluginGroupId(),
artifactId, version, null, MAVEN_PLUGIN,
null );
Artifact pluginArtifact = artifactFactory.createArtifact( groupId, artifactId, version, null,
MAVEN_PLUGIN, null );
addPlugin( pluginArtifact, session );
}