diff options
author | Susan Franklin | 2010-04-22 00:55:13 +0000 |
---|---|---|
committer | Susan Franklin | 2010-04-22 00:55:13 +0000 |
commit | 187dd473bda839f352a947ae27b87edcf66e3e6b (patch) | |
tree | f0ee11b53d575b2c84f89d3b4150bd1cc44f8495 /bundles/org.eclipse.equinox.p2.operations | |
parent | b195745e69fe4ef35dae5ebf08bdd74d7e382d2d (diff) | |
download | rt.equinox.p2-187dd473bda839f352a947ae27b87edcf66e3e6b.tar.gz rt.equinox.p2-187dd473bda839f352a947ae27b87edcf66e3e6b.tar.xz rt.equinox.p2-187dd473bda839f352a947ae27b87edcf66e3e6b.zip |
Bug 299818 - [ui] Uninstall should not contact the external world
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.operations')
6 files changed, 82 insertions, 19 deletions
diff --git a/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/internal/p2/operations/PlannerResolutionJob.java b/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/internal/p2/operations/PlannerResolutionJob.java index c8cd61cc6..823534ea8 100644 --- a/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/internal/p2/operations/PlannerResolutionJob.java +++ b/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/internal/p2/operations/PlannerResolutionJob.java @@ -29,20 +29,21 @@ public class PlannerResolutionJob extends ProvisioningJob implements IProfileCha IProvisioningPlan plan; MultiStatus additionalStatus; ResolutionResult report; - ProvisioningContext provisioningContext; + ProvisioningContext firstPass, secondPass, successful; public static MultiStatus getProfileChangeRequestAlteredStatus() { return PlanAnalyzer.getProfileChangeAlteredStatus(); } - public PlannerResolutionJob(String label, ProvisioningSession session, String profileId, ProfileChangeRequest request, ProvisioningContext provisioningContext, MultiStatus additionalStatus) { + public PlannerResolutionJob(String label, ProvisioningSession session, String profileId, ProfileChangeRequest request, ProvisioningContext firstPass, ProvisioningContext secondPass, MultiStatus additionalStatus) { super(label, session); this.request = request; this.profileId = profileId; - if (provisioningContext == null) - this.provisioningContext = new ProvisioningContext(session.getProvisioningAgent()); + if (firstPass == null) + this.firstPass = new ProvisioningContext(session.getProvisioningAgent()); else - this.provisioningContext = provisioningContext; + this.firstPass = firstPass; + this.secondPass = secondPass; Assert.isNotNull(additionalStatus); this.additionalStatus = additionalStatus; } @@ -55,21 +56,46 @@ public class PlannerResolutionJob extends ProvisioningJob implements IProfileCha return request; } - public ProvisioningContext getProvisioningContext() { - return provisioningContext; + public ProvisioningContext getActualProvisioningContext() { + return successful; } - public void setProvisioningContext(ProvisioningContext context) { - this.provisioningContext = context; + public void setFirstPassProvisioningContext(ProvisioningContext firstPass) { + this.firstPass = firstPass; + } + + public void setSecondPassProvisioningContext(ProvisioningContext secondPass) { + this.secondPass = firstPass; } public IStatus runModal(IProgressMonitor monitor) { - plan = ((IPlanner) getSession().getProvisioningAgent().getService(IPlanner.SERVICE_NAME)).getProvisioningPlan(request, provisioningContext, monitor); + SubMonitor sub; + if (secondPass != null) { + sub = SubMonitor.convert(monitor, 1000); + } else { + sub = SubMonitor.convert(monitor, 500); + } + + plan = ((IPlanner) getSession().getProvisioningAgent().getService(IPlanner.SERVICE_NAME)).getProvisioningPlan(request, firstPass, sub.newChild(500)); + IStatus status; + if (plan == null) { + status = new Status(IStatus.ERROR, Activator.ID, Messages.PlannerResolutionJob_NullProvisioningPlan); + } else { + status = plan.getStatus(); + } + + if (status.getSeverity() != IStatus.ERROR || secondPass == null) { + successful = firstPass; + return status; + } + + // First resolution was in error, try again with an alternate provisioning context + successful = secondPass; + plan = ((IPlanner) getSession().getProvisioningAgent().getService(IPlanner.SERVICE_NAME)).getProvisioningPlan(request, secondPass, sub.newChild(500)); if (plan == null) { return new Status(IStatus.ERROR, Activator.ID, Messages.PlannerResolutionJob_NullProvisioningPlan); } return plan.getStatus(); - } public ResolutionResult getResolutionResult() { diff --git a/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/internal/p2/operations/SearchForUpdatesResolutionJob.java b/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/internal/p2/operations/SearchForUpdatesResolutionJob.java index b62c46c75..ef99f08bc 100644 --- a/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/internal/p2/operations/SearchForUpdatesResolutionJob.java +++ b/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/internal/p2/operations/SearchForUpdatesResolutionJob.java @@ -24,8 +24,8 @@ public class SearchForUpdatesResolutionJob extends PlannerResolutionJob { ProfileChangeRequest[] requestHolder; UpdateOperation operation; - public SearchForUpdatesResolutionJob(String label, ProvisioningSession session, String profileId, ProfileChangeRequest request, ProvisioningContext provisioningContext, MultiStatus additionalStatus, IRunnableWithProgress searchForUpdatesRunnable, ProfileChangeRequest[] requestHolder, UpdateOperation operation) { - super(label, session, profileId, request, provisioningContext, additionalStatus); + public SearchForUpdatesResolutionJob(String label, ProvisioningSession session, String profileId, ProfileChangeRequest request, ProvisioningContext firstPass, ProvisioningContext secondPass, MultiStatus additionalStatus, IRunnableWithProgress searchForUpdatesRunnable, ProfileChangeRequest[] requestHolder, UpdateOperation operation) { + super(label, session, profileId, request, firstPass, secondPass, additionalStatus); this.searchForUpdatesRunnable = searchForUpdatesRunnable; this.requestHolder = requestHolder; this.operation = operation; diff --git a/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/InstallOperation.java b/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/InstallOperation.java index ebdc19545..97113f67c 100644 --- a/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/InstallOperation.java +++ b/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/InstallOperation.java @@ -12,15 +12,15 @@ package org.eclipse.equinox.p2.operations; -import org.eclipse.equinox.p2.planner.ProfileInclusionRules; - import java.util.Collection; import org.eclipse.core.runtime.*; import org.eclipse.equinox.internal.p2.operations.*; import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest; import org.eclipse.equinox.p2.engine.IProfile; +import org.eclipse.equinox.p2.engine.ProvisioningContext; 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.IQueryResult; import org.eclipse.equinox.p2.query.QueryUtil; @@ -46,6 +46,7 @@ import org.eclipse.equinox.p2.query.QueryUtil; public class InstallOperation extends ProfileChangeOperation { private Collection<IInstallableUnit> toInstall; + private static final String CUSTOM_PROVISIONING_CONTEXT_MARKER = "org.eclipse.equinox.p2.operations.customContext"; //$NON-NLS-1$ /** * Create an install operation on the specified provisioning session that installs @@ -144,4 +145,14 @@ public class InstallOperation extends ProfileChangeOperation { return Messages.InstallOperation_InstallJobName; } + + @Override + ProvisioningContext getSecondPassProvisioningContext() { + // If we were already contacting all sites, then let's go ahead + // and follow references if the first try fails + if (context.getProperty(CUSTOM_PROVISIONING_CONTEXT_MARKER) == null) { + context.setProperty(ProvisioningContext.FOLLOW_REPOSITORY_REFERENCES, Boolean.toString(true)); + } + return context; + } } diff --git a/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/ProfileChangeOperation.java b/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/ProfileChangeOperation.java index d6502066c..65b2ba6ec 100644 --- a/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/ProfileChangeOperation.java +++ b/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/ProfileChangeOperation.java @@ -178,7 +178,7 @@ public abstract class ProfileChangeOperation implements IProfileChangeJob { protected abstract void computeProfileChangeRequest(MultiStatus status, IProgressMonitor monitor); private void createPlannerResolutionJob() { - job = new PlannerResolutionJob(getResolveJobName(), session, profileId, request, context, noChangeRequest); + job = new PlannerResolutionJob(getResolveJobName(), session, profileId, request, getFirstPassProvisioningContext(), getSecondPassProvisioningContext(), noChangeRequest); } /** @@ -311,7 +311,7 @@ public abstract class ProfileChangeOperation implements IProfileChangeJob { IStatus status = getResolutionResult(); if (status.getSeverity() != IStatus.CANCEL && status.getSeverity() != IStatus.ERROR) { if (job.getProvisioningPlan() != null) { - ProfileModificationJob pJob = new ProfileModificationJob(getProvisioningJobName(), session, profileId, job.getProvisioningPlan(), context); + ProfileModificationJob pJob = new ProfileModificationJob(getProvisioningJobName(), session, profileId, job.getProvisioningPlan(), job.getActualProvisioningContext()); pJob.setAdditionalProgressMonitor(monitor); return pJob; } @@ -329,7 +329,7 @@ public abstract class ProfileChangeOperation implements IProfileChangeJob { public void setProvisioningContext(ProvisioningContext context) { this.context = context; if (job != null) - job.setProvisioningContext(context); + updateJobProvisioningContexts(job, context); } /** @@ -364,4 +364,16 @@ public abstract class ProfileChangeOperation implements IProfileChangeJob { return getResolutionResult() != null; } + ProvisioningContext getFirstPassProvisioningContext() { + return getProvisioningContext(); + } + + ProvisioningContext getSecondPassProvisioningContext() { + return null; + } + + protected void updateJobProvisioningContexts(PlannerResolutionJob job, ProvisioningContext context) { + job.setFirstPassProvisioningContext(context); + } + } diff --git a/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/UninstallOperation.java b/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/UninstallOperation.java index 09a526f65..d0bebec1e 100644 --- a/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/UninstallOperation.java +++ b/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/UninstallOperation.java @@ -12,12 +12,14 @@ package org.eclipse.equinox.p2.operations; +import java.net.URI; import java.util.Collection; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.equinox.internal.p2.operations.Messages; import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest; import org.eclipse.equinox.p2.engine.IProfile; +import org.eclipse.equinox.p2.engine.ProvisioningContext; import org.eclipse.equinox.p2.metadata.IInstallableUnit; /** @@ -85,4 +87,16 @@ public class UninstallOperation extends ProfileChangeOperation { return Messages.UninstallOperation_ResolveJobName; } + @Override + ProvisioningContext getFirstPassProvisioningContext() { + ProvisioningContext pc = new ProvisioningContext(session.getProvisioningAgent()); + pc.setMetadataRepositories(new URI[0]); + pc.setArtifactRepositories(new URI[0]); + return pc; + } + + @Override + ProvisioningContext getSecondPassProvisioningContext() { + return context; + } } diff --git a/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/UpdateOperation.java b/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/UpdateOperation.java index f37afb547..d306cde8e 100644 --- a/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/UpdateOperation.java +++ b/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/UpdateOperation.java @@ -316,7 +316,7 @@ public class UpdateOperation extends ProfileChangeOperation { // for the resolution job to get the request from the operation after it has been // computed. final ProfileChangeRequest[] requestHolder = new ProfileChangeRequest[1]; - job = new SearchForUpdatesResolutionJob(getResolveJobName(), session, profileId, request, context, noChangeRequest, new IRunnableWithProgress() { + job = new SearchForUpdatesResolutionJob(getResolveJobName(), session, profileId, request, getFirstPassProvisioningContext(), getSecondPassProvisioningContext(), noChangeRequest, new IRunnableWithProgress() { public void run(IProgressMonitor mon) throws OperationCanceledException { // We only check for other jobs running if this job is *not* scheduled if (job.getState() == Job.NONE && session.hasScheduledOperationsFor(profileId)) { |