diff options
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/URLMetadataRepository.java')
-rw-r--r-- | bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/URLMetadataRepository.java | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/URLMetadataRepository.java b/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/URLMetadataRepository.java index 63d548798..0ba7cd271 100644 --- a/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/URLMetadataRepository.java +++ b/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/URLMetadataRepository.java @@ -12,13 +12,17 @@ package org.eclipse.equinox.internal.p2.metadata.repository; import java.net.URI; +import java.util.Iterator; import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.URIUtil; import org.eclipse.equinox.internal.p2.metadata.IUMap; +import org.eclipse.equinox.internal.p2.metadata.InstallableUnit; +import org.eclipse.equinox.internal.p2.metadata.index.CapabilityIndex; +import org.eclipse.equinox.internal.p2.metadata.index.IdIndex; import org.eclipse.equinox.p2.core.IProvisioningAgent; import org.eclipse.equinox.p2.metadata.IInstallableUnit; -import org.eclipse.equinox.p2.metadata.query.InstallableUnitQuery; +import org.eclipse.equinox.p2.metadata.index.*; import org.eclipse.equinox.p2.query.IQuery; import org.eclipse.equinox.p2.query.IQueryResult; import org.eclipse.equinox.p2.repository.metadata.spi.AbstractMetadataRepository; @@ -26,7 +30,7 @@ import org.eclipse.equinox.p2.repository.metadata.spi.AbstractMetadataRepository /** * A metadata repository backed by an arbitrary URL. */ -public class URLMetadataRepository extends AbstractMetadataRepository { +public class URLMetadataRepository extends AbstractMetadataRepository implements IIndexProvider<IInstallableUnit> { public static final String CONTENT_FILENAME = "content"; //$NON-NLS-1$ public static final String XML_EXTENSION = ".xml"; //$NON-NLS-1$ @@ -35,6 +39,8 @@ public class URLMetadataRepository extends AbstractMetadataRepository { transient protected URI content; protected IUMap units = new IUMap(); + private IIndex<IInstallableUnit> idIndex; + private IIndex<IInstallableUnit> capabilityIndex; public static URI getActualLocation(URI base) { return getActualLocation(base, XML_EXTENSION); @@ -82,8 +88,25 @@ public class URLMetadataRepository extends AbstractMetadataRepository { } public synchronized IQueryResult<IInstallableUnit> query(IQuery<IInstallableUnit> query, IProgressMonitor monitor) { - if (query instanceof InstallableUnitQuery) - return units.query((InstallableUnitQuery) query); - return query.perform(units.iterator()); + return (query instanceof IQueryWithIndex<?>) ? ((IQueryWithIndex<IInstallableUnit>) query).perform(this) : query.perform(units.iterator()); + } + + public synchronized IIndex<IInstallableUnit> getIndex(String memberName) { + if (InstallableUnit.MEMBER_ID.equals(memberName)) { + if (idIndex == null) + idIndex = new IdIndex(units); + return idIndex; + } + + if (InstallableUnit.MEMBER_PROVIDED_CAPABILITIES.equals(memberName)) { + if (capabilityIndex == null) + capabilityIndex = new CapabilityIndex(units.iterator()); + return capabilityIndex; + } + return null; + } + + public Iterator<IInstallableUnit> everything() { + return units.iterator(); } } |