|
|
@@ -32,6 +32,7 @@ import java.util.Map.Entry; |
|
|
|
|
|
|
|
import org.apache.commons.collections.CollectionUtils; |
|
|
|
import org.apache.commons.io.FileUtils; |
|
|
|
import org.apache.commons.io.FilenameUtils; |
|
|
|
import org.apache.commons.lang.StringUtils; |
|
|
|
import org.apache.maven.archiva.configuration.ArchivaConfiguration; |
|
|
|
import org.apache.maven.archiva.configuration.ConfigurationNames; |
|
|
@@ -137,211 +138,230 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
* @plexus.requirement |
|
|
|
*/ |
|
|
|
private WagonFactory wagonFactory; |
|
|
|
|
|
|
|
|
|
|
|
public File fetchFromProxies( ManagedRepositoryContent repository, ArtifactReference artifact ) |
|
|
|
throws ProxyDownloadException |
|
|
|
{ |
|
|
|
File localFile = toLocalFile( repository, artifact ); |
|
|
|
|
|
|
|
Properties requestProperties = new Properties(); |
|
|
|
requestProperties.setProperty( "filetype", "artifact" ); |
|
|
|
requestProperties.setProperty( "version", artifact.getVersion() ); |
|
|
|
requestProperties.setProperty( "managedRepositoryId", repository.getId() ); |
|
|
|
|
|
|
|
List<ProxyConnector> connectors = getProxyConnectors( repository ); |
|
|
|
Map<String, Exception> previousExceptions = new LinkedHashMap<String, Exception>(); |
|
|
|
for ( ProxyConnector connector : connectors ) |
|
|
|
File workingDirectory = createWorkingDirectory(repository); |
|
|
|
try |
|
|
|
{ |
|
|
|
RemoteRepositoryContent targetRepository = connector.getTargetRepository(); |
|
|
|
requestProperties.setProperty( "remoteRepositoryId", targetRepository.getId() ); |
|
|
|
File localFile = toLocalFile( repository, artifact ); |
|
|
|
|
|
|
|
String targetPath = targetRepository.toPath( artifact ); |
|
|
|
Properties requestProperties = new Properties(); |
|
|
|
requestProperties.setProperty( "filetype", "artifact" ); |
|
|
|
requestProperties.setProperty( "version", artifact.getVersion() ); |
|
|
|
requestProperties.setProperty( "managedRepositoryId", repository.getId() ); |
|
|
|
|
|
|
|
try |
|
|
|
List<ProxyConnector> connectors = getProxyConnectors( repository ); |
|
|
|
Map<String, Exception> previousExceptions = new LinkedHashMap<String, Exception>(); |
|
|
|
for ( ProxyConnector connector : connectors ) |
|
|
|
{ |
|
|
|
File downloadedFile = |
|
|
|
transferFile( connector, targetRepository, targetPath, repository, localFile, requestProperties, |
|
|
|
true ); |
|
|
|
RemoteRepositoryContent targetRepository = connector.getTargetRepository(); |
|
|
|
requestProperties.setProperty( "remoteRepositoryId", targetRepository.getId() ); |
|
|
|
|
|
|
|
String targetPath = targetRepository.toPath( artifact ); |
|
|
|
|
|
|
|
if ( fileExists( downloadedFile ) ) |
|
|
|
try |
|
|
|
{ |
|
|
|
log.debug( "Successfully transferred: " + downloadedFile.getAbsolutePath() ); |
|
|
|
return downloadedFile; |
|
|
|
File downloadedFile = |
|
|
|
transferFile( connector, targetRepository, targetPath, repository, workingDirectory, localFile, requestProperties, |
|
|
|
true ); |
|
|
|
|
|
|
|
if ( fileExists( downloadedFile ) ) |
|
|
|
{ |
|
|
|
log.debug( "Successfully transferred: " + downloadedFile.getAbsolutePath() ); |
|
|
|
return downloadedFile; |
|
|
|
} |
|
|
|
} |
|
|
|
catch ( NotFoundException e ) |
|
|
|
{ |
|
|
|
log.debug( "Artifact " + Keys.toKey( artifact ) + " not found on repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( NotModifiedException e ) |
|
|
|
{ |
|
|
|
log.debug( "Artifact " + Keys.toKey( artifact ) + " not updated on repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( ProxyException e ) |
|
|
|
{ |
|
|
|
validatePolicies( this.downloadErrorPolicies, connector.getPolicies(), requestProperties, artifact, |
|
|
|
targetRepository, localFile, e, previousExceptions ); |
|
|
|
} |
|
|
|
} |
|
|
|
catch ( NotFoundException e ) |
|
|
|
{ |
|
|
|
log.debug( "Artifact " + Keys.toKey( artifact ) + " not found on repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( NotModifiedException e ) |
|
|
|
{ |
|
|
|
log.debug( "Artifact " + Keys.toKey( artifact ) + " not updated on repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( ProxyException e ) |
|
|
|
|
|
|
|
if ( !previousExceptions.isEmpty() ) |
|
|
|
{ |
|
|
|
validatePolicies( this.downloadErrorPolicies, connector.getPolicies(), requestProperties, artifact, |
|
|
|
targetRepository, localFile, e, previousExceptions ); |
|
|
|
throw new ProxyDownloadException( "Failures occurred downloading from some remote repositories", |
|
|
|
previousExceptions ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if ( !previousExceptions.isEmpty() ) |
|
|
|
log.debug( "Exhausted all target repositories, artifact " + Keys.toKey( artifact ) + " not found." ); |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
|
throw new ProxyDownloadException( "Failures occurred downloading from some remote repositories", |
|
|
|
previousExceptions ); |
|
|
|
FileUtils.deleteQuietly(workingDirectory); |
|
|
|
} |
|
|
|
|
|
|
|
log.debug( "Exhausted all target repositories, artifact " + Keys.toKey( artifact ) + " not found." ); |
|
|
|
|
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
public File fetchFromProxies( ManagedRepositoryContent repository, String path ) |
|
|
|
{ |
|
|
|
File localFile = new File( repository.getRepoRoot(), path ); |
|
|
|
|
|
|
|
// no update policies for these paths |
|
|
|
if ( localFile.exists() ) |
|
|
|
File workingDir = createWorkingDirectory(repository); |
|
|
|
try |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
Properties requestProperties = new Properties(); |
|
|
|
requestProperties.setProperty( "filetype", "resource" ); |
|
|
|
requestProperties.setProperty( "managedRepositoryId", repository.getId() ); |
|
|
|
File localFile = new File( repository.getRepoRoot(), path ); |
|
|
|
|
|
|
|
List<ProxyConnector> connectors = getProxyConnectors( repository ); |
|
|
|
for ( ProxyConnector connector : connectors ) |
|
|
|
{ |
|
|
|
RemoteRepositoryContent targetRepository = connector.getTargetRepository(); |
|
|
|
requestProperties.setProperty( "remoteRepositoryId", targetRepository.getId() ); |
|
|
|
// no update policies for these paths |
|
|
|
if ( localFile.exists() ) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
String targetPath = path; |
|
|
|
Properties requestProperties = new Properties(); |
|
|
|
requestProperties.setProperty( "filetype", "resource" ); |
|
|
|
requestProperties.setProperty( "managedRepositoryId", repository.getId() ); |
|
|
|
|
|
|
|
try |
|
|
|
List<ProxyConnector> connectors = getProxyConnectors( repository ); |
|
|
|
for ( ProxyConnector connector : connectors ) |
|
|
|
{ |
|
|
|
File downloadedFile = |
|
|
|
transferFile( connector, targetRepository, targetPath, repository, localFile, requestProperties, |
|
|
|
false ); |
|
|
|
RemoteRepositoryContent targetRepository = connector.getTargetRepository(); |
|
|
|
requestProperties.setProperty( "remoteRepositoryId", targetRepository.getId() ); |
|
|
|
|
|
|
|
String targetPath = path; |
|
|
|
|
|
|
|
if ( fileExists( downloadedFile ) ) |
|
|
|
try |
|
|
|
{ |
|
|
|
log.debug( "Successfully transferred: " + downloadedFile.getAbsolutePath() ); |
|
|
|
return downloadedFile; |
|
|
|
File downloadedFile = |
|
|
|
transferFile( connector, targetRepository, targetPath, repository, workingDir, localFile, requestProperties, false ); |
|
|
|
|
|
|
|
if ( fileExists( downloadedFile ) ) |
|
|
|
{ |
|
|
|
log.debug( "Successfully transferred: " + downloadedFile.getAbsolutePath() ); |
|
|
|
return downloadedFile; |
|
|
|
} |
|
|
|
} |
|
|
|
catch ( NotFoundException e ) |
|
|
|
{ |
|
|
|
log.debug( "Resource " + path + " not found on repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( NotModifiedException e ) |
|
|
|
{ |
|
|
|
log.debug( "Resource " + path + " not updated on repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( ProxyException e ) |
|
|
|
{ |
|
|
|
log.warn( "Transfer error from repository \"" + targetRepository.getRepository().getId() |
|
|
|
+ "\" for resource " + path + ", continuing to next repository. Error message: " + e.getMessage() ); |
|
|
|
log.debug( "Full stack trace", e ); |
|
|
|
} |
|
|
|
} |
|
|
|
catch ( NotFoundException e ) |
|
|
|
{ |
|
|
|
log.debug( "Resource " + path + " not found on repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( NotModifiedException e ) |
|
|
|
{ |
|
|
|
log.debug( "Resource " + path + " not updated on repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( ProxyException e ) |
|
|
|
{ |
|
|
|
log.warn( "Transfer error from repository \"" + targetRepository.getRepository().getId() |
|
|
|
+ "\" for resource " + path + ", continuing to next repository. Error message: " + e.getMessage() ); |
|
|
|
log.debug( "Full stack trace", e ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
log.debug( "Exhausted all target repositories, resource " + path + " not found." ); |
|
|
|
log.debug( "Exhausted all target repositories, resource " + path + " not found." ); |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
|
FileUtils.deleteQuietly(workingDir); |
|
|
|
} |
|
|
|
|
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
public File fetchFromProxies( ManagedRepositoryContent repository, VersionedReference metadata ) |
|
|
|
{ |
|
|
|
File localFile = toLocalFile( repository, metadata ); |
|
|
|
|
|
|
|
Properties requestProperties = new Properties(); |
|
|
|
requestProperties.setProperty( "filetype", "metadata" ); |
|
|
|
boolean metadataNeedsUpdating = false; |
|
|
|
long originalTimestamp = getLastModified( localFile ); |
|
|
|
|
|
|
|
List<ProxyConnector> connectors = getProxyConnectors( repository ); |
|
|
|
for ( ProxyConnector connector : connectors ) |
|
|
|
File workingDir = createWorkingDirectory(repository); |
|
|
|
try |
|
|
|
{ |
|
|
|
RemoteRepositoryContent targetRepository = connector.getTargetRepository(); |
|
|
|
String targetPath = metadataTools.toPath( metadata ); |
|
|
|
File localFile = toLocalFile( repository, metadata ); |
|
|
|
|
|
|
|
File localRepoFile = toLocalRepoFile( repository, targetRepository, targetPath ); |
|
|
|
long originalMetadataTimestamp = getLastModified( localRepoFile ); |
|
|
|
Properties requestProperties = new Properties(); |
|
|
|
requestProperties.setProperty( "filetype", "metadata" ); |
|
|
|
boolean metadataNeedsUpdating = false; |
|
|
|
long originalTimestamp = getLastModified( localFile ); |
|
|
|
|
|
|
|
try |
|
|
|
List<ProxyConnector> connectors = getProxyConnectors( repository ); |
|
|
|
for ( ProxyConnector connector : connectors ) |
|
|
|
{ |
|
|
|
transferFile( connector, targetRepository, targetPath, repository, localRepoFile, requestProperties, |
|
|
|
true ); |
|
|
|
RemoteRepositoryContent targetRepository = connector.getTargetRepository(); |
|
|
|
String targetPath = metadataTools.toPath( metadata ); |
|
|
|
|
|
|
|
File localRepoFile = toLocalRepoFile( repository, targetRepository, targetPath ); |
|
|
|
long originalMetadataTimestamp = getLastModified( localRepoFile ); |
|
|
|
|
|
|
|
if ( hasBeenUpdated( localRepoFile, originalMetadataTimestamp ) ) |
|
|
|
try |
|
|
|
{ |
|
|
|
metadataNeedsUpdating = true; |
|
|
|
transferFile( connector, targetRepository, targetPath, repository, workingDir, localRepoFile, requestProperties, true ); |
|
|
|
|
|
|
|
if ( hasBeenUpdated( localRepoFile, originalMetadataTimestamp ) ) |
|
|
|
{ |
|
|
|
metadataNeedsUpdating = true; |
|
|
|
} |
|
|
|
} |
|
|
|
catch ( NotFoundException e ) |
|
|
|
{ |
|
|
|
log.debug( "Versioned Metadata " + Keys.toKey( metadata ) |
|
|
|
+ " not found on remote repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( NotModifiedException e ) |
|
|
|
{ |
|
|
|
log.debug( "Versioned Metadata " + Keys.toKey( metadata ) |
|
|
|
+ " not updated on remote repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( ProxyException e ) |
|
|
|
{ |
|
|
|
log.warn( "Transfer error from repository \"" + targetRepository.getRepository().getId() + |
|
|
|
"\" for versioned Metadata " + Keys.toKey( metadata ) + |
|
|
|
", continuing to next repository. Error message: " + e.getMessage() ); |
|
|
|
log.debug( "Full stack trace", e ); |
|
|
|
} |
|
|
|
} |
|
|
|
catch ( NotFoundException e ) |
|
|
|
{ |
|
|
|
log.debug( "Versioned Metadata " + Keys.toKey( metadata ) |
|
|
|
+ " not found on remote repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( NotModifiedException e ) |
|
|
|
{ |
|
|
|
log.debug( "Versioned Metadata " + Keys.toKey( metadata ) |
|
|
|
+ " not updated on remote repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( ProxyException e ) |
|
|
|
{ |
|
|
|
log.warn( "Transfer error from repository \"" + targetRepository.getRepository().getId() + |
|
|
|
"\" for versioned Metadata " + Keys.toKey( metadata ) + |
|
|
|
", continuing to next repository. Error message: " + e.getMessage() ); |
|
|
|
log.debug( "Full stack trace", e ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if ( hasBeenUpdated( localFile, originalTimestamp ) ) |
|
|
|
{ |
|
|
|
metadataNeedsUpdating = true; |
|
|
|
} |
|
|
|
|
|
|
|
if ( metadataNeedsUpdating ) |
|
|
|
{ |
|
|
|
try |
|
|
|
if ( hasBeenUpdated( localFile, originalTimestamp ) ) |
|
|
|
{ |
|
|
|
metadataTools.updateMetadata( repository, metadata ); |
|
|
|
metadataNeedsUpdating = true; |
|
|
|
} |
|
|
|
catch ( LayoutException e ) |
|
|
|
{ |
|
|
|
log.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage() ); |
|
|
|
// TODO: add into repository report? |
|
|
|
} |
|
|
|
catch ( RepositoryMetadataException e ) |
|
|
|
{ |
|
|
|
log |
|
|
|
.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage(), e ); |
|
|
|
// TODO: add into repository report? |
|
|
|
} |
|
|
|
catch ( IOException e ) |
|
|
|
|
|
|
|
if ( metadataNeedsUpdating ) |
|
|
|
{ |
|
|
|
log |
|
|
|
.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage(), e ); |
|
|
|
// TODO: add into repository report? |
|
|
|
try |
|
|
|
{ |
|
|
|
metadataTools.updateMetadata( repository, metadata ); |
|
|
|
} |
|
|
|
catch ( LayoutException e ) |
|
|
|
{ |
|
|
|
log.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage() ); |
|
|
|
// TODO: add into repository report? |
|
|
|
} |
|
|
|
catch ( RepositoryMetadataException e ) |
|
|
|
{ |
|
|
|
log.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage(), e ); |
|
|
|
// TODO: add into repository report? |
|
|
|
} |
|
|
|
catch ( IOException e ) |
|
|
|
{ |
|
|
|
log.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage(), e ); |
|
|
|
// TODO: add into repository report? |
|
|
|
} |
|
|
|
catch ( ContentNotFoundException e ) |
|
|
|
{ |
|
|
|
log.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage(), e ); |
|
|
|
// TODO: add into repository report? |
|
|
|
} |
|
|
|
} |
|
|
|
catch ( ContentNotFoundException e ) |
|
|
|
|
|
|
|
if ( fileExists( localFile ) ) |
|
|
|
{ |
|
|
|
log |
|
|
|
.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage(), e ); |
|
|
|
// TODO: add into repository report? |
|
|
|
return localFile; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if ( fileExists( localFile ) ) |
|
|
|
finally |
|
|
|
{ |
|
|
|
return localFile; |
|
|
|
FileUtils.deleteQuietly(workingDir); |
|
|
|
} |
|
|
|
|
|
|
|
return null; |
|
|
@@ -370,91 +390,98 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
|
|
|
|
public File fetchFromProxies( ManagedRepositoryContent repository, ProjectReference metadata ) |
|
|
|
{ |
|
|
|
File localFile = toLocalFile( repository, metadata ); |
|
|
|
|
|
|
|
Properties requestProperties = new Properties(); |
|
|
|
requestProperties.setProperty( "filetype", "metadata" ); |
|
|
|
boolean metadataNeedsUpdating = false; |
|
|
|
long originalTimestamp = getLastModified( localFile ); |
|
|
|
|
|
|
|
List<ProxyConnector> connectors = getProxyConnectors( repository ); |
|
|
|
for ( ProxyConnector connector : connectors ) |
|
|
|
File workingDir = createWorkingDirectory(repository); |
|
|
|
try |
|
|
|
{ |
|
|
|
RemoteRepositoryContent targetRepository = connector.getTargetRepository(); |
|
|
|
String targetPath = metadataTools.toPath( metadata ); |
|
|
|
File localFile = toLocalFile( repository, metadata ); |
|
|
|
|
|
|
|
File localRepoFile = toLocalRepoFile( repository, targetRepository, targetPath ); |
|
|
|
long originalMetadataTimestamp = getLastModified( localRepoFile ); |
|
|
|
try |
|
|
|
{ |
|
|
|
transferFile( connector, targetRepository, targetPath, repository, localRepoFile, requestProperties, |
|
|
|
true ); |
|
|
|
Properties requestProperties = new Properties(); |
|
|
|
requestProperties.setProperty( "filetype", "metadata" ); |
|
|
|
boolean metadataNeedsUpdating = false; |
|
|
|
long originalTimestamp = getLastModified( localFile ); |
|
|
|
|
|
|
|
if ( hasBeenUpdated( localRepoFile, originalMetadataTimestamp ) ) |
|
|
|
{ |
|
|
|
metadataNeedsUpdating = true; |
|
|
|
} |
|
|
|
} |
|
|
|
catch ( NotFoundException e ) |
|
|
|
List<ProxyConnector> connectors = getProxyConnectors( repository ); |
|
|
|
for ( ProxyConnector connector : connectors ) |
|
|
|
{ |
|
|
|
log.debug( "Project Metadata " + Keys.toKey( metadata ) + " not found on remote repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( NotModifiedException e ) |
|
|
|
{ |
|
|
|
log.debug( "Project Metadata " + Keys.toKey( metadata ) |
|
|
|
+ " not updated on remote repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( ProxyException e ) |
|
|
|
{ |
|
|
|
log.warn( "Transfer error from repository \"" + targetRepository.getRepository().getId() + |
|
|
|
"\" for project metadata " + Keys.toKey( metadata ) + |
|
|
|
", continuing to next repository. Error message: " + e.getMessage() ); |
|
|
|
log.debug( "Full stack trace", e ); |
|
|
|
} |
|
|
|
RemoteRepositoryContent targetRepository = connector.getTargetRepository(); |
|
|
|
String targetPath = metadataTools.toPath( metadata ); |
|
|
|
|
|
|
|
} |
|
|
|
File localRepoFile = toLocalRepoFile( repository, targetRepository, targetPath ); |
|
|
|
long originalMetadataTimestamp = getLastModified( localRepoFile ); |
|
|
|
try |
|
|
|
{ |
|
|
|
transferFile( connector, targetRepository, targetPath, repository, workingDir, localRepoFile, requestProperties, true ); |
|
|
|
|
|
|
|
if ( hasBeenUpdated( localFile, originalTimestamp ) ) |
|
|
|
{ |
|
|
|
metadataNeedsUpdating = true; |
|
|
|
} |
|
|
|
if ( hasBeenUpdated( localRepoFile, originalMetadataTimestamp ) ) |
|
|
|
{ |
|
|
|
metadataNeedsUpdating = true; |
|
|
|
} |
|
|
|
} |
|
|
|
catch ( NotFoundException e ) |
|
|
|
{ |
|
|
|
log.debug( "Project Metadata " + Keys.toKey( metadata ) + " not found on remote repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( NotModifiedException e ) |
|
|
|
{ |
|
|
|
log.debug( "Project Metadata " + Keys.toKey( metadata ) |
|
|
|
+ " not updated on remote repository \"" |
|
|
|
+ targetRepository.getRepository().getId() + "\"." ); |
|
|
|
} |
|
|
|
catch ( ProxyException e ) |
|
|
|
{ |
|
|
|
log.warn( "Transfer error from repository \"" + targetRepository.getRepository().getId() + |
|
|
|
"\" for project metadata " + Keys.toKey( metadata ) + |
|
|
|
", continuing to next repository. Error message: " + e.getMessage() ); |
|
|
|
log.debug( "Full stack trace", e ); |
|
|
|
} |
|
|
|
|
|
|
|
if ( metadataNeedsUpdating ) |
|
|
|
{ |
|
|
|
try |
|
|
|
{ |
|
|
|
metadataTools.updateMetadata( repository, metadata ); |
|
|
|
} |
|
|
|
catch ( LayoutException e ) |
|
|
|
{ |
|
|
|
log.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage() ); |
|
|
|
// TODO: add into repository report? |
|
|
|
} |
|
|
|
catch ( RepositoryMetadataException e ) |
|
|
|
|
|
|
|
if ( hasBeenUpdated( localFile, originalTimestamp ) ) |
|
|
|
{ |
|
|
|
log |
|
|
|
.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage(), e ); |
|
|
|
// TODO: add into repository report? |
|
|
|
metadataNeedsUpdating = true; |
|
|
|
} |
|
|
|
catch ( IOException e ) |
|
|
|
|
|
|
|
if ( metadataNeedsUpdating ) |
|
|
|
{ |
|
|
|
log |
|
|
|
.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage(), e ); |
|
|
|
// TODO: add into repository report? |
|
|
|
try |
|
|
|
{ |
|
|
|
metadataTools.updateMetadata( repository, metadata ); |
|
|
|
} |
|
|
|
catch ( LayoutException e ) |
|
|
|
{ |
|
|
|
log.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage() ); |
|
|
|
// TODO: add into repository report? |
|
|
|
} |
|
|
|
catch ( RepositoryMetadataException e ) |
|
|
|
{ |
|
|
|
log |
|
|
|
.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage(), e ); |
|
|
|
// TODO: add into repository report? |
|
|
|
} |
|
|
|
catch ( IOException e ) |
|
|
|
{ |
|
|
|
log |
|
|
|
.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage(), e ); |
|
|
|
// TODO: add into repository report? |
|
|
|
} |
|
|
|
catch ( ContentNotFoundException e ) |
|
|
|
{ |
|
|
|
log |
|
|
|
.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage(), e ); |
|
|
|
// TODO: add into repository report? |
|
|
|
} |
|
|
|
} |
|
|
|
catch ( ContentNotFoundException e ) |
|
|
|
|
|
|
|
if ( fileExists( localFile ) ) |
|
|
|
{ |
|
|
|
log |
|
|
|
.warn( "Unable to update metadata " + localFile.getAbsolutePath() + ": " + e.getMessage(), e ); |
|
|
|
// TODO: add into repository report? |
|
|
|
return localFile; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if ( fileExists( localFile ) ) |
|
|
|
finally |
|
|
|
{ |
|
|
|
return localFile; |
|
|
|
FileUtils.deleteQuietly(workingDir); |
|
|
|
} |
|
|
|
|
|
|
|
return null; |
|
|
@@ -538,7 +565,7 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
* @throws ProxyException if transfer was unsuccessful. |
|
|
|
*/ |
|
|
|
private File transferFile( ProxyConnector connector, RemoteRepositoryContent remoteRepository, String remotePath, |
|
|
|
ManagedRepositoryContent repository, File localFile, Properties requestProperties, |
|
|
|
ManagedRepositoryContent repository, File workingDirectory, File localFile, Properties requestProperties, |
|
|
|
boolean executeConsumers ) |
|
|
|
throws ProxyException, NotModifiedException |
|
|
|
{ |
|
|
@@ -594,6 +621,10 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
String previousHttpProxyPort = System.getProperty( "http.proxyPort" ); |
|
|
|
String previousProxyExclusions = System.getProperty( "http.nonProxyHosts" ); |
|
|
|
|
|
|
|
File tmpMd5 = null; |
|
|
|
File tmpSha1 = null; |
|
|
|
File tmpLocalFile = null; |
|
|
|
|
|
|
|
Wagon wagon = null; |
|
|
|
try |
|
|
|
{ |
|
|
@@ -608,12 +639,12 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
boolean connected = connectToRepository( connector, wagon, remoteRepository ); |
|
|
|
if ( connected ) |
|
|
|
{ |
|
|
|
localFile = transferSimpleFile( wagon, remoteRepository, remotePath, repository, localFile ); |
|
|
|
tmpLocalFile = transferSimpleFile( wagon, remoteRepository, remotePath, repository, workingDirectory, localFile ); |
|
|
|
|
|
|
|
// TODO: these should be used to validate the download based on the policies, not always downloaded to |
|
|
|
// save on connections since md5 is rarely used |
|
|
|
transferChecksum( wagon, remoteRepository, remotePath, repository, localFile, ".sha1" ); |
|
|
|
transferChecksum( wagon, remoteRepository, remotePath, repository, localFile, ".md5" ); |
|
|
|
tmpSha1 = transferChecksum( wagon, remoteRepository, remotePath, repository, workingDirectory, localFile, ".sha1" ); |
|
|
|
tmpMd5 = transferChecksum( wagon, remoteRepository, remotePath, repository, workingDirectory, localFile, ".md5" ); |
|
|
|
} |
|
|
|
} |
|
|
|
catch ( NotFoundException e ) |
|
|
@@ -675,17 +706,23 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
// Handle post-download policies. |
|
|
|
try |
|
|
|
{ |
|
|
|
validatePolicies( this.postDownloadPolicies, connector.getPolicies(), requestProperties, localFile ); |
|
|
|
validatePolicies( this.postDownloadPolicies, connector.getPolicies(), requestProperties, tmpLocalFile ); |
|
|
|
} |
|
|
|
catch ( PolicyViolationException e ) |
|
|
|
{ |
|
|
|
log.info( "Transfer invalidated from " + url + " : " + e.getMessage() ); |
|
|
|
if ( fileExists( localFile ) ) |
|
|
|
executeConsumers = false; |
|
|
|
if ( !fileExists( tmpLocalFile ) ) |
|
|
|
{ |
|
|
|
return localFile; |
|
|
|
localFile = null; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return null; |
|
|
|
if (localFile != null) |
|
|
|
{ |
|
|
|
moveFileIfExists(tmpMd5, localFile); |
|
|
|
moveFileIfExists(tmpSha1, localFile); |
|
|
|
moveFileIfExists(tmpLocalFile, localFile); |
|
|
|
} |
|
|
|
|
|
|
|
if ( executeConsumers ) |
|
|
@@ -693,10 +730,25 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
// Just-in-time update of the index and database by executing the consumers for this artifact |
|
|
|
consumers.executeConsumers( connector.getSourceRepository().getRepository(), localFile ); |
|
|
|
} |
|
|
|
|
|
|
|
// Everything passes. |
|
|
|
|
|
|
|
return localFile; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Moves the file into repository location if it exists |
|
|
|
* |
|
|
|
* @param fileToMove this could be either the main artifact, sha1 or md5 checksum file. |
|
|
|
* @param localFile this is always the main artifact |
|
|
|
*/ |
|
|
|
private void moveFileIfExists(File fileToMove, File localFile) throws ProxyException |
|
|
|
{ |
|
|
|
if (fileToMove != null && fileToMove.exists()) |
|
|
|
{ |
|
|
|
moveTempToTarget(fileToMove, new File(localFile.getParentFile(), fileToMove.getName())); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* <p> |
|
|
@@ -711,22 +763,23 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
* @param type the type of checksum to transfer (example: ".md5" or ".sha1") |
|
|
|
* @throws ProxyException if copying the downloaded file into place did not succeed. |
|
|
|
*/ |
|
|
|
private void transferChecksum( Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath, |
|
|
|
ManagedRepositoryContent repository, File localFile, String type ) |
|
|
|
private File transferChecksum( Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath, |
|
|
|
ManagedRepositoryContent repository, File workingDirectory, File localFile, String type ) |
|
|
|
throws ProxyException |
|
|
|
{ |
|
|
|
File hashFile = new File( localFile.getAbsolutePath() + type ); |
|
|
|
File tmpChecksum = new File(workingDirectory, hashFile.getName()); |
|
|
|
String url = remoteRepository.getURL().getUrl() + remotePath; |
|
|
|
|
|
|
|
// Transfer checksum does not use the policy. |
|
|
|
if ( urlFailureCache.hasFailedBefore( url + type ) ) |
|
|
|
{ |
|
|
|
return; |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
File hashFile = new File( localFile.getAbsolutePath() + type ); |
|
|
|
transferSimpleFile( wagon, remoteRepository, remotePath + type, repository, hashFile ); |
|
|
|
transferSimpleFile( wagon, remoteRepository, remotePath + type, repository, workingDirectory, hashFile ); |
|
|
|
log.debug( "Checksum" + type + " Downloaded: " + hashFile ); |
|
|
|
} |
|
|
|
catch ( NotFoundException e ) |
|
|
@@ -747,6 +800,7 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
// Critical issue, pass it on. |
|
|
|
throw e; |
|
|
|
} |
|
|
|
return tmpChecksum; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@@ -762,7 +816,7 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
* @throws WagonException if there was a problem tranfering the file. |
|
|
|
*/ |
|
|
|
private File transferSimpleFile( Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath, |
|
|
|
ManagedRepositoryContent repository, File localFile ) |
|
|
|
ManagedRepositoryContent repository, File workingDirectory, File localFile ) |
|
|
|
throws ProxyException |
|
|
|
{ |
|
|
|
assert ( remotePath != null ); |
|
|
@@ -772,7 +826,7 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
temp = File.createTempFile(localFile.getName() + ".", null, new File( repository.getRepoRoot() )); |
|
|
|
temp = new File(workingDirectory, localFile.getName()); |
|
|
|
|
|
|
|
boolean success = false; |
|
|
|
|
|
|
@@ -782,11 +836,6 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
wagon.get( remotePath, temp ); |
|
|
|
success = true; |
|
|
|
|
|
|
|
if ( temp.exists() ) |
|
|
|
{ |
|
|
|
moveTempToTarget( temp, localFile ); |
|
|
|
} |
|
|
|
|
|
|
|
// You wouldn't get here on failure, a WagonException would have been thrown. |
|
|
|
log.debug( "Downloaded successfully." ); |
|
|
|
} |
|
|
@@ -804,15 +853,10 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
if ( temp.exists() ) |
|
|
|
{ |
|
|
|
log.debug( "Downloaded successfully." ); |
|
|
|
moveTempToTarget( temp, localFile ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return localFile; |
|
|
|
} |
|
|
|
catch (IOException e) |
|
|
|
{ |
|
|
|
throw new ProxyException("Could not create temporary file at " + localFile.getAbsolutePath(), e); |
|
|
|
return temp; |
|
|
|
} |
|
|
|
catch ( ResourceDoesNotExistException e ) |
|
|
|
{ |
|
|
@@ -832,10 +876,6 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
} |
|
|
|
throw new ProxyException( msg, e ); |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
|
FileUtils.deleteQuietly(temp); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@@ -918,6 +958,27 @@ public class DefaultRepositoryProxyConnectors |
|
|
|
Keys.toKey( artifact ) + ", continuing to next repository. Error message: " + exception.getMessage() ); |
|
|
|
log.debug( "Full stack trace", exception ); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Creates a working directory in the repository root for this request |
|
|
|
* @param repository |
|
|
|
* @return file location of working directory |
|
|
|
*/ |
|
|
|
private File createWorkingDirectory(ManagedRepositoryContent repository) |
|
|
|
{ |
|
|
|
//TODO: This is ugly - lets actually clean this up when we get the new repository api |
|
|
|
try |
|
|
|
{ |
|
|
|
File tmpDir = File.createTempFile(".workingdirectory", null, new File(repository.getRepoRoot())); |
|
|
|
tmpDir.delete(); |
|
|
|
tmpDir.mkdirs(); |
|
|
|
return tmpDir; |
|
|
|
} |
|
|
|
catch (IOException e) |
|
|
|
{ |
|
|
|
throw new RuntimeException("Could not create working directory for this request", e); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Used to move the temporary file to its real destination. This is patterned from the way WagonManager handles |