| /******************************************************************************* |
| * Copyright (c) 2007, 2010 IBM Corporation 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: |
| * IBM Corporation - initial API and implementation |
| * Prashant Deva - Bug 194674 [prov] Provide write access to metadata repository |
| * Cloudsmith Inc. - query indexes |
| *******************************************************************************/ |
| package org.eclipse.equinox.internal.p2.metadata.repository; |
| |
| import java.net.URI; |
| import java.util.*; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.URIUtil; |
| import org.eclipse.equinox.internal.p2.core.helpers.CollectionUtils; |
| import org.eclipse.equinox.internal.p2.metadata.*; |
| import org.eclipse.equinox.internal.p2.metadata.index.*; |
| import org.eclipse.equinox.p2.core.IProvisioningAgent; |
| import org.eclipse.equinox.p2.metadata.IInstallableUnit; |
| import org.eclipse.equinox.p2.metadata.KeyWithLocale; |
| import org.eclipse.equinox.p2.metadata.index.IIndex; |
| import org.eclipse.equinox.p2.metadata.index.IIndexProvider; |
| import org.eclipse.equinox.p2.query.IQuery; |
| import org.eclipse.equinox.p2.query.IQueryResult; |
| import org.eclipse.equinox.p2.repository.IRepositoryReference; |
| import org.eclipse.equinox.p2.repository.metadata.spi.AbstractMetadataRepository; |
| |
| /** |
| * A metadata repository backed by an arbitrary URL. |
| */ |
| public class URLMetadataRepository extends AbstractMetadataRepository implements IIndexProvider<IInstallableUnit> { |
| |
| public static final String CONTENT_FILENAME = "content"; //$NON-NLS-1$ |
| protected Collection<IRepositoryReference> references; |
| public static final String XML_EXTENSION = ".xml"; //$NON-NLS-1$ |
| private static final String REPOSITORY_TYPE = URLMetadataRepository.class.getName(); |
| private static final Integer REPOSITORY_VERSION = new Integer(1); |
| |
| transient protected URI content; |
| protected IUMap units = new IUMap(); |
| private IIndex<IInstallableUnit> idIndex; |
| private IIndex<IInstallableUnit> capabilityIndex; |
| private TranslationSupport translationSupport; |
| |
| public static URI getActualLocation(URI base) { |
| return getActualLocation(base, XML_EXTENSION); |
| } |
| |
| public static URI getActualLocation(URI base, String extension) { |
| if (extension == null) |
| extension = XML_EXTENSION; |
| return URIUtil.append(base, CONTENT_FILENAME + extension); |
| } |
| |
| public URLMetadataRepository(IProvisioningAgent agent) { |
| super(agent); |
| } |
| |
| public URLMetadataRepository(IProvisioningAgent agent, URI location, String name, Map<String, String> properties) { |
| super(agent, name == null ? (location != null ? location.toString() : "") : name, REPOSITORY_TYPE, REPOSITORY_VERSION.toString(), location, null, null, properties); //$NON-NLS-1$ |
| content = getActualLocation(location); |
| } |
| |
| // this is synchronized because content can be initialized in initializeAfterLoad |
| protected synchronized URI getContentURL() { |
| return content; |
| } |
| |
| public synchronized void initialize(RepositoryState state) { |
| setName(state.Name); |
| setType(state.Type); |
| setVersion(state.Version.toString()); |
| setProvider(state.Provider); |
| setDescription(state.Description); |
| setLocation(state.Location); |
| setProperties(state.Properties); |
| this.units.addAll(state.Units); |
| this.references = CollectionUtils.unmodifiableList(state.Repositories); |
| } |
| |
| // Use this method to setup any transient fields etc after the object has been restored from a stream |
| public synchronized void initializeAfterLoad(URI repoLocation) { |
| setLocation(repoLocation); |
| content = getActualLocation(repoLocation); |
| } |
| |
| public Collection<IRepositoryReference> getReferences() { |
| return references; |
| } |
| |
| public boolean isModifiable() { |
| return false; |
| } |
| |
| public synchronized IQueryResult<IInstallableUnit> query(IQuery<IInstallableUnit> query, IProgressMonitor monitor) { |
| return IndexProvider.query(this, query, monitor); |
| } |
| |
| 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 synchronized Object getManagedProperty(Object client, String memberName, Object key) { |
| if (!(client instanceof IInstallableUnit)) |
| return null; |
| IInstallableUnit iu = (IInstallableUnit) client; |
| if (InstallableUnit.MEMBER_TRANSLATED_PROPERTIES.equals(memberName)) { |
| if (translationSupport == null) |
| translationSupport = new TranslationSupport(this); |
| return key instanceof KeyWithLocale ? translationSupport.getIUProperty(iu, (KeyWithLocale) key) : translationSupport.getIUProperty(iu, key.toString()); |
| } |
| return null; |
| } |
| |
| public Iterator<IInstallableUnit> everything() { |
| return units.iterator(); |
| } |
| } |