Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package luck;
- import java.util.*;
- import org.eclipse.equinox.internal.p2.metadata.query.UpdateQuery;
- import org.eclipse.equinox.p2.engine.*;
- import org.eclipse.equinox.p2.engine.query.IUProfilePropertyQuery;
- import org.eclipse.equinox.p2.metadata.*;
- import org.eclipse.equinox.p2.planner.*;
- import org.eclipse.equinox.p2.query.*;
- public class Luck {
- private IPlanner planner;
- public IProvisioningPlan iFeelLucky(IProfile prof, IPlanner plan, ProvisioningContext context) {
- final String INCLUSION_RULES = "org.eclipse.equinox.p2.internal.inclusion.rules"; //$NON-NLS-1$
- final String INCLUSION_OPTIONAL = "OPTIONAL"; //$NON-NLS-1$
- final String INCLUSION_STRICT = "STRICT"; //$NON-NLS-1$
- IQueryResult<IInstallableUnit> strictRoots = prof.query(new IUProfilePropertyQuery(INCLUSION_RULES, INCLUSION_STRICT), null);
- IQueryResult<IInstallableUnit> optionalRoots = prof.query(new IUProfilePropertyQuery(INCLUSION_RULES, INCLUSION_OPTIONAL), null);
- Set<IInstallableUnit> tmpRoots = new HashSet<IInstallableUnit>(strictRoots.toUnmodifiableSet());
- tmpRoots.addAll(optionalRoots.toUnmodifiableSet());
- CollectionResult<IInstallableUnit> allRoots = new CollectionResult<IInstallableUnit>(tmpRoots);
- IProfileChangeRequest newRequest = plan.createChangeRequest(prof);
- Collection<IRequirement> limitingRequirements = new ArrayList<IRequirement>();
- for (Iterator<IInstallableUnit> iterator = allRoots.query(QueryUtil.ALL_UNITS, null).iterator(); iterator.hasNext();) {
- IInstallableUnit currentlyInstalled = iterator.next();
- //find all the potential updates for the currentlyInstalled iu
- IQueryResult<IInstallableUnit> updatesAvailable = plan.updatesFor(currentlyInstalled, context, null);
- for (Iterator<IInstallableUnit> iterator2 = updatesAvailable.iterator(); iterator2.hasNext();) {
- IInstallableUnit update = iterator2.next();
- newRequest.add(update);
- newRequest.setInstallableUnitInclusionRules(update, ProfileInclusionRules.createOptionalInclusionRule(update));
- }
- if (!updatesAvailable.isEmpty()) {
- //force the original IU to optional, but make sure that the solution at least includes it
- newRequest.setInstallableUnitInclusionRules(currentlyInstalled, ProfileInclusionRules.createOptionalInclusionRule(currentlyInstalled));
- limitingRequirements.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, currentlyInstalled.getId(), new VersionRange(currentlyInstalled.getVersion(), true, Version.MAX_VERSION, true), null, false, false));
- }
- }
- IProvisioningPlan updateFinderPlan = planner.getProvisioningPlan(newRequest, context, null);
- if (updateFinderPlan.getAdditions().query(QueryUtil.ALL_UNITS, null).isEmpty())
- return null;
- //Take into account all the removals
- IProfileChangeRequest finalChangeRequest = plan.createChangeRequest(prof);
- IQueryResult<IInstallableUnit> removals = updateFinderPlan.getRemovals().query(QueryUtil.ALL_UNITS, null);
- for (Iterator<IInstallableUnit> iterator = removals.iterator(); iterator.hasNext();) {
- IInstallableUnit iu = iterator.next();
- if (!allRoots.query(QueryUtil.createIUQuery(iu), null).isEmpty()) {
- finalChangeRequest.remove(iu);
- }
- }
- //Take into account the additions for stricts
- for (Iterator<IInstallableUnit> iterator = strictRoots.iterator(); iterator.hasNext();) {
- IInstallableUnit formerRoot = iterator.next();
- IQueryResult<IInstallableUnit> update = updateFinderPlan.getAdditions().query(new UpdateQuery(formerRoot), null);
- if (!update.isEmpty())
- finalChangeRequest.addAll(update.toUnmodifiableSet());
- }
- //Take into account the additions for optionals
- for (Iterator<IInstallableUnit> iterator = optionalRoots.iterator(); iterator.hasNext();) {
- IInstallableUnit formerRoot = iterator.next();
- IQueryResult<IInstallableUnit> update = updateFinderPlan.getAdditions().query(new UpdateQuery(formerRoot), null);
- if (!update.isEmpty()) {
- for (Iterator<IInstallableUnit> it = update.iterator(); it.hasNext();) {
- IInstallableUnit updatedOptionalIU = it.next();
- finalChangeRequest.add(updatedOptionalIU);
- finalChangeRequest.setInstallableUnitInclusionRules(updatedOptionalIU, ProfileInclusionRules.createOptionalInclusionRule(updatedOptionalIU));
- }
- }
- }
- return planner.getProvisioningPlan(finalChangeRequest, context, null);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement