private boolean isIncluded(IInstallableUnit iu, IRequirement req, IInstallableUnit match) { Set<String> includedIUs = FeatureDependenciesAction.getIncludedUIs(iu); if (includedIUs.contains(match.getId())) { return true; } return RequiredCapability.isStrictVersionRequirement(req.getMatches()); }
/** * @param req * @return a list of mandatory requirements if any, an empty list if req.isOptional(). */ private List<IInstallableUnit> getApplicableMatches(IRequirement req) { List<IInstallableUnit> target = new ArrayList<>(); IQueryResult<IInstallableUnit> matches = picker.query(QueryUtil.createMatchQuery(req.getMatches()), null); for (IInstallableUnit match : matches) { if (isApplicable(match)) { target.add(match); } } emptyBecauseFiltered = !matches.isEmpty() && target.isEmpty(); return target; }
public boolean equals(Object obj) { if (this == obj) return true; if (!(obj instanceof IRequirement)) return false; IRequirement other = (IRequirement) obj; if (filter == null) { if (other.getFilter() != null) return false; } else if (!filter.equals(other.getFilter())) return false; return min == other.getMin() && max == other.getMax() && greedy == other.isGreedy() && matchExpression.equals(other.getMatches()); }
private void computeNonGreedyIUs() { Set<IInstallableUnit> ius = considered.keySet(); IQueryable<IInstallableUnit> queryable = new QueryableArray(ius.toArray(new IInstallableUnit[ius.size()])); Iterator<IInstallableUnit> it = queryable.query(QueryUtil.ALL_UNITS, new NullProgressMonitor()).iterator(); while (it.hasNext()) { Collection<IRequirement> reqs = getRequirements(it.next().unresolved()); for (IRequirement req : reqs) { if (!isApplicable(req)) continue; if (!isGreedy(req)) { nonGreedyIUs.addAll(queryable.query(QueryUtil.createMatchQuery(req.getMatches()), null).toUnmodifiableSet()); } } } }
private void computeNonGreedyIUs() { IQueryable<IInstallableUnit> queryable = new QueryableArray(considered.toArray(new IInstallableUnit[considered.size()])); Iterator<IInstallableUnit> it = queryable.query(QueryUtil.ALL_UNITS, new NullProgressMonitor()).iterator(); while (it.hasNext()) { Collection<IRequirement> reqs = getRequirements(it.next().unresolved()); for (IRequirement req : reqs) { if (!isApplicable(req)) continue; if (!isGreedy(req)) { nonGreedyIUs.addAll(queryable.query(QueryUtil.createMatchQuery(req.getMatches()), null).toUnmodifiableSet()); } } } }
private void expandRequirement(IInstallableUnit iu, IRequirement req) { if (req.getMax() == 0) return; IQueryResult<IInstallableUnit> matches = possibilites.query(QueryUtil.createMatchQuery(req.getMatches()), null); int validMatches = 0; for (Iterator<IInstallableUnit> iterator = matches.iterator(); iterator.hasNext();) { IInstallableUnit match = iterator.next(); if (!isApplicable(match)) continue; validMatches++; Map<Version, IInstallableUnit> iuSlice = slice.get(match.getId()); if (iuSlice == null || !iuSlice.containsKey(match.getVersion())) consider(iu, match); } if (validMatches == 0) { if (req.getMin() == 0) { if (DEBUG) System.out.println("No IU found to satisfy optional dependency of " + iu + " on req " + req); //$NON-NLS-1$//$NON-NLS-2$ } else { result.add(new Status(IStatus.WARNING, DirectorActivator.PI_DIRECTOR, NLS.bind(Messages.Planner_Unsatisfied_dependency, iu, req))); } } }
private void collectIncludedIUs(IQueryable<IInstallableUnit> availableIUs, Set<IInstallableUnit> result, Set<IStatus> errors, IInstallableUnit iu, boolean immediate, IProgressMonitor monitor) { // features listed in site.xml directly // features/bundles included in included features (RequiredCapability.isVersionStrict is approximation of this) for (IRequirement req : iu.getRequirements()) { IQueryResult<IInstallableUnit> matches = availableIUs .query(QueryUtil.createLatestQuery(QueryUtil.createMatchQuery(req.getMatches())), monitor); if (!matches.isEmpty()) { IInstallableUnit match = matches.iterator().next(); // can only be one if (immediate || isIncluded(iu, req, match)) { result.add(match); if (isFeature(match)) { collectIncludedIUs(availableIUs, result, errors, match, false, monitor); } } } else { errors.add(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Unable to find dependency from " + iu.toString() + " to " + req.toString())); } } }
private void expandRequirement(IInstallableUnit iu, IRequirement req) { if (req.getMax() == 0) return; IQueryResult<IInstallableUnit> matches = possibilites.query(QueryUtil.createMatchQuery(req.getMatches()), null); int validMatches = 0; for (Iterator<IInstallableUnit> iterator = matches.iterator(); iterator.hasNext();) { IInstallableUnit match = iterator.next(); if (!isApplicable(match)) continue; validMatches++; Map<Version, IInstallableUnit> iuSlice = slice.get(match.getId()); if (iuSlice == null || !iuSlice.containsKey(match.getVersion())) consider(match); } if (validMatches == 0) { if (req.getMin() == 0) { if (DEBUG) System.out.println("No IU found to satisfy optional dependency of " + iu + " on req " + req); //$NON-NLS-1$//$NON-NLS-2$ } else { result.add(new Status(IStatus.WARNING, DirectorActivator.PI_DIRECTOR, NLS.bind(Messages.Planner_Unsatisfied_dependency, iu, req))); } } }
private boolean hasOnlySimpleRequirements(IInstallableUnit iu) { for (IRequirement r : iu.getRequirements()) if (r.getMax() == 0 || !RequiredCapability.isSimpleRequirement(r.getMatches())) return false; if (iu.getUpdateDescriptor() != null) { for (IMatchExpression<IInstallableUnit> m : iu.getUpdateDescriptor().getIUsBeingUpdated()) { if (!RequiredCapability.isSimpleRequirement(m)) return false; } } for (IRequirement r : iu.getMetaRequirements()) if (r.getMax() == 0 || !RequiredCapability.isSimpleRequirement(r.getMatches())) return false; if (iu instanceof IInstallableUnitFragment) { for (IRequirement r : ((IInstallableUnitFragment) iu).getHost()) if (!RequiredCapability.isSimpleRequirement(r.getMatches())) return false; } if (iu instanceof IInstallableUnitPatch) { IInstallableUnitPatch iuPatch = (IInstallableUnitPatch) iu; for (IRequirement[] rArr : iuPatch.getApplicabilityScope()) for (IRequirement r : rArr) if (!RequiredCapability.isSimpleRequirement(r.getMatches())) return false; IRequirement lifeCycle = iuPatch.getLifeCycle(); if (lifeCycle != null && !RequiredCapability.isSimpleRequirement(lifeCycle.getMatches())) return false; } return true; }
private Collection<IRequirement> areMetaRequirementsSatisfied(IProfile oldProfile, Collection<IInstallableUnit> newProfile, IProvisioningPlan initialPlan) { Collection<IRequirement> allMetaRequirements = extractMetaRequirements(newProfile, initialPlan); for (IRequirement requirement : allMetaRequirements) { if (oldProfile .query(QueryUtil.createLimitQuery(QueryUtil.createMatchQuery(requirement.getMatches()), 1), null) .isEmpty()) return allMetaRequirements; } return null; }
/** * Returns a query matching the installable units representing the specified Eclipse * artifact(s). * * @param type * Eclipse artifact type as defined in Tycho's {@link ArtifactType} * @throws IllegalArtifactReferenceException * if the given artifact type is unknown */ public static IQuery<IInstallableUnit> createQueryFor(String type, String id, VersionRange versionRange) throws IllegalArtifactReferenceException { if (ArtifactType.TYPE_ECLIPSE_PLUGIN.equals(type)) { return QueryUtil.createMatchQuery(createBundleRequirement(id, versionRange).getMatches()); } else if (ArtifactType.TYPE_ECLIPSE_FEATURE.equals(type)) { return QueryUtil.createPipeQuery(QueryUtil.createIUQuery(id + ".feature.group", versionRange), QueryUtil.createIUGroupQuery()); } else if (ArtifactType.TYPE_ECLIPSE_PRODUCT.equals(type)) { return QueryUtil.createPipeQuery(QueryUtil.createIUQuery(id, versionRange), QueryUtil.createIUProductQuery()); } else if (ArtifactType.TYPE_INSTALLABLE_UNIT.equals(type)) { return QueryUtil.createIUQuery(id, versionRange); } else { throw new IllegalArtifactReferenceException("Unknown artifact type \"" + type + "\""); } }
protected boolean isApplicable(IRequirement req) { //Every filter in this method needs to continue except when the filter does not pass if (!includeOptionalDependencies) if (req.getMin() == 0) return false; if (considerOnlyStrictDependency) { if (!RequiredCapability.isVersionStrict(req.getMatches())) return false; } //deal with filters if (considerFilter) { if (onlyFilteredRequirements && req.getFilter() == null) { return false; } return super.isApplicable(req); } if (req.getFilter() == null) { if (onlyFilteredRequirements) return false; return true; } return evalFilterTo; }
@Override protected boolean isApplicable(IRequirement req) { //Every filter in this method needs to continue except when the filter does not pass if (!includeOptionalDependencies) if (req.getMin() == 0) return false; if (considerOnlyStrictDependency) { if (!RequiredCapability.isStrictVersionRequirement(req.getMatches())) return false; } //deal with filters if (considerFilter) { if (onlyFilteredRequirements && req.getFilter() == null) { return false; } return super.isApplicable(req); } if (req.getFilter() == null) { if (onlyFilteredRequirements) return false; return true; } return evalFilterTo; }
protected void changedRoots(List<WeightedObject<?>> weightedObjects, BigInteger weight, IInstallableUnit entryPointIU) { Collection<IRequirement> requirements = entryPointIU.getRequirements(); for (IRequirement req : requirements) { IQuery<IInstallableUnit> query = QueryUtil.createMatchQuery(req.getMatches()); IQueryResult<IInstallableUnit> matches = picker.query(query, null); Object[] changed = new Object[matches.toUnmodifiableSet().size()]; int i = 0; for (IInstallableUnit match : matches) { changed[i++] = isInstalledAsRoot(match) ? dependencyHelper.not(match) : match; } try { Projector.AbstractVariable abs = new Projector.AbstractVariable("CHANGED"); //$NON-NLS-1$ dependencyHelper.or(FakeExplanation.getInstance(), abs, changed); weightedObjects.add(WeightedObject.newWO(abs, weight)); } catch (ContradictionException e) { // TODO Auto-generated catch block TODO e.printStackTrace(); } } }
protected void newRoots(List<WeightedObject<?>> weightedObjects, BigInteger weight, IInstallableUnit entryPointIU) { Collection<IRequirement> requirements = entryPointIU.getRequirements(); for (IRequirement req : requirements) { IQuery<IInstallableUnit> query = QueryUtil.createMatchQuery(req.getMatches()); IQueryResult<IInstallableUnit> matches = picker.query(query, null); boolean oneInstalled = false; for (IInstallableUnit match : matches) { oneInstalled = oneInstalled || isInstalledAsRoot(match); } if (!oneInstalled) { try { Projector.AbstractVariable abs = new Projector.AbstractVariable("NEW"); //$NON-NLS-1$ dependencyHelper.or(FakeExplanation.getInstance(), abs, (Object[]) matches.toArray(IInstallableUnit.class)); weightedObjects.add(WeightedObject.newWO(abs, weight)); } catch (ContradictionException e) { // should not happen e.printStackTrace(); } } } }
@Override protected Object getQueriedIDs(IEvaluationContext ctx, IExpression variable, String memberName, IExpression booleanExpr, Object queriedKeys) { if (booleanExpr.getExpressionType() != IExpression.TYPE_MATCHES) return super.getQueriedIDs(ctx, variable, memberName, booleanExpr, queriedKeys); Matches matches = (Matches) booleanExpr; if (matches.lhs != variable) return null; Object rhsObj = matches.rhs.evaluate(ctx); if (!(rhsObj instanceof IRequirement)) return null; // Let the requirement expression participate in the // index usage query // IMatchExpression<IInstallableUnit> rm = ((IRequirement) rhsObj).getMatches(); return RequiredCapability.isSimpleRequirement(rm) ? concatenateUnique(queriedKeys, rm.getParameters()[0]) : getRequirementIDs(rm.createContext(), ((Unary) rm).operand, queriedKeys); }
@Override public P2ResolutionResult resolveInstallableUnit(TargetPlatform targetPlatform, String id, String versionRange) { setContext(targetPlatform, null); QueryableCollection queriable = new QueryableCollection(context.getInstallableUnits()); VersionRange range = new VersionRange(versionRange); IRequirement requirement = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, id, range, null, 1 /* min */, Integer.MAX_VALUE /* max */, false /* greedy */); IQueryResult<IInstallableUnit> result = queriable .query(QueryUtil.createLatestQuery(QueryUtil.createMatchQuery(requirement.getMatches())), monitor); Set<IInstallableUnit> newState = result.toUnmodifiableSet(); return toResolutionResult(newState, null); } }
protected void writeRequirement(IRequirement requirement) { start(REQUIREMENT_ELEMENT); IMatchExpression<IInstallableUnit> match = requirement.getMatches(); if (requirement.getMax() > 0 && RequiredCapability.isSimpleRequirement(match)) { attribute(NAMESPACE_ATTRIBUTE, RequiredCapability.extractNamespace(match)); attribute(NAME_ATTRIBUTE, RequiredCapability.extractName(match)); attribute(VERSION_RANGE_ATTRIBUTE, RequiredCapability.extractRange(match)); attribute(CAPABILITY_OPTIONAL_ATTRIBUTE, requirement.getMin() == 0, false); attribute(CAPABILITY_MULTIPLE_ATTRIBUTE, requirement.getMax() > 1, false); } else { writeMatchExpression(match); if (requirement.getMin() != 1) attribute(MIN_ATTRIBUTE, requirement.getMin()); if (requirement.getMax() != 1) attribute(MAX_ATTRIBUTE, requirement.getMax()); } attribute(CAPABILITY_GREED_ATTRIBUTE, requirement.isGreedy(), true); if (requirement.getFilter() != null) writeTrimmedCdata(CAPABILITY_FILTER_ELEMENT, requirement.getFilter().getParameters()[0].toString()); if (requirement.getDescription() != null) writeTrimmedCdata(REQUIREMENT_DESCRIPTION_ELEMENT, requirement.getDescription()); end(REQUIREMENT_ELEMENT); }
protected void writeRequirement(IRequirement requirement) { start(REQUIREMENT_ELEMENT); IMatchExpression<IInstallableUnit> match = requirement.getMatches(); if (requirement.getMax() > 0 && RequiredCapability.isSimpleRequirement(match)) { attribute(NAMESPACE_ATTRIBUTE, RequiredCapability.extractNamespace(match)); attribute(NAME_ATTRIBUTE, RequiredCapability.extractName(match)); attribute(VERSION_RANGE_ATTRIBUTE, RequiredCapability.extractRange(match)); attribute(CAPABILITY_OPTIONAL_ATTRIBUTE, requirement.getMin() == 0, false); attribute(CAPABILITY_MULTIPLE_ATTRIBUTE, requirement.getMax() > 1, false); } else { writeMatchExpression(match); if (requirement.getMin() != 1) attribute(MIN_ATTRIBUTE, requirement.getMin()); if (requirement.getMax() != 1) attribute(MAX_ATTRIBUTE, requirement.getMax()); } attribute(CAPABILITY_GREED_ATTRIBUTE, requirement.isGreedy(), true); if (requirement.getFilter() != null) writeTrimmedCdata(CAPABILITY_FILTER_ELEMENT, requirement.getFilter().getParameters()[0].toString()); if (requirement.getDescription() != null) writeTrimmedCdata(REQUIREMENT_DESCRIPTION_ELEMENT, requirement.getDescription()); end(REQUIREMENT_ELEMENT); }
protected void writeRequirement(IRequirement requirement) { start(REQUIREMENT_ELEMENT); IMatchExpression<IInstallableUnit> match = requirement.getMatches(); if (requirement.getMax() > 0 && RequiredCapability.isSimpleRequirement(match)) { attribute(NAMESPACE_ATTRIBUTE, RequiredCapability.extractNamespace(match)); attribute(NAME_ATTRIBUTE, RequiredCapability.extractName(match)); attribute(VERSION_RANGE_ATTRIBUTE, RequiredCapability.extractRange(match)); attribute(CAPABILITY_OPTIONAL_ATTRIBUTE, requirement.getMin() == 0, false); attribute(CAPABILITY_MULTIPLE_ATTRIBUTE, requirement.getMax() > 1, false); } else { writeMatchExpression(match); if (requirement.getMin() != 1) attribute(MIN_ATTRIBUTE, requirement.getMin()); if (requirement.getMax() != 1) attribute(MAX_ATTRIBUTE, requirement.getMax()); } attribute(CAPABILITY_GREED_ATTRIBUTE, requirement.isGreedy(), true); if (requirement.getFilter() != null) writeTrimmedCdata(CAPABILITY_FILTER_ELEMENT, requirement.getFilter().getParameters()[0].toString()); if (requirement.getDescription() != null) writeTrimmedCdata(REQUIREMENT_DESCRIPTION_ELEMENT, requirement.getDescription()); end(REQUIREMENT_ELEMENT); }