|
Author: adrianc
Date: Mon Jul 2 14:23:33 2012 New Revision: 1356245 URL: http://svn.apache.org/viewvc?rev=1356245&view=rev Log: Some code optimization work on Calculate.java. Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/otherops/Calculate.java Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/otherops/Calculate.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/otherops/Calculate.java?rev=1356245&r1=1356244&r2=1356245&view=diff ============================================================================== --- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/otherops/Calculate.java (original) +++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/otherops/Calculate.java Mon Jul 2 14:23:33 2012 @@ -38,6 +38,8 @@ import org.w3c.dom.Element; /** * Implements the <calculate> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Ccalculate%3E}}">Mini-language Reference</a> */ public final class Calculate extends MethodOperation { @@ -55,7 +57,8 @@ public final class Calculate extends Met private final FlexibleStringExpander decimalScaleFse; private final FlexibleMapAccessor<Object> fieldFma; private final FlexibleStringExpander roundingModeFse; - private final FlexibleStringExpander typeFse; + private final int type; + private final String typeString; public Calculate(Element element, SimpleMethod simpleMethod) throws MiniLangException { super(element, simpleMethod); @@ -70,7 +73,22 @@ public final class Calculate extends Met this.decimalFormatFse = FlexibleStringExpander.getInstance(element.getAttribute("decimal-format")); this.decimalScaleFse = FlexibleStringExpander.getInstance(element.getAttribute("decimal-scale")); this.roundingModeFse = FlexibleStringExpander.getInstance(element.getAttribute("rounding-mode")); - this.typeFse = FlexibleStringExpander.getInstance(element.getAttribute("type")); + this.typeString = element.getAttribute("type"); + int type = Calculate.TYPE_BIG_DECIMAL; + if ("Double".equals(typeString)) { + type = Calculate.TYPE_DOUBLE; + } else if ("Float".equals(typeString)) { + type = Calculate.TYPE_FLOAT; + } else if ("Long".equals(typeString)) { + type = Calculate.TYPE_LONG; + } else if ("Integer".equals(typeString)) { + type = Calculate.TYPE_INTEGER; + } else if ("String".equals(typeString)) { + type = Calculate.TYPE_STRING; + } else if ("BigDecimal".equals(typeString)) { + type = Calculate.TYPE_BIG_DECIMAL; + } + this.type = type; List<? extends Element> calcopElements = UtilXml.childElementList(element); calcops = new Calculate.SubCalc[calcopElements.size()]; int i = 0; @@ -90,25 +108,8 @@ public final class Calculate extends Met @Override public boolean exec(MethodContext methodContext) throws MiniLangException { - String typeString = typeFse.expandString(methodContext.getEnvMap()); - int type; - if ("Double".equals(typeString)) { - type = Calculate.TYPE_DOUBLE; - } else if ("Float".equals(typeString)) { - type = Calculate.TYPE_FLOAT; - } else if ("Long".equals(typeString)) { - type = Calculate.TYPE_LONG; - } else if ("Integer".equals(typeString)) { - type = Calculate.TYPE_INTEGER; - } else if ("String".equals(typeString)) { - type = Calculate.TYPE_STRING; - } else if ("BigDecimal".equals(typeString)) { - type = Calculate.TYPE_BIG_DECIMAL; - } else { - type = Calculate.TYPE_BIG_DECIMAL; - } String roundingModeString = roundingModeFse.expandString(methodContext.getEnvMap()); - int roundingMode; + int roundingMode = BigDecimal.ROUND_HALF_EVEN; if ("Ceiling".equals(roundingModeString)) { roundingMode = BigDecimal.ROUND_CEILING; } else if ("Floor".equals(roundingModeString)) { @@ -121,24 +122,14 @@ public final class Calculate extends Met roundingMode = BigDecimal.ROUND_HALF_UP; } else if ("HalfDown".equals(roundingModeString)) { roundingMode = BigDecimal.ROUND_HALF_DOWN; - } else if ("HalfEven".equals(roundingModeString)) { - roundingMode = BigDecimal.ROUND_HALF_EVEN; } else if ("Unnecessary".equals(roundingModeString)) { roundingMode = BigDecimal.ROUND_UNNECESSARY; - } else { - // default to HalfEven, reduce cumulative errors - roundingMode = BigDecimal.ROUND_HALF_EVEN; } String decimalScaleString = decimalScaleFse.expandString(methodContext.getEnvMap()); int decimalScale = 2; if (!decimalScaleString.isEmpty()) { decimalScale = Integer.valueOf(decimalScaleString).intValue(); } - String decimalFormatString = decimalFormatFse.expandString(methodContext.getEnvMap()); - DecimalFormat df = null; - if (!decimalFormatString.isEmpty()) { - df = new DecimalFormat(decimalFormatString); - } BigDecimal resultValue = BigDecimal.ZERO.setScale(decimalScale, roundingMode); for (Calculate.SubCalc calcop : calcops) { resultValue = resultValue.add(calcop.calcValue(methodContext, decimalScale, roundingMode)); @@ -162,7 +153,12 @@ public final class Calculate extends Met break; case TYPE_STRING: // run the decimal-formatting - if (df != null && resultValue.compareTo(BigDecimal.ZERO) > 0) { + String decimalFormatString = decimalFormatFse.expandString(methodContext.getEnvMap()); + DecimalFormat df = null; + if (!decimalFormatString.isEmpty()) { + df = new DecimalFormat(decimalFormatString); + } + if (df != null && resultValue.compareTo(BigDecimal.ZERO) != 0) { resultObj = df.format(resultValue); } else { resultObj = resultValue.toString(); @@ -189,8 +185,8 @@ public final class Calculate extends Met if (!this.decimalFormatFse.isEmpty()) { sb.append("decimal-format=\"").append(this.decimalFormatFse).append("\" "); } - if (!typeFse.isEmpty()) { - sb.append("type=\"").append(this.typeFse).append("\" "); + if (!typeString.isEmpty()) { + sb.append("type=\"").append(this.typeString).append("\" "); } sb.append("/>"); return sb.toString(); @@ -205,6 +201,8 @@ public final class Calculate extends Met /** * Implements the <calcop> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Ccalcop%3E}}">Mini-language Reference</a> */ public final class CalcOp extends MiniLangElement implements SubCalc { private static final int OPERATOR_ADD = 1; @@ -215,18 +213,29 @@ public final class Calculate extends Met private final Calculate.SubCalc calcops[]; private final FlexibleMapAccessor<Object> fieldFma; - private final FlexibleStringExpander operatorFse; + private final int operator; private CalcOp(Element element, SimpleMethod simpleMethod) throws MiniLangException { super(element, simpleMethod); if (MiniLangValidate.validationOn()) { MiniLangValidate.attributeNames(simpleMethod, element, "field", "operator"); - MiniLangValidate.requiredAttributes(simpleMethod, element, "field"); + MiniLangValidate.requiredAttributes(simpleMethod, element, "operator"); MiniLangValidate.expressionAttributes(simpleMethod, element, "field"); MiniLangValidate.childElements(simpleMethod, element, "calcop", "number"); } this.fieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("field")); - this.operatorFse = FlexibleStringExpander.getInstance(element.getAttribute("operator")); + String operatorStr = element.getAttribute("operator"); + int operator = CalcOp.OPERATOR_ADD; + if ("subtract".equals(operatorStr)) { + operator = CalcOp.OPERATOR_SUBTRACT; + } else if ("multiply".equals(operatorStr)) { + operator = CalcOp.OPERATOR_MULTIPLY; + } else if ("divide".equals(operatorStr)) { + operator = CalcOp.OPERATOR_DIVIDE; + } else if ("negative".equals(operatorStr)) { + operator = CalcOp.OPERATOR_NEGATIVE; + } + this.operator = operator; List<? extends Element> calcopElements = UtilXml.childElementList(element); calcops = new Calculate.SubCalc[calcopElements.size()]; int i = 0; @@ -245,21 +254,6 @@ public final class Calculate extends Met @Override public BigDecimal calcValue(MethodContext methodContext, int scale, int roundingMode) throws MiniLangException { - String operatorStr = operatorFse.expandString(methodContext.getEnvMap()); - int operator = CalcOp.OPERATOR_ADD; - if ("get".equals(operatorStr)) { - operator = CalcOp.OPERATOR_ADD; - } else if ("add".equals(operatorStr)) { - operator = CalcOp.OPERATOR_ADD; - } else if ("subtract".equals(operatorStr)) { - operator = CalcOp.OPERATOR_SUBTRACT; - } else if ("multiply".equals(operatorStr)) { - operator = CalcOp.OPERATOR_MULTIPLY; - } else if ("divide".equals(operatorStr)) { - operator = CalcOp.OPERATOR_DIVIDE; - } else if ("negative".equals(operatorStr)) { - operator = CalcOp.OPERATOR_NEGATIVE; - } BigDecimal resultValue = BigDecimal.ZERO.setScale(scale, roundingMode); boolean isFirst = true; Object fieldObj = fieldFma.get(methodContext.getEnvMap()); @@ -311,6 +305,8 @@ public final class Calculate extends Met /** * Implements the <number> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cnumber%3E}}">Mini-language Reference</a> */ public final class NumberOp extends MiniLangElement implements SubCalc { |
| Free forum by Nabble | Edit this page |
