Learning Site
http://commons.apache.org/jexl/ Usage: 1. Expression Calculation i) Elements a. JexlContext hold on the variable numbers
b. ExpressionFactory create an Expression instance to calculate ii) Examples
How to calculate the 2 expressions "3+2" and "n1+n2+2"
FormulaCalculator.java
package JEXL;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.jexl.Expression;
import org.apache.commons.jexl.ExpressionFactory;
import org.apache.commons.jexl.JexlContext;
/**
*
* JEXL test, this Util class is used for testing the Formula Calculator
*
* @author shangyang
*
*/
public class FormulaCalculator {
String _formula;
JexlContext _jexlContext;
Map _varMap;
public FormulaCalculator(){
_jexlContext = new JexlContext(){
public Map getVars() {
// TODO Auto-generated method stub
return _varMap;
}
public void setVars(Map vars) {
// TODO Auto-generated method stub
_varMap.clear();
_varMap.putAll( vars );
}
};
}
public void setFormula(String formula) throws Exception{
validateFormula( formula );
_formula = formula;
}
// set the values to the variable of the expression
public void setVars(Map<String, Number> vars){
_varMap = vars;
}
public Number calculate() throws Exception{
Expression e = ExpressionFactory.createExpression( _formula );
return (Number) e.evaluate( _jexlContext );
}
private void validateFormula( String formula ) throws Exception{
// FIXME: implementation
}
}
FormulaCalculatorTest.java
package JEXL;
import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
import org.junit.Assert;
public class FormulaCalculatorTest extends TestCase{
public void testCalculate() throws Exception{
String formula = "3+2";
FormulaCalculator cal = new FormulaCalculator();
cal.setFormula(formula);
cal.setVars(null);
Number n = cal.calculate();
Assert.assertEquals( 5, Integer.parseInt( n.toString() ));
String formula2 = "n1+n2+3";
cal.setFormula(formula2);
Map<String, Number> mapVars = new HashMap<String, Number>();
mapVars.put( "n1", 2);
mapVars.put( "n2", 3);
cal.setFormula( formula2);
cal.setVars( mapVars);
Number n2 = cal.calculate();
Assert.assertEquals(8, Integer.parseInt( n2.toString() ));
}
}