{
// check parameters
String userName = getAuditInformation().getUser().getUsername();
if ( StringUtils.isBlank( userName ) )
{
throw new ArchivaRestServiceException( "copyArtifact call: userName not found" );
}
if ( StringUtils.isBlank( artifactTransferRequest.getRepositoryId() ) )
{
throw new ArchivaRestServiceException( "copyArtifact call: sourceRepositoryId cannot be null" );
}
if ( StringUtils.isBlank( artifactTransferRequest.getTargetRepositoryId() ) )
{
throw new ArchivaRestServiceException( "copyArtifact call: targetRepositoryId cannot be null" );
}
ManagedRepository source = null;
try
{
source = managedRepositoryAdmin.getManagedRepository( artifactTransferRequest.getRepositoryId() );
}
catch ( RepositoryAdminException e )
{
throw new ArchivaRestServiceException( e.getMessage() );
}
if ( source == null )
{
throw new ArchivaRestServiceException(
"cannot find repository with id " + artifactTransferRequest.getRepositoryId() );
}
ManagedRepository target = null;
try
{
target = managedRepositoryAdmin.getManagedRepository( artifactTransferRequest.getTargetRepositoryId() );
}
catch ( RepositoryAdminException e )
{
throw new ArchivaRestServiceException( e.getMessage() );
}
if ( target == null )
{
throw new ArchivaRestServiceException(
"cannot find repository with id " + artifactTransferRequest.getTargetRepositoryId() );
}
if ( StringUtils.isBlank( artifactTransferRequest.getGroupId() ) )
{
throw new ArchivaRestServiceException( "groupId is mandatory" );
}
if ( StringUtils.isBlank( artifactTransferRequest.getArtifactId() ) )
{
throw new ArchivaRestServiceException( "artifactId is mandatory" );
}
if ( StringUtils.isBlank( artifactTransferRequest.getVersion() ) )
{
throw new ArchivaRestServiceException( "version is mandatory" );
}
if ( VersionUtil.isSnapshot( artifactTransferRequest.getVersion() ) )
{
throw new ArchivaRestServiceException( "copy of SNAPSHOT not supported" );
}
// end check parameters
User user = null;
try
{
user = securitySystem.getUserManager().findUser( userName );
}
catch ( UserNotFoundException e )
{
throw new ArchivaRestServiceException( "user " + userName + " not found" );
}
// check karma on source : read
AuthenticationResult authn = new AuthenticationResult( true, userName, null );
SecuritySession securitySession = new DefaultSecuritySession( authn, user );
try
{
boolean authz =
securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS,
artifactTransferRequest.getRepositoryId() );
if ( !authz )
{
throw new ArchivaRestServiceException(
"not authorized to access repo:" + artifactTransferRequest.getRepositoryId() );
}
}
catch ( AuthorizationException e )
{
log.error( "error reading permission: " + e.getMessage(), e );
throw new ArchivaRestServiceException( e.getMessage() );
}
// check karma on target: write
try
{
boolean authz =
securitySystem.isAuthorized( securitySession, ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD,
artifactTransferRequest.getTargetRepositoryId() );
if ( !authz )
{
throw new ArchivaRestServiceException(
"not authorized to write to repo:" + artifactTransferRequest.getTargetRepositoryId() );
}
}
catch ( AuthorizationException e )
{
log.error( "error reading permission: " + e.getMessage(), e );
throw new ArchivaRestServiceException( e.getMessage() );
}
// sounds good we can continue !
ArtifactReference artifactReference = new ArtifactReference();
artifactReference.setArtifactId( artifactTransferRequest.getArtifactId() );
artifactReference.setGroupId( artifactTransferRequest.getGroupId() );
artifactReference.setVersion( artifactTransferRequest.getVersion() );
artifactReference.setClassifier( artifactTransferRequest.getClassifier() );
String packaging = StringUtils.trim( artifactTransferRequest.getPackaging() );
artifactReference.setType( StringUtils.isEmpty( packaging ) ? "jar" : packaging );
try
{
ManagedRepositoryContent sourceRepository =
repositoryFactory.getManagedRepositoryContent( artifactTransferRequest.getRepositoryId() );
String artifactSourcePath = sourceRepository.toPath( artifactReference );
if ( StringUtils.isEmpty( artifactSourcePath ) )
{
log.error( "cannot find artifact " + artifactTransferRequest.toString() );
throw new ArchivaRestServiceException( "cannot find artifact " + artifactTransferRequest.toString() );
}
File artifactFile = new File( source.getLocation(), artifactSourcePath );
if ( !artifactFile.exists() )
{
log.error( "cannot find artifact " + artifactTransferRequest.toString() );
throw new ArchivaRestServiceException( "cannot find artifact " + artifactTransferRequest.toString() );
}
ManagedRepositoryContent targetRepository =
repositoryFactory.getManagedRepositoryContent( artifactTransferRequest.getTargetRepositoryId() );
String artifactPath = targetRepository.toPath( artifactReference );
int lastIndex = artifactPath.lastIndexOf( '/' );
String path = artifactPath.substring( 0, lastIndex );
File targetPath = new File( target.getLocation(), path );
Date lastUpdatedTimestamp = Calendar.getInstance().getTime();
int newBuildNumber = 1;
String timestamp = null;
File versionMetadataFile = new File( targetPath, MetadataTools.MAVEN_METADATA );
ArchivaRepositoryMetadata versionMetadata = getMetadata( versionMetadataFile );
if ( !targetPath.exists() )
{
targetPath.mkdirs();
}
String filename = artifactPath.substring( lastIndex + 1 );
// FIXME some dupe with uploadaction
boolean fixChecksums =
!( archivaAdministration.getKnownContentConsumers().contains( "create-missing-checksums" ) );
File targetFile = new File( targetPath, filename );
if ( targetFile.exists() && target.isBlockRedeployments() )
{
throw new ArchivaRestServiceException(
"artifact already exists in target repo: " + artifactTransferRequest.getTargetRepositoryId()
+ " and redeployment blocked" );
}
else
{
copyFile( artifactFile, targetPath, filename, fixChecksums );
queueRepositoryTask( target.getId(), targetFile );
}
// copy source pom to target repo
String pomFilename = filename;
if ( StringUtils.isNotBlank( artifactTransferRequest.getClassifier() ) )
{
pomFilename = StringUtils.remove( pomFilename, "-" + artifactTransferRequest.getClassifier() );
}
pomFilename = FilenameUtils.removeExtension( pomFilename ) + ".pom";
File pomFile = new File(
new File( source.getLocation(), artifactSourcePath.substring( 0, artifactPath.lastIndexOf( '/' ) ) ),
pomFilename );
if ( pomFile != null && pomFile.length() > 0 )
{
copyFile( pomFile, targetPath, pomFilename, fixChecksums );
queueRepositoryTask( target.getId(), new File( targetPath, pomFilename ) );
}
// explicitly update only if metadata-updater consumer is not enabled!
if ( !archivaAdministration.getKnownContentConsumers().contains( "metadata-updater" ) )
{
updateProjectMetadata( targetPath.getAbsolutePath(), lastUpdatedTimestamp, timestamp, newBuildNumber,
fixChecksums, artifactTransferRequest );
}
String msg =
"Artifact \'" + artifactTransferRequest.getGroupId() + ":" + artifactTransferRequest.getArtifactId()
+ ":" + artifactTransferRequest.getVersion() + "\' was successfully deployed to repository \'"
+ artifactTransferRequest.getTargetRepositoryId() + "\'";
}
catch ( RepositoryException e )
{
log.error( "RepositoryException: " + e.getMessage(), e );
throw new ArchivaRestServiceException( e.getMessage() );
}
catch ( RepositoryAdminException e )
{
log.error( "RepositoryAdminException: " + e.getMessage(), e );
throw new ArchivaRestServiceException( e.getMessage() );
}
catch ( IOException e )
{
log.error( "IOException: " + e.getMessage(), e );
throw new ArchivaRestServiceException( e.getMessage() );
}
return true;
}