From 563dc24854b64b56ee8226d6885629981f06ddde Mon Sep 17 00:00:00 2001 From: Stefan Neuhaus Date: Thu, 16 Feb 2017 08:50:06 +0100 Subject: [PATCH] Parallelize retrieval of last modification timestamps --- .../data/update/NvdCveUpdater.java | 44 +++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/dependency-check-core/src/main/java/org/owasp/dependencycheck/data/update/NvdCveUpdater.java b/dependency-check-core/src/main/java/org/owasp/dependencycheck/data/update/NvdCveUpdater.java index c3263bc1e..46affc263 100644 --- a/dependency-check-core/src/main/java/org/owasp/dependencycheck/data/update/NvdCveUpdater.java +++ b/dependency-check-core/src/main/java/org/owasp/dependencycheck/data/update/NvdCveUpdater.java @@ -24,10 +24,12 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; import java.net.URL; +import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; import org.owasp.dependencycheck.data.nvdcve.CveDB; import org.owasp.dependencycheck.data.nvdcve.DatabaseException; import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties; @@ -406,12 +408,48 @@ public class NvdCveUpdater extends BaseUpdater implements CachedWebDataSource { } urls.add(Settings.getString(Settings.KEYS.CVE_MODIFIED_20_URL)); + final Map> timestampFutures = new HashMap>(); + for (String url : urls) { + final TimestampRetriever timestampRetriever = new TimestampRetriever(url); + final Future future = downloadExecutorService.submit(timestampRetriever); + timestampFutures.put(url, future); + } + final Map lastModifiedDates = new HashMap(); - for(String url: urls) { - LOGGER.debug("Checking for updates from: {}", url); - lastModifiedDates.put(url, Downloader.getLastModified(new URL(url))); + for (String url : urls) { + final Future timestampFuture = timestampFutures.get(url); + final long timestamp; + try { + timestamp = timestampFuture.get(60, TimeUnit.SECONDS); + } catch (Exception e) { + throw new DownloadFailedException(e); + } + lastModifiedDates.put(url, timestamp); } return lastModifiedDates; } + + /** + * Retrieves the last modified timestamp from a NVD CVE meta data file. + */ + private static class TimestampRetriever implements Callable { + + private String url; + + TimestampRetriever(String url) { + this.url = url; + } + + @Override + public Long call() throws Exception { + LOGGER.debug("Checking for updates from: {}", url); + try { + Settings.initialize(); + return Downloader.getLastModified(new URL(url)); + } finally { + Settings.cleanup(false); + } + } + } }