blob: 2087ddc54d83e122a4c16aa5866b6e311a63bab8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2010 Cloudsmith Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Cloudsmith Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.internal.p2.metadata.expression;
import java.util.Iterator;
import org.eclipse.equinox.p2.metadata.expression.IEvaluationContext;
/**
* An expression that represents a function such as filter(<expr>) or version(<expr>)
*/
public abstract class Function extends NAry {
private Object instance;
protected Function(Expression[] operands) {
super(operands);
}
boolean assertSingleArgumentClass(Object v) {
return true;
}
Object createInstance(Object arg) {
throw new UnsupportedOperationException();
}
final Object createInstance(String arg) {
throw new UnsupportedOperationException();
}
public Object evaluate(IEvaluationContext context) {
if (instance != null)
return instance;
Expression operand = operands[0];
Object arg = operand.evaluate(context);
if (assertSingleArgumentClass(arg)) {
Object result = createInstance(arg);
if (operand instanceof Literal || operand instanceof Parameter)
// operand won't change over time so we can cache this instance.
instance = result;
return result;
}
String what = arg == null ? "null" : ("a " + arg.getClass().getName()); //$NON-NLS-1$ //$NON-NLS-2$
throw new IllegalArgumentException("Cannot create a " + getOperator() + " from " + what); //$NON-NLS-1$ //$NON-NLS-2$
}
public Iterator<?> evaluateAsIterator(IEvaluationContext context) {
Object value = evaluate(context);
if (!(value instanceof Iterator<?>))
value = RepeatableIterator.create(value);
return (Iterator<?>) value;
}
public int getExpressionType() {
return TYPE_FUNCTION;
}
public int getPriority() {
return PRIORITY_FUNCTION;
}
public void toString(StringBuffer bld, Variable rootVariable) {
bld.append(getOperator());
bld.append('(');
elementsToString(bld, rootVariable, operands);
bld.append(')');
}
}