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() )); } }