Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorspingel2010-04-20 23:21:25 +0000
committerspingel2010-04-20 23:21:25 +0000
commit8d6ff75f692e7a90652156749a8f43e64816eadc (patch)
treefff947327dea4ce26f98497d7ec57e2594a99a83 /bundles/org.eclipse.equinox.p2.discovery.compatibility
parentf87dc37c1844e17dcfb54bb97b5f2aabef1af068 (diff)
downloadrt.equinox.p2-8d6ff75f692e7a90652156749a8f43e64816eadc.tar.gz
rt.equinox.p2-8d6ff75f692e7a90652156749a8f43e64816eadc.tar.xz
rt.equinox.p2-8d6ff75f692e7a90652156749a8f43e64816eadc.zip
bug 309875 - [discovery] support site verification
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.discovery.compatibility')
-rw-r--r--bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/Messages.java7
-rw-r--r--bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/SiteVerifier.java128
-rw-r--r--bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/messages.properties3
3 files changed, 138 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/Messages.java b/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/Messages.java
index 824601623..3e334b23c 100644
--- a/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/Messages.java
+++ b/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/Messages.java
@@ -68,12 +68,19 @@ class Messages extends NLS {
public static String RemoteBundleDiscoveryStrategy_unrecognized_discovery_url;
+ public static String SiteVerifier_Error_with_cause;
+
+ public static String SiteVerifier_Unexpected_Error;
+
+ public static String SiteVerifier_Verify_Job_Label;
+
static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
}
private Messages() {
+ // constructor
}
}
diff --git a/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/SiteVerifier.java b/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/SiteVerifier.java
new file mode 100644
index 000000000..bceca3fbd
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/SiteVerifier.java
@@ -0,0 +1,128 @@
+package org.eclipse.equinox.internal.p2.discovery.compatibility;
+
+import java.net.URI;
+import java.net.URL;
+import java.util.*;
+import java.util.concurrent.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
+import org.eclipse.equinox.internal.p2.discovery.Catalog;
+import org.eclipse.equinox.internal.p2.discovery.DiscoveryCore;
+import org.eclipse.equinox.internal.p2.discovery.compatibility.util.TransportUtil;
+import org.eclipse.equinox.internal.p2.discovery.model.CatalogItem;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Verifies if site URIs point to valid P2 repositories.
+ *
+ * @author David Green
+ * @author Steffen Pingel
+ */
+public class SiteVerifier {
+
+ private final Catalog catalog;
+
+ public SiteVerifier(Catalog catalog) {
+ this.catalog = catalog;
+ }
+
+ /**
+ * Determine update site availability. This may be performed automatically as part of discovery when
+ * {@link #isVerifyUpdateSiteAvailability()} is true, or it may be invoked later by calling this method.
+ */
+ public void verifySiteAvailability(IProgressMonitor monitor) {
+ // NOTE: we don't put java.net.URLs in the map since it involves DNS activity when
+ // computing the hash code.
+ Map<String, Collection<CatalogItem>> urlToDescriptors = new HashMap<String, Collection<CatalogItem>>();
+
+ for (CatalogItem descriptor : catalog.getItems()) {
+ String url = descriptor.getSiteUrl();
+ if (!url.endsWith("/")) { //$NON-NLS-1$
+ url += "/"; //$NON-NLS-1$
+ }
+ Collection<CatalogItem> collection = urlToDescriptors.get(url);
+ if (collection == null) {
+ collection = new ArrayList<CatalogItem>();
+ urlToDescriptors.put(url, collection);
+ }
+ collection.add(descriptor);
+ }
+ final int totalTicks = urlToDescriptors.size();
+ monitor.beginTask(Messages.SiteVerifier_Verify_Job_Label, totalTicks);
+ try {
+ if (!urlToDescriptors.isEmpty()) {
+ ExecutorService executorService = Executors.newFixedThreadPool(Math.min(urlToDescriptors.size(), 4));
+ try {
+ List<Future<VerifyUpdateSiteJob>> futures = new ArrayList<Future<VerifyUpdateSiteJob>>(urlToDescriptors.size());
+ for (String url : urlToDescriptors.keySet()) {
+ futures.add(executorService.submit(new VerifyUpdateSiteJob(url)));
+ }
+ for (Future<VerifyUpdateSiteJob> jobFuture : futures) {
+ try {
+ for (;;) {
+ try {
+ VerifyUpdateSiteJob job = jobFuture.get(1L, TimeUnit.SECONDS);
+
+ Collection<CatalogItem> descriptors = urlToDescriptors.get(job.url);
+ for (CatalogItem descriptor : descriptors) {
+ descriptor.setAvailable(job.ok);
+ }
+ break;
+ } catch (TimeoutException e) {
+ if (monitor.isCanceled()) {
+ return;
+ }
+ }
+ }
+ } catch (InterruptedException e) {
+ monitor.setCanceled(true);
+ return;
+ } catch (ExecutionException e) {
+ if (e.getCause() instanceof OperationCanceledException) {
+ monitor.setCanceled(true);
+ return;
+ }
+ LogHelper.log(computeStatus(e, Messages.SiteVerifier_Unexpected_Error));
+ }
+ monitor.worked(1);
+ }
+ } finally {
+ executorService.shutdownNow();
+ }
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+
+ private IStatus computeStatus(ExecutionException e, String message) {
+ Throwable cause = e.getCause();
+ if (cause.getMessage() != null) {
+ message = NLS.bind(Messages.SiteVerifier_Error_with_cause, message, cause.getMessage());
+ }
+ return new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, message, e);
+ }
+
+ private static class VerifyUpdateSiteJob implements Callable<VerifyUpdateSiteJob> {
+
+ private final String url;
+
+ private boolean ok = false;
+
+ public VerifyUpdateSiteJob(String url) {
+ this.url = url;
+ }
+
+ public VerifyUpdateSiteJob call() throws Exception {
+ URL baseUrl = new URL(url);
+ List<URI> locations = new ArrayList<URI>();
+ for (String location : new String[] {"content.jar", "content.xml", "site.xml"}) { //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+ locations.add(new URL(baseUrl, location).toURI());
+ }
+ ok = TransportUtil.verifyAvailability(locations, true, new NullProgressMonitor());
+ return this;
+ }
+
+ }
+
+}
diff --git a/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/messages.properties b/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/messages.properties
index 9a10066b5..d4c1a86b4 100644
--- a/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/messages.properties
+++ b/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/messages.properties
@@ -32,3 +32,6 @@ RemoteBundleDiscoveryStrategy_task_remote_discovery=remote discovery
RemoteBundleDiscoveryStrategy_unexpectedError=Unexpected error
RemoteBundleDiscoveryStrategy_unknown_host_discovery_directory=Cannot access {0}: unknown host: please check your Internet connection and try again.
RemoteBundleDiscoveryStrategy_unrecognized_discovery_url=Unrecognized discovery bundle URL: {0}
+SiteVerifier_Error_with_cause={0}: {1}
+SiteVerifier_Unexpected_Error=Unexpected error while verifying site availability
+SiteVerifier_Verify_Job_Label=Verifying availability

Back to the top