diff options
author | Susan Franklin | 2009-03-06 23:14:53 +0000 |
---|---|---|
committer | Susan Franklin | 2009-03-06 23:14:53 +0000 |
commit | 97d2f11a9cc05abf81ce05a676c5523f982dfd8c (patch) | |
tree | f22f7bbca63b26b93ababb5672ccfc242e0d7421 /bundles | |
parent | ab3beeff90497e915f1e9e3f909bb420e2bb32f4 (diff) | |
download | rt.equinox.p2-97d2f11a9cc05abf81ce05a676c5523f982dfd8c.tar.gz rt.equinox.p2-97d2f11a9cc05abf81ce05a676c5523f982dfd8c.tar.xz rt.equinox.p2-97d2f11a9cc05abf81ce05a676c5523f982dfd8c.zip |
Bug 266939 - [ui] "Install New Software" should only contact the selected sites when resolving an install
Diffstat (limited to 'bundles')
19 files changed, 266 insertions, 74 deletions
diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/AbstractProvisioningUITest.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/AbstractProvisioningUITest.java index 00e9f242c..758bc3333 100644 --- a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/AbstractProvisioningUITest.java +++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/AbstractProvisioningUITest.java @@ -107,7 +107,7 @@ public abstract class AbstractProvisioningUITest extends AbstractProvisioningTes ProvisioningPlan plan = ProvisioningUtil.getProvisioningPlan(req, new ProvisioningContext(new URI[] {}), getMonitor()); if (plan.getStatus().getSeverity() == IStatus.ERROR || plan.getStatus().getSeverity() == IStatus.CANCEL) return plan.getStatus(); - return ProvisioningUtil.performProvisioningPlan(plan, new DefaultPhaseSet(), profile, getMonitor()); + return ProvisioningUtil.performProvisioningPlan(plan, new DefaultPhaseSet(), profile, new ProvisioningContext(), getMonitor()); } protected IInstallableUnit createNamedIU(String id, String name, Version version, boolean isCategory) { diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWizardTest.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWizardTest.java index 51b304c72..cddb8a73c 100644 --- a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWizardTest.java +++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWizardTest.java @@ -61,10 +61,12 @@ public class InstallWizardTest extends AbstractProvisioningUITest { // Start reaching in... AvailableIUGroup group = page1.testGetAvailableIUGroup(); + group.setRepositoryFilter(AvailableIUGroup.AVAILABLE_ALL, null); // Now manipulate the tree itself. we are reaching way in. DeferredQueryContentProvider provider = (DeferredQueryContentProvider) group.getCheckboxTreeViewer().getContentProvider(); provider.setSynchronous(true); group.getCheckboxTreeViewer().refresh(); + group.getCheckboxTreeViewer().expandAll(); Tree tree = (Tree) group.getCheckboxTreeViewer().getControl(); TreeItem[] items = tree.getItems(); HashSet ids = new HashSet(); diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/operations/SizingTest.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/operations/SizingTest.java index 61a2e8476..91b84d30b 100644 --- a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/operations/SizingTest.java +++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/operations/SizingTest.java @@ -37,7 +37,7 @@ public class SizingTest extends AbstractProvisioningUITest { } long size = IIUElement.SIZE_NOTAPPLICABLE; try { - size = ProvisioningUtil.getSize(plan, profileId, getMonitor()); + size = ProvisioningUtil.getSize(plan, profileId, new ProvisioningContext(), getMonitor()); } catch (ProvisionException e) { fail("1.99", e); } @@ -62,7 +62,7 @@ public class SizingTest extends AbstractProvisioningUITest { } long size = IIUElement.SIZE_NOTAPPLICABLE; try { - size = ProvisioningUtil.getSize(plan, profileId, getMonitor()); + size = ProvisioningUtil.getSize(plan, profileId, new ProvisioningContext(), getMonitor()); } catch (ProvisionException e) { fail("1.99", e); } diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdater.java b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdater.java index 9958e36b5..039513ec7 100644 --- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdater.java +++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdater.java @@ -91,15 +91,17 @@ public class AutomaticUpdater implements IUpdateListener { new Updates(event.getProfileId(), event .getIUs())); Collection results = descriptor.performQuery(null); - IInstallableUnit[] replacements = (IInstallableUnit[]) results.toArray(new IInstallableUnit[results.size()]); + IInstallableUnit[] replacements = (IInstallableUnit[]) results + .toArray(new IInstallableUnit[results.size()]); if (replacements.length > 0) { ProfileChangeRequest request = ProfileChangeRequest .createByProfileId(event.getProfileId()); request.removeInstallableUnits(iusWithUpdates); request.addInstallableUnits(replacements); final PlannerResolutionOperation operation = new PlannerResolutionOperation( - AutomaticUpdateMessages.AutomaticUpdater_ResolutionOperationLabel, iusWithUpdates, - event.getProfileId(), request, new MultiStatus( + AutomaticUpdateMessages.AutomaticUpdater_ResolutionOperationLabel, + iusWithUpdates, event.getProfileId(), request, + null, new MultiStatus( AutomaticUpdatePlugin.PLUGIN_ID, 0, null, null), false); if ((operation.execute(new NullProgressMonitor())).isOK()) { @@ -109,6 +111,7 @@ public class AutomaticUpdater implements IUpdateListener { AutomaticUpdateMessages.AutomaticUpdater_AutomaticDownloadOperationName, event.getProfileId(), operation .getProvisioningPlan(), + new ProvisioningContext(), new DownloadPhaseSet(), false), StatusManager.LOG); job.addJobChangeListener(new JobChangeAdapter() { diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/UpdateHandler.java b/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/UpdateHandler.java index 6d7bfcf3f..924632b7d 100644 --- a/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/UpdateHandler.java +++ b/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/UpdateHandler.java @@ -47,10 +47,9 @@ public class UpdateHandler extends PreloadingRepositoryHandler { } // get the profile roots ElementQueryDescriptor queryDescriptor = Policy.getDefault().getQueryProvider().getQueryDescriptor(new ProfileElement(null, profileId)); - // Collector collector = queryDescriptor.queryable.query(queryDescriptor.query, queryDescriptor.collector, null); - Collection collector = queryDescriptor.performQuery(null); - final IInstallableUnit[] roots = new IInstallableUnit[collector.size()]; - Iterator iter = collector.iterator(); + Collection collection = queryDescriptor.performQuery(null); + final IInstallableUnit[] roots = new IInstallableUnit[collection.size()]; + Iterator iter = collection.iterator(); int i = 0; while (iter.hasNext()) { roots[i] = (IInstallableUnit) ProvUI.getAdapter(iter.next(), IInstallableUnit.class); diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java index d03013341..2ea580ee1 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java @@ -147,6 +147,7 @@ public class ProvUIMessages extends NLS { public static String ResolutionReport_SummaryStatus; public static String ResolutionWizardPage_Canceled; public static String ResolutionWizardPage_ErrorStatus; + public static String ResolutionWizardPage_NoSelections; public static String ResolutionWizardPage_WarningInfoStatus; public static String AddColocatedRepositoryAction_Label; @@ -171,6 +172,7 @@ public class ProvUIMessages extends NLS { public static String AvailableIUsPage_NoSites; public static String AvailableIUsPage_RepoFilterInstructions; public static String AvailableIUsPage_RepoFilterLabel; + public static String AvailableIUsPage_ResolveAllCheckbox; public static String AvailableIUsPage_ShowLatestVersions; public static String AvailableIUsPage_Title; public static String DefaultQueryProvider_ErrorRetrievingProfile; diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/AvailableIUsPage.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/AvailableIUsPage.java index e095831cf..6111dc9ad 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/AvailableIUsPage.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/AvailableIUsPage.java @@ -20,6 +20,7 @@ import org.eclipse.equinox.internal.p2.ui.viewers.IUDetailsLabelProvider; import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException; import org.eclipse.equinox.internal.provisional.p2.core.repository.IRepositoryManager; import org.eclipse.equinox.internal.provisional.p2.core.repository.RepositoryEvent; +import org.eclipse.equinox.internal.provisional.p2.engine.ProvisioningContext; import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit; import org.eclipse.equinox.internal.provisional.p2.ui.*; import org.eclipse.equinox.internal.provisional.p2.ui.dialogs.AddRepositoryDialog; @@ -50,6 +51,7 @@ public class AvailableIUsPage extends ProvisioningWizardPage implements ISelecta private static final String AVAILABLE_VIEW_TYPE = "AvailableViewType"; //$NON-NLS-1$ private static final String SHOW_LATEST_VERSIONS_ONLY = "ShowLatestVersionsOnly"; //$NON-NLS-1$ private static final String HIDE_INSTALLED_IUS = "HideInstalledContent"; //$NON-NLS-1$ + private static final String RESOLVE_ALL = "ResolveInstallWithAllSites"; //$NON-NLS-1$ private static final String LINKACTION = "linkAction"; //$NON-NLS-1$ private static final int DEFAULT_WIDTH = 300; private static final String SITE_NONE = ProvUIMessages.AvailableIUsPage_NoSites; @@ -68,7 +70,7 @@ public class AvailableIUsPage extends ProvisioningWizardPage implements ISelecta Composite availableIUButtonBar; Combo repoCombo; Link repoLink, installLink; - Button useCategoriesCheckbox, hideInstalledCheckbox, showLatestVersionsCheckbox; + Button useCategoriesCheckbox, hideInstalledCheckbox, showLatestVersionsCheckbox, resolveAllCheckbox; Text detailsArea; StructuredViewerProvisioningListener profileListener; ProvUIProvisioningListener comboRepoListener; @@ -110,7 +112,11 @@ public class AvailableIUsPage extends ProvisioningWizardPage implements ISelecta createRepoArea(composite); // Now the available group - availableIUGroup = new AvailableIUGroup(policy, composite, JFaceResources.getDialogFont(), manager, queryContext, ProvUI.getIUColumnConfig()); + // If we have a repository manipulator, we want to default to showing no repos. Otherwise all. + int filterConstant = AvailableIUGroup.AVAILABLE_NONE; + if (policy.getRepositoryManipulator() == null) + filterConstant = AvailableIUGroup.AVAILABLE_ALL; + availableIUGroup = new AvailableIUGroup(policy, composite, JFaceResources.getDialogFont(), manager, queryContext, ProvUI.getIUColumnConfig(), filterConstant); // Selection listeners must be registered on both the normal selection // events and the check mark events. Must be done after buttons @@ -213,6 +219,15 @@ public class AvailableIUsPage extends ProvisioningWizardPage implements ISelecta } }, ProvUIMessages.AvailableIUsPage_GotoInstallInfo); installLink.setLayoutData(gd); + + if (policy.getRepositoryManipulator() != null) { + // Checkbox + resolveAllCheckbox = new Button(parent, SWT.CHECK); + resolveAllCheckbox.setText(ProvUIMessages.AvailableIUsPage_ResolveAllCheckbox); + gd = new GridData(SWT.FILL, SWT.FILL, true, false); + gd.horizontalSpan = 2; + resolveAllCheckbox.setLayoutData(gd); + } } private void createRepoArea(Composite parent) { @@ -398,8 +413,24 @@ public class AvailableIUsPage extends ProvisioningWizardPage implements ISelecta updateDetails(); iuDetailsGroup.enablePropertyLink(availableIUGroup.getSelectedIUElements().length == 1); validateNextButton(); - fillRepoCombo(SITE_NONE); - setRepoComboDecoration(null); + + if (repoCombo != null) { + fillRepoCombo(SITE_NONE); + setRepoComboDecoration(null); + } + + if (resolveAllCheckbox != null) { + IDialogSettings settings = ProvUIActivator.getDefault().getDialogSettings(); + IDialogSettings section = settings.getSection(DIALOG_SETTINGS_SECTION); + String value = null; + if (section != null) + value = section.get(RESOLVE_ALL); + // no section or no value in the section + if (value == null) + resolveAllCheckbox.setSelection(true); + else + resolveAllCheckbox.setSelection(section.getBoolean(RESOLVE_ALL)); + } } public boolean performFinish() { @@ -455,6 +486,8 @@ public class AvailableIUsPage extends ProvisioningWizardPage implements ISelecta section.put(AVAILABLE_VIEW_TYPE, queryContext.getViewType()); section.put(SHOW_LATEST_VERSIONS_ONLY, showLatestVersionsCheckbox.getSelection()); section.put(HIDE_INSTALLED_IUS, hideInstalledCheckbox.getSelection()); + if (resolveAllCheckbox != null) + section.put(RESOLVE_ALL, resolveAllCheckbox.getSelection()); } void updateDetails() { @@ -608,22 +641,27 @@ public class AvailableIUsPage extends ProvisioningWizardPage implements ISelecta void fillRepoCombo(final String selection) { if (repoCombo == null || policy.getRepositoryManipulator() == null) return; - comboRepos = policy.getRepositoryManipulator().getKnownRepositories(); - boolean hasLocalSites = localSitesAvailable(); + URI[] sites = policy.getRepositoryManipulator().getKnownRepositories(); + boolean hasLocalSites = getLocalSites().length > 0; final String[] items; - if (hasLocalSites) + if (hasLocalSites) { // None, All, repo1, repo2....repo n, Local - items = new String[comboRepos.length + 3]; - else + comboRepos = new URI[sites.length + 3]; + items = new String[sites.length + 3]; + } else { // None, All, repo1, repo2....repo n - items = new String[comboRepos.length + 2]; + comboRepos = new URI[sites.length + 2]; + items = new String[sites.length + 2]; + } items[INDEX_SITE_NONE] = SITE_NONE; items[INDEX_SITE_ALL] = SITE_ALL; - for (int i = 0; i < comboRepos.length; i++) - items[i + 2] = comboRepos[i].toString(); + for (int i = 0; i < sites.length; i++) { + items[i + 2] = sites[i].toString(); + comboRepos[i + 2] = sites[i]; + } if (hasLocalSites) items[items.length - 1] = SITE_LOCAL; - display.asyncExec(new Runnable() { + Runnable runnable = new Runnable() { public void run() { if (repoCombo == null || repoCombo.isDisposed()) return; @@ -643,17 +681,23 @@ public class AvailableIUsPage extends ProvisioningWizardPage implements ISelecta repoCombo.select(INDEX_SITE_NONE); repoComboSelectionChanged(); } - }); + }; + // Only run the UI code async if we have to. If we always async the code, + // the automated tests (which are in the UI thread) can get out of sync + if (Display.getCurrent() == null) + display.asyncExec(runnable); + else + runnable.run(); } - private boolean localSitesAvailable() { + private URI[] getLocalSites() { // use our current visibility flags plus the local filter int flags = queryContext.getMetadataRepositoryFlags() | IRepositoryManager.REPOSITORIES_LOCAL; try { - return ProvisioningUtil.getMetadataRepositories(flags).length > 0; + return ProvisioningUtil.getMetadataRepositories(flags); } catch (ProvisionException e) { - return false; + return null; } } @@ -672,17 +716,19 @@ public class AvailableIUsPage extends ProvisioningWizardPage implements ISelecta void repoComboSelectionChanged() { int selection = repoCombo.getSelectionIndex(); + int localIndex = getLocalSites().length == 0 ? repoCombo.getItemCount() : repoCombo.getItemCount() - 1; if (comboRepos == null || selection < 0) selection = INDEX_SITE_NONE; if (selection == INDEX_SITE_NONE) { availableIUGroup.setRepositoryFilter(AvailableIUGroup.AVAILABLE_NONE, null); } else if (selection == INDEX_SITE_ALL) { availableIUGroup.setRepositoryFilter(AvailableIUGroup.AVAILABLE_ALL, null); - } else if (selection - 2 >= comboRepos.length) { + } else if (selection >= localIndex) { availableIUGroup.setRepositoryFilter(AvailableIUGroup.AVAILABLE_LOCAL, null); } else { - availableIUGroup.setRepositoryFilter(AvailableIUGroup.AVAILABLE_SPECIFIED, comboRepos[selection - 2]); + availableIUGroup.setRepositoryFilter(AvailableIUGroup.AVAILABLE_SPECIFIED, comboRepos[selection]); } + validateNextButton(); } void addViewerProvisioningListeners() { @@ -771,6 +817,23 @@ public class AvailableIUsPage extends ProvisioningWizardPage implements ISelecta // since we passed the default column config to the available iu group, // we know that this label provider matches the one used there. return CopyUtils.getIndentedClipboardText(getSelectedIUElements(), new IUDetailsLabelProvider()); + } + public ProvisioningContext getProvisioningContext() { + // If the user can't manipulate repos, always resolve against everything + if (policy.getRepositoryManipulator() == null) + return new ProvisioningContext(); + // Consult the checkbox to see if we should resolve against everything, + // or use the combo to determine what to do. + if (resolveAllCheckbox.getSelection()) + return new ProvisioningContext(); + int siteSel = repoCombo.getSelectionIndex(); + if (siteSel == INDEX_SITE_ALL || siteSel == INDEX_SITE_NONE) + return new ProvisioningContext(); + URI[] locals = getLocalSites(); + // If there are local sites, the last item in the combo is "Local Sites" + if (locals.length > 0 && siteSel == repoCombo.getItemCount() - 1) + return new ProvisioningContext(locals); + return new ProvisioningContext(new URI[] {comboRepos[siteSel]}); } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java index 64dc62141..cc459fca7 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java @@ -12,8 +12,10 @@ package org.eclipse.equinox.internal.p2.ui.dialogs; import java.util.Arrays; import java.util.HashSet; +import org.eclipse.core.runtime.IStatus; import org.eclipse.equinox.internal.p2.ui.model.ElementUtils; import org.eclipse.equinox.internal.p2.ui.model.IUElementListRoot; +import org.eclipse.equinox.internal.provisional.p2.engine.ProvisioningContext; import org.eclipse.equinox.internal.provisional.p2.ui.ProvisioningOperationRunner; import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy; @@ -34,6 +36,7 @@ public abstract class ProvisioningOperationWizard extends Wizard { private Object[] planSelections; protected ISelectableIUsPage mainPage; protected ResolutionWizardPage resolutionPage; + private ProvisioningContext provisioningContext; private PlannerResolutionOperation resolutionOperation; boolean waitingForOtherJobs = false; @@ -104,26 +107,41 @@ public abstract class ProvisioningOperationWizard extends Wizard { if (shouldRecomputePlan()) { // any initial plan that was passed in is no longer valid, no need to hang on to it resolutionOperation = null; + // record the provisioning context so we'll know if it's different next time + provisioningContext = getProvisioningContext(); planSelections = mainPage.getCheckedIUElements(); - resolutionPage.recomputePlan(makeResolutionElementRoot(planSelections)); + root = makeResolutionElementRoot(planSelections); + resolutionPage.recomputePlan(root, provisioningContext, getContainer()); planChanged(); } } else { if (resolutionOperation != null && shouldRecomputePlan()) resolutionOperation = null; - resolutionPage = createResolutionPage(makeResolutionElementRoot(mainPage.getCheckedIUElements()), resolutionOperation); + provisioningContext = getProvisioningContext(); + root = makeResolutionElementRoot(mainPage.getCheckedIUElements()); + resolutionPage = createResolutionPage(root, resolutionOperation); + if (resolutionOperation == null) + resolutionPage.recomputePlan(root, provisioningContext, getContainer()); planChanged(); addPage(resolutionPage); } - return resolutionPage; + IStatus status = resolutionPage.getCurrentStatus(); + // Normally, resolution errors are reported on the next page. + // But if the user canceled the resolution, we don't want to move + // to the next page. In the future we may have other reasons not to + // move to the next page (providing selection quick fixes on the first + // page, etc.) + if (status.getSeverity() != IStatus.CANCEL) + return resolutionPage; } return null; } private boolean shouldRecomputePlan() { boolean previouslyWaiting = waitingForOtherJobs; + boolean previouslyCanceled = resolutionPage != null && resolutionPage.getCurrentStatus().getSeverity() == IStatus.CANCEL; waitingForOtherJobs = ProvisioningOperationRunner.hasScheduledOperationsFor(profileId); - return waitingForOtherJobs || previouslyWaiting || mainPageSelectionsHaveChanged(); + return waitingForOtherJobs || previouslyWaiting || previouslyCanceled || mainPageSelectionsHaveChanged() || provisioningContextChanged(); } private boolean mainPageSelectionsHaveChanged() { @@ -134,9 +152,23 @@ public abstract class ProvisioningOperationWizard extends Wizard { return !(selectedIUs.equals(lastIUSelections)); } + private boolean provisioningContextChanged() { + ProvisioningContext currentProvisioningContext = getProvisioningContext(); + if (currentProvisioningContext == null && provisioningContext == null) + return false; + if (currentProvisioningContext != null && provisioningContext != null) + return provisioningContext.getMetadataRepositories() != getProvisioningContext().getMetadataRepositories(); + // One is null and the other is not + return true; + } + protected void planChanged() { // hook for subclasses. Default is to do nothing } protected abstract IUElementListRoot makeResolutionElementRoot(Object[] selectedElements); + + protected ProvisioningContext getProvisioningContext() { + return null; + } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionWizardPage.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionWizardPage.java index 7c27e6a77..de293072f 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionWizardPage.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionWizardPage.java @@ -29,6 +29,7 @@ import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy; import org.eclipse.equinox.internal.provisional.p2.ui.viewers.*; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IMessageProvider; +import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.*; import org.eclipse.swt.SWT; @@ -112,12 +113,12 @@ public abstract class ResolutionWizardPage extends ProvisioningWizardPage { labelProvider = new IUDetailsLabelProvider(null, getColumnConfig(), getShell()); treeViewer.setLabelProvider(labelProvider); - if (resolvedOperation == null) - // this will also set the input on the viewer - recomputePlan(input); - else { + if (resolvedOperation != null) { treeViewer.setInput(input); resolutionResult = resolvedOperation.getResolutionResult(); + } else { + // Just record the fact that we haven't resolved yet + couldNotResolve(null); } // Optional area to show the size @@ -183,28 +184,36 @@ public abstract class ResolutionWizardPage extends ProvisioningWizardPage { } - public void recomputePlan(IUElementListRoot root) { + /** + * Recompute the provisioning plan based on the items in the IUElementListRoot and the given provisioning context. + * Report progress using the specified runnable context. This method may be called before the page is created. + * + * @param root + * @param provisioningContext + * @param runnableContext + */ + public void recomputePlan(IUElementListRoot root, final ProvisioningContext provisioningContext, IRunnableContext runnableContext) { this.input = root; final Object[] elements = root.getChildren(root); final IInstallableUnit[] ius = ElementUtils.elementsToIUs(elements); couldNotResolve = false; try { if (elements.length == 0) { - couldNotResolve(); + couldNotResolve(ProvUIMessages.ResolutionWizardPage_NoSelections); } else - getContainer().run(true, true, new IRunnableWithProgress() { + runnableContext.run(true, true, new IRunnableWithProgress() { public void run(IProgressMonitor monitor) { resolvedOperation = null; resolutionResult = null; MultiStatus status = PlanAnalyzer.getProfileChangeAlteredStatus(); ProfileChangeRequest request = computeProfileChangeRequest(elements, status, monitor); if (request != null) { - resolvedOperation = new PlannerResolutionOperation(ProvUIMessages.ProfileModificationWizardPage_ResolutionOperationLabel, ius, getProfileId(), request, status, false); + resolvedOperation = new PlannerResolutionOperation(ProvUIMessages.ProfileModificationWizardPage_ResolutionOperationLabel, ius, getProfileId(), request, provisioningContext, status, false); try { resolvedOperation.execute(monitor); } catch (ProvisionException e) { ProvUI.handleException(e, null, StatusManager.SHOW | StatusManager.LOG); - couldNotResolve(); + couldNotResolve(null); } if (resolvedOperation.getProvisioningPlan() != null) { resolutionResult = resolvedOperation.getResolutionResult(); @@ -224,16 +233,23 @@ public abstract class ResolutionWizardPage extends ProvisioningWizardPage { // Nothing to report if thread was interrupted } catch (InvocationTargetException e) { ProvUI.handleException(e.getCause(), null, StatusManager.SHOW | StatusManager.LOG); - couldNotResolve(); + couldNotResolve(null); + } + // If we've already been created (and not disposed), update the widgets. If not, nothing to do. + if (treeViewer != null && !treeViewer.getTree().isDisposed()) { + treeViewer.setInput(input); + updateStatus(); } - treeViewer.setInput(input); - updateStatus(); } - private void couldNotResolve() { + void couldNotResolve(String message) { resolvedOperation = null; resolutionResult = null; couldNotResolve = true; + if (message != null) { + IStatus status = new MultiStatus(ProvUIActivator.PLUGIN_ID, IStatusCodes.UNEXPECTED_NOTHING_TO_DO, message, null); + StatusManager.getManager().handle(status, StatusManager.LOG); + } } private ProfileModificationOperation createProfileModificationOperation(ProvisioningPlan plan) { @@ -289,6 +305,13 @@ public abstract class ResolutionWizardPage extends ProvisioningWizardPage { detailsArea.setText(getDetailText()); } + public IStatus getCurrentStatus() { + if (couldNotResolve || resolutionResult == null) { + return PlanAnalyzer.getStatus(IStatusCodes.UNEXPECTED_NOTHING_TO_DO, null); + } + return resolutionResult.getSummaryStatus(); + } + String getDetailText() { String detail = null; IInstallableUnit iu = getSelectedIU(); diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/SizeComputingWizardPage.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/SizeComputingWizardPage.java index 297953a40..9fe9c709d 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/SizeComputingWizardPage.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/SizeComputingWizardPage.java @@ -18,10 +18,12 @@ import org.eclipse.equinox.internal.p2.ui.model.IIUElement; import org.eclipse.equinox.internal.p2.ui.model.IUElementListRoot; import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException; import org.eclipse.equinox.internal.provisional.p2.director.ProvisioningPlan; +import org.eclipse.equinox.internal.provisional.p2.engine.ProvisioningContext; import org.eclipse.equinox.internal.provisional.p2.query.IQueryable; import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; import org.eclipse.equinox.internal.provisional.p2.ui.operations.ProvisioningUtil; import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy; +import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; @@ -39,7 +41,7 @@ public abstract class SizeComputingWizardPage extends ResolutionWizardPage { // Compute size immediately if a plan is available. This may or may not finish before // the widgetry is created. if (initialResolution != null) - computeSizing(initialResolution.getProvisioningPlan(), profileID); + computeSizing(initialResolution.getProvisioningPlan(), profileID, initialResolution.getProvisioningContext()); else // Set the size to indicate there is no size yet. size = IIUElement.SIZE_NOTAPPLICABLE; @@ -49,14 +51,14 @@ public abstract class SizeComputingWizardPage extends ResolutionWizardPage { protected long size; Job sizingJob; - protected void computeSizing(final ProvisioningPlan plan, final String profileId) { + protected void computeSizing(final ProvisioningPlan plan, final String profileId, final ProvisioningContext provisioningContext) { size = IIUElement.SIZE_UNKNOWN; if (sizingJob != null) sizingJob.cancel(); sizingJob = new Job(ProvUIMessages.SizeComputingWizardPage_SizeJobTitle) { protected IStatus run(IProgressMonitor monitor) { try { - size = ProvisioningUtil.getSize(plan, profileId, monitor); + size = ProvisioningUtil.getSize(plan, profileId, provisioningContext, monitor); } catch (ProvisionException e) { return e.getStatus(); } @@ -118,10 +120,10 @@ public abstract class SizeComputingWizardPage extends ResolutionWizardPage { } } - public void recomputePlan(IUElementListRoot root) { - super.recomputePlan(root); + public void recomputePlan(IUElementListRoot root, ProvisioningContext provisioningContext, IRunnableContext runnableContext) { + super.recomputePlan(root, provisioningContext, runnableContext); if (getCurrentPlan() != null) - computeSizing(getCurrentPlan(), getProfileId()); + computeSizing(getCurrentPlan(), getProfileId(), provisioningContext); } protected IQueryable getQueryable(ProvisioningPlan plan) { diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties index f85015a3a..bf1a3b7c8 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties @@ -108,6 +108,7 @@ RepositoryManipulatorDropTarget_DragSourceNotValid={0} was not accepted as a val ResolutionReport_SummaryStatus=Operation details ResolutionWizardPage_Canceled=The operation was cancelled. ResolutionWizardPage_ErrorStatus=The operation cannot be completed. See the details. +ResolutionWizardPage_NoSelections=There were no installable units selected when the plan was computed. ResolutionWizardPage_WarningInfoStatus=Your original request has been modified. See the details. AcceptLicensesWizardPage_AcceptMultiple=I &accept the terms of the license agreements @@ -166,7 +167,7 @@ PlannerResolutionOperation_UnexpectedError=Unexpected error. Unable to calculat PlanStatusHelper_IgnoringImpliedDowngrade="{0}" will be ignored because a newer version is already installed. PlanStatusHelper_ImpliedUpdate="{0}" is already installed, so an update will be performed instead. PlanStatusHelper_Items=Items -PlanStatusHelper_NothingToDo=Cannot complete the request. +PlanStatusHelper_NothingToDo=Cannot complete the request. See the error log for details. PlanStatusHelper_AlreadyInstalled="{0}" will be ignored because it is already installed. PlanStatusHelper_AnotherOperationInProgress=Cannot continue the operation. There is another install operation in progress. PlanStatusHelper_Launch=Launch... @@ -206,6 +207,7 @@ AvailableIUsPage_LocalSites=Only Local Sites AvailableIUsPage_NoSites=type or select a site AvailableIUsPage_RepoFilterInstructions=You can type a new site name and press 'Enter' to view software from that site. AvailableIUsPage_RepoFilterLabel=&Work with: +AvailableIUsPage_ResolveAllCheckbox=&Contact all update sites during install to find required software AvailableIUsPage_ShowLatestVersions=Show only the &latest versions of available software AvailableIUsPage_Title=Available Software DefaultQueryProvider_ErrorRetrievingProfile=Error retrieving profile {0} diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/model/AvailableIUElement.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/model/AvailableIUElement.java index 44f1e8430..93c096f13 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/model/AvailableIUElement.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/model/AvailableIUElement.java @@ -10,10 +10,12 @@ *******************************************************************************/ package org.eclipse.equinox.internal.p2.ui.model; +import java.net.URI; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException; +import org.eclipse.equinox.internal.provisional.p2.core.repository.IRepository; import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest; import org.eclipse.equinox.internal.provisional.p2.director.ProvisioningPlan; import org.eclipse.equinox.internal.provisional.p2.engine.IProfile; @@ -88,7 +90,7 @@ public class AvailableIUElement extends QueriedElement implements IIUElement { try { SubMonitor mon = SubMonitor.convert(monitor, 100); ProvisioningPlan plan = getSizingPlan(mon.newChild(50)); - size = ProvisioningUtil.getSize(plan, profileID, mon.newChild(50)); + size = ProvisioningUtil.getSize(plan, profileID, getProvisioningContext(), mon.newChild(50)); } catch (ProvisionException e) { handleException(e, ProvUIMessages.AvailableIUElement_ProfileNotFound); size = IIUElement.SIZE_UNAVAILABLE; @@ -102,7 +104,7 @@ public class AvailableIUElement extends QueriedElement implements IIUElement { protected ProvisioningPlan getSizingPlan(IProgressMonitor monitor) throws ProvisionException { ProfileChangeRequest request = ProfileChangeRequest.createByProfileId(profileID); request.addInstallableUnits(new IInstallableUnit[] {getIU()}); - return ProvisioningUtil.getProvisioningPlan(request, new ProvisioningContext(), monitor); + return ProvisioningUtil.getProvisioningPlan(request, getProvisioningContext(), monitor); } public IInstallableUnit getIU() { @@ -177,4 +179,10 @@ public class AvailableIUElement extends QueriedElement implements IIUElement { public boolean isUpdate() { return isUpdate; } + + private ProvisioningContext getProvisioningContext() { + if (hasQueryable() && getQueryable() instanceof IRepository) + return new ProvisioningContext(new URI[] {((IRepository) getQueryable()).getLocation()}); + return new ProvisioningContext(); + } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/actions/ProfileModificationAction.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/actions/ProfileModificationAction.java index d837603c5..d49f8093f 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/actions/ProfileModificationAction.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/actions/ProfileModificationAction.java @@ -97,12 +97,12 @@ public abstract class ProfileModificationAction extends ProvisioningAction { // No explanation for failure was provided. It shouldn't happen, but... failureStatus = new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, ProvUIMessages.ProfileModificationAction_NoExplanationProvided); } - ProvUI.reportStatus(failureStatus, StatusManager.SHOW); + ProvUI.reportStatus(failureStatus, StatusManager.SHOW | StatusManager.LOG); runCanceled(); return; } // We have a profile change request, let's get a plan for it. This could take awhile. - final PlannerResolutionOperation operation = new PlannerResolutionOperation(ProvUIMessages.ProfileModificationAction_ResolutionOperationLabel, ius, id, request[0], additionalStatus, isResolveUserVisible()); + final PlannerResolutionOperation operation = new PlannerResolutionOperation(ProvUIMessages.ProfileModificationAction_ResolutionOperationLabel, ius, id, request[0], null, additionalStatus, isResolveUserVisible()); // Since we are resolving asynchronously, our job is done. Setting this allows // callers to decide to close the launching window. // See https://bugs.eclipse.org/bugs/show_bug.cgi?id=236495 diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/AvailableIUGroup.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/AvailableIUGroup.java index a5a381a55..36a8b364a 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/AvailableIUGroup.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/AvailableIUGroup.java @@ -44,7 +44,8 @@ import org.eclipse.ui.PlatformUI; /** * An AvailableIUGroup is a reusable UI component that displays the - * IU's available for installation. + * IU's available for installation. By default, content from all available + * repositories is shown. * * @since 3.4 */ @@ -74,13 +75,14 @@ public class AvailableIUGroup extends StructuredIUGroup { Job lastRequestedLoadJob; /** - * Create a group that represents the available IU's but does not use any of the - * view menu or check box capabilities. + * Create a group that represents the available IU's from all available + * repositories. The default policy controls the visibility flags for + * repositories and IU's. * * @param parent the parent composite for the group */ public AvailableIUGroup(final Composite parent) { - this(Policy.getDefault(), parent, parent.getFont(), null, null, ProvUI.getIUColumnConfig()); + this(Policy.getDefault(), parent, parent.getFont(), null, null, ProvUI.getIUColumnConfig(), AVAILABLE_ALL); } /** @@ -96,8 +98,9 @@ public class AvailableIUGroup extends StructuredIUGroup { * information about what is shown, such as the visible repositories * @param columnConfig the description of the columns that should be shown. If <code>null</code>, a default * will be used. + * @param filterConstant a constant specifying which repositories are used when showing content */ - public AvailableIUGroup(Policy policy, final Composite parent, Font font, QueryableMetadataRepositoryManager queryable, IUViewQueryContext queryContext, IUColumnConfig[] columnConfig) { + public AvailableIUGroup(Policy policy, final Composite parent, Font font, QueryableMetadataRepositoryManager queryable, IUViewQueryContext queryContext, IUColumnConfig[] columnConfig, int filterConstant) { super(policy, parent, font, columnConfig); this.display = parent.getDisplay(); if (queryContext == null) @@ -108,6 +111,7 @@ public class AvailableIUGroup extends StructuredIUGroup { this.queryableManager = new QueryableMetadataRepositoryManager(this.queryContext, false); else this.queryableManager = queryable; + this.filterConstant = filterConstant; this.filter = new AvailableIUPatternFilter(getColumnConfig()); createGroupComposite(parent); } @@ -407,6 +411,15 @@ public class AvailableIUGroup extends StructuredIUGroup { } public void setRepositoryFilter(int filterFlag, URI repoLocation) { + // If there has been no change, don't do anything. We will be + // clearing out selection caches in this method and should not do + // so if there's really no change. + if (filterConstant == filterFlag) { + if (filterConstant != AVAILABLE_SPECIFIED) + return; + if (repoLocation != null && repoLocation.equals(repositoryFilter)) + return; + } filterConstant = filterFlag; switch (filterFlag) { diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/InstallWizard.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/InstallWizard.java index ddf5f98f8..d15756fc4 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/InstallWizard.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/InstallWizard.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; import org.eclipse.equinox.internal.p2.ui.dialogs.*; import org.eclipse.equinox.internal.p2.ui.model.*; +import org.eclipse.equinox.internal.provisional.p2.engine.ProvisioningContext; import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit; import org.eclipse.equinox.internal.provisional.p2.ui.ProvUIImages; import org.eclipse.equinox.internal.provisional.p2.ui.QueryableMetadataRepositoryManager; @@ -79,4 +80,8 @@ public class InstallWizard extends WizardWithLicenses { mainPage.performFinish(); return super.performFinish(); } + + protected ProvisioningContext getProvisioningContext() { + return mainPage.getProvisioningContext(); + } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/RevertProfilePage.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/RevertProfilePage.java index e1769d040..da8cd6ec0 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/RevertProfilePage.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/RevertProfilePage.java @@ -21,7 +21,7 @@ import org.eclipse.equinox.internal.p2.ui.viewers.DeferredQueryContentProvider; import org.eclipse.equinox.internal.p2.ui.viewers.IUDetailsLabelProvider; import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException; import org.eclipse.equinox.internal.provisional.p2.director.ProvisioningPlan; -import org.eclipse.equinox.internal.provisional.p2.engine.IProfile; +import org.eclipse.equinox.internal.provisional.p2.engine.*; import org.eclipse.equinox.internal.provisional.p2.ui.*; import org.eclipse.equinox.internal.provisional.p2.ui.operations.*; import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy; @@ -251,7 +251,9 @@ public class RevertProfilePage extends InstallationPage implements ICopyable { boolean reverted = false; if (plan[0] != null) { if (plan[0].getStatus().isOK()) { - ProvisioningOperation op = new ProfileModificationOperation(ProvUIMessages.RevertDialog_RevertOperationLabel, profileId, plan[0]); + // We use a default provisioning context (all repos) because we have no other + // way currently to figure out which sites the user wants to contact + ProvisioningOperation op = new ProfileModificationOperation(ProvUIMessages.RevertDialog_RevertOperationLabel, profileId, plan[0], new ProvisioningContext(), new DefaultPhaseSet(), true); ProvisioningOperationRunner.schedule(op, StatusManager.SHOW | StatusManager.LOG); ProvisioningOperationRunner.requestRestart(true); reverted = true; diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/operations/PlannerResolutionOperation.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/operations/PlannerResolutionOperation.java index d883b4de6..2bf99b0fa 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/operations/PlannerResolutionOperation.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/operations/PlannerResolutionOperation.java @@ -34,13 +34,18 @@ public class PlannerResolutionOperation extends ProvisioningOperation { MultiStatus additionalStatus; ResolutionResult report; IInstallableUnit[] iusInvolved; + ProvisioningContext provisioningContext; - public PlannerResolutionOperation(String label, IInstallableUnit[] iusInvolved, String profileId, ProfileChangeRequest request, MultiStatus additionalStatus, boolean isUser) { + public PlannerResolutionOperation(String label, IInstallableUnit[] iusInvolved, String profileId, ProfileChangeRequest request, ProvisioningContext provisioningContext, MultiStatus additionalStatus, boolean isUser) { super(label); this.request = request; this.profileId = profileId; this.isUser = isUser; this.iusInvolved = iusInvolved; + if (provisioningContext == null) + this.provisioningContext = new ProvisioningContext(); + else + this.provisioningContext = provisioningContext; Assert.isNotNull(additionalStatus); this.additionalStatus = additionalStatus; } @@ -53,8 +58,12 @@ public class PlannerResolutionOperation extends ProvisioningOperation { return request; } + public ProvisioningContext getProvisioningContext() { + return provisioningContext; + } + protected IStatus doExecute(IProgressMonitor monitor) throws ProvisionException { - plan = ProvisioningUtil.getProvisioningPlan(request, new ProvisioningContext(), monitor); + plan = ProvisioningUtil.getProvisioningPlan(request, provisioningContext, monitor); if (plan == null) return new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, IStatusCodes.UNEXPECTED_NOTHING_TO_DO, ProvUIMessages.PlannerResolutionOperation_UnexpectedError, null); // We are reporting on our ability to get a plan, not on the status of the plan itself. diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/operations/ProfileModificationOperation.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/operations/ProfileModificationOperation.java index 8ce92a87f..2f022ec22 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/operations/ProfileModificationOperation.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/operations/ProfileModificationOperation.java @@ -27,15 +27,17 @@ public class ProfileModificationOperation extends ProvisioningOperation { String profileId; PhaseSet phaseSet; boolean isUser = true; + ProvisioningContext provisioningContext; public ProfileModificationOperation(String label, String profileId, ProvisioningPlan plan) { - this(label, profileId, plan, null, true); + this(label, profileId, plan, null, null, true); } - public ProfileModificationOperation(String label, String profileId, ProvisioningPlan plan, PhaseSet set, boolean isUser) { + public ProfileModificationOperation(String label, String profileId, ProvisioningPlan plan, ProvisioningContext context, PhaseSet set, boolean isUser) { super(label); this.plan = plan; this.profileId = profileId; + this.provisioningContext = context; this.isUser = isUser; if (set == null) phaseSet = new DefaultPhaseSet(); @@ -56,7 +58,7 @@ public class ProfileModificationOperation extends ProvisioningOperation { } protected IStatus doExecute(IProgressMonitor monitor) throws ProvisionException { - return ProvisioningUtil.performProvisioningPlan(plan, phaseSet, getProfile(), monitor); + return ProvisioningUtil.performProvisioningPlan(plan, phaseSet, getProfile(), provisioningContext, monitor); } public boolean runInBackground() { diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/operations/ProvisioningUtil.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/operations/ProvisioningUtil.java index eca565b84..01ae4b074 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/operations/ProvisioningUtil.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/operations/ProvisioningUtil.java @@ -268,7 +268,11 @@ public class ProvisioningUtil { * Get the plan for the specified install operation */ public static ProvisioningPlan getProvisioningPlan(ProfileChangeRequest request, ProvisioningContext context, IProgressMonitor monitor) throws ProvisionException { - return getPlanner().getProvisioningPlan(request, context, monitor); + try { + return getPlanner().getProvisioningPlan(request, context, monitor); + } catch (OperationCanceledException e) { + return null; + } } /* @@ -277,32 +281,53 @@ public class ProvisioningUtil { public static ProvisioningPlan getRevertPlan(IProfile currentProfile, IProfile snapshot, IProgressMonitor monitor) throws ProvisionException { Assert.isNotNull(currentProfile); Assert.isNotNull(snapshot); - return getPlanner().getRevertPlan(currentProfile, snapshot, new ProvisioningContext(), monitor); + return getPlanner().getDiffPlan(currentProfile, snapshot, monitor); } /* * Get sizing info for the specified plan */ - public static long getSize(ProvisioningPlan plan, String profileId, IProgressMonitor monitor) throws ProvisionException { + public static long getSize(ProvisioningPlan plan, String profileId, ProvisioningContext context, IProgressMonitor monitor) throws ProvisionException { // If there is nothing to size, return 0 if (plan == null) return IIUElement.SIZE_NOTAPPLICABLE; if (plan.getOperands().length == 0) return 0; SizingPhaseSet set = new SizingPhaseSet(); - IStatus status = getEngine().perform(getProfile(profileId), set, plan.getOperands(), null, monitor); + IStatus status = getEngine().perform(getProfile(profileId), set, plan.getOperands(), context, monitor); if (status.isOK()) return set.getSizing().getDiskSize(); return IIUElement.SIZE_UNAVAILABLE; } + public static IStatus performProvisioningPlan(ProvisioningPlan plan, PhaseSet phaseSet, IProfile profile, ProvisioningContext context, IProgressMonitor monitor) throws ProvisionException { + PhaseSet set; + if (phaseSet == null) + set = new DefaultPhaseSet(); + else + set = phaseSet; + return getEngine().perform(profile, set, plan.getOperands(), context, monitor); + } + + /** + * Perform the provisioning plan using a default context that contacts all repositories. + * @param plan the plan to perform + * @param phaseSet the phase set to use + * @param profile the profile to be changed + * @param monitor the progress monitor + * @return a status indicating the success of the plan + * @throws ProvisionException + * + * @deprecated clients should use {@linkplain #performProvisioningPlan(ProvisioningPlan, PhaseSet, IProfile, ProvisioningContext, IProgressMonitor)} + * to explicitly establish a provisioning context. Otherwise all repositories will be contacted + */ public static IStatus performProvisioningPlan(ProvisioningPlan plan, PhaseSet phaseSet, IProfile profile, IProgressMonitor monitor) throws ProvisionException { PhaseSet set; if (phaseSet == null) set = new DefaultPhaseSet(); else set = phaseSet; - return getEngine().perform(profile, set, plan.getOperands(), null, monitor); + return getEngine().perform(profile, set, plan.getOperands(), new ProvisioningContext(), monitor); } private static IEngine getEngine() throws ProvisionException { |