### Eclipse Workspace Patch 1.0 #P org.eclipse.equinox.p2.director Index: src/org/eclipse/equinox/internal/p2/director/Explanation.java =================================================================== RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Explanation.java,v retrieving revision 1.12 diff -u -r1.12 Explanation.java --- src/org/eclipse/equinox/internal/p2/director/Explanation.java 26 Apr 2010 00:55:03 -0000 1.12 +++ src/org/eclipse/equinox/internal/p2/director/Explanation.java 26 Apr 2010 14:06:32 -0000 @@ -116,13 +116,35 @@ } } + public static class NotInstallableRoot extends Explanation { + public final IRequirement req; + + public NotInstallableRoot(IRequirement req) { + this.req = req; + } + + public String toString() { + return NLS.bind(Messages.Explanation_missingRootFilter, req); + } + + public IStatus toStatus() { + return new Status(IStatus.ERROR, DirectorActivator.PI_DIRECTOR, NLS.bind(Messages.Explanation_missingRootFilter, req)); + } + + protected int orderValue() { + return 2; + } + } + public static class MissingIU extends Explanation { public final IInstallableUnit iu; public final IRequirement req; + public boolean isEntryPoint; - public MissingIU(IInstallableUnit iu, IRequirement req) { + public MissingIU(IInstallableUnit iu, IRequirement req, boolean isEntryPoint) { this.iu = iu; this.req = req; + this.isEntryPoint = isEntryPoint; } public int orderValue() { @@ -134,6 +156,9 @@ } public String toString() { + if (isEntryPoint) { + return NLS.bind(Messages.Explanation_missingRootRequired, req); + } if (req.getFilter() == null) { return NLS.bind(Messages.Explanation_missingRequired, iu, req); } @@ -141,6 +166,9 @@ } public IStatus toStatus() { + if (isEntryPoint) { + return new Status(IStatus.ERROR, DirectorActivator.PI_DIRECTOR, NLS.bind(Messages.Explanation_missingRootRequired, req)); + } if (req.getFilter() == null) { return new Status(IStatus.ERROR, DirectorActivator.PI_DIRECTOR, NLS.bind(Messages.Explanation_missingRequired, getUserReadableName(iu), req)); } Index: src/org/eclipse/equinox/internal/p2/director/Messages.java =================================================================== RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Messages.java,v retrieving revision 1.25 diff -u -r1.25 Messages.java --- src/org/eclipse/equinox/internal/p2/director/Messages.java 26 Apr 2010 00:55:02 -0000 1.25 +++ src/org/eclipse/equinox/internal/p2/director/Messages.java 26 Apr 2010 14:06:32 -0000 @@ -39,8 +39,10 @@ public static String Explanation_hardDependency; public static String Explanation_patchedHardDependency; public static String Explanation_missingRequired; + public static String Explanation_missingRootRequired; public static String Explanation_missingNonGreedyRequired; public static String Explanation_missingRequiredFilter; + public static String Explanation_missingRootFilter; public static String Explanation_optionalDependency; public static String Explanation_rootMissing; public static String Explanation_rootSingleton; Index: src/org/eclipse/equinox/internal/p2/director/Projector.java =================================================================== RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Projector.java,v retrieving revision 1.64 diff -u -r1.64 Projector.java --- src/org/eclipse/equinox/internal/p2/director/Projector.java 26 Apr 2010 00:55:02 -0000 1.64 +++ src/org/eclipse/equinox/internal/p2/director/Projector.java 26 Apr 2010 14:06:32 -0000 @@ -19,6 +19,7 @@ import org.eclipse.core.runtime.jobs.Job; import org.eclipse.equinox.internal.p2.core.helpers.CollectionUtils; import org.eclipse.equinox.internal.p2.core.helpers.Tracing; +import org.eclipse.equinox.internal.p2.director.Explanation.NotInstallableRoot; import org.eclipse.equinox.internal.p2.metadata.IRequiredCapability; import org.eclipse.equinox.internal.p2.metadata.InstallableUnit; import org.eclipse.equinox.p2.metadata.*; @@ -368,7 +369,7 @@ if (DEBUG) { Tracing.debug(iu + "=0"); //$NON-NLS-1$ } - dependencyHelper.setFalse(iu, new Explanation.MissingIU(iu, req)); + dependencyHelper.setFalse(iu, new Explanation.MissingIU(iu, req, iu == this.entryPoint)); } // Check whether the requirement is applicable @@ -416,7 +417,11 @@ } if (req.getMin() > 0) { if (matches.isEmpty()) { - missingRequirement(iu, req); + if (iu == entryPoint && emptyBecauseFiltered) { + dependencyHelper.setFalse(iu, new NotInstallableRoot(req)); + } else { + missingRequirement(iu, req); + } } else { if (req.isGreedy()) { IInstallableUnit reqIu = matches.get(0); @@ -501,6 +506,11 @@ iuSlice = new HashMap(); slice.put(iu.getId(), iuSlice); } + IInstallableUnit alreadyProcessed = iuSlice.get(iu.getVersion()); + if (alreadyProcessed != null) { + assert alreadyProcessed == iu; + return; + } iuSlice.put(iu.getVersion(), iu); if (!isApplicable(iu)) { createNegation(iu, null); @@ -853,6 +863,8 @@ createNegation(iu, req); } + private boolean emptyBecauseFiltered; + /** * @param req * @return a list of mandatory requirements if any, an empty list if req.isOptional(). @@ -866,6 +878,7 @@ target.add(match); } } + emptyBecauseFiltered = !matches.isEmpty() && target.isEmpty(); return target; } Index: src/org/eclipse/equinox/internal/p2/director/SimplePlanner.java =================================================================== RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/SimplePlanner.java,v retrieving revision 1.122 diff -u -r1.122 SimplePlanner.java --- src/org/eclipse/equinox/internal/p2/director/SimplePlanner.java 26 Apr 2010 00:55:02 -0000 1.122 +++ src/org/eclipse/equinox/internal/p2/director/SimplePlanner.java 26 Apr 2010 14:06:32 -0000 @@ -317,12 +317,12 @@ Slicer slicer = new Slicer(new QueryableArray(availableIUs), newSelectionContext, satisfyMetaRequirements(profileChangeRequest.getProfileProperties())); IQueryable slice = slicer.slice(new IInstallableUnit[] {(IInstallableUnit) updatedPlan[0]}, sub.newChild(ExpandWork / 4)); - slicer.getNonGreedyIUs(); if (slice == null) { IProvisioningPlan plan = engine.createPlan(profile, context); plan.setStatus(slicer.getStatus()); return plan; } + slice = new CompoundQueryable(new IQueryable[] {slice, new QueryableArray(profileChangeRequest.getAdditions().toArray(new IInstallableUnit[profileChangeRequest.getAdditions().size()]))}); Projector projector = new Projector(slice, newSelectionContext, slicer.getNonGreedyIUs(), satisfyMetaRequirements(profileChangeRequest.getProfileProperties())); projector.encode((IInstallableUnit) updatedPlan[0], (IInstallableUnit[]) updatedPlan[1], profile, profileChangeRequest.getAdditions(), sub.newChild(ExpandWork / 4)); IStatus s = projector.invokeSolver(sub.newChild(ExpandWork / 4)); Index: src/org/eclipse/equinox/internal/p2/director/Slicer.java =================================================================== RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Slicer.java,v retrieving revision 1.27 diff -u -r1.27 Slicer.java --- src/org/eclipse/equinox/internal/p2/director/Slicer.java 26 Apr 2010 00:55:03 -0000 1.27 +++ src/org/eclipse/equinox/internal/p2/director/Slicer.java 26 Apr 2010 14:06:32 -0000 @@ -85,7 +85,7 @@ private void validateInput(IInstallableUnit[] ius) { for (int i = 0; i < ius.length; i++) { if (!isApplicable(ius[i])) - throw new IllegalStateException("The IU " + ius[i] + " can't be installed in this environment because its filter does not match."); //$NON-NLS-1$//$NON-NLS-2$ + throw new IllegalStateException(NLS.bind(Messages.Explanation_missingRootFilter, ius[i])); } } Index: src/org/eclipse/equinox/internal/p2/director/messages.properties =================================================================== RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/messages.properties,v retrieving revision 1.31 diff -u -r1.31 messages.properties --- src/org/eclipse/equinox/internal/p2/director/messages.properties 26 Apr 2010 00:55:02 -0000 1.31 +++ src/org/eclipse/equinox/internal/p2/director/messages.properties 26 Apr 2010 14:06:32 -0000 @@ -25,8 +25,10 @@ Explanation_hardDependency=Cannot satisfy dependency: {0} depends on: {1} Explanation_patchedHardDependency=Cannot satisfy patched ({0}) dependency: {1} depends on: {2} Explanation_missingRequired=Missing requirement: {0} requires ''{1}'' but it could not be found +Explanation_missingRootRequired=You requested to install ''{0}'' but it could not be found Explanation_missingNonGreedyRequired=Missing non greedy requirement: ''{0}'' is required non greedily but it could not be found Explanation_missingRequiredFilter=Missing requirement for filter {0}: {1} requires ''{2}'' but it could not be found +Explanation_missingRootFilter={0} can't be installed in this environment because its filter is not applicable. Explanation_optionalDependency=Optional dependency Explanation_rootMissing=Cannot complete the install because one or more required items could not be found. Explanation_rootSingleton=Cannot complete the install because of a conflicting dependency.