diff options
author | Susan Franklin | 2009-04-09 23:01:31 +0000 |
---|---|---|
committer | Susan Franklin | 2009-04-09 23:01:31 +0000 |
commit | 7508abd7bbf9364d7c0204047c41f400fc10580f (patch) | |
tree | 51716ebcaad3323debebb8ea0212ab28231d8cd1 | |
parent | fb7c5b1a15fec6e82f4a41e7d7feb0d36d8fe78e (diff) | |
download | rt.equinox.p2-7508abd7bbf9364d7c0204047c41f400fc10580f.tar.gz rt.equinox.p2-7508abd7bbf9364d7c0204047c41f400fc10580f.tar.xz rt.equinox.p2-7508abd7bbf9364d7c0204047c41f400fc10580f.zip |
Bug 268205 - [ui] Accepting an update causes plan to be recomputed
28 files changed, 439 insertions, 219 deletions
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 0b9450560..126aa5be6 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 @@ -22,7 +22,6 @@ import org.eclipse.equinox.internal.provisional.p2.ui.dialogs.AvailableIUGroup; import org.eclipse.equinox.internal.provisional.p2.ui.dialogs.InstallWizard; import org.eclipse.equinox.internal.provisional.p2.ui.policy.IUViewQueryContext; import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy; -import org.eclipse.equinox.p2.tests.ui.AbstractProvisioningUITest; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.widgets.Tree; @@ -32,7 +31,7 @@ import org.eclipse.ui.statushandlers.StatusManager; /** * Tests for the install wizard */ -public class InstallWizardTest extends AbstractProvisioningUITest { +public class InstallWizardTest extends WizardTest { private static final String AVAILABLE_SOFTWARE_PAGE = "AvailableSoftwarePage"; private static final String BROKEN_IU = "RCP_Browser_Example.feature.group"; @@ -40,7 +39,7 @@ public class InstallWizardTest extends AbstractProvisioningUITest { /** * Tests the wizard */ - public void testWizard() { + public void testInstallWizardUnresolved() { Policy policy = Policy.getDefault(); IUViewQueryContext context = policy.getQueryContext(); context.setViewType(IUViewQueryContext.AVAILABLE_VIEW_FLAT); diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/UninstallWizardTest.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/UninstallWizardTest.java index fb77a290c..bed58d1f8 100644 --- a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/UninstallWizardTest.java +++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/UninstallWizardTest.java @@ -13,26 +13,67 @@ package org.eclipse.equinox.p2.tests.ui.dialogs; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.equinox.internal.p2.ui.dialogs.ResolutionResultsWizardPage; import org.eclipse.equinox.internal.p2.ui.dialogs.SelectableIUsPage; +import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException; +import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest; import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit; import org.eclipse.equinox.internal.provisional.p2.ui.ProvUI; import org.eclipse.equinox.internal.provisional.p2.ui.ProvisioningOperationRunner; import org.eclipse.equinox.internal.provisional.p2.ui.dialogs.UninstallWizard; +import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy; -import org.eclipse.equinox.p2.tests.ui.AbstractProvisioningUITest; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.ui.statushandlers.StatusManager; /** * Tests for the install wizard */ -public class UninstallWizardTest extends AbstractProvisioningUITest { +public class UninstallWizardTest extends WizardTest { private static final String SELECTION_PAGE = "IUSelectionPage"; /** - * Tests the wizard + * Tests the wizard when the uninstall is preresolved. + * This is the normal SDK workflow. */ - public void testWizard() { + public void testUninstallWizardResolved() throws ProvisionException { + + ProfileChangeRequest req = new ProfileChangeRequest(profile); + IInstallableUnit[] iusInvolved = new IInstallableUnit[] {top1, top2}; + req.removeInstallableUnits(iusInvolved); + PlannerResolutionOperation op = getResolvedOperation(req); + UninstallWizard wizard = new UninstallWizard(Policy.getDefault(), TESTPROFILE, iusInvolved, op); + WizardDialog dialog = new WizardDialog(ProvUI.getDefaultParentShell(), wizard); + dialog.setBlockOnOpen(false); + dialog.create(); + dialog.open(); + + try { + SelectableIUsPage page1 = (SelectableIUsPage) wizard.getPage(SELECTION_PAGE); + // We should have a good plan + assertTrue(page1.isPageComplete()); + ResolutionResultsWizardPage page2 = (ResolutionResultsWizardPage) wizard.getNextPage(page1); + dialog.showPage(page2); + assertTrue(page2.isPageComplete()); + + // if another operation is scheduled for this profile, we should not be allowed to proceed + Job job = ProvisioningOperationRunner.schedule(getLongTestOperation(), StatusManager.LOG); + assertTrue(page1.isPageComplete()); + // causes recalculation of plan and status + wizard.getNextPage(page1); + // can't move to next page while op is running + assertFalse(page1.isPageComplete()); + job.cancel(); + + } finally { + dialog.getShell().close(); + } + } + + /** + * Tests the wizard without the resolution having been done ahead + * of time. This is not the SDK workflow, but should be supported. + */ + public void testUninstallWizardUnresolved() { // This test is pretty useless right now but at least it opens the wizard UninstallWizard wizard = new UninstallWizard(Policy.getDefault(), TESTPROFILE, new IInstallableUnit[] {top1, top2}, null); WizardDialog dialog = new WizardDialog(ProvUI.getDefaultParentShell(), wizard); diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/UpdateWizardTest.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/UpdateWizardTest.java index 091220d27..0fb76e4f0 100644 --- a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/UpdateWizardTest.java +++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/UpdateWizardTest.java @@ -14,26 +14,69 @@ import org.eclipse.core.runtime.jobs.Job; import org.eclipse.equinox.internal.p2.ui.dialogs.ResolutionResultsWizardPage; import org.eclipse.equinox.internal.p2.ui.dialogs.SelectableIUsPage; import org.eclipse.equinox.internal.p2.ui.model.AvailableUpdateElement; -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.ProfileChangeRequest; +import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit; import org.eclipse.equinox.internal.provisional.p2.ui.ProvUI; import org.eclipse.equinox.internal.provisional.p2.ui.ProvisioningOperationRunner; import org.eclipse.equinox.internal.provisional.p2.ui.dialogs.UpdateWizard; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; +import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy; -import org.eclipse.equinox.p2.tests.ui.AbstractProvisioningUITest; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.ui.statushandlers.StatusManager; /** * Tests for the install wizard */ -public class UpdateWizardTest extends AbstractProvisioningUITest { +public class UpdateWizardTest extends WizardTest { private static final String SELECTION_PAGE = "IUSelectionPage"; /** - * Tests the wizard + * Tests the wizard when a prior resolution has been done. + * This is the SDK */ - public void testWizard() { + public void testUpdateWizardResolved() throws ProvisionException { + IUElementListRoot root = new IUElementListRoot(); + AvailableUpdateElement element = new AvailableUpdateElement(root, upgrade, top1, TESTPROFILE, true); + root.setChildren(new Object[] {element}); + ProfileChangeRequest request = new ProfileChangeRequest(profile); + request.removeInstallableUnits(new IInstallableUnit[] {top1}); + request.addInstallableUnits(new IInstallableUnit[] {upgrade}); + PlannerResolutionOperation op = getResolvedOperation(request); + UpdateWizard wizard = new UpdateWizard(Policy.getDefault(), TESTPROFILE, root, new Object[] {element}, op, null); + WizardDialog dialog = new WizardDialog(ProvUI.getDefaultParentShell(), wizard); + dialog.setBlockOnOpen(false); + dialog.open(); + + try { + SelectableIUsPage page1 = (SelectableIUsPage) wizard.getPage(SELECTION_PAGE); + // should already have a plan + assertTrue(page1.isPageComplete()); + ResolutionResultsWizardPage page2 = (ResolutionResultsWizardPage) wizard.getNextPage(page1); + dialog.showPage(page2); + assertTrue(page2.isPageComplete()); + + // if another operation is scheduled for this profile, we should not be allowed to proceed + Job job = ProvisioningOperationRunner.schedule(getLongTestOperation(), StatusManager.LOG); + assertTrue(page1.isPageComplete()); + // causes recalculation of plan and status + wizard.getNextPage(page1); + // can't move to next page while op is running + assertFalse(page1.isPageComplete()); + job.cancel(); + + } finally { + dialog.getShell().close(); + } + } + + /** + * Tests the wizard without a prior resolution being done. + * This is not the SDK workflow, but should be supported. + */ + public void testUpdateWizardUnresolved() { IUElementListRoot root = new IUElementListRoot(); AvailableUpdateElement element = new AvailableUpdateElement(root, upgrade, top1, TESTPROFILE, true); root.setChildren(new Object[] {element}); diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/WizardTest.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/WizardTest.java new file mode 100644 index 000000000..5d26748f9 --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/WizardTest.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2008 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.equinox.p2.tests.ui.dialogs; + +import java.net.URI; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.equinox.internal.p2.ui.ProvUIActivator; +import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException; +import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest; +import org.eclipse.equinox.internal.provisional.p2.engine.ProvisioningContext; +import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; +import org.eclipse.equinox.p2.tests.ui.AbstractProvisioningUITest; + +/** + * Tests for the install wizard + */ +public abstract class WizardTest extends AbstractProvisioningUITest { + protected PlannerResolutionOperation getResolvedOperation(ProfileChangeRequest request) throws ProvisionException { + PlannerResolutionOperation op = new PlannerResolutionOperation("Test resolve operation", request.getProfile().getProfileId(), request, new ProvisioningContext(new URI[] {}), new MultiStatus(ProvUIActivator.PLUGIN_ID, 0, "This is just a test multistatus", null), true); + op.execute(getMonitor()); + return op; + } +} diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateAction.java b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateAction.java index 09598e79a..69389a488 100644 --- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateAction.java +++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateAction.java @@ -10,24 +10,29 @@ *******************************************************************************/ package org.eclipse.equinox.internal.p2.ui.sdk.scheduler; +import java.util.ArrayList; + import org.eclipse.core.runtime.IStatus; import org.eclipse.equinox.internal.provisional.p2.director.ProvisioningPlan; import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.internal.provisional.p2.ui.ProvUI; +import org.eclipse.equinox.internal.provisional.p2.ui.ProvUIProvisioningListener; import org.eclipse.equinox.internal.provisional.p2.ui.actions.UpdateAction; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; import org.eclipse.equinox.internal.provisional.p2.ui.policy.PlanValidator; import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.PlatformUI; /** - * Overridden so that we can use the profile change request computations, - * but we hide the resolution from the user and optionally suppress the - * wizard if we are resolving for reasons other than user request. + * Overridden to hide the resolution from the user and optionally suppress + * the wizard if we are resolving for reasons other than user request. * * @since 3.5 - * + * */ final class AutomaticUpdateAction extends UpdateAction { @@ -36,19 +41,61 @@ final class AutomaticUpdateAction extends UpdateAction { */ final AutomaticUpdater automaticUpdater; private boolean suppressWizard = false; + private PlannerResolutionOperation resolvedOperation; + private ProvUIProvisioningListener profileListener; - AutomaticUpdateAction(AutomaticUpdater automaticUpdater, ISelectionProvider selectionProvider, String profileId) { + AutomaticUpdateAction(AutomaticUpdater automaticUpdater, + ISelectionProvider selectionProvider, String profileId, + PlannerResolutionOperation op, IUElementListRoot root, + ArrayList initialSelections) { super(new Policy(), selectionProvider, profileId, false); + ProvUI.addProvisioningListener(createProfileListener()); + this.resolvedOperation = op; this.automaticUpdater = automaticUpdater; + this.root = root; + this.initialSelections = initialSelections; + } + + private ProvUIProvisioningListener createProfileListener() { + profileListener = new ProvUIProvisioningListener( + ProvUIProvisioningListener.PROV_EVENT_PROFILE) { + protected void profileChanged(final String profileId) { + if (profileId.equals(getProfileId(false))) + resolvedOperation = null; + } + }; + return profileListener; + } + + protected void run(final IInstallableUnit[] ius, final String id) { + // Do we have a plan?? + if (resolvedOperation != null + && resolvedOperation.getProvisioningPlan() != null) { + if (PlatformUI.isWorkbenchRunning()) { + PlatformUI.getWorkbench().getDisplay().asyncExec( + new Runnable() { + public void run() { + if (validatePlan(resolvedOperation + .getProvisioningPlan())) { + performAction(ius, id, resolvedOperation); + } + } + }); + } + } else + super.run(ius, id); } void suppressWizard(boolean suppress) { suppressWizard = suppress; } - protected int performAction(IInstallableUnit[] ius, String targetProfileId, PlannerResolutionOperation resolution) { + protected int performAction(IInstallableUnit[] ius, String targetProfileId, + PlannerResolutionOperation resolution) { if (suppressWizard) { - automaticUpdater.setUpdateAffordanceState(resolution != null && resolution.getResolutionResult().getSummaryStatus().isOK()); + automaticUpdater.setUpdateAffordanceState(resolution != null + && resolution.getResolutionResult().getSummaryStatus() + .isOK()); return Window.OK; } return super.performAction(ius, targetProfileId, resolution); @@ -56,17 +103,20 @@ final class AutomaticUpdateAction extends UpdateAction { protected PlanValidator getPlanValidator() { return new PlanValidator() { - public boolean continueWorkingWithPlan(ProvisioningPlan plan, Shell shell) { + public boolean continueWorkingWithPlan(ProvisioningPlan plan, + Shell shell) { if (automaticUpdater.alreadyValidated) return true; - // In all other cases we return false, because clicking the popup will actually run the action. + // In all other cases we return false, because clicking the + // popup will actually run the action. // We are just determining whether to show the popup or not. if (plan != null) { // If the user cancelled the operation, don't continue if (plan.getStatus().getSeverity() == IStatus.CANCEL) return false; boolean noError = plan.getStatus().getSeverity() != IStatus.ERROR; - // Show the affordance regardless of the status since updates were found. + // Show the affordance regardless of the status since + // updates were found. if (automaticUpdater.updateAffordance == null) automaticUpdater.createUpdateAffordance(); automaticUpdater.setUpdateAffordanceState(noError); @@ -77,4 +127,10 @@ final class AutomaticUpdateAction extends UpdateAction { } }; } + + public void dispose() { + if (profileListener != null) + ProvUI.removeProvisioningListener(profileListener); + profileListener = null; + } }
\ No newline at end of file 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 039513ec7..dd7ea0757 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008 IBM Corporation and others. + * Copyright (c) 2008, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -13,29 +13,49 @@ package org.eclipse.equinox.internal.p2.ui.sdk.scheduler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.Collection; -import java.util.EventObject; -import org.eclipse.core.runtime.*; -import org.eclipse.core.runtime.jobs.*; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.IJobChangeListener; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException; -import org.eclipse.equinox.internal.provisional.p2.core.eventbus.IProvisioningEventBus; -import org.eclipse.equinox.internal.provisional.p2.core.eventbus.ProvisioningListener; import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest; -import org.eclipse.equinox.internal.provisional.p2.engine.*; +import org.eclipse.equinox.internal.provisional.p2.engine.IProfile; +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.model.Updates; -import org.eclipse.equinox.internal.provisional.p2.ui.operations.*; -import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy; +import org.eclipse.equinox.internal.provisional.p2.ui.ProvUI; +import org.eclipse.equinox.internal.provisional.p2.ui.ProvUIImages; +import org.eclipse.equinox.internal.provisional.p2.ui.ProvisioningOperationRunner; +import org.eclipse.equinox.internal.provisional.p2.ui.dialogs.UpdateWizard; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; +import org.eclipse.equinox.internal.provisional.p2.ui.operations.DownloadPhaseSet; +import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; +import org.eclipse.equinox.internal.provisional.p2.ui.operations.ProfileModificationOperation; +import org.eclipse.equinox.internal.provisional.p2.ui.operations.ProvisioningUtil; import org.eclipse.equinox.internal.provisional.p2.updatechecker.IUpdateListener; import org.eclipse.equinox.internal.provisional.p2.updatechecker.UpdateEvent; import org.eclipse.jface.action.IStatusLineManager; import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.viewers.*; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.*; -import org.eclipse.ui.*; -import org.eclipse.ui.progress.WorkbenchJob; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IEditorSite; +import org.eclipse.ui.IViewSite; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPartSite; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.statushandlers.StatusManager; /** @@ -49,7 +69,6 @@ public class AutomaticUpdater implements IUpdateListener { IInstallableUnit[] iusWithUpdates; String profileId; AutomaticUpdatesPopup popup; - ProvisioningListener profileChangeListener; IJobChangeListener provisioningJobListener; boolean alreadyValidated = false; boolean alreadyDownloaded = false; @@ -79,74 +98,72 @@ public class AutomaticUpdater implements IUpdateListener { clearUpdatesAvailable(); return; } - registerProfileChangeListener(); registerProvisioningJobListener(); - // Download the items if the preference dictates before - // showing the user that updates are available. + // Always get a profile change request and provisioning plan. + // A side-effect of making the change request is producing the model + // elements necessary for a wizard, so initialize the data structures + // for getting these. + final ArrayList initialSelections = new ArrayList(); + final IUElementListRoot root = new IUElementListRoot(); try { - if (download) { - ElementQueryDescriptor descriptor = Policy.getDefault() - .getQueryProvider().getQueryDescriptor( - new Updates(event.getProfileId(), event - .getIUs())); - Collection results = descriptor.performQuery(null); - 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, - null, new MultiStatus( - AutomaticUpdatePlugin.PLUGIN_ID, 0, null, - null), false); - if ((operation.execute(new NullProgressMonitor())).isOK()) { - Job job = ProvisioningOperationRunner - .schedule( - new ProfileModificationOperation( - AutomaticUpdateMessages.AutomaticUpdater_AutomaticDownloadOperationName, - event.getProfileId(), operation - .getProvisioningPlan(), - new ProvisioningContext(), - new DownloadPhaseSet(), false), - StatusManager.LOG); - job.addJobChangeListener(new JobChangeAdapter() { - public void done(IJobChangeEvent jobEvent) { - alreadyDownloaded = true; - IStatus status = jobEvent.getResult(); - if (status.isOK()) { - createUpdateAction(); - PlatformUI.getWorkbench().getDisplay() - .asyncExec(new Runnable() { - public void run() { - updateAction - .suppressWizard(true); - updateAction.run(); - } - }); - } else if (status.getSeverity() != IStatus.CANCEL) { - ProvUI.reportStatus(status, - StatusManager.LOG); - } + ProfileChangeRequest request = UpdateWizard + .createProfileChangeRequest(event.getIUs(), event + .getProfileId(), root, initialSelections, null); + if (request == null) { + clearUpdatesAvailable(); + return; + } + final PlannerResolutionOperation operation = new PlannerResolutionOperation( + AutomaticUpdateMessages.AutomaticUpdater_ResolutionOperationLabel, + event.getProfileId(), request, null, new MultiStatus( + AutomaticUpdatePlugin.PLUGIN_ID, 0, null, null), + false); + if ((operation.execute(new NullProgressMonitor())).isOK()) { + // Download the items before notifying user if the + // preference dictates. + + if (download) { + Job job = ProvisioningOperationRunner + .schedule( + new ProfileModificationOperation( + AutomaticUpdateMessages.AutomaticUpdater_AutomaticDownloadOperationName, + event.getProfileId(), operation + .getProvisioningPlan(), + new ProvisioningContext(), + new DownloadPhaseSet(), false), + StatusManager.LOG); + job.addJobChangeListener(new JobChangeAdapter() { + public void done(IJobChangeEvent jobEvent) { + alreadyDownloaded = true; + IStatus status = jobEvent.getResult(); + if (status.isOK()) { + createUpdateAction(operation, root, + initialSelections); + PlatformUI.getWorkbench().getDisplay() + .asyncExec(new Runnable() { + public void run() { + updateAction + .suppressWizard(true); + updateAction.run(); + } + }); + } else if (status.getSeverity() != IStatus.CANCEL) { + ProvUI.reportStatus(status, StatusManager.LOG); } - }); - } + } + }); + } else { + createUpdateAction(operation, root, initialSelections); + PlatformUI.getWorkbench().getDisplay().asyncExec( + new Runnable() { + public void run() { + updateAction.suppressWizard(true); + updateAction.run(); + } + }); } - } else { - createUpdateAction(); - PlatformUI.getWorkbench().getDisplay().asyncExec( - new Runnable() { - public void run() { - updateAction.suppressWizard(true); - updateAction.run(); - } - }); } - } catch (ProvisionException e) { ProvUI .handleException( @@ -327,10 +344,13 @@ public class AutomaticUpdater implements IUpdateListener { } - void createUpdateAction() { - if (updateAction == null) - updateAction = new AutomaticUpdateAction(this, - getSelectionProvider(), profileId); + void createUpdateAction(PlannerResolutionOperation operation, + IUElementListRoot root, ArrayList initialSelections) { + if (updateAction != null) { + updateAction.dispose(); + } + updateAction = new AutomaticUpdateAction(this, getSelectionProvider(), + profileId, operation, root, initialSelections); } void clearUpdatesAvailable() { @@ -406,26 +426,6 @@ public class AutomaticUpdater implements IUpdateListener { updateAction.run(); } - private void registerProfileChangeListener() { - if (profileChangeListener == null) { - profileChangeListener = new ProvisioningListener() { - public void notify(EventObject o) { - if (o instanceof ProfileEvent) { - ProfileEvent event = (ProfileEvent) o; - if (event.getReason() == ProfileEvent.CHANGED - && profileId.equals(event.getProfileId())) { - validateUpdates(); - } - } - } - }; - IProvisioningEventBus bus = AutomaticUpdatePlugin.getDefault() - .getProvisioningEventBus(); - if (bus != null) - bus.addListener(profileChangeListener); - } - } - private void registerProvisioningJobListener() { if (provisioningJobListener == null) { provisioningJobListener = new JobChangeAdapter() { @@ -466,40 +466,44 @@ public class AutomaticUpdater implements IUpdateListener { * affordance. */ void validateUpdates() { - Job validateJob = new WorkbenchJob("Update validate job") { //$NON-NLS-1$ - public IStatus runInUIThread(IProgressMonitor monitor) { + Job validateJob = new Job("Update validate job") { //$NON-NLS-1$ + public IStatus run(IProgressMonitor monitor) { if (monitor.isCanceled()) return Status.CANCEL_STATUS; validateUpdates(monitor, false); - if (iusWithUpdates.length == 0) - clearUpdatesAvailable(); - else { - createUpdateAction(); - updateAction.suppressWizard(true); - updateAction.run(); + // If there are no more updates, clear the indicators + if (iusWithUpdates.length == 0) { + if (PlatformUI.isWorkbenchRunning()) + PlatformUI.getWorkbench().getDisplay().asyncExec( + new Runnable() { + public void run() { + clearUpdatesAvailable(); + } + }); + } else { + // Run through the same update notification logic as before, + // which will cause a new plan to be created against the + // changed profile. + updatesAvailable(new UpdateEvent(profileId, iusWithUpdates)); } return Status.OK_STATUS; } }; validateJob.setSystem(true); - validateJob.setPriority(Job.SHORT); + validateJob.setPriority(Job.LONG); validateJob.schedule(); } public void shutdown() { + if (updateAction != null) + updateAction.dispose(); if (provisioningJobListener != null) { ProvisioningOperationRunner .removeJobChangeListener(provisioningJobListener); provisioningJobListener = null; } - if (profileChangeListener == null) - return; - IProvisioningEventBus bus = AutomaticUpdatePlugin.getDefault() - .getProvisioningEventBus(); - if (bus != null) - bus.removeListener(profileChangeListener); - profileChangeListener = null; statusLineManager = null; + updateAction = null; } IPreferenceStore getPreferenceStore() { 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 1e0a8b690..49563868e 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 @@ -62,6 +62,7 @@ public class ProvUIMessages extends NLS { public static String IULicensePropertyPage_ViewLicenseLabel; public static String ProfileChangeRequestBuildingRequest; public static String ProfileElement_InvalidProfile; + public static String ProfileModificationAction_InvalidSelections; public static String ProfileModificationAction_NoChangeRequestProvided; public static String ProfileModificationAction_NoExplanationProvided; public static String ProfileModificationAction_ResolutionOperationLabel; diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/IResolutionErrorReportingPage.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/IResolutionErrorReportingPage.java index 69d7c04ba..1646cea01 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/IResolutionErrorReportingPage.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/IResolutionErrorReportingPage.java @@ -11,7 +11,8 @@ package org.eclipse.equinox.internal.p2.ui.dialogs; -import org.eclipse.equinox.internal.p2.ui.model.IUElementListRoot; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; + import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; /** diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/InstallWizardPage.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/InstallWizardPage.java index eb94f8375..5b3ee78e1 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/InstallWizardPage.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/InstallWizardPage.java @@ -10,8 +10,9 @@ *******************************************************************************/ package org.eclipse.equinox.internal.p2.ui.dialogs; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; + import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; -import org.eclipse.equinox.internal.p2.ui.model.IUElementListRoot; import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy; 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 51dbc4f9f..87a95d855 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2009 IBM Corporation and others. + * Copyright (c) 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -16,12 +16,11 @@ import java.util.HashSet; import org.eclipse.core.runtime.*; import org.eclipse.equinox.internal.p2.ui.*; 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.core.ProvisionException; import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest; 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.model.IUElementListRoot; import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy; import org.eclipse.jface.operation.IRunnableContext; @@ -119,6 +118,9 @@ public abstract class ProvisioningOperationWizard extends Wizard { root = makeResolutionElementRoot(planSelections); recomputePlan(getContainer()); planChanged(); + } else { + planSelections = currentPage.getCheckedIUElements(); + root = makeResolutionElementRoot(planSelections); } return selectNextPage(page, getCurrentStatus()); } @@ -209,7 +211,6 @@ public abstract class ProvisioningOperationWizard extends Wizard { */ public void recomputePlan(IRunnableContext runnableContext) { final Object[] elements = root.getChildren(root); - final IInstallableUnit[] ius = ElementUtils.elementsToIUs(elements); couldNotResolve = false; try { if (elements.length == 0) { @@ -221,7 +222,7 @@ public abstract class ProvisioningOperationWizard extends Wizard { MultiStatus status = PlanAnalyzer.getProfileChangeAlteredStatus(); ProfileChangeRequest request = computeProfileChangeRequest(elements, status, monitor); if (request != null) { - resolutionOperation = new PlannerResolutionOperation(ProvUIMessages.ProfileModificationWizardPage_ResolutionOperationLabel, ius, profileId, request, provisioningContext, status, false); + resolutionOperation = new PlannerResolutionOperation(ProvUIMessages.ProfileModificationWizardPage_ResolutionOperationLabel, profileId, request, provisioningContext, status, false); try { resolutionOperation.execute(monitor); } catch (ProvisionException e) { diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionResultsWizardPage.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionResultsWizardPage.java index c5471123c..572c36afc 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionResultsWizardPage.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionResultsWizardPage.java @@ -11,6 +11,8 @@ *******************************************************************************/ package org.eclipse.equinox.internal.p2.ui.dialogs; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; + import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IStatus; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionStatusPage.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionStatusPage.java index d3005da63..04f45bd0d 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionStatusPage.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionStatusPage.java @@ -11,10 +11,11 @@ *******************************************************************************/ package org.eclipse.equinox.internal.p2.ui.dialogs; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; + import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IStatus; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; -import org.eclipse.equinox.internal.p2.ui.model.IUElementListRoot; import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit; import org.eclipse.equinox.internal.provisional.p2.ui.IUPropertyUtils; import org.eclipse.equinox.internal.provisional.p2.ui.ProvUI; diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/SelectableIUsPage.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/SelectableIUsPage.java index f5db65e1b..2da9dcce4 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/SelectableIUsPage.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/SelectableIUsPage.java @@ -15,10 +15,10 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.equinox.internal.p2.ui.*; import org.eclipse.equinox.internal.p2.ui.model.ElementUtils; -import org.eclipse.equinox.internal.p2.ui.model.IUElementListRoot; import org.eclipse.equinox.internal.p2.ui.viewers.IUDetailsLabelProvider; 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.model.IUElementListRoot; import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy; import org.eclipse.equinox.internal.provisional.p2.ui.viewers.*; @@ -129,7 +129,7 @@ public class SelectableIUsPage extends ResolutionStatusPage implements IResoluti createSelectButtons(composite); // The text area shows a description of the selected IU, or error detail if applicable. - iuDetailsGroup = new IUDetailsGroup(sashForm, tableViewer, convertWidthInCharsToPixels(ILayoutConstants.DEFAULT_TABLE_WIDTH), false); + iuDetailsGroup = new IUDetailsGroup(sashForm, tableViewer, convertWidthInCharsToPixels(ILayoutConstants.DEFAULT_TABLE_WIDTH), true); detailsArea = iuDetailsGroup.getDetailsArea(); updateStatus(root, resolvedOperation); 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 f89825844..87db30ab2 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 @@ -10,12 +10,13 @@ *******************************************************************************/ package org.eclipse.equinox.internal.p2.ui.dialogs; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; + import java.text.NumberFormat; import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.jobs.*; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; 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; diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/UninstallWizardPage.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/UninstallWizardPage.java index 7efc99a6b..e245a3f8e 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/UninstallWizardPage.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/UninstallWizardPage.java @@ -10,8 +10,9 @@ *******************************************************************************/ package org.eclipse.equinox.internal.p2.ui.dialogs; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; + import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; -import org.eclipse.equinox.internal.p2.ui.model.IUElementListRoot; import org.eclipse.equinox.internal.provisional.p2.director.ProvisioningPlan; import org.eclipse.equinox.internal.provisional.p2.query.IQueryable; import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/UpdateWizardPage.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/UpdateWizardPage.java index 0ebe8792c..a8428ef43 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/UpdateWizardPage.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/UpdateWizardPage.java @@ -10,8 +10,9 @@ *******************************************************************************/ package org.eclipse.equinox.internal.p2.ui.dialogs; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; + import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; -import org.eclipse.equinox.internal.p2.ui.model.IUElementListRoot; import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit; import org.eclipse.equinox.internal.provisional.p2.metadata.IUpdateDescriptor; import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/WizardWithLicenses.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/WizardWithLicenses.java index ca8f6b92b..487c9be71 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/WizardWithLicenses.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/WizardWithLicenses.java @@ -10,8 +10,9 @@ *******************************************************************************/ package org.eclipse.equinox.internal.p2.ui.dialogs; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; + 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.director.ProvisioningPlan; import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit; import org.eclipse.equinox.internal.provisional.p2.ui.dialogs.AcceptLicensesWizardPage; 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 a6e306cfb..38f764406 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 @@ -11,6 +11,7 @@ ProfileChangeRequestBuildingRequest=Processing request ProfileElement_InvalidProfile=Invalid profile ID {0} +ProfileModificationAction_InvalidSelections=Problem determining user request. Profile id: {0}, Selection count: {1} ProfileModificationAction_NoChangeRequestProvided=Could not interpret the request ProfileModificationAction_NoExplanationProvided=Unexpected error while processing the request. ProfileModificationAction_ResolutionOperationLabel=Calculating Requirements diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/model/QueriedElement.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/model/QueriedElement.java index 08f149a0d..a214daf52 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/model/QueriedElement.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/model/QueriedElement.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.equinox.internal.p2.ui.model; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; + import java.util.*; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; 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 d49f8093f..0f4d527ac 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 @@ -11,6 +11,8 @@ package org.eclipse.equinox.internal.provisional.p2.ui.actions; +import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; + import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.*; @@ -62,7 +64,7 @@ public abstract class ProfileModificationAction extends ProvisioningAction { } protected IStatus getNoProfileOrSelectionStatus(String id, IInstallableUnit[] ius) { - return new Status(IStatus.WARNING, ProvUIActivator.PLUGIN_ID, NLS.bind("Problem determining user request. Profile id: {0}, Selection count: {1}", id, new Integer(ius.length))); + return new Status(IStatus.WARNING, ProvUIActivator.PLUGIN_ID, NLS.bind(ProvUIMessages.ProfileModificationAction_InvalidSelections, id, new Integer(ius.length))); } protected void run(final IInstallableUnit[] ius, final String id) { @@ -102,7 +104,7 @@ public abstract class ProfileModificationAction extends ProvisioningAction { 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], null, additionalStatus, isResolveUserVisible()); + final PlannerResolutionOperation operation = new PlannerResolutionOperation(ProvUIMessages.ProfileModificationAction_ResolutionOperationLabel, 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/actions/UpdateAction.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/actions/UpdateAction.java index 9cbd4e228..9f3b4df7b 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/actions/UpdateAction.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/actions/UpdateAction.java @@ -11,17 +11,15 @@ package org.eclipse.equinox.internal.provisional.p2.ui.actions; -import java.util.*; +import java.util.ArrayList; import org.eclipse.core.runtime.*; import org.eclipse.equinox.internal.p2.ui.PlanAnalyzer; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; -import org.eclipse.equinox.internal.p2.ui.model.AvailableUpdateElement; -import org.eclipse.equinox.internal.p2.ui.model.IUElementListRoot; import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest; 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.UpdateWizard; -import org.eclipse.equinox.internal.provisional.p2.ui.model.Updates; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy; import org.eclipse.jface.viewers.ISelectionProvider; @@ -30,8 +28,8 @@ import org.eclipse.ui.PlatformUI; public class UpdateAction extends ExistingIUInProfileAction { - IUElementListRoot root; // root that will be used to seed the wizard - HashMap latestReplacements; + protected IUElementListRoot root; // root that will be used to seed the wizard + protected ArrayList initialSelections; // the elements that should be selected in the wizard boolean resolveIsVisible = true; QueryableMetadataRepositoryManager manager; boolean skipSelectionPage = false; @@ -52,11 +50,11 @@ public class UpdateAction extends ExistingIUInProfileAction { protected int performAction(IInstallableUnit[] ius, String targetProfileId, PlannerResolutionOperation resolution) { // Caches should have been created while formulating the plan - Assert.isNotNull(latestReplacements); + Assert.isNotNull(initialSelections); Assert.isNotNull(root); Assert.isNotNull(resolution); - UpdateWizard wizard = new UpdateWizard(getPolicy(), targetProfileId, root, latestReplacements.values().toArray(), resolution, manager); + UpdateWizard wizard = new UpdateWizard(getPolicy(), targetProfileId, root, initialSelections.toArray(), resolution, manager); wizard.setSkipSelectionsPage(skipSelectionPage); WizardDialog dialog = new WizardDialog(getShell(), wizard); dialog.create(); @@ -66,50 +64,14 @@ public class UpdateAction extends ExistingIUInProfileAction { } protected ProfileChangeRequest getProfileChangeRequest(IInstallableUnit[] ius, String targetProfileId, MultiStatus status, IProgressMonitor monitor) { - // Here we create a profile change request by finding the latest version available for any replacement. - ArrayList toBeUpdated = new ArrayList(); - latestReplacements = new HashMap(); - ArrayList allReplacements = new ArrayList(); - SubMonitor sub = SubMonitor.convert(monitor, ProvUIMessages.ProfileChangeRequestBuildingRequest, ius.length); - for (int i = 0; i < ius.length; i++) { - ElementQueryDescriptor descriptor = getQueryProvider().getQueryDescriptor(new Updates(targetProfileId, new IInstallableUnit[] {ius[i]})); - Iterator iter = descriptor.performQuery(sub).iterator(); - if (iter.hasNext()) - toBeUpdated.add(ius[i]); - ArrayList currentReplacements = new ArrayList(); - root = new IUElementListRoot(); - while (iter.hasNext()) { - IInstallableUnit iu = (IInstallableUnit) ProvUI.getAdapter(iter.next(), IInstallableUnit.class); - if (iu != null) { - AvailableUpdateElement element = new AvailableUpdateElement(root, iu, ius[i], targetProfileId, true); - currentReplacements.add(element); - allReplacements.add(element); - } - } - root.setChildren(allReplacements.toArray()); - for (int j = 0; j < currentReplacements.size(); j++) { - AvailableUpdateElement replacementElement = (AvailableUpdateElement) currentReplacements.get(j); - AvailableUpdateElement latestElement = (AvailableUpdateElement) latestReplacements.get(replacementElement.getIU().getId()); - IInstallableUnit latestIU = latestElement == null ? null : latestElement.getIU(); - if (latestIU == null || replacementElement.getIU().getVersion().compareTo(latestIU.getVersion()) > 0) - latestReplacements.put(replacementElement.getIU().getId(), replacementElement); - } - sub.worked(1); - } - if (toBeUpdated.size() <= 0) { + initialSelections = new ArrayList(); + root = new IUElementListRoot(); + ProfileChangeRequest request = UpdateWizard.createProfileChangeRequest(ius, targetProfileId, root, initialSelections, monitor); + if (request == null) { status.add(PlanAnalyzer.getStatus(IStatusCodes.NOTHING_TO_UPDATE, null)); - sub.done(); return null; } - ProfileChangeRequest request = ProfileChangeRequest.createByProfileId(targetProfileId); - Iterator iter = toBeUpdated.iterator(); - while (iter.hasNext()) - request.removeInstallableUnits(new IInstallableUnit[] {(IInstallableUnit) iter.next()}); - iter = latestReplacements.values().iterator(); - while (iter.hasNext()) - request.addInstallableUnits(new IInstallableUnit[] {((AvailableUpdateElement) iter.next()).getIU()}); - sub.done(); return request; } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/AcceptLicensesWizardPage.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/AcceptLicensesWizardPage.java index 8fd829b2f..96fdd14f7 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/AcceptLicensesWizardPage.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/AcceptLicensesWizardPage.java @@ -10,10 +10,11 @@ *******************************************************************************/ package org.eclipse.equinox.internal.provisional.p2.ui.dialogs; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; + import java.util.*; import java.util.List; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; -import org.eclipse.equinox.internal.p2.ui.model.IUElementListRoot; import org.eclipse.equinox.internal.p2.ui.viewers.IUDetailsLabelProvider; import org.eclipse.equinox.internal.provisional.p2.director.ProvisioningPlan; import org.eclipse.equinox.internal.provisional.p2.engine.InstallableUnitOperand; 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 5882c6b8c..077867858 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 @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.equinox.internal.provisional.p2.ui.dialogs; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; + import java.util.ArrayList; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.MultiStatus; diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/PreselectedIUInstallWizard.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/PreselectedIUInstallWizard.java index 11ed812d3..a899f84db 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/PreselectedIUInstallWizard.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/PreselectedIUInstallWizard.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.equinox.internal.provisional.p2.ui.dialogs; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; + import java.util.ArrayList; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.MultiStatus; diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/UninstallWizard.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/UninstallWizard.java index f562f92a4..511fc0eb7 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/UninstallWizard.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/UninstallWizard.java @@ -10,13 +10,14 @@ *******************************************************************************/ package org.eclipse.equinox.internal.provisional.p2.ui.dialogs; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; + import java.util.ArrayList; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; import org.eclipse.equinox.internal.p2.ui.dialogs.*; 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.director.ProfileChangeRequest; import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit; import org.eclipse.equinox.internal.provisional.p2.ui.ProvUIImages; diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/UpdateWizard.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/UpdateWizard.java index cf03925b6..e05703253 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/UpdateWizard.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/UpdateWizard.java @@ -12,16 +12,15 @@ package org.eclipse.equinox.internal.provisional.p2.ui.dialogs; import java.util.*; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.*; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; import org.eclipse.equinox.internal.p2.ui.dialogs.*; import org.eclipse.equinox.internal.p2.ui.model.AvailableUpdateElement; -import org.eclipse.equinox.internal.p2.ui.model.IUElementListRoot; import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest; 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; +import org.eclipse.equinox.internal.provisional.p2.ui.*; +import org.eclipse.equinox.internal.provisional.p2.ui.model.IUElementListRoot; +import org.eclipse.equinox.internal.provisional.p2.ui.model.Updates; import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation; import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy; import org.eclipse.jface.wizard.IWizardPage; @@ -56,6 +55,69 @@ public class UpdateWizard extends WizardWithLicenses { return (IInstallableUnit[]) replacements.toArray(new IInstallableUnit[replacements.size()]); } + /** + * Create a profile change request that represents an update of the specified IUs to their latest versions. + * If an element root and selection container are provided, update those elements so that a wizard could + * be opened on them to reflect the profile change request. + * + * @param iusToUpdate + * @param profileId + * @param root + * @param initialSelections + * @param monitor + * @return the profile change request describing an update, or null if there is nothing to update. + */ + public static ProfileChangeRequest createProfileChangeRequest(IInstallableUnit[] iusToUpdate, String profileId, IUElementListRoot root, Collection initialSelections, IProgressMonitor monitor) { + // Here we create a profile change request by finding the latest version available for any replacement. + ArrayList toBeUpdated = new ArrayList(); + HashMap latestReplacements = new HashMap(); + ArrayList allReplacements = new ArrayList(); + SubMonitor sub = SubMonitor.convert(monitor, ProvUIMessages.ProfileChangeRequestBuildingRequest, 100 * iusToUpdate.length); + for (int i = 0; i < iusToUpdate.length; i++) { + ElementQueryDescriptor descriptor = Policy.getDefault().getQueryProvider().getQueryDescriptor(new Updates(profileId, new IInstallableUnit[] {iusToUpdate[i]})); + Iterator iter = descriptor.performQuery(sub).iterator(); + if (iter.hasNext()) + toBeUpdated.add(iusToUpdate[i]); + ArrayList currentReplacements = new ArrayList(); + while (iter.hasNext()) { + IInstallableUnit iu = (IInstallableUnit) ProvUI.getAdapter(iter.next(), IInstallableUnit.class); + if (iu != null) { + AvailableUpdateElement element = new AvailableUpdateElement(root, iu, iusToUpdate[i], profileId, true); + currentReplacements.add(element); + allReplacements.add(element); + } + } + for (int j = 0; j < currentReplacements.size(); j++) { + AvailableUpdateElement replacementElement = (AvailableUpdateElement) currentReplacements.get(j); + AvailableUpdateElement latestElement = (AvailableUpdateElement) latestReplacements.get(replacementElement.getIU().getId()); + IInstallableUnit latestIU = latestElement == null ? null : latestElement.getIU(); + if (latestIU == null || replacementElement.getIU().getVersion().compareTo(latestIU.getVersion()) > 0) + latestReplacements.put(replacementElement.getIU().getId(), replacementElement); + } + sub.worked(100); + } + if (root != null) + root.setChildren(allReplacements.toArray()); + + if (initialSelections != null) + initialSelections.addAll(latestReplacements.values()); + + if (toBeUpdated.size() <= 0) { + sub.done(); + return null; + } + + ProfileChangeRequest request = ProfileChangeRequest.createByProfileId(profileId); + Iterator iter = toBeUpdated.iterator(); + while (iter.hasNext()) + request.removeInstallableUnits(new IInstallableUnit[] {(IInstallableUnit) iter.next()}); + iter = latestReplacements.values().iterator(); + while (iter.hasNext()) + request.addInstallableUnits(new IInstallableUnit[] {((AvailableUpdateElement) iter.next()).getIU()}); + sub.done(); + return request; + } + public UpdateWizard(Policy policy, String profileId, IUElementListRoot root, Object[] initialSelections, PlannerResolutionOperation initialResolution, QueryableMetadataRepositoryManager manager) { super(policy, profileId, root, initialSelections, initialResolution); setWindowTitle(ProvUIMessages.UpdateAction_UpdatesAvailableTitle); @@ -119,8 +181,9 @@ public class UpdateWizard extends WizardWithLicenses { } public IWizardPage getStartingPage() { - if (skipSelectionsPage) - return selectNextPage(mainPage, getCurrentStatus()); + if (skipSelectionsPage) { + return getNextPage(mainPage); + } return mainPage; } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/model/IUElementListRoot.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/model/IUElementListRoot.java index 3e130ca6e..5f1c71910 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/model/IUElementListRoot.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/model/IUElementListRoot.java @@ -8,7 +8,9 @@ * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ -package org.eclipse.equinox.internal.p2.ui.model; +package org.eclipse.equinox.internal.provisional.p2.ui.model; + +import org.eclipse.equinox.internal.p2.ui.model.ProvElement; /** 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 2bf99b0fa..0eadc6190 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 @@ -16,7 +16,6 @@ import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException; 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.ProvisioningContext; -import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit; import org.eclipse.equinox.internal.provisional.p2.ui.IStatusCodes; import org.eclipse.equinox.internal.provisional.p2.ui.ResolutionResult; @@ -33,15 +32,13 @@ public class PlannerResolutionOperation extends ProvisioningOperation { ProvisioningPlan plan; MultiStatus additionalStatus; ResolutionResult report; - IInstallableUnit[] iusInvolved; ProvisioningContext provisioningContext; - public PlannerResolutionOperation(String label, IInstallableUnit[] iusInvolved, String profileId, ProfileChangeRequest request, ProvisioningContext provisioningContext, MultiStatus additionalStatus, boolean isUser) { + public PlannerResolutionOperation(String label, 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 |