blob: fa0d67d333848318cf6786f19cd098c58acc044d [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.expressions;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.expressions.EvaluationResult;
import org.eclipse.core.expressions.IEvaluationContext;
public class IterateExpression extends CompositeExpression {
private static class IteratePool implements IEvaluationContext {
private Iterator fIterator;
private Object fDefaultVariable;
private IEvaluationContext fParent;
public IteratePool(IEvaluationContext parent, Iterator iterator) {
Assert.isNotNull(parent);
Assert.isNotNull(iterator);
fParent= parent;
fIterator= iterator;
}
public IEvaluationContext getParent() {
return fParent;
}
public IEvaluationContext getRoot() {
return fParent.getRoot();
}
public Object getDefaultVariable() {
return fDefaultVariable;
}
public void addVariable(String name, Object value) {
fParent.addVariable(name, value);
}
public Object removeVariable(String name) {
return fParent.removeVariable(name);
}
public Object getVariable(String name) {
return fParent.getVariable(name);
}
public Object resolveVariable(String name, Object[] args) throws CoreException {
return fParent.resolveVariable(name, args);
}
public Object next() {
fDefaultVariable= fIterator.next();
return fDefaultVariable;
}
public boolean hasNext() {
return fIterator.hasNext();
}
}
private static final String ATT_OPERATOR= "operator"; //$NON-NLS-1$
private static final int OR= 1;
private static final int AND= 2;
private int fOperator;
public IterateExpression(IConfigurationElement configElement) throws CoreException {
String opValue= configElement.getAttribute(ATT_OPERATOR);
if (opValue == null) {
fOperator= AND;
} else {
Expressions.checkAttribute(ATT_OPERATOR, opValue, new String[] {"and", "or"}); //$NON-NLS-1$//$NON-NLS-2$
if ("and".equals(opValue)) { //$NON-NLS-1$
fOperator= AND;
} else {
fOperator= OR;
}
}
}
/* (non-Javadoc)
* @see Expression#evaluate(IVariablePool)
*/
public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
Object var= context.getDefaultVariable();
Expressions.checkCollection(var, this);
Collection col= (Collection)var;
switch (col.size()) {
case 0:
return fOperator == AND ? EvaluationResult.TRUE : EvaluationResult.FALSE;
case 1:
if (col instanceof List)
return evaluateAnd(new DefaultVariable(context, ((List)col).get(0)));
// fall through
default:
IteratePool iter= new IteratePool(context, col.iterator());
EvaluationResult result= fOperator == AND ? EvaluationResult.TRUE : EvaluationResult.FALSE;
while (iter.hasNext()) {
iter.next();
switch(fOperator) {
case OR:
result= result.or(evaluateAnd(iter));
if (result == EvaluationResult.TRUE)
return result;
break;
case AND:
result= result.and(evaluateAnd(iter));
if (result != EvaluationResult.TRUE)
return result;
break;
}
}
return result;
}
}
}