blob: bba3e135b76261cf3cee71a4cf20ae3f0fa3fe50 [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 ResolutionVisitor implements IElementSetVisitor {
private int order;
public ResolutionVisitor(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 selected versions are resolved
if (elementSet.getRequired().isEmpty()) {
elementSet.setResolved(elementSet.getSelected());
return;
}
Set resolved = new HashSet();
for (Iterator elementsIter = elementSet.getSelected().iterator(); elementsIter.hasNext();) {
IElement element = (IElement) elementsIter.next();
IDependency[] dependencies = element.getDependencies();
boolean versionResolved = true;
for (int i = 0; i < dependencies.length; i++) {
IElementSet requiredNode = elementSet.getSystem().getElementSet(dependencies[i].getRequiredObjectId());
List requiredNodeResolvedVersions = new ArrayList(requiredNode.getResolved());
Object highestRequiredVersionId = null;
for (Iterator requiredNodeResolvedVersionsIter = requiredNodeResolvedVersions.iterator(); requiredNodeResolvedVersionsIter.hasNext();) {
IElement requiredResolvedVersion = (IElement) requiredNodeResolvedVersionsIter.next();
if (dependencies[i].getMatchRule().isSatisfied(dependencies[i].getRequiredVersionId(), requiredResolvedVersion.getVersionId()))
if (highestRequiredVersionId == null || elementSet.getSystem().compare(requiredResolvedVersion.getVersionId(), highestRequiredVersionId) > 0)
highestRequiredVersionId = requiredResolvedVersion.getVersionId();
}
if (highestRequiredVersionId == null && !dependencies[i].isOptional()) {
versionResolved = false;
break;
}
// new version id will be null if dependency cannot be satisfied but is optional
elementSet.resolveDependency(element, dependencies[i], highestRequiredVersionId);
}
if (versionResolved)
resolved.add(element);
}
elementSet.setResolved(resolved);
}
}