Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSusan Franklin2009-04-09 23:01:31 +0000
committerSusan Franklin2009-04-09 23:01:31 +0000
commit7508abd7bbf9364d7c0204047c41f400fc10580f (patch)
tree51716ebcaad3323debebb8ea0212ab28231d8cd1
parentfb7c5b1a15fec6e82f4a41e7d7feb0d36d8fe78e (diff)
downloadrt.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
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWizardTest.java5
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/UninstallWizardTest.java49
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/UpdateWizardTest.java53
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/WizardTest.java31
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateAction.java76
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdater.java242
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java1
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/IResolutionErrorReportingPage.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/InstallWizardPage.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java11
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionResultsWizardPage.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionStatusPage.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/SelectableIUsPage.java4
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/SizeComputingWizardPage.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/UninstallWizardPage.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/UpdateWizardPage.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/WizardWithLicenses.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties1
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/model/QueriedElement.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/actions/ProfileModificationAction.java6
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/actions/UpdateAction.java58
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/AcceptLicensesWizardPage.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/InstallWizard.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/PreselectedIUInstallWizard.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/UninstallWizard.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/dialogs/UpdateWizard.java77
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/model/IUElementListRoot.java (renamed from bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/model/IUElementListRoot.java)4
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/operations/PlannerResolutionOperation.java5
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

Back to the top