Advertisement
Guest User

Untitled

a guest
Oct 13th, 2011
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.32 KB | None | 0 0
  1. package luck;
  2.  
  3. import java.util.*;
  4. import org.eclipse.equinox.internal.p2.metadata.query.UpdateQuery;
  5. import org.eclipse.equinox.p2.engine.*;
  6. import org.eclipse.equinox.p2.engine.query.IUProfilePropertyQuery;
  7. import org.eclipse.equinox.p2.metadata.*;
  8. import org.eclipse.equinox.p2.planner.*;
  9. import org.eclipse.equinox.p2.query.*;
  10.  
  11. public class Luck {
  12. private IPlanner planner;
  13.  
  14. public IProvisioningPlan iFeelLucky(IProfile prof, IPlanner plan, ProvisioningContext context) {
  15. final String INCLUSION_RULES = "org.eclipse.equinox.p2.internal.inclusion.rules"; //$NON-NLS-1$
  16. final String INCLUSION_OPTIONAL = "OPTIONAL"; //$NON-NLS-1$
  17. final String INCLUSION_STRICT = "STRICT"; //$NON-NLS-1$
  18.  
  19. IQueryResult<IInstallableUnit> strictRoots = prof.query(new IUProfilePropertyQuery(INCLUSION_RULES, INCLUSION_STRICT), null);
  20. IQueryResult<IInstallableUnit> optionalRoots = prof.query(new IUProfilePropertyQuery(INCLUSION_RULES, INCLUSION_OPTIONAL), null);
  21. Set<IInstallableUnit> tmpRoots = new HashSet<IInstallableUnit>(strictRoots.toUnmodifiableSet());
  22. tmpRoots.addAll(optionalRoots.toUnmodifiableSet());
  23. CollectionResult<IInstallableUnit> allRoots = new CollectionResult<IInstallableUnit>(tmpRoots);
  24.  
  25. IProfileChangeRequest newRequest = plan.createChangeRequest(prof);
  26. Collection<IRequirement> limitingRequirements = new ArrayList<IRequirement>();
  27.  
  28. for (Iterator<IInstallableUnit> iterator = allRoots.query(QueryUtil.ALL_UNITS, null).iterator(); iterator.hasNext();) {
  29. IInstallableUnit currentlyInstalled = iterator.next();
  30.  
  31. //find all the potential updates for the currentlyInstalled iu
  32. IQueryResult<IInstallableUnit> updatesAvailable = plan.updatesFor(currentlyInstalled, context, null);
  33. for (Iterator<IInstallableUnit> iterator2 = updatesAvailable.iterator(); iterator2.hasNext();) {
  34. IInstallableUnit update = iterator2.next();
  35. newRequest.add(update);
  36. newRequest.setInstallableUnitInclusionRules(update, ProfileInclusionRules.createOptionalInclusionRule(update));
  37. }
  38. if (!updatesAvailable.isEmpty()) {
  39. //force the original IU to optional, but make sure that the solution at least includes it
  40. newRequest.setInstallableUnitInclusionRules(currentlyInstalled, ProfileInclusionRules.createOptionalInclusionRule(currentlyInstalled));
  41. limitingRequirements.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, currentlyInstalled.getId(), new VersionRange(currentlyInstalled.getVersion(), true, Version.MAX_VERSION, true), null, false, false));
  42. }
  43. }
  44.  
  45. IProvisioningPlan updateFinderPlan = planner.getProvisioningPlan(newRequest, context, null);
  46. if (updateFinderPlan.getAdditions().query(QueryUtil.ALL_UNITS, null).isEmpty())
  47. return null;
  48.  
  49. //Take into account all the removals
  50. IProfileChangeRequest finalChangeRequest = plan.createChangeRequest(prof);
  51. IQueryResult<IInstallableUnit> removals = updateFinderPlan.getRemovals().query(QueryUtil.ALL_UNITS, null);
  52. for (Iterator<IInstallableUnit> iterator = removals.iterator(); iterator.hasNext();) {
  53. IInstallableUnit iu = iterator.next();
  54. if (!allRoots.query(QueryUtil.createIUQuery(iu), null).isEmpty()) {
  55. finalChangeRequest.remove(iu);
  56. }
  57. }
  58.  
  59. //Take into account the additions for stricts
  60. for (Iterator<IInstallableUnit> iterator = strictRoots.iterator(); iterator.hasNext();) {
  61. IInstallableUnit formerRoot = iterator.next();
  62. IQueryResult<IInstallableUnit> update = updateFinderPlan.getAdditions().query(new UpdateQuery(formerRoot), null);
  63. if (!update.isEmpty())
  64. finalChangeRequest.addAll(update.toUnmodifiableSet());
  65. }
  66.  
  67. //Take into account the additions for optionals
  68. for (Iterator<IInstallableUnit> iterator = optionalRoots.iterator(); iterator.hasNext();) {
  69. IInstallableUnit formerRoot = iterator.next();
  70. IQueryResult<IInstallableUnit> update = updateFinderPlan.getAdditions().query(new UpdateQuery(formerRoot), null);
  71. if (!update.isEmpty()) {
  72. for (Iterator<IInstallableUnit> it = update.iterator(); it.hasNext();) {
  73. IInstallableUnit updatedOptionalIU = it.next();
  74. finalChangeRequest.add(updatedOptionalIU);
  75. finalChangeRequest.setInstallableUnitInclusionRules(updatedOptionalIU, ProfileInclusionRules.createOptionalInclusionRule(updatedOptionalIU));
  76. }
  77. }
  78. }
  79. return planner.getProvisioningPlan(finalChangeRequest, context, null);
  80. }
  81.  
  82. }
  83.  
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement