Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java')
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java123
1 files changed, 86 insertions, 37 deletions
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 efe2f3f75..6df089cd1 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, 2011 IBM Corporation and others.
+ * Copyright (c) 2008, 2013 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
@@ -8,6 +8,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
* Sonatype, Inc. - ongoing development
+ * Red Hat, Inc. - support for remediation page
*******************************************************************************/
package org.eclipse.equinox.internal.p2.ui.dialogs;
@@ -15,12 +16,13 @@ import java.lang.reflect.InvocationTargetException;
import java.util.HashSet;
import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.jobs.*;
+import org.eclipse.equinox.internal.p2.director.ProfileChangeRequest;
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.p2.engine.ProvisioningContext;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
-import org.eclipse.equinox.p2.operations.ProfileChangeOperation;
+import org.eclipse.equinox.p2.operations.*;
import org.eclipse.equinox.p2.ui.*;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
@@ -38,11 +40,11 @@ import org.eclipse.ui.statushandlers.StatusManager;
public abstract class ProvisioningOperationWizard extends Wizard {
private static final String WIZARD_SETTINGS_SECTION = "WizardSettings"; //$NON-NLS-1$
-
protected ProvisioningUI ui;
protected IUElementListRoot root;
protected ProfileChangeOperation operation;
protected Object[] planSelections;
+ protected RemediationPage remediationPage;
protected ISelectableIUsPage mainPage;
protected IResolutionErrorReportingPage errorPage;
protected ResolutionResultsWizardPage resolutionPage;
@@ -50,8 +52,8 @@ public abstract class ProvisioningOperationWizard extends Wizard {
protected LoadMetadataRepositoryJob repoPreloadJob;
IStatus couldNotResolveStatus = Status.OK_STATUS; // we haven't tried and failed
boolean resolveWithRelaxedConstraints = false;
-
boolean waitingForOtherJobs = false;
+ protected RemediationOperation remediationOperation;
public ProvisioningOperationWizard(ProvisioningUI ui, ProfileChangeOperation operation, Object[] initialSelections, LoadMetadataRepositoryJob job) {
super();
@@ -66,6 +68,14 @@ public abstract class ProvisioningOperationWizard extends Wizard {
}
}
+ public void setRemediationOperation(RemediationOperation remediationOperation) {
+ this.remediationOperation = remediationOperation;
+ }
+
+ public RemediationOperation getRemediationOperation() {
+ return remediationOperation;
+ }
+
/*
* (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#addPages()
@@ -76,10 +86,15 @@ public abstract class ProvisioningOperationWizard extends Wizard {
errorPage = createErrorReportingPage();
if (errorPage != mainPage)
addPage(errorPage);
+ remediationPage = createRemediationPage();
+ if (remediationPage != null)
+ addPage(remediationPage);
resolutionPage = createResolutionPage();
addPage(resolutionPage);
}
+ protected abstract RemediationPage createRemediationPage();
+
protected abstract IResolutionErrorReportingPage createErrorReportingPage();
protected abstract ISelectableIUsPage createMainPage(IUElementListRoot input, Object[] selections);
@@ -96,16 +111,48 @@ public abstract class ProvisioningOperationWizard extends Wizard {
/*
* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#getPreviousPage(org.eclipse.jface.wizard.IWizardPage)
+ *
+ */
+ public IWizardPage getPreviousPage(IWizardPage page) {
+ if (page == errorPage) {
+ return mainPage;
+ }
+ return super.getPreviousPage(page);
+ }
+
+ /*
+ * (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#getNextPage(org.eclipse.jface.wizard.IWizardPage)
+ *
*/
public IWizardPage getNextPage(IWizardPage page) {
// If we are moving from the main page or error page, we may need to resolve before
// advancing.
- if (page == mainPage || page == errorPage) {
+
+ if (page == remediationPage) {
+ remediationOperation.setSelectedRemedy(remediationPage.getSelectedRemedy());
+ try {
+ getContainer().run(true, false, new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) {
+ remediationOperation.resolveModal(monitor);
+ }
+ });
+ } catch (InterruptedException e) {
+ // Nothing to report if thread was interrupted
+ } catch (InvocationTargetException e) {
+ ProvUI.handleException(e.getCause(), null, StatusManager.SHOW | StatusManager.LOG);
+ couldNotResolve(null);
+ }
+ operation = remediationOperation;
+ initializeResolutionModelElements(remediationPage.transformIUstoIUElements().toArray());
+ planChanged();
+ return resolutionPage;
+ } else if (page == mainPage || page == errorPage) {
ISelectableIUsPage currentPage = (ISelectableIUsPage) page;
// Do we need to resolve?
if (operation == null || (operation != null && shouldRecomputePlan(currentPage))) {
- recomputePlan(getContainer());
+ recomputePlan(getContainer(), true);
} else {
// the selections have not changed from an IU point of view, but we want
// to reinitialize the resolution model elements to ensure they are up to
@@ -114,10 +161,22 @@ public abstract class ProvisioningOperationWizard extends Wizard {
}
IStatus status = operation.getResolutionResult();
if (status == null || status.getSeverity() == IStatus.ERROR) {
- return errorPage;
+ if (page == mainPage) {
+ if (remediationOperation != null && remediationOperation.hasRemedies() && remediationOperation.getRemedies().size() == 1) {
+ planChanged();
+ remediationPage.setSelectedRemedy(remediationOperation.getRemedies().get(0));
+ return getNextPage(remediationPage);
+ } else if (remediationOperation != null && remediationOperation.hasRemedies()) {
+ planChanged();
+ return remediationPage;
+ }
+ return errorPage;
+ }
} else if (status.getSeverity() == IStatus.CANCEL) {
return page;
} else {
+ if (remediationPage != null)
+ remediationPage.setPageComplete(true);
return resolutionPage;
}
}
@@ -172,6 +231,10 @@ public abstract class ProvisioningOperationWizard extends Wizard {
}
protected void planChanged() {
+ IWizardPage currentPage = ((WizardDialog) getContainer()).getCurrentPage();
+ if ((currentPage == null || currentPage == mainPage) && remediationPage != null && remediationOperation != null && remediationOperation.hasRemedies()) {
+ remediationPage.updateStatus(root, operation, planSelections);
+ }
resolutionPage.updateStatus(root, operation);
if (errorPage != resolutionPage) {
IUElementListRoot newRoot = shouldUpdateErrorPageModelOnPlanChange() ? root : null;
@@ -192,31 +255,16 @@ public abstract class ProvisioningOperationWizard extends Wizard {
return new ProvisioningContext(ui.getSession().getProvisioningAgent());
}
- public void recomputePlanWithRelaxedConstraints(IRunnableContext runnableContext) {
- couldNotResolveStatus = Status.OK_STATUS;
- provisioningContext = getProvisioningContext();
- initializeResolutionModelElements(getOperationSelections());
- if (planSelections.length == 0) {
- operation = null;
- couldNotResolve(ProvUIMessages.ResolutionWizardPage_NoSelections);
- } else {
- operation = ui.getRelaxedUpdateOperation(provisioningContext);
- operation.setProvisioningContext(provisioningContext);
- try {
- runnableContext.run(true, true, new IRunnableWithProgress() {
- public void run(IProgressMonitor monitor) {
- operation.resolveModal(monitor);
- }
- });
+ public void recomputePlan(IRunnableContext runnableContext) {
+ recomputePlan(runnableContext, false);
+ }
- } catch (InterruptedException e) {
- // Nothing to report if thread was interrupted
- } catch (InvocationTargetException e) {
- ProvUI.handleException(e.getCause(), null, StatusManager.SHOW | StatusManager.LOG);
- couldNotResolve(null);
- }
- }
- planChanged();
+ public void computeRemediationOperation(ProfileChangeOperation operation, ProvisioningUI ui, IProgressMonitor monitor) {
+ SubMonitor sub = SubMonitor.convert(monitor, "remediationoperation", RemedyConfig.getAllRemdyConfigs().length);
+ monitor.setTaskName("compute remediation operation");
+ remediationOperation = new RemediationOperation(ui.getSession(), (ProfileChangeRequest) operation.getProfileChangeRequest());
+ remediationOperation.getResolveJob(monitor);
+ sub.done();
}
/**
@@ -225,11 +273,7 @@ public abstract class ProvisioningOperationWizard extends Wizard {
*
* @param runnableContext
*/
- public void recomputePlan(IRunnableContext runnableContext) {
- if (resolveWithRelaxedConstraints) {
- recomputePlanWithRelaxedConstraints(runnableContext);
- return;
- }
+ public void recomputePlan(IRunnableContext runnableContext, final boolean withRemediation) {
couldNotResolveStatus = Status.OK_STATUS;
provisioningContext = getProvisioningContext();
initializeResolutionModelElements(getOperationSelections());
@@ -243,9 +287,14 @@ public abstract class ProvisioningOperationWizard extends Wizard {
runnableContext.run(true, true, new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) {
operation.resolveModal(monitor);
+ if (withRemediation) {
+ IStatus status = operation.getResolutionResult();
+ if (remediationPage != null && (status == null || (status.getSeverity() == IStatus.ERROR && status.getCode() != 10053))) {
+ computeRemediationOperation(operation, ui, monitor);
+ }
+ }
}
});
-
} catch (InterruptedException e) {
// Nothing to report if thread was interrupted
} catch (InvocationTargetException e) {

Back to the top