for ( MetadataRequest request : requests )
{
RequestTrace trace = DefaultRequestTrace.newChild( request.getTrace(), request );
MetadataResult result = new MetadataResult( request );
results.add( result );
Metadata metadata = request.getMetadata();
RemoteRepository repository = request.getRepository();
if ( repository == null )
{
LocalRepository localRepo = session.getLocalRepositoryManager().getRepository();
metadataResolving( session, trace, metadata, localRepo );
File localFile = getLocalFile( session, metadata );
if ( localFile != null )
{
metadata = metadata.setFile( localFile );
result.setMetadata( metadata );
}
else
{
result.setException( new MetadataNotFoundException( metadata, localRepo ) );
}
metadataResolved( session, trace, metadata, localRepo, result.getException() );
continue;
}
List<RemoteRepository> repositories = getEnabledSourceRepositories( repository, metadata.getNature() );
if ( repositories.isEmpty() )
{
continue;
}
metadataResolving( session, trace, metadata, repository );
LocalRepositoryManager lrm = session.getLocalRepositoryManager();
LocalMetadataRequest localRequest =
new LocalMetadataRequest( metadata, repository, request.getRequestContext() );
LocalMetadataResult lrmResult = lrm.find( session, localRequest );
File metadataFile = lrmResult.getFile();
if ( session.isOffline() )
{
if ( metadataFile != null )
{
metadata = metadata.setFile( metadataFile );
result.setMetadata( metadata );
}
else
{
String msg =
"The repository system is offline but the metadata " + metadata + " from " + repository
+ " is not available in the local repository.";
result.setException( new MetadataNotFoundException( metadata, repository, msg ) );
}
metadataResolved( session, trace, metadata, repository, result.getException() );
continue;
}
Long localLastUpdate = null;
if ( request.isFavorLocalRepository() )
{
File localFile = getLocalFile( session, metadata );
localLastUpdate = localLastUpdates.get( localFile );
if ( localLastUpdate == null )
{
localLastUpdate = Long.valueOf( localFile != null ? localFile.lastModified() : 0 );
localLastUpdates.put( localFile, localLastUpdate );
}
}
List<UpdateCheck<Metadata, MetadataTransferException>> checks =
new ArrayList<UpdateCheck<Metadata, MetadataTransferException>>();
Exception exception = null;
for ( RemoteRepository repo : repositories )
{
UpdateCheck<Metadata, MetadataTransferException> check =
new UpdateCheck<Metadata, MetadataTransferException>();
check.setLocalLastUpdated( ( localLastUpdate != null ) ? localLastUpdate.longValue() : 0 );
check.setItem( metadata );
// use 'main' installation file for the check (-> use requested repository)
File checkFile =
new File(
session.getLocalRepository().getBasedir(),
session.getLocalRepositoryManager().getPathForRemoteMetadata( metadata, repository,
request.getRequestContext() ) );
check.setFile( checkFile );
check.setRepository( repository );
check.setAuthoritativeRepository( repo );
check.setPolicy( getPolicy( session, repo, metadata.getNature() ).getUpdatePolicy() );
if ( lrmResult.isStale() )
{
checks.add( check );
}
else
{
updateCheckManager.checkMetadata( session, check );
if ( check.isRequired() )
{
checks.add( check );
}
else if ( exception == null )
{
exception = check.getException();
}
}
}
if ( !checks.isEmpty() )
{
RepositoryPolicy policy = getPolicy( session, repository, metadata.getNature() );
// install path may be different from lookup path
File installFile =
new File(
session.getLocalRepository().getBasedir(),
session.getLocalRepositoryManager().getPathForRemoteMetadata( metadata,
request.getRepository(),
request.getRequestContext() ) );
ResolveTask task =
new ResolveTask( session, trace, result, installFile, checks, policy.getChecksumPolicy() );
tasks.add( task );
}
else
{
result.setException( exception );
if ( metadataFile != null )
{
metadata = metadata.setFile( metadataFile );
result.setMetadata( metadata );
}
metadataResolved( session, trace, metadata, repository, result.getException() );
}
}
if ( !tasks.isEmpty() )
{