package com.esri.geoevent.processor.cacheawarefieldcalculator.expression; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Stack; import com.esri.ges.core.geoevent.Field; import com.esri.ges.core.geoevent.FieldDefinition; import com.esri.ges.core.geoevent.FieldExpression; import com.esri.ges.core.geoevent.GeoEvent; public class VariableToken extends CalculationToken { /** * construct a new {@link VariableToken} * * @param value * the value of the token */ VariableToken(FieldExpression fe) { super(fe); } @Override public boolean equals(Object obj) { return (obj instanceof VariableToken) ? super.getValue().equals(((VariableToken) obj).getValue()) : false; } @Override public int hashCode() { return value.hashCode(); } @Override void mutateStackForCalculation(Stack<Object> stack, GeoEvent geoEvent) { Object value = null; Field field = geoEvent.getField((FieldExpression)this.value); if (field != null) { FieldDefinition fd = field.getDefinition(); value = field.getValue(); if (fd != null) { switch (fd.getType()) { case Group: break; case Boolean: if (value == null) value = Boolean.FALSE; break; case Date: if (value == null) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(0); value = calendar.getTimeInMillis(); } else value = ((Date)value).getTime(); break; case Geometry: break; case String: if (value == null) value = ""; break; case Short: if (value == null) value = (short)0; break; case Integer: if (value == null) value = 0; break; case Long: if (value == null) value = 0l; break; case Float: if (field.getValue() == null) value = 0f; break; case Double: if (value == null) value = 0d; break; } } } stack.push(value); } @Override void mutateStackForInfixTranslation(Stack<Token> operatorStack, List<Token> tokens) { tokens.add(this); } }