| /******************************************************************************* |
| * Copyright (c) 2011 Sonatype, Inc. 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: |
| * Sonatype, Inc. - initial API and implementation |
| * IBM Corporation - Ongoing development |
| *******************************************************************************/ |
| package org.eclipse.equinox.p2.operations; |
| |
| import java.util.Collection; |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.equinox.internal.p2.director.ProfileChangeRequest; |
| import org.eclipse.equinox.internal.p2.operations.Messages; |
| import org.eclipse.equinox.p2.engine.IProfile; |
| import org.eclipse.equinox.p2.engine.query.UserVisibleRootQuery; |
| import org.eclipse.equinox.p2.metadata.IInstallableUnit; |
| import org.eclipse.equinox.p2.planner.ProfileInclusionRules; |
| import org.eclipse.equinox.p2.query.QueryUtil; |
| |
| /** |
| * A {@link SynchronizeOperation} describes an operation that will modify the installation to |
| * exclusively include the InstallableUnit mentioned. Note that all the Installable Units necessary |
| * to satisfy the dependencies of the Installable Units installed will also be installed. |
| * |
| * The following snippet shows how one might use an SynchronizeOperation to perform a synchronous resolution and |
| * then kick off an install in the background: |
| * |
| * <pre> |
| * SynchronizeOperation op = new SynchronizeOperation(session, new IInstallableUnit [] { myIU }); |
| * IStatus result = op.resolveModal(monitor); |
| * if (result.isOK()) { |
| * op.getProvisioningJob(monitor).schedule(); |
| * } |
| * </pre> |
| * |
| * @since 2.1 |
| * @see ProfileChangeOperation |
| * @noextend This class is not intended to be subclassed by clients. |
| */ |
| public class SynchronizeOperation extends InstallOperation { |
| |
| public SynchronizeOperation(ProvisioningSession session, Collection<IInstallableUnit> toInstall) { |
| super(session, toInstall); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.equinox.p2.operations.ProfileChangeOperation#computeProfileChangeRequest(org.eclipse.core.runtime.MultiStatus, org.eclipse.core.runtime.IProgressMonitor) |
| */ |
| protected void computeProfileChangeRequest(MultiStatus status, IProgressMonitor monitor) { |
| request = ProfileChangeRequest.createByProfileId(session.getProvisioningAgent(), profileId); |
| IProfile profile; |
| SubMonitor sub = SubMonitor.convert(monitor, Messages.InstallOperation_ComputeProfileChangeProgress, toInstall.size()); |
| profile = session.getProfileRegistry().getProfile(profileId); |
| request.removeAll(profile.query(new UserVisibleRootQuery(), sub).toUnmodifiableSet()); |
| request.addAll(toInstall); |
| for (IInstallableUnit entryToInstall : toInstall) { |
| // If the user is installing a patch, we mark it optional. This allows the patched IU to be updated later by removing the patch. |
| if (QueryUtil.isPatch(entryToInstall)) |
| request.setInstallableUnitInclusionRules(entryToInstall, ProfileInclusionRules.createOptionalInclusionRule(entryToInstall)); |
| else |
| request.setInstallableUnitProfileProperty(entryToInstall, IProfile.PROP_PROFILE_ROOT_IU, Boolean.toString(true)); |
| |
| sub.worked(1); |
| } |
| sub.done(); |
| } |
| } |