1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
/*******************************************************************************
* 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 implementation and ideas
******************************************************************************/
package org.eclipse.equinox.p2.tests.planner;
import java.util.*;
import org.eclipse.core.runtime.IProgressMonitor;
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.*;
public class LuckyHelper {
ProfileChangeRequest computeProfileChangeRequest(IProfile profile, IPlanner planner, ProfileChangeRequest request, ProvisioningContext context, IProgressMonitor monitor) {
// IProfileRegistry profileRegistry = (IProfileRegistry) session.getProvisioningAgent().getService(IProfileRegistry.SERVICE_NAME);
IPlanner plan = planner; //(IPlanner) session.getProvisioningAgent().getService(IPlanner.SERVICE_NAME);
IProfile prof = profile; //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 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 (ProfileChangeRequest) finalChangeRequest;
}
}
|