| /******************************************************************************* |
| * 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); |
| } |
| |
| } |