diff options
author | Susan Franklin | 2009-03-05 21:34:40 +0000 |
---|---|---|
committer | Susan Franklin | 2009-03-05 21:34:40 +0000 |
commit | 057d4fe69f11271aa6c5a4b3bf5bd6d8a4637a89 (patch) | |
tree | 7ca489c937cdcfd51f0f1db2c3ab114c1fabe620 /bundles/org.eclipse.equinox.p2.ui | |
parent | 61c50236855639c751cff1d5413cc662a52f25bc (diff) | |
download | rt.equinox.p2-057d4fe69f11271aa6c5a4b3bf5bd6d8a4637a89.tar.gz rt.equinox.p2-057d4fe69f11271aa6c5a4b3bf5bd6d8a4637a89.tar.xz rt.equinox.p2-057d4fe69f11271aa6c5a4b3bf5bd6d8a4637a89.zip |
Bug 260950 - [ui] Remove the custom collectors from the UI
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.ui')
6 files changed, 116 insertions, 59 deletions
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ElementQueryDescriptor.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ElementQueryDescriptor.java index 9e123830b..d73c2a2c0 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ElementQueryDescriptor.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ElementQueryDescriptor.java @@ -27,7 +27,7 @@ public class ElementQueryDescriptor { private Query query; private Collector collector; private IQueryable queryable; - private ElementWrapper transformer; + private ElementWrapper wrapper; /** * Creates an ElementQueryDescriptor to represent a Query, its collector the queryable @@ -41,11 +41,11 @@ public class ElementQueryDescriptor { * Creates an ElementQueryDescriptor to represent a Query, its collector the queryable * on which it will run, and the transformer used to transform the results. */ - public ElementQueryDescriptor(IQueryable queryable, Query query, Collector collector, ElementWrapper transformer) { + public ElementQueryDescriptor(IQueryable queryable, Query query, Collector collector, ElementWrapper wrapper) { this.query = query; this.collector = collector; this.queryable = queryable; - this.transformer = transformer; + this.wrapper = wrapper; } public boolean isComplete() { @@ -58,8 +58,8 @@ public class ElementQueryDescriptor { */ public Collection performQuery(IProgressMonitor monitor) { Collector results = this.queryable.query(this.query, this.collector, monitor); - if (transformer != null) - return transformer.getElements(results); + if (wrapper != null) + return wrapper.getElements(results); return results.toCollection(); } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ElementWrapper.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ElementWrapper.java new file mode 100644 index 000000000..194148ab5 --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ElementWrapper.java @@ -0,0 +1,57 @@ +/******************************************************************************* +* Copyright (c) 2009 EclipseSource and others. All rights reserved. This +* program and the accompanying materials are made available under the terms of +* the Eclipse Public License v1.0 which accompanies this distribution, and is +* available at http://www.eclipse.org/legal/epl-v10.html +* +* Contributors: +* EclipseSource - initial API and implementation +* IBM Corporation - ongoing development +******************************************************************************/ +package org.eclipse.equinox.internal.provisional.p2.ui; + +import java.util.*; +import org.eclipse.equinox.internal.provisional.p2.query.Collector; + +/** + * Wraps query results inside corresponding UI elements + */ +public abstract class ElementWrapper { + + private Collection collection = null; + + /** + * Transforms a collector returned by a query to a collection + * of UI elements + */ + public Collection getElements(Collector collector) { + collection = new ArrayList(collector.size()); + Iterator iter = collector.iterator(); + while (iter.hasNext()) { + Object o = iter.next(); + if (shouldWrap(o)) + collection.add(wrap(o)); + } + return getCollection(); + } + + /** + * Gets the collection where the elements are being stored. + */ + protected Collection getCollection() { + return collection == null ? Collections.EMPTY_LIST : collection; + } + + /** + * Determines if this object should be accepted and wrapped + * by a UI element. + */ + protected boolean shouldWrap(Object o) { + return true; + } + + /** + * Wraps a single element of the query result inside a UI element. + */ + protected abstract Object wrap(Object item); +} diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/QueryableArtifactRepositoryManager.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/QueryableArtifactRepositoryManager.java index 112888a34..96b31b3a8 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/QueryableArtifactRepositoryManager.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/QueryableArtifactRepositoryManager.java @@ -14,6 +14,7 @@ package org.eclipse.equinox.internal.provisional.p2.ui; import java.net.URI; import java.util.Arrays; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.SubMonitor; import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper; import org.eclipse.equinox.internal.p2.ui.ProvUIActivator; import org.eclipse.equinox.internal.provisional.p2.artifact.repository.IArtifactRepositoryManager; @@ -48,9 +49,14 @@ public class QueryableArtifactRepositoryManager extends QueryableRepositoryManag return null; } - protected Collector query(URI uri, Query query, Collector collector, IProgressMonitor monitor) { - // artifact repositories do not support querying, so we always use the location. - query.perform(Arrays.asList(new URI[] {uri}).iterator(), collector); + protected Collector query(URI[] uris, Query query, Collector collector, IProgressMonitor monitor) { + SubMonitor sub = SubMonitor.convert(monitor, uris.length * 100); + for (int i = 0; i < uris.length; i++) { + if (sub.isCanceled()) + return collector; + // artifact repositories do not support querying, so we always use the location. + query.perform(Arrays.asList(uris).iterator(), collector); + } return collector; } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/QueryableMetadataRepositoryManager.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/QueryableMetadataRepositoryManager.java index 74b79dcaf..24c076ac2 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/QueryableMetadataRepositoryManager.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/QueryableMetadataRepositoryManager.java @@ -11,6 +11,7 @@ package org.eclipse.equinox.internal.provisional.p2.ui; import java.net.URI; +import java.util.ArrayList; import java.util.Arrays; import org.eclipse.core.runtime.*; import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper; @@ -20,10 +21,8 @@ import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException; import org.eclipse.equinox.internal.provisional.p2.core.repository.IRepository; import org.eclipse.equinox.internal.provisional.p2.core.repository.IRepositoryManager; -import org.eclipse.equinox.internal.provisional.p2.metadata.repository.IMetadataRepository; import org.eclipse.equinox.internal.provisional.p2.metadata.repository.IMetadataRepositoryManager; -import org.eclipse.equinox.internal.provisional.p2.query.Collector; -import org.eclipse.equinox.internal.provisional.p2.query.Query; +import org.eclipse.equinox.internal.provisional.p2.query.*; import org.eclipse.equinox.internal.provisional.p2.ui.policy.IUViewQueryContext; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.statushandlers.StatusManager; @@ -61,28 +60,34 @@ public class QueryableMetadataRepositoryManager extends QueryableRepositoryManag return null; } - protected Collector query(URI uri, Query query, Collector collector, IProgressMonitor monitor) { - SubMonitor sub = SubMonitor.convert(monitor, NLS.bind(ProvUIMessages.QueryableMetadataRepositoryManager_RepositoryQueryProgress, uri.toString()), 200); + protected Collector query(URI uris[], Query query, Collector collector, IProgressMonitor monitor) { if (query instanceof RepositoryLocationQuery) { - query.perform(Arrays.asList(new URI[] {uri}).iterator(), collector); - sub.worked(2); + query.perform(Arrays.asList(uris).iterator(), collector); + monitor.done(); } else { - IRepository repo = null; - try { - repo = loadRepository(getRepositoryManager(), uri, sub.newChild(100)); - } catch (ProvisionException e) { - if (e.getStatus().getCode() == ProvisionException.REPOSITORY_NOT_FOUND) - handleNotFound(e, uri); - else - ProvUI.handleException(e, NLS.bind(ProvUIMessages.ProvisioningUtil_LoadRepositoryFailure, uri), StatusManager.LOG); - } catch (OperationCanceledException e) { - // user has canceled - repo = null; + SubMonitor sub = SubMonitor.convert(monitor, (uris.length + 1) * 100); + ArrayList loadedRepos = new ArrayList(uris.length); + for (int i = 0; i < uris.length; i++) { + IRepository repo = null; + try { + repo = loadRepository(getRepositoryManager(), uris[i], sub.newChild(100)); + } catch (ProvisionException e) { + if (e.getStatus().getCode() == ProvisionException.REPOSITORY_NOT_FOUND) + handleNotFound(e, uris[i]); + else + ProvUI.handleException(e, NLS.bind(ProvUIMessages.ProvisioningUtil_LoadRepositoryFailure, uris[i]), StatusManager.LOG); + } catch (OperationCanceledException e) { + // user has canceled + repo = null; + } + if (repo != null) + loadedRepos.add(repo); + } + if (loadedRepos.size() > 0) { + IQueryable[] queryables = (IQueryable[]) loadedRepos.toArray(new IQueryable[loadedRepos.size()]); + collector = new CompoundQueryable(queryables).query(query, collector, sub.newChild(100)); } - if (repo instanceof IMetadataRepository) - ((IMetadataRepository) repo).query(query, collector, sub.newChild(100)); } - monitor.done(); return collector; } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/QueryableRepositoryManager.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/QueryableRepositoryManager.java index 2ebf9a74f..0545a5a28 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/QueryableRepositoryManager.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/QueryableRepositoryManager.java @@ -76,15 +76,9 @@ public abstract class QueryableRepositoryManager implements IQueryable { ProvUI.reportStatus(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, ProvUIMessages.ProvisioningUtil_NoRepositoryManager), StatusManager.SHOW | StatusManager.LOG); return result; } - Collection repoLocations = getRepoLocations(manager); - Iterator iterator = repoLocations.iterator(); - SubMonitor sub = SubMonitor.convert(monitor, repoLocations.size() * 100); - while (iterator.hasNext()) { - if (sub.isCanceled()) - return result; - URI location = (URI) iterator.next(); - query(location, query, result, sub.newChild(100)); - } + if (monitor == null) + monitor = new NullProgressMonitor(); + query(getRepoLocations(manager), query, result, monitor); reportAccumulatedStatus(); return result; } @@ -102,37 +96,35 @@ public abstract class QueryableRepositoryManager implements IQueryable { ProvUI.reportStatus(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, ProvUIMessages.ProvisioningUtil_NoRepositoryManager), StatusManager.SHOW | StatusManager.LOG); return; } - Collection repoLocations = getRepoLocations(manager); - Iterator iter = repoLocations.iterator(); - SubMonitor sub = SubMonitor.convert(monitor, repoLocations.size() * 100); + URI[] repoLocations = getRepoLocations(manager); + SubMonitor sub = SubMonitor.convert(monitor, repoLocations.length * 100); if (sub.isCanceled()) return; - while (iter.hasNext()) { + for (int i = 0; i < repoLocations.length; i++) { if (sub.isCanceled()) return; - URI location = (URI) iter.next(); try { - loadRepository(manager, location, sub.newChild(100)); + loadRepository(manager, repoLocations[i], sub.newChild(100)); } catch (ProvisionException e) { if (e.getStatus().getCode() == ProvisionException.REPOSITORY_NOT_FOUND) - handleNotFound(e, location); + handleNotFound(e, repoLocations[i]); else - ProvUI.handleException(e, NLS.bind(ProvUIMessages.ProvisioningUtil_LoadRepositoryFailure, location), StatusManager.LOG); + ProvUI.handleException(e, NLS.bind(ProvUIMessages.ProvisioningUtil_LoadRepositoryFailure, repoLocations[i]), StatusManager.LOG); } } } /** - * Returns a Collection<URI> of repository locations. + * Returns an array of repository locations. */ - private Collection getRepoLocations(IRepositoryManager manager) { + private URI[] getRepoLocations(IRepositoryManager manager) { Set locations = new HashSet(); int flags = queryContext.getMetadataRepositoryFlags(); locations.addAll(Arrays.asList(manager.getKnownRepositories(flags))); if (includeDisabledRepos) { locations.addAll(Arrays.asList(manager.getKnownRepositories(IRepositoryManager.REPOSITORIES_DISABLED | flags))); } - return locations; + return (URI[]) locations.toArray(new URI[locations.size()]); } protected void handleNotFound(ProvisionException e, URI missingRepo) { @@ -187,14 +179,11 @@ public abstract class QueryableRepositoryManager implements IQueryable { IRepositoryManager mgr = getRepositoryManager(); if (mgr == null) return false; - Iterator repoURIs = getRepoLocations(mgr).iterator(); - while (repoURIs.hasNext()) { - Object location = repoURIs.next(); - if (location instanceof URI) { - IRepository repo = getRepository(mgr, (URI) location); - if (repo == null) - return false; - } + URI[] repoURIs = getRepoLocations(mgr); + for (int i = 0; i < repoURIs.length; i++) { + IRepository repo = getRepository(mgr, repoURIs[i]); + if (repo == null) + return false; } return true; } @@ -241,7 +230,7 @@ public abstract class QueryableRepositoryManager implements IQueryable { */ protected abstract IRepository doLoadRepository(IRepositoryManager manager, URI location, IProgressMonitor monitor) throws ProvisionException; - protected abstract Collector query(URI uri, Query query, Collector collector, IProgressMonitor monitor); + protected abstract Collector query(URI[] uris, Query query, Collector collector, IProgressMonitor monitor); public void setQueryContext(IUViewQueryContext queryContext) { this.queryContext = queryContext; diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/actions/UpdateAction.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/actions/UpdateAction.java index 4af08d6f0..a7c9cf89b 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/actions/UpdateAction.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/actions/UpdateAction.java @@ -67,7 +67,7 @@ public class UpdateAction extends ExistingIUInProfileAction { SubMonitor sub = SubMonitor.convert(monitor, ProvUIMessages.ProfileChangeRequestBuildingRequest, ius.length); for (int i = 0; i < ius.length; i++) { ElementQueryDescriptor descriptor = getQueryProvider().getQueryDescriptor(new Updates(targetProfileId, new IInstallableUnit[] {ius[i]})); - Iterator iter = descriptor.queryable.query(descriptor.query, descriptor.collector, sub).iterator(); + Iterator iter = descriptor.performQuery(sub).iterator(); if (iter.hasNext()) toBeUpdated.add(ius[i]); ArrayList currentReplacements = new ArrayList(); |