/* * Copyright 2004 original author or authors. * * Licensed 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.extremecomponents.table.calc; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.extremecomponents.table.bean.Column; import org.extremecomponents.table.core.PreferencesConstants; import org.extremecomponents.table.core.TableCache; import org.extremecomponents.table.core.TableModel; import org.extremecomponents.util.ExtremeUtils; /** * @author Jeff Johnston */ public final class CalcUtils { private static Log logger = LogFactory.getLog(CalcUtils.class); private CalcUtils() { } public static CalcResult[] getCalcResults(TableModel model, Column column) { List values = new ArrayList(); String calcs[] = column.getCalc(); for (int i = 0; i < calcs.length; i++) { values.add(getCalcResultsByPosition(model, column, i)); } return (CalcResult[]) values.toArray(new CalcResult[values.size()]); } public static CalcResult getCalcResultsByPosition(TableModel model, Column column, int position) { String calcClassName = CalcUtils.getCalcClassNameByPosition(model, column, position); if (!isCalcClassName(calcClassName)) { return new CalcResult(calcClassName, null); } Calc calc = TableCache.getInstance().getCalc(calcClassName); return new CalcResult(calcClassName, calc.getCalcResult(model, column)); } public static String[] getFirstCalcColumnTitles(TableModel model) { List values = new ArrayList(); Column column = model.getColumnHandler().getFirstCalcColumn(); String calcs[] = column.getCalc(); for (int i = 0; i < calcs.length; i++) { values.add(getFirstCalcColumnTitleByPosition(model, i)); } return (String[]) values.toArray(new String[values.size()]); } public static String getFirstCalcColumnTitleByPosition(TableModel model, int position) { Column column = model.getColumnHandler().getFirstCalcColumn(); String calcTitle[] = column.getCalcTitle(); return calcTitle[position]; } private static String getCalcClassNameByPosition(TableModel model, Column column, int position) { String calcs[] = column.getCalc(); String calcName = calcs[position]; String calcClassName = model.getPreferences().getPreference(PreferencesConstants.COLUMN_CALC + calcName); if (StringUtils.isBlank(calcClassName)) { calcClassName = calcName; } return calcClassName; } private static boolean isCalcClassName(String calcClassName) { try { Class.forName(calcClassName); return true; } catch (ClassNotFoundException e) { return false; } } public static void eachRowCalcValue(CalcHandler handler, Collection rows, String property) { if (rows == null) { return; } for (Iterator listIter = rows.iterator(); listIter.hasNext();) { Object row = listIter.next(); Object value = null; if (ExtremeUtils.isBeanPropertyReadable(row, property)) { try { value = PropertyUtils.getProperty(row, property); if (value instanceof Number) { handler.processCalcValue((Number) value); } else { handler.processCalcValue(getValue(property, value)); } } catch (Exception e) { String errorMessage = "Problem parsing numeric value for property [" + property + "]."; logger.error("CalcUtils.eachCalc() - " + errorMessage); } } } } private static Number getValue(String property, Object value) { String valueAsString = String.valueOf(value); if (StringUtils.isNotBlank(valueAsString)) { try { return new BigDecimal(valueAsString); } catch (NumberFormatException e) { String errorMessage = "Problem parsing numeric value for property [" + property + "] with value [" + valueAsString + "]."; logger.error("CalcUtils.getValue() - " + errorMessage); } } return new BigDecimal(0.00); } }