diff options
Diffstat (limited to 'bundles/org.eclipse.osgi/resolver/src/org/eclipse/core/internal/dependencies/SatisfactionVisitor.java')
-rw-r--r-- | bundles/org.eclipse.osgi/resolver/src/org/eclipse/core/internal/dependencies/SatisfactionVisitor.java | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/core/internal/dependencies/SatisfactionVisitor.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/core/internal/dependencies/SatisfactionVisitor.java new file mode 100644 index 000000000..7348a5999 --- /dev/null +++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/core/internal/dependencies/SatisfactionVisitor.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2000, 2003 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ + +package org.eclipse.core.internal.dependencies; + +import java.util.*; + +import org.eclipse.core.dependencies.*; + +public class SatisfactionVisitor implements IElementSetVisitor { + private int order; + public SatisfactionVisitor(int order) { + this.order = order; + } + public int getOrder() { + return order; + } + public Collection getAncestors(ElementSet elementSet) { + return elementSet.getRequired(); + } + public Collection getDescendants(ElementSet elementSet) { + return elementSet.getRequiring(); + } + public void update(ElementSet elementSet) { + // if there are no pre-requisites, all available versions are satisfied + if (elementSet.getRequired().isEmpty()) { + elementSet.setSatisfied(elementSet.getAvailable()); + return; + } + + Set satisfied = new HashSet(); + for (Iterator elementsIter = elementSet.getAvailable().iterator(); elementsIter.hasNext();) { + IElement element = (IElement) elementsIter.next(); + IDependency[] dependencies = element.getDependencies(); + boolean versionSatisfied = true; + for (int i = 0; i < dependencies.length; i++) { + // optional pre-requisites are not relevant for satisfaction + if (dependencies[i].isOptional()) + continue; + + IElementSet requiredNode = elementSet.getSystem().getElementSet(dependencies[i].getRequiredObjectId()); + + Collection requiredNodeSatisfiedVersions = requiredNode.getSatisfied(); + boolean depSatisfied = false; + for (Iterator requiredNodeSatisfiedVersionsIter = requiredNodeSatisfiedVersions.iterator(); requiredNodeSatisfiedVersionsIter.hasNext();) { + IElement requiredSatisfiedVersion = (IElement) requiredNodeSatisfiedVersionsIter.next(); + if (dependencies[i].getMatchRule().isSatisfied(dependencies[i].getRequiredVersionId(), requiredSatisfiedVersion.getVersionId())) { + depSatisfied = true; + break; + } + } + if (!depSatisfied) { + versionSatisfied = false; + break; + } + } + if (versionSatisfied) + satisfied.add(element); + } + elementSet.setSatisfied(satisfied); + } + +} |