use of org.sonatype.aether.resolution.MetadataRequest in project sonatype-aether by sonatype.
the class DefaultMetadataResolver method resolve.
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);
// 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()) {
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();
// re-lookup metadata for resolve
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;
}
use of org.sonatype.aether.resolution.MetadataRequest in project sonatype-aether by sonatype.
the class DefaultMetadataResolverTest method testFavorLocal.
@Test
public void testFavorLocal() throws IOException {
lrm.add(session, new LocalMetadataRegistration(metadata));
String path = session.getLocalRepositoryManager().getPathForLocalMetadata(metadata);
File file = new File(session.getLocalRepository().getBasedir(), path);
TestFileUtils.write(file.getAbsolutePath(), file);
final long timestamp = file.lastModified();
MetadataRequest request = new MetadataRequest(metadata, repository, "");
request.setFavorLocalRepository(true);
resolver.setUpdateCheckManager(new StaticUpdateCheckManager(false) {
@Override
public boolean isUpdatedRequired(RepositorySystemSession session, long lastModified, String policy) {
assertEquals(timestamp, lastModified);
return super.isUpdatedRequired(session, lastModified, policy);
}
});
List<MetadataResult> results = resolver.resolveMetadata(session, Arrays.asList(request));
assertEquals(1, results.size());
MetadataResult result = results.get(0);
assertSame(request, result.getRequest());
assertNull(String.valueOf(result.getException()), result.getException());
connector.assertSeenExpected();
}
use of org.sonatype.aether.resolution.MetadataRequest in project sonatype-aether by sonatype.
the class DefaultMetadataResolverTest method testOfflineSessionResolveMetadataMissing.
@Test
public void testOfflineSessionResolveMetadataMissing() {
session.setOffline(true);
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());
assertNotNull(result.getException());
assertNull(result.getMetadata());
connector.assertSeenExpected();
}
Aggregations