/*******************************************************************************
* Copyright (c) 2006-2013, Cloudsmith Inc.
* The code, documentation and other materials contained herein have been
* licensed under the Eclipse Public License - v 1.0 by the copyright holder
* listed above, as the Initial Contributor under such license. The text of
* such license is available at www.eclipse.org.
******************************************************************************/
package org.eclipse.buckminster.core.version;
import java.net.URI;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.buckminster.core.CorePlugin;
import org.eclipse.buckminster.core.KeyConstants;
import org.eclipse.buckminster.core.Messages;
import org.eclipse.buckminster.core.actor.AbstractActor;
import org.eclipse.buckminster.core.actor.IActionContext;
import org.eclipse.buckminster.core.common.model.ExpandingProperties;
import org.eclipse.buckminster.core.cspec.IComponentIdentifier;
import org.eclipse.buckminster.core.ctype.IComponentType;
import org.eclipse.buckminster.core.helpers.AbstractExtension;
import org.eclipse.buckminster.runtime.MonitorUtils;
import org.eclipse.buckminster.runtime.URLUtils;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.VersionRange;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
import org.eclipse.osgi.util.NLS;
public abstract class AbstractQualifierGenerator extends AbstractExtension implements IQualifierGenerator {
protected IInstallableUnit obtainFromReferenceRepo(IComponentIdentifier identifier, IProgressMonitor monitor) throws CoreException {
MonitorUtils.begin(monitor, 2000);
try {
IActionContext ctx = AbstractActor.getActiveContext();
if (ctx == null)
return null;
Map<String, ? extends Object> props = ctx.getProperties();
IMetadataRepository repo = getReferenceRepository(props, MonitorUtils.subMonitor(monitor, 1990));
if (repo == null)
return null;
String id = identifier.getName();
if (IComponentType.ECLIPSE_FEATURE.equals(identifier.getComponentTypeID()))
id += ".feature.group"; //$NON-NLS-1$
VersionRange range = VersionHelper.unqualifiedRange(identifier.getVersion());
if (range == null)
return null;
Iterator<IInstallableUnit> iter = repo.query(QueryUtil.createLatestQuery(QueryUtil.createIUQuery(id, range)),
MonitorUtils.subMonitor(monitor, 10)).iterator();
return iter.hasNext() ? iter.next() : null;
} finally {
MonitorUtils.done(monitor);
}
}
synchronized IMetadataRepository getReferenceRepository(Map<String, ? extends Object> props, IProgressMonitor monitor) throws CoreException {
Object refURIVal = props.get(KeyConstants.REFERENCE_REPOSITORY);
if (!(refURIVal instanceof String)) {
MonitorUtils.complete(monitor);
return null;
}
String expanded = ExpandingProperties.expand(props, (String) refURIVal, 0);
URI refURI = URLUtils.normalizeToURI(expanded, true);
IProvisioningAgent p2Agent = CorePlugin.getDefault().getResolverAgent();
IMetadataRepositoryManager mdrManager = (IMetadataRepositoryManager) p2Agent.getService(IMetadataRepositoryManager.SERVICE_NAME);
try {
return mdrManager.loadRepository(refURI, monitor);
} catch (ProvisionException e) {
CorePlugin.getLogger().error(NLS.bind(Messages.Unable_to_load_reference_repo_0, refURI.toString()));
throw e;
}
}
}