package org.eclipse.buckminster.core.reader; import org.eclipse.buckminster.core.P2Constants; import org.eclipse.buckminster.core.cspec.model.ComponentRequest; import org.eclipse.buckminster.core.ctype.IComponentType; import org.eclipse.buckminster.core.resolver.NodeQuery; import org.eclipse.buckminster.core.rmap.model.Provider; import org.eclipse.buckminster.core.version.AbstractVersionFinder; import org.eclipse.buckminster.core.version.VersionMatch; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.metadata.VersionRange; import org.eclipse.equinox.p2.query.IQuery; import org.eclipse.equinox.p2.query.IQueryResult; import org.eclipse.equinox.p2.query.QueryUtil; import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository; public class P2VersionFinder extends AbstractVersionFinder { private final IMetadataRepository mdr; public P2VersionFinder(Provider provider, IComponentType componentType, NodeQuery query, IMetadataRepository mdr) { super(provider, componentType, query); this.mdr = mdr; } @Override public VersionMatch getBestVersion(IProgressMonitor monitor) throws CoreException { ComponentRequest request = getQuery().getComponentRequest(); IComponentType ctype = request.getComponentType(); boolean isFeature = (ctype != null && ctype.getId().equals(IComponentType.ECLIPSE_FEATURE)); String name = request.getName(); if (isFeature) { if (!name.endsWith(P2Constants.FEATURE_GROUP)) name += P2Constants.FEATURE_GROUP; } VersionRange range = request.getVersionRange(); IQuery<IInstallableUnit> query = (range == null || range.equals(VersionRange.emptyRange)) // ? QueryUtil.createQuery("select(x | x.id == $0).latest()", name) //$NON-NLS-1$ : QueryUtil.createQuery("select(x | x.id == $0 && x.version ~= $1).latest()", name, range); //$NON-NLS-1$ IQueryResult<IInstallableUnit> result = mdr.query(query, monitor); if (result.isEmpty()) return null; IInstallableUnit best = result.iterator().next(); return new VersionMatch(best.getVersion(), null, -1, null, best.getId()); } }