package com.esri.geoevent.processor.cacheawarefieldcalculator.expression; import java.util.List; import java.util.Stack; import com.esri.ges.core.geoevent.GeoEvent; public class FunctionToken extends CalculationToken { final String functionName; final Function function; FunctionToken(String value, Function function) throws UnknownFunctionException { super(value); if (value == null) throw new UnknownFunctionException(value); try { this.functionName = function.name; this.function = function; } catch (IllegalArgumentException e) { throw new UnknownFunctionException(value); } } String getName() { return functionName; } @Override public boolean equals(Object obj) { return (obj instanceof FunctionToken) ? functionName.equals(((FunctionToken) obj).functionName) : false; } @Override public int hashCode() { return functionName.hashCode(); } @Override void mutateStackForCalculation(Stack<Object> stack, GeoEvent geoEvent) { Object[] args = new Object[function.argc]; for (int i=0; i < function.argc; i++) args[i] = stack.isEmpty() ? null : stack.pop(); stack.push(function.applyFunction(ArrayUtil.reverse(args))); } @Override void mutateStackForInfixTranslation(Stack<Token> operatorStack, List<Token> tokens) { operatorStack.push(this); } }