net.sf.xmlform.expression.AbstractExpressionContext Maven / Gradle / Ivy
package net.sf.xmlform.expression;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.xmlform.XMLFormPastport;
import net.sf.xmlform.expression.fun.*;
import net.sf.xmlform.expression.impl.AbstractValue;
import net.sf.xmlform.expression.type.*;
/**
* @author Liu Zhikun
*/
public abstract class AbstractExpressionContext implements ExpressionContext {
static private Map functions=new HashMap();
static private Map fields=new HashMap();
private Map tempValues=new HashMap();
private XMLFormPastport pastport;
static {
regFun(new Abs());
regFun(new Add());
regFun(new Div());
regFun(new Mod());
regFun(new Mul());
regFun(new Sub());
regFun(new Ceil());
regFun(new Floor());
regFun(new Round());
regFun(new And(),"and");
regFun(new Eq(),"eq");
regFun(new Ge(),"ge");
regFun(new Gt(),"gt");
regFun(new Le(),"le");
regFun(new Lt(),"lt");
regFun(new Not());
regFun(new Or(),"or");
regFun(new Ne(),"ne");
regFun(new ToNumber());
regFun(new ToInteger());
regFun(new ToFloat());
regFun(new ToString());
regFun(new Set());
regFun(new Get());
regFun(new Concat());
regFun(new NConcat());
regFun(new NotNull());
regFun(new Upper());
regFun(new Lower());
regFun(new Initcap());
regFun(new Instr());
regFun(new IsInteger());
regFun(new IsFloat());
regFun(new IsNull());
regFun(new Length());
regFun(new Lpad());
regFun(new Rpad());
regFun(new Ltrim());
regFun(new Reverse());
regFun(new Rtrim());
regFun(new Substr());
regFun(new Trim());
regFun(new Replace());
regFun(new Left());
regFun(new Right());
regFun(new Case());
regFun(new Switch());
regFun(new Nvl());
regFun(new Greatest());
regFun(new Least());
regFun(new Contains());
regFun(new NotContains());
regFun(new Max());
regFun(new Min());
regFun(new Sum());
regFun(new Avg());
regFun(new Count());
regFun(new AddDays());
regFun(new AddMonths());
regFun(new AddYears());
regFun(new CurrentDate());
regFun(new CurrentDatetime());
regFun(new CurrentTime());
regFun(new DaysDiff());
regFun(new ToDate());
regFun(new ToDatetime());
regFun(new ToTime());
regFun(new Count());
regField(new BooleanTypeValue());
regField(new ByteTypeValue());
regField(new DecimalTypeValue());
regField(new DoubleTypeValue());
regField(new FloatTypeValue());
regField(new IntegerTypeValue());
regField(new IntTypeValue());
regField(new LongTypeValue());
regField(new ShortTypeValue());
regField(new StringTypeValue());
regField(new LocalDateTimeTypeValue());
regField(new LocalDateTypeValue());
regField(new LocalTimeTypeValue());
regField(new YearMonthTypeValue());
regField(new DateTimeTypeValue());
regField(new DateTypeValue());
regField(new TimeTypeValue());
}
private static void regFun(Fun fun){
functions.put(fun.getName(), fun);
}
private static void regFun(Fun fun,String name){
regFun(fun);
//functions.put(name, fun);
}
private static void regField(net.sf.xmlform.expression.type.TypeValue field){
fields.put(field.getType(), field);
}
public AbstractExpressionContext(XMLFormPastport pastport){
this.pastport=pastport;
}
public Value executeFunction(String funName, Factor factors[]) {
Fun f=getFunction(funName);
if(f==null)
FunHelper.throwException(getPastport().getLocale(), FunHelper.FUN_NAME_INVALID, new String[] {funName});
return f.execute(this,factors);
}
public XMLFormPastport getPastport(){
return pastport;
}
protected Fun getFunction(String funName){
Fun f=(Fun)functions.get(funName);
return f;
}
public Value convertToValue(Object value) {
if(value instanceof Value)
return (Value)value;
Value nvalue=NullValue.NULL_VALUE;
if(value==null){
return NullValue.NULL_VALUE;
}
if(value instanceof List){
return new ListValue((List)value);
}else{
TypeValue type=(net.sf.xmlform.expression.type.TypeValue)fields.get(value.getClass());
if(type==null){
return null;
}
return type.getValue(value);
}
}
protected Value createNamedValue(String name,Object value){
Value nvalue=convertToValue(value);
if(nvalue==null){
throw new IllegalStateException("Not found TypeValue for "+value.getClass()+" in AbstractExpressionContext");
}
((AbstractValue)nvalue).setName(name);
return nvalue;
}
public Object getAttribute(String valueName){
return tempValues.get(valueName);
}
public void setAttribute(String valueName,Object value){
tempValues.put(valueName, value);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy