/******************************************************************************* * Copyright (c) 2011 WindRiver 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: * WindRiver Corporation - initial API and implementation * IBM Corporation - Ongoing development * Ericsson (AB) - bug 409073 *******************************************************************************/ package org.eclipse.equinox.internal.p2.importexport.internal.wizard; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import org.eclipse.core.runtime.*; import org.eclipse.equinox.internal.p2.importexport.internal.*; import org.eclipse.equinox.internal.p2.ui.ProvUI; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; import org.eclipse.equinox.internal.p2.ui.dialogs.ISelectableIUsPage; import org.eclipse.equinox.internal.p2.ui.dialogs.InstallWizard; 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.InstallOperation; import org.eclipse.equinox.p2.operations.ProvisioningSession; import org.eclipse.equinox.p2.ui.LoadMetadataRepositoryJob; import org.eclipse.equinox.p2.ui.ProvisioningUI; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IImportWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.statushandlers.StatusManager; public class ImportWizard extends InstallWizard implements IImportWizard { public ImportWizard() { this(ProvisioningUI.getDefaultUI(), null, null, null); } public ImportWizard(ProvisioningUI ui, InstallOperation operation, Collection<IInstallableUnit> initialSelections, LoadMetadataRepositoryJob preloadJob) { super(ui, operation, initialSelections, preloadJob); IDialogSettings workbenchSettings = ImportExportActivator.getDefault().getDialogSettings(); String sectionName = "ImportWizard"; //$NON-NLS-1$ IDialogSettings section = workbenchSettings.getSection(sectionName); if (section == null) { section = workbenchSettings.addNewSection(sectionName); } setDialogSettings(section); } public void init(IWorkbench workbench, IStructuredSelection selection) { setWindowTitle(Messages.ImportWizard_WINDOWTITLE); setDefaultPageImageDescriptor(ImageDescriptor.createFromURL(Platform.getBundle(Constants.Bundle_ID).getEntry("icons/wizban/install_wiz.png"))); //$NON-NLS-1$ setNeedsProgressMonitor(true); } @Override protected ISelectableIUsPage createMainPage(IUElementListRoot input, Object[] selections) { return new ImportPage(ui, this); } @Override protected ProvisioningContext getProvisioningContext() { return ((ImportPage) mainPage).getProvisioningContext(); } public void recomputePlan(IRunnableContext runnableContext) { recomputePlan(runnableContext, true); } /** * Recompute the provisioning plan based on the items in the IUElementListRoot and the given provisioning context. * Report progress using the specified runnable context. This method may be called before the page is created. * * @param runnableContext */ @Override public void recomputePlan(IRunnableContext runnableContext, final boolean withRemediation) { if (((ImportPage) mainPage).hasUnloadedRepo()) { try { runnableContext.run(true, true, new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InterruptedException { final SubMonitor sub = SubMonitor.convert(monitor, 1000); ((ImportPage) mainPage).recompute(sub.newChild(800)); if (sub.isCanceled()) throw new InterruptedException(); Display.getDefault().syncExec(new Runnable() { public void run() { ProvisioningContext context = getProvisioningContext(); initializeResolutionModelElements(getOperationSelections()); if (planSelections.length == 0) { operation = new InstallOperation(new ProvisioningSession(AbstractPage.agent), new ArrayList<IInstallableUnit>()) { protected void computeProfileChangeRequest(MultiStatus status, IProgressMonitor monitor) { monitor.done(); } public IStatus getResolutionResult() { if (sub.isCanceled()) return Status.CANCEL_STATUS; return new Status(IStatus.ERROR, Constants.Bundle_ID, Messages.ImportWizard_CannotQuerySelection); } }; } else { operation = getProfileChangeOperation(planSelections); operation.setProvisioningContext(context); } } }); if (sub.isCanceled()) throw new InterruptedException(); if (operation.resolveModal(sub.newChild(200)).getSeverity() == IStatus.CANCEL) throw new InterruptedException(); else { if (withRemediation) { IStatus status = operation.getResolutionResult(); if (remediationPage != null && shouldRemediate(status)) { computeRemediationOperation(operation, ui, monitor); } } } Display.getDefault().asyncExec(new Runnable() { public void run() { planChanged(); } }); } }); } catch (InterruptedException e) { operation = new InstallOperation(new ProvisioningSession(AbstractPage.agent), new ArrayList<IInstallableUnit>()) { public IStatus getResolutionResult() { return Status.CANCEL_STATUS; } }; } catch (InvocationTargetException e) { ProvUI.handleException(e.getCause(), null, StatusManager.SHOW | StatusManager.LOG); unableToResolve(null); } } else super.recomputePlan(runnableContext, withRemediation); } void unableToResolve(String message) { IStatus couldNotResolveStatus; if (message != null) { couldNotResolveStatus = new Status(IStatus.ERROR, Constants.Bundle_ID, message, null); } else { couldNotResolveStatus = new Status(IStatus.ERROR, Constants.Bundle_ID, ProvUIMessages.ProvisioningOperationWizard_UnexpectedFailureToResolve, null); } StatusManager.getManager().handle(couldNotResolveStatus, StatusManager.LOG); } }