/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.cocoon.forms.expression; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Collection; import java.util.Iterator; import org.outerj.expression.AbstractExpression; import org.outerj.expression.Expression; import org.outerj.expression.ExpressionContext; import org.outerj.expression.ExpressionException; /** * Sum function. This function returns the sum of all of its argument, but * it accepts Collections or Iterators as arguments. When it finds such an * argument it iterates on all it's values, and try to sum them as well. It * accepts String and any instance of Number. */ public class SumFunction extends AbstractExpression { public Object evaluate(ExpressionContext context) throws ExpressionException { BigDecimal result = new BigDecimal("0"); for(int i = 0; i < arguments.size(); i++) { Expression function = (Expression)arguments.get(i); Object ret = function.evaluate(context); if (ret instanceof Collection) { ret = ((Collection)ret).iterator(); } if (ret instanceof Iterator) { Iterator iter = (Iterator)ret; while (iter.hasNext()) { Object p = iter.next(); BigDecimal db = null; if (p instanceof BigDecimal) { db =(BigDecimal)p; } else if (p instanceof Long) { db = new BigDecimal(((Long)p).longValue()); } else if (p instanceof Integer) { db = new BigDecimal(((Integer)p).intValue()); } else if (p instanceof Double) { db = new BigDecimal(((Double)p).doubleValue()); } else if (p instanceof Float) { db = new BigDecimal(((Float)p).floatValue()); } else if (p instanceof BigInteger) { db = new BigDecimal((BigInteger)p); } else if (p instanceof Number) { db = new BigDecimal(((Number)p).doubleValue()); } else if (p instanceof String) { db = new BigDecimal((String)p); } else { throw new IllegalArgumentException("Cannot sum an argument of type " + p.getClass().getName()); } result = result.add(db); } } else { result = result.add((BigDecimal)function.evaluate(context)); } } return result; } public Class getResultType() { return BigDecimal.class; } public String getDescription() { return "Summatory"; } }