blob: 35af1398575ca56e669f9cfd5d8ea48d176e5ad3 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}