package com.onaro.sanscreen.client.view.tabular.value; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import com.onaro.util.jfc.grouping.Node; /** * Summarizer that sums numbers based on a condition. Works the same as the ConditionalSumUniqueNumberColumnSummarizer * except does not add the unique value requirement. * */ public class ConditionalSumNumberColumnSummarizer extends ConditionalSumUniqueNumberColumnSummarizer { public ConditionalSumNumberColumnSummarizer(NodeCondition condition, int column, String format) { super(condition, column, format); } public ConditionalSumNumberColumnSummarizer(NodeCondition condition, int column) { super(condition, column); } @Override public void updateSummary(Node node) { List values = new LinkedList(); int otherValuesCount = 0; for (int i = 0; i < node.getChildCount(); ++i) { Node child = node.getChild(i); if (condition == null || condition.count(child)) { Object value = child.getValueAt(column); values.add(value); if ((value instanceof SumNumberValue)) ++otherValuesCount; } } if (!values.isEmpty() && otherValuesCount == 0) { Iterator valueItr = values.iterator(); if (values.size() == 1) { Object value = valueItr.next(); if (value instanceof NumberValue) { node.setValueAt(column, new SumNumberValue((NumberValue)value)); } else { node.setValueAt(column, value); } } else { double sum = 0; while (valueItr.hasNext()) { Object value = valueItr.next(); if (value instanceof NumberValue) { sum += ((NumberValue) value).getNumber(); } else if (value instanceof Number) { sum += ((Number)value).doubleValue(); } } node.setValueAt(column, new SumNumberValue(sum)); } } } }