| /******************************************************************************* |
| * Copyright (c) 2009 IBM Corporation 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: IBM Corporation - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.equinox.internal.p2.director; |
| |
| import java.util.Map; |
| import org.eclipse.equinox.internal.p2.metadata.RequiredCapability; |
| import org.eclipse.equinox.p2.metadata.IInstallableUnit; |
| import org.eclipse.equinox.p2.metadata.IRequirement; |
| import org.eclipse.equinox.p2.query.IQueryable; |
| |
| public class PermissiveSlicer extends Slicer { |
| private boolean includeOptionalDependencies; //Cause optional dependencies not be followed as part of the |
| private boolean everythingGreedy; |
| private boolean considerFilter; |
| private boolean considerOnlyStrictDependency; |
| private boolean evalFilterTo; |
| private boolean onlyFilteredRequirements; |
| |
| public PermissiveSlicer(IQueryable<IInstallableUnit> input, Map<String, String> context, boolean includeOptionalDependencies, boolean everythingGreedy, boolean evalFilterTo, boolean considerOnlyStrictDependency, boolean onlyFilteredRequirements) { |
| super(input, context, true); |
| this.considerFilter = (context != null && context.size() > 1) ? true : false; |
| this.includeOptionalDependencies = includeOptionalDependencies; |
| this.everythingGreedy = everythingGreedy; |
| this.evalFilterTo = evalFilterTo; |
| this.considerOnlyStrictDependency = considerOnlyStrictDependency; |
| this.onlyFilteredRequirements = onlyFilteredRequirements; |
| } |
| |
| protected boolean isApplicable(IInstallableUnit iu) { |
| if (considerFilter) |
| return super.isApplicable(iu); |
| if (iu.getFilter() == null) |
| return true; |
| return evalFilterTo; |
| } |
| |
| 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; |
| } |
| |
| protected boolean isGreedy(IRequirement req) { |
| if (everythingGreedy) { |
| return true; |
| } |
| return super.isGreedy(req); |
| } |
| } |