long totalTransferred = 0;
try
{
transfer.setState( State.ACTIVE );
resource = newResource( transfer, repository );
DefaultTransferEvent event = newEvent( transfer );
catapult.fireInitiated( event );
File baseDir = new File( PathUtils.basedir( repository.getUrl() ) );
File localFile = transfer.getFile();
File repoFile = new File( baseDir, transfer.getRelativePath() );
File src = null;
switch ( direction )
{
case UPLOAD:
src = localFile;
target = repoFile;
break;
case DOWNLOAD:
src = repoFile;
target = localFile;
break;
}
if ( transfer.isExistenceCheck() )
{
if ( !src.exists() )
{
throw new FileNotFoundException( src.getAbsolutePath() );
}
}
else
{
File tmp = tmpfile( target );
totalTransferred = copy( src, tmp );
fileProcessor.move( tmp, target );
switch ( direction )
{
case UPLOAD:
writeChecksum( src, target.getPath() );
break;
case DOWNLOAD:
verifyChecksum( src );
break;
}
}
}
catch ( FileNotFoundException e )
{
switch ( transfer.getType() )
{
case ARTIFACT:
ArtifactTransferException artEx;
if ( Direction.DOWNLOAD.equals( direction ) )
{
artEx = new ArtifactNotFoundException( transfer.getArtifact(), repository );
}
else
{
artEx = new ArtifactTransferException( transfer.getArtifact(), repository, e );
}
transfer.setException( artEx );
break;
case METADATA:
MetadataTransferException mdEx;
if ( Direction.DOWNLOAD.equals( direction ) )
{
mdEx = new MetadataNotFoundException( transfer.getMetadata(), repository );
}
else
{
mdEx = new MetadataTransferException( transfer.getMetadata(), repository, e );
}
transfer.setException( mdEx );
break;
}
}
catch ( Throwable t )
{
logger.debug( t.getMessage(), t );
switch ( transfer.getType() )
{
case ARTIFACT:
transfer.setException( new ArtifactTransferException( transfer.getArtifact(), repository, t ) );
break;
case METADATA:
transfer.setException( new MetadataTransferException( transfer.getMetadata(), repository, t ) );
break;
}
}
finally
{
transfer.setState( State.DONE );
if ( transfer.getException() == null )
{
DefaultTransferEvent event = newEvent( transfer );
event.setTransferredBytes( (int) totalTransferred );
catapult.fireSucceeded( event );
}
else
{
// cleanup
if ( direction.equals( Direction.UPLOAD ) )
{
for ( String ext : checksumAlgos.values() )
{
new File( target.getPath() + ext ).delete();
}
}
if ( target != null )
{
target.delete();
}
DefaultTransferEvent event = newEvent( transfer );
catapult.fireFailed( event );
}
}
}