DefaultMetadataResolver implements MetadataResolver, Service { private List<MetadataResult> resolve( RepositorySystemSession session, Collection<? extends MetadataRequest> requests ) { List<MetadataResult> results = new ArrayList<MetadataResult>( requests.size() ); List<ResolveTask> tasks = new ArrayList<ResolveTask>( requests.size() ); Map<File, Long> localLastUpdates = new HashMap<File, Long>(); 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 ); 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() ); 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() ) { int threads = ConfigUtils.getInteger( session, 4, "aether.metadataResolver.threads" ); Executor executor = getExecutor( Math.min( tasks.size(), threads ) ); try { RunnableErrorForwarder errorForwarder = new RunnableErrorForwarder(); for ( ResolveTask task : tasks ) { executor.execute( errorForwarder.wrap( task ) ); } errorForwarder.await(); for ( ResolveTask task : tasks ) { task.result.setException( task.exception ); } } finally { shutdown( executor ); } for ( ResolveTask task : tasks ) { Metadata metadata = task.request.getMetadata(); LocalMetadataRequest localRequest = new LocalMetadataRequest( metadata, task.request.getRepository(), task.request.getRequestContext() ); File metadataFile = session.getLocalRepositoryManager().find( session, localRequest ).getFile(); if ( metadataFile != null ) { metadata = metadata.setFile( metadataFile ); task.result.setMetadata( metadata ); } if ( task.result.getException() == null ) { task.result.setUpdated( true ); } metadataResolved( session, task.trace, metadata, task.request.getRepository(), task.result.getException() ); } } return results; } DefaultMetadataResolver();  DefaultMetadataResolver( Logger logger, RepositoryEventDispatcher repositoryEventDispatcher,
                                    UpdateCheckManager updateCheckManager,
                                    RemoteRepositoryManager remoteRepositoryManager,
                                    SyncContextFactory syncContextFactory ); void initService( ServiceLocator locator ); DefaultMetadataResolver setLogger( Logger logger ); DefaultMetadataResolver setRepositoryEventDispatcher( RepositoryEventDispatcher repositoryEventDispatcher ); DefaultMetadataResolver setUpdateCheckManager( UpdateCheckManager updateCheckManager ); DefaultMetadataResolver setRemoteRepositoryManager( RemoteRepositoryManager remoteRepositoryManager ); DefaultMetadataResolver setSyncContextFactory( SyncContextFactory syncContextFactory ); List<MetadataResult> resolveMetadata( RepositorySystemSession session,
                                                 Collection<? extends MetadataRequest> requests );  }
@Test public void testResolve() throws IOException { connector.setExpectGet( metadata ); File file = new File( session.getLocalRepository().getBasedir(), session.getLocalRepositoryManager().getPathForRemoteMetadata( metadata, repository, "" ) ); TestFileUtils.write( file.getAbsolutePath(), file ); MetadataRequest request = new MetadataRequest( metadata, repository, "" ); List<MetadataResult> results = resolver.resolveMetadata( session, Arrays.asList( request ) ); assertEquals( 1, results.size() ); MetadataResult result = results.get( 0 ); assertSame( request, result.getRequest() ); assertNull( result.getException() ); assertNotNull( result.getMetadata() ); assertNotNull( result.getMetadata().getFile() ); assertEquals( file, result.getMetadata().getFile() ); assertEquals( metadata, result.getMetadata().setFile( null ) ); connector.assertSeenExpected(); Set<Metadata> metadataRegistration = ( (TestLocalRepositoryManager) session.getLocalRepositoryManager() ).getMetadataRegistration(); assertTrue( metadataRegistration.contains( metadata ) ); assertEquals( 1, metadataRegistration.size() ); }