blob: 1f6c534497bffee7818505651f7980a0d3b552e7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2015 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
* Genuitec, LLC - added license support
* Sonatype, Inc. - ongoing development
* Red Hat, Inc. - support for remediation page
*******************************************************************************/
package org.eclipse.equinox.internal.p2.ui.dialogs;
import java.util.*;
import org.eclipse.core.runtime.Assert;
import org.eclipse.equinox.internal.p2.ui.ProvUIImages;
import org.eclipse.equinox.internal.p2.ui.ProvUIMessages;
import org.eclipse.equinox.internal.p2.ui.model.*;
import org.eclipse.equinox.p2.engine.IProfile;
import org.eclipse.equinox.p2.engine.IProfileRegistry;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.operations.*;
import org.eclipse.equinox.p2.ui.LoadMetadataRepositoryJob;
import org.eclipse.equinox.p2.ui.ProvisioningUI;
import org.eclipse.jface.wizard.IWizardPage;
/**
* @since 3.4
*/
public class UpdateWizard extends WizardWithLicenses {
IInstallableUnit[] iusToReplace;
boolean skipSelectionsPage = false;
IUElementListRoot firstPageRoot;
Update[] initialSelections;
public static Collection<IInstallableUnit> getIUsToReplace(Object[] elements) {
Set<IInstallableUnit> iusToReplace = new HashSet<IInstallableUnit>();
for (int i = 0; i < elements.length; i++) {
if (elements[i] instanceof AvailableUpdateElement) {
iusToReplace.add(((AvailableUpdateElement) elements[i]).getIUToBeUpdated());
}
}
return iusToReplace;
}
public static IInstallableUnit[] getReplacementIUs(Object[] elements) {
Set<IInstallableUnit> replacements = new HashSet<IInstallableUnit>();
for (int i = 0; i < elements.length; i++) {
if (elements[i] instanceof AvailableUpdateElement) {
replacements.add(((AvailableUpdateElement) elements[i]).getIU());
}
}
return replacements.toArray(new IInstallableUnit[replacements.size()]);
}
public static Update[] makeUpdatesFromElements(Object[] elements) {
Set<Update> updates = new HashSet<Update>();
for (int i = 0; i < elements.length; i++) {
if (elements[i] instanceof AvailableUpdateElement) {
updates.add(((AvailableUpdateElement) elements[i]).getUpdate());
}
}
return updates.toArray(new Update[updates.size()]);
}
/**
* Open an update wizard. For update wizards, the operation must have been resolved in advanced.
* This prevents searching for updates in the UI thread.
*
* @param ui the provisioning UI
* @param operation the update operation. Must already be resolved!
* @param initialSelections initial selections for the wizard (can be null)
* @param preloadJob a job that has been used to preload metadata repositories (can be null)
*/
public UpdateWizard(ProvisioningUI ui, UpdateOperation operation, Object[] initialSelections, LoadMetadataRepositoryJob preloadJob) {
super(ui, operation, initialSelections, preloadJob);
this.initialSelections = (Update[]) initialSelections;
Assert.isLegal(operation.hasResolved(), "Cannot create an update wizard on an unresolved operation"); //$NON-NLS-1$
setWindowTitle(ProvUIMessages.UpdateAction_UpdatesAvailableTitle);
setDefaultPageImageDescriptor(ProvUIImages.getImageDescriptor(ProvUIImages.WIZARD_BANNER_UPDATE));
}
private boolean isLocked(IProfile profile, IInstallableUnit iuToBeUpdated) {
return Boolean.parseBoolean(profile.getInstallableUnitProperty(iuToBeUpdated, IProfile.PROP_PROFILE_LOCKED_IU));
}
public void deselectLockedIUs() {
IProfileRegistry profileRegistry = (IProfileRegistry) ui.getSession().getProvisioningAgent().getService(IProfileRegistry.SERVICE_NAME);
IProfile profile = profileRegistry.getProfile(ui.getProfileId());
ArrayList<Update> newSelection = new ArrayList<Update>(initialSelections.length);
for (int i = 0; i < initialSelections.length; i++) {
if (!isLocked(profile, initialSelections[i].toUpdate)) {
newSelection.add(initialSelections[i]);
}
}
((UpdateOperation) operation).setSelectedUpdates(newSelection.toArray(new Update[newSelection.size()]));
recomputePlan(getContainer());
}
protected ISelectableIUsPage createMainPage(IUElementListRoot input, Object[] selections) {
mainPage = new SelectableIUsPage(ui, this, getAllPossibleUpdatesRoot(), selections);
mainPage.setTitle(ProvUIMessages.UpdateAction_UpdatesAvailableTitle);
mainPage.setDescription(ProvUIMessages.UpdateAction_UpdatesAvailableMessage);
((SelectableIUsPage) mainPage).updateStatus(getAllPossibleUpdatesRoot(), operation);
return mainPage;
}
protected ResolutionResultsWizardPage createResolutionPage() {
return new UpdateWizardPage(ui, this, root, (UpdateOperation) operation);
}
protected void initializeResolutionModelElements(Object[] selectedElements) {
if (selectedElements == null)
return;
root = new IUElementListRoot();
if (operation instanceof RemediationOperation) {
AvailableIUElement[] elements = ElementUtils.requestToElement(((RemediationOperation) operation).getCurrentRemedy(), false);
root.setChildren(elements);
//planSelections = elements;
} else {
ArrayList<AvailableUpdateElement> list = new ArrayList<AvailableUpdateElement>(selectedElements.length);
ArrayList<AvailableUpdateElement> selected = new ArrayList<AvailableUpdateElement>(selectedElements.length);
for (int i = 0; i < selectedElements.length; i++) {
if (selectedElements[i] instanceof AvailableUpdateElement) {
AvailableUpdateElement element = (AvailableUpdateElement) selectedElements[i];
AvailableUpdateElement newElement = new AvailableUpdateElement(root, element.getIU(), element.getIUToBeUpdated(), getProfileId(), shouldShowProvisioningPlanChildren());
list.add(newElement);
selected.add(newElement);
} else if (selectedElements[i] instanceof Update) {
Update update = (Update) selectedElements[i];
AvailableUpdateElement newElement = new AvailableUpdateElement(root, update.replacement, update.toUpdate, getProfileId(), shouldShowProvisioningPlanChildren());
list.add(newElement);
selected.add(newElement);
}
}
root.setChildren(list.toArray());
planSelections = selected.toArray();
}
}
protected IResolutionErrorReportingPage createErrorReportingPage() {
return (SelectableIUsPage) mainPage;
}
public void setSkipSelectionsPage(boolean skipSelectionsPage) {
this.skipSelectionsPage = skipSelectionsPage;
}
public IWizardPage getStartingPage() {
if (skipSelectionsPage) {
// TODO see https://bugs.eclipse.org/bugs/show_bug.cgi?id=276963
IWizardPage page = getNextPage(mainPage);
if (page != null)
return page;
}
return mainPage;
}
/* (non-Javadoc)
* @see org.eclipse.equinox.internal.p2.ui.dialogs.ProvisioningOperationWizard#getProfileChangeOperation(java.lang.Object[])
*/
protected ProfileChangeOperation getProfileChangeOperation(Object[] elements) {
if (operation == null) {
operation = new UpdateOperation(ui.getSession(), getIUsToReplace(elements));
operation.setProfileId(getProfileId());
// operation.setRootMarkerKey(getRootMarkerKey());
} else {
((UpdateOperation) operation).setSelectedUpdates(makeUpdatesFromElements(elements));
}
return operation;
}
private IUElementListRoot getAllPossibleUpdatesRoot() {
if (firstPageRoot == null) {
firstPageRoot = new IUElementListRoot();
if (operation != null && operation instanceof UpdateOperation) {
Update[] updates;
if (getPolicy().getShowLatestVersionsOnly()) {
updates = ((UpdateOperation) operation).getSelectedUpdates();
} else {
updates = ((UpdateOperation) operation).getPossibleUpdates();
}
ArrayList<AvailableUpdateElement> allPossible = new ArrayList<AvailableUpdateElement>(updates.length);
for (int i = 0; i < updates.length; i++) {
AvailableUpdateElement newElement = new AvailableUpdateElement(firstPageRoot, updates[i].replacement, updates[i].toUpdate, getProfileId(), shouldShowProvisioningPlanChildren());
allPossible.add(newElement);
}
firstPageRoot.setChildren(allPossible.toArray());
}
}
return firstPageRoot;
}
@Override
protected RemediationPage createRemediationPage() {
remediationPage = new RemediationPage(ui, this, root, operation);
return remediationPage;
}
}