Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSusan Franklin2010-04-22 00:55:13 +0000
committerSusan Franklin2010-04-22 00:55:13 +0000
commit187dd473bda839f352a947ae27b87edcf66e3e6b (patch)
treef0ee11b53d575b2c84f89d3b4150bd1cc44f8495 /bundles/org.eclipse.equinox.p2.operations
parentb195745e69fe4ef35dae5ebf08bdd74d7e382d2d (diff)
downloadrt.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')
-rw-r--r--bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/internal/p2/operations/PlannerResolutionJob.java48
-rw-r--r--bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/internal/p2/operations/SearchForUpdatesResolutionJob.java4
-rw-r--r--bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/InstallOperation.java15
-rw-r--r--bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/ProfileChangeOperation.java18
-rw-r--r--bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/UninstallOperation.java14
-rw-r--r--bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/UpdateOperation.java2
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)) {

Back to the top