diff options
author | Ian Bull | 2011-10-17 20:49:08 +0000 |
---|---|---|
committer | Ian Bull | 2011-10-17 20:49:08 +0000 |
commit | 217087198b3f479409c1fdffff93c87dbb31d58f (patch) | |
tree | d26bbb4e226cb77971eb0a4afb05bff4f3ab7765 | |
parent | 5ab961530101ed0266a077c889592845ac165cdf (diff) | |
download | rt.equinox.p2-irbull/lucky2.tar.gz rt.equinox.p2-irbull/lucky2.tar.xz rt.equinox.p2-irbull/lucky2.zip |
Added a checkbox to resolve with relaxed constraints.irbull/lucky2
T
8 files changed, 285 insertions, 3 deletions
diff --git a/bundles/org.eclipse.equinox.p2.operations/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.operations/META-INF/MANIFEST.MF index 5d72f5d83..0c930e7aa 100644 --- a/bundles/org.eclipse.equinox.p2.operations/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.equinox.p2.operations/META-INF/MANIFEST.MF @@ -16,6 +16,7 @@ Bundle-RequiredExecutionEnvironment: J2SE-1.5, Bundle-ActivationPolicy: lazy Import-Package: org.eclipse.equinox.internal.p2.core.helpers, org.eclipse.equinox.internal.p2.director, + org.eclipse.equinox.internal.p2.metadata.query, org.eclipse.equinox.internal.p2.repository.helpers, org.eclipse.equinox.internal.provisional.configurator, org.eclipse.equinox.internal.provisional.p2.core.eventbus, diff --git a/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/LuckyOperation.java b/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/LuckyOperation.java new file mode 100644 index 000000000..4d9a9e193 --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.operations/src/org/eclipse/equinox/p2/operations/LuckyOperation.java @@ -0,0 +1,177 @@ +package org.eclipse.equinox.p2.operations; + +import java.util.*; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.equinox.internal.p2.director.ProfileChangeRequest; +import org.eclipse.equinox.internal.p2.metadata.query.UpdateQuery; +import org.eclipse.equinox.p2.engine.*; +import org.eclipse.equinox.p2.engine.query.IUProfilePropertyQuery; +import org.eclipse.equinox.p2.metadata.*; +import org.eclipse.equinox.p2.planner.*; +import org.eclipse.equinox.p2.query.*; + +/** + * @noinstantiate This class is not intended to be instantiated by clients. + * @noreference + */ +public class LuckyOperation extends ProfileChangeOperation { + + public LuckyOperation(ProvisioningSession session) { + super(session); + } + + @Override + protected void computeProfileChangeRequest(MultiStatus status, IProgressMonitor monitor) { + IProfileRegistry profileRegistry = (IProfileRegistry) session.getProvisioningAgent().getService(IProfileRegistry.SERVICE_NAME); + IPlanner plan = (IPlanner) session.getProvisioningAgent().getService(IPlanner.SERVICE_NAME); + IProfile prof = profileRegistry.getProfile(getProfileId()); + + final String INCLUSION_RULES = "org.eclipse.equinox.p2.internal.inclusion.rules"; //$NON-NLS-1$ + final String INCLUSION_OPTIONAL = "OPTIONAL"; //$NON-NLS-1$ + final String INCLUSION_STRICT = "STRICT"; //$NON-NLS-1$ + + IQueryResult<IInstallableUnit> strictRoots = prof.query(new IUProfilePropertyQuery(INCLUSION_RULES, INCLUSION_STRICT), null); + IQueryResult<IInstallableUnit> optionalRoots = prof.query(new IUProfilePropertyQuery(INCLUSION_RULES, INCLUSION_OPTIONAL), null); + Set<IInstallableUnit> tmpRoots = new HashSet<IInstallableUnit>(strictRoots.toUnmodifiableSet()); + tmpRoots.addAll(optionalRoots.toUnmodifiableSet()); + CollectionResult<IInstallableUnit> allRoots = new CollectionResult<IInstallableUnit>(tmpRoots); + + request = (ProfileChangeRequest) plan.createChangeRequest(prof); + Collection<IRequirement> limitingRequirements = new ArrayList<IRequirement>(); + + for (Iterator<IInstallableUnit> iterator = allRoots.query(QueryUtil.ALL_UNITS, null).iterator(); iterator.hasNext();) { + IInstallableUnit currentlyInstalled = iterator.next(); + + //find all the potential updates for the currentlyInstalled iu + IQueryResult<IInstallableUnit> updatesAvailable = plan.updatesFor(currentlyInstalled, context, null); + for (Iterator<IInstallableUnit> iterator2 = updatesAvailable.iterator(); iterator2.hasNext();) { + IInstallableUnit update = iterator2.next(); + request.add(update); + request.setInstallableUnitInclusionRules(update, ProfileInclusionRules.createOptionalInclusionRule(update)); + } + if (!updatesAvailable.isEmpty()) { + //force the original IU to optional, but make sure that the solution at least includes it + request.setInstallableUnitInclusionRules(currentlyInstalled, ProfileInclusionRules.createOptionalInclusionRule(currentlyInstalled)); + limitingRequirements.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, currentlyInstalled.getId(), new VersionRange(currentlyInstalled.getVersion(), true, Version.MAX_VERSION, true), null, false, false)); + } + } + + IProvisioningPlan updateFinderPlan = plan.getProvisioningPlan(request, context, null); + if (updateFinderPlan.getAdditions().query(QueryUtil.ALL_UNITS, null).isEmpty()) { + return; + } + + //Take into account all the removals + IProfileChangeRequest finalChangeRequest = plan.createChangeRequest(prof); + IQueryResult<IInstallableUnit> removals = updateFinderPlan.getRemovals().query(QueryUtil.ALL_UNITS, null); + for (Iterator<IInstallableUnit> iterator = removals.iterator(); iterator.hasNext();) { + IInstallableUnit iu = iterator.next(); + if (!allRoots.query(QueryUtil.createIUQuery(iu), null).isEmpty()) { + finalChangeRequest.remove(iu); + } + } + + //Take into account the additions for stricts + for (Iterator<IInstallableUnit> iterator = strictRoots.iterator(); iterator.hasNext();) { + IInstallableUnit formerRoot = iterator.next(); + IQueryResult<IInstallableUnit> update = updateFinderPlan.getAdditions().query(new UpdateQuery(formerRoot), null); + if (!update.isEmpty()) + finalChangeRequest.addAll(update.toUnmodifiableSet()); + } + + //Take into account the additions for optionals + for (Iterator<IInstallableUnit> iterator = optionalRoots.iterator(); iterator.hasNext();) { + IInstallableUnit formerRoot = iterator.next(); + IQueryResult<IInstallableUnit> update = updateFinderPlan.getAdditions().query(new UpdateQuery(formerRoot), null); + if (!update.isEmpty()) { + for (Iterator<IInstallableUnit> it = update.iterator(); it.hasNext();) { + IInstallableUnit updatedOptionalIU = it.next(); + finalChangeRequest.add(updatedOptionalIU); + finalChangeRequest.setInstallableUnitInclusionRules(updatedOptionalIU, ProfileInclusionRules.createOptionalInclusionRule(updatedOptionalIU)); + } + } + } + //return planner.getProvisioningPlan(finalChangeRequest, context, null); + + } + + // private IProvisioningPlan iFeelLucky(IProfile prof, IPlanner plan, ProvisioningContext context) { + // final String INCLUSION_RULES = "org.eclipse.equinox.p2.internal.inclusion.rules"; //$NON-NLS-1$ + // final String INCLUSION_OPTIONAL = "OPTIONAL"; //$NON-NLS-1$ + // final String INCLUSION_STRICT = "STRICT"; //$NON-NLS-1$ + // + // IQueryResult<IInstallableUnit> strictRoots = prof.query(new IUProfilePropertyQuery(INCLUSION_RULES, INCLUSION_STRICT), null); + // IQueryResult<IInstallableUnit> optionalRoots = prof.query(new IUProfilePropertyQuery(INCLUSION_RULES, INCLUSION_OPTIONAL), null); + // Set<IInstallableUnit> tmpRoots = new HashSet<IInstallableUnit>(strictRoots.toUnmodifiableSet()); + // tmpRoots.addAll(optionalRoots.toUnmodifiableSet()); + // CollectionResult<IInstallableUnit> allRoots = new CollectionResult<IInstallableUnit>(tmpRoots); + // + // IProfileChangeRequest newRequest = plan.createChangeRequest(prof); + // Collection<IRequirement> limitingRequirements = new ArrayList<IRequirement>(); + // + // for (Iterator<IInstallableUnit> iterator = allRoots.query(QueryUtil.ALL_UNITS, null).iterator(); iterator.hasNext();) { + // IInstallableUnit currentlyInstalled = iterator.next(); + // + // //find all the potential updates for the currentlyInstalled iu + // IQueryResult<IInstallableUnit> updatesAvailable = plan.updatesFor(currentlyInstalled, context, null); + // for (Iterator<IInstallableUnit> iterator2 = updatesAvailable.iterator(); iterator2.hasNext();) { + // IInstallableUnit update = iterator2.next(); + // newRequest.add(update); + // newRequest.setInstallableUnitInclusionRules(update, ProfileInclusionRules.createOptionalInclusionRule(update)); + // } + // if (!updatesAvailable.isEmpty()) { + // //force the original IU to optional, but make sure that the solution at least includes it + // newRequest.setInstallableUnitInclusionRules(currentlyInstalled, ProfileInclusionRules.createOptionalInclusionRule(currentlyInstalled)); + // limitingRequirements.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, currentlyInstalled.getId(), new VersionRange(currentlyInstalled.getVersion(), true, Version.MAX_VERSION, true), null, false, false)); + // } + // } + // + // IProvisioningPlan updateFinderPlan = planner.getProvisioningPlan(newRequest, context, null); + // if (updateFinderPlan.getAdditions().query(QueryUtil.ALL_UNITS, null).isEmpty()) + // return null; + // + // //Take into account all the removals + // IProfileChangeRequest finalChangeRequest = plan.createChangeRequest(prof); + // IQueryResult<IInstallableUnit> removals = updateFinderPlan.getRemovals().query(QueryUtil.ALL_UNITS, null); + // for (Iterator<IInstallableUnit> iterator = removals.iterator(); iterator.hasNext();) { + // IInstallableUnit iu = iterator.next(); + // if (!allRoots.query(QueryUtil.createIUQuery(iu), null).isEmpty()) { + // finalChangeRequest.remove(iu); + // } + // } + // + // //Take into account the additions for stricts + // for (Iterator<IInstallableUnit> iterator = strictRoots.iterator(); iterator.hasNext();) { + // IInstallableUnit formerRoot = iterator.next(); + // IQueryResult<IInstallableUnit> update = updateFinderPlan.getAdditions().query(new UpdateQuery(formerRoot), null); + // if (!update.isEmpty()) + // finalChangeRequest.addAll(update.toUnmodifiableSet()); + // } + // + // //Take into account the additions for optionals + // for (Iterator<IInstallableUnit> iterator = optionalRoots.iterator(); iterator.hasNext();) { + // IInstallableUnit formerRoot = iterator.next(); + // IQueryResult<IInstallableUnit> update = updateFinderPlan.getAdditions().query(new UpdateQuery(formerRoot), null); + // if (!update.isEmpty()) { + // for (Iterator<IInstallableUnit> it = update.iterator(); it.hasNext();) { + // IInstallableUnit updatedOptionalIU = it.next(); + // finalChangeRequest.add(updatedOptionalIU); + // finalChangeRequest.setInstallableUnitInclusionRules(updatedOptionalIU, ProfileInclusionRules.createOptionalInclusionRule(updatedOptionalIU)); + // } + // } + // } + // return planner.getProvisioningPlan(finalChangeRequest, context, null); + // } + + @Override + protected String getResolveJobName() { + return "Lucky Resolve Job"; + } + + @Override + protected String getProvisioningJobName() { + return "Lucky Provisioning Job"; + } + +}
\ No newline at end of file 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 b05ae813a..d0067e01b 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 @@ -84,7 +84,7 @@ public abstract class ProfileChangeOperation implements IProfileChangeJob { ProvisioningContext context; MultiStatus noChangeRequest; PlannerResolutionJob job; - ProfileChangeRequest request; + protected ProfileChangeRequest request; /** * Create an operation using the provided provisioning session. diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/IUDetailsGroup.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/IUDetailsGroup.java index 4baa4a067..c27cae544 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/IUDetailsGroup.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/IUDetailsGroup.java @@ -101,7 +101,7 @@ public class IUDetailsGroup { public void widgetSelected(SelectionEvent e) { System.out.println("Let's retry the operation"); // TODO, Let's do something different here. - wizard.recomputePlan(wizard.getContainer()); + wizard.recomputePlanWithLuck(wizard.getContainer()); System.out.println("Completed... the operation"); } }); diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java index e1d12f642..ee6c65a13 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java @@ -191,6 +191,37 @@ public abstract class ProvisioningOperationWizard extends Wizard { return new ProvisioningContext(ui.getSession().getProvisioningAgent()); } + boolean youAreLucky = false; + + public void recomputePlanWithLuck(IRunnableContext runnableContext) { + + couldNotResolveStatus = Status.OK_STATUS; + provisioningContext = getProvisioningContext(); + initializeResolutionModelElements(getOperationSelections()); + if (planSelections.length == 0) { + operation = null; + couldNotResolve(ProvUIMessages.ResolutionWizardPage_NoSelections); + } else { + operation = ui.getLuckyOperation(provisioningContext); + operation.setProvisioningContext(provisioningContext); + try { + runnableContext.run(true, true, new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) { + operation.resolveModal(monitor); + } + }); + + } catch (InterruptedException e) { + // Nothing to report if thread was interrupted + } catch (InvocationTargetException e) { + ProvUI.handleException(e.getCause(), null, StatusManager.SHOW | StatusManager.LOG); + couldNotResolve(null); + } + } + planChanged(); + youAreLucky = 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. @@ -198,6 +229,10 @@ public abstract class ProvisioningOperationWizard extends Wizard { * @param runnableContext */ public void recomputePlan(IRunnableContext runnableContext) { + if (youAreLucky) { + recomputePlanWithLuck(runnableContext); + return; + } couldNotResolveStatus = Status.OK_STATUS; provisioningContext = getProvisioningContext(); initializeResolutionModelElements(getOperationSelections()); @@ -350,4 +385,8 @@ public abstract class ProvisioningOperationWizard extends Wizard { public boolean statusOverridesOperation() { return false; } + + public void setBeLucky(boolean b) { + this.youAreLucky = b; + } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionResultsWizardPage.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionResultsWizardPage.java index bd3762550..ef04c44e8 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionResultsWizardPage.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ResolutionResultsWizardPage.java @@ -24,10 +24,13 @@ import org.eclipse.equinox.p2.operations.ProvisioningJob; import org.eclipse.equinox.p2.query.IQueryable; import org.eclipse.equinox.p2.ui.ProvisioningUI; import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.*; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; import org.eclipse.ui.statushandlers.StatusManager; @@ -51,6 +54,7 @@ public abstract class ResolutionResultsWizardPage extends ResolutionStatusPage { protected Display display; private IUDetailsGroup iuDetailsGroup; SashForm sashForm; + Button relaxConstraints; protected ResolutionResultsWizardPage(ProvisioningUI ui, ProvisioningOperationWizard wizard, IUElementListRoot input, ProfileChangeOperation operation) { super("ResolutionPage", ui, wizard); //$NON-NLS-1$ @@ -117,6 +121,20 @@ public abstract class ResolutionResultsWizardPage extends ResolutionStatusPage { sashForm.setWeights(getSashWeights()); Dialog.applyDialogFont(sashForm); + // Controls for filtering/presentation/site selection + Composite controlsComposite = new Composite(composite, SWT.NONE); + gridLayout = new GridLayout(); + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + gridLayout.numColumns = 2; + gridLayout.makeColumnsEqualWidth = true; + gridLayout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING); + controlsComposite.setLayout(layout); + GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false); + controlsComposite.setLayoutData(gd); + + createViewControlsArea(controlsComposite); + final Runnable runnable = new Runnable() { public void run() { treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { @@ -124,7 +142,6 @@ public abstract class ResolutionResultsWizardPage extends ResolutionStatusPage { setDetailText(resolvedOperation); } }); - updateStatus(input, resolvedOperation); setDrilldownElements(input, resolvedOperation); treeViewer.setInput(input); } @@ -146,6 +163,18 @@ public abstract class ResolutionResultsWizardPage extends ResolutionStatusPage { } } + private void createViewControlsArea(Composite controlsComposite) { + relaxConstraints = new Button(controlsComposite, SWT.CHECK); + relaxConstraints.setText("Relax constraints"); + relaxConstraints.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + ((ProvisioningOperationWizard) getWizard()).setBeLucky(relaxConstraints.getSelection()); + setPageComplete(true); + } + }); + } + protected void createSizingInfo(Composite parent) { // Default is to do nothing } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/SelectableIUsPage.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/SelectableIUsPage.java index 44708e638..e126d08f1 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/SelectableIUsPage.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/SelectableIUsPage.java @@ -27,6 +27,8 @@ import org.eclipse.jface.viewers.*; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; @@ -53,6 +55,7 @@ public class SelectableIUsPage extends ResolutionStatusPage implements IResoluti protected Display display; protected Policy policy; SashForm sashForm; + Button relaxConstraints; public SelectableIUsPage(ProvisioningUI ui, ProvisioningOperationWizard wizard, IUElementListRoot root, Object[] initialSelections) { super("IUSelectionPage", ui, wizard); //$NON-NLS-1$ @@ -147,6 +150,20 @@ public class SelectableIUsPage extends ResolutionStatusPage implements IResoluti // Select and Deselect All buttons createSelectButtons(composite); + // Controls for filtering/presentation/site selection + Composite controlsComposite = new Composite(composite, SWT.NONE); + gridLayout = new GridLayout(); + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + gridLayout.numColumns = 2; + gridLayout.makeColumnsEqualWidth = true; + gridLayout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING); + controlsComposite.setLayout(layout); + GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false); + controlsComposite.setLayoutData(gd); + + createViewControlsArea(controlsComposite); + // The text area shows a description of the selected IU, or error detail if applicable. iuDetailsGroup = new IUDetailsGroup(sashForm, tableViewer, convertWidthInCharsToPixels(ILayoutConstants.DEFAULT_TABLE_WIDTH), true, (ProvisioningOperationWizard) getWizard()); @@ -156,6 +173,18 @@ public class SelectableIUsPage extends ResolutionStatusPage implements IResoluti Dialog.applyDialogFont(sashForm); } + private void createViewControlsArea(Composite controlsComposite) { + relaxConstraints = new Button(controlsComposite, SWT.CHECK); + relaxConstraints.setText("Relax constraints"); + relaxConstraints.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + ((ProvisioningOperationWizard) getWizard()).setBeLucky(relaxConstraints.getSelection()); + setPageComplete(true); + } + }); + } + private void createSelectButtons(Composite parent) { Composite buttonParent = new Composite(parent, SWT.NONE); GridLayout gridLayout = new GridLayout(); diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/ProvisioningUI.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/ProvisioningUI.java index 6b8625647..d488fe969 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/ProvisioningUI.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/ProvisioningUI.java @@ -132,6 +132,13 @@ public class ProvisioningUI { return profileId; } + public LuckyOperation getLuckyOperation(ProvisioningContext context) { + LuckyOperation luckyOperation = new LuckyOperation(getSession()); + luckyOperation.setProfileId(getProfileId()); + luckyOperation.setProvisioningContext(context); + return luckyOperation; + } + /** * Return an install operation that describes installing the specified IInstallableUnits from the * provided list of repositories. |