{
totalsTableDecorator = TableTotaler.NULL;
}
// iterator on rows
TableDecorator tableDecorator = model.getTableDecorator();
Row previousRow = null;
Row currentRow = null;
Row nextRow = null;
Map<Integer, CellStruct> previousRowValues = new HashMap<Integer, CellStruct>(10);
Map<Integer, CellStruct> currentRowValues = new HashMap<Integer, CellStruct>(10);
Map<Integer, CellStruct> nextRowValues = new HashMap<Integer, CellStruct>(10);
while (nextRow != null || rowIterator.hasNext())
{
// The first pass
if (currentRow == null)
{
currentRow = rowIterator.next();
}
else
{
previousRow = currentRow;
currentRow = nextRow;
}
if (previousRow != null)
{
previousRowValues.putAll(currentRowValues);
}
if (!nextRowValues.isEmpty())
{
currentRowValues.putAll(nextRowValues);
}
// handle the first pass
else
{
ColumnIterator columnIterator = currentRow.getColumnIterator(model.getHeaderCellList());
// iterator on columns
if (log.isDebugEnabled())
{
log.debug(" creating ColumnIterator on " + model.getHeaderCellList());
}
while (columnIterator.hasNext())
{
Column column = columnIterator.nextColumn();
// Get the value to be displayed for the column
column.initialize();
@SuppressWarnings("deprecation")
String cellvalue = MediaTypeEnum.HTML.equals(model.getMedia())
? column.getChoppedAndLinkedValue()
: ObjectUtils.toString(column.getValue(true));
CellStruct struct = new CellStruct(column, cellvalue);
currentRowValues.put(new Integer(column.getHeaderCell().getColumnNumber()), struct);
}
}
nextRowValues.clear();
// Populate the next row values
nextRow = rowIterator.hasNext() ? rowIterator.next() : null;
if (nextRow != null)
{
ColumnIterator columnIterator = nextRow.getColumnIterator(model.getHeaderCellList());
// iterator on columns
if (log.isDebugEnabled())
{
log.debug(" creating ColumnIterator on " + model.getHeaderCellList());
}
while (columnIterator.hasNext())
{
Column column = columnIterator.nextColumn();
column.initialize();
// Get the value to be displayed for the column
@SuppressWarnings("deprecation")
String cellvalue = MediaTypeEnum.HTML.equals(model.getMedia())
? column.getChoppedAndLinkedValue()
: ObjectUtils.toString(column.getValue(true));
CellStruct struct = new CellStruct(column, cellvalue);
nextRowValues.put(new Integer(column.getHeaderCell().getColumnNumber()), struct);
}
}
// now we are going to create the current row; reset the decorator to the current row
if (tableDecorator != null)
{
tableDecorator.initRow(currentRow.getObject(), currentRow.getRowNumber(), currentRow.getRowNumber()
+ rowIterator.getPageOffset());
}
if (totalsTableDecorator != null)
{
totalsTableDecorator.initRow(
currentRow.getRowNumber(),
currentRow.getRowNumber() + rowIterator.getPageOffset());
}
ArrayList<CellStruct> structsForRow = new ArrayList<CellStruct>(model.getHeaderCellList().size());
lowestEndedGroup = NO_RESET_GROUP;
lowestStartedGroup = NO_RESET_GROUP;
for (HeaderCell header : model.getHeaderCellList())
{
// Get the value to be displayed for the column
CellStruct struct = currentRowValues.get(new Integer(header.getColumnNumber()));
struct.decoratedValue = struct.bodyValue;
// Check and see if there is a grouping transition. If there is, then notify the decorator
if (header.getGroup() != -1)
{
CellStruct prior = previousRowValues.get(new Integer(header.getColumnNumber()));
CellStruct next = nextRowValues.get(new Integer(header.getColumnNumber()));
// Why npe?
String priorBodyValue = prior != null ? prior.bodyValue : null;
String nextBodyValue = next != null ? next.bodyValue : null;
short groupingValue = groupColumns(
struct.bodyValue,
priorBodyValue,
nextBodyValue,
header.getGroup());
if (tableDecorator != null || totalsTableDecorator != null)
{
switch (groupingValue)
{
case GROUP_START :
totalsTableDecorator.startGroup(struct.bodyValue, header.getGroup());
if (tableDecorator != null)
{
tableDecorator.startOfGroup(struct.bodyValue, header.getGroup());
}
break;
case GROUP_END :
totalsTableDecorator.stopGroup(struct.bodyValue, header.getGroup());
if (tableDecorator != null)
{
tableDecorator.endOfGroup(struct.bodyValue, header.getGroup());
}
break;
case GROUP_START_AND_END :
totalsTableDecorator.startGroup(struct.bodyValue, header.getGroup());
if (tableDecorator != null)
{
tableDecorator.startOfGroup(struct.bodyValue, header.getGroup());
}
totalsTableDecorator.stopGroup(struct.bodyValue, header.getGroup());
if (tableDecorator != null)
{
tableDecorator.endOfGroup(struct.bodyValue, header.getGroup());
}
break;
default :
break;
}
}
if (tableDecorator != null)
{
struct.decoratedValue = tableDecorator.displayGroupedValue(
struct.bodyValue,
groupingValue,
header.getColumnNumber());
}
else if (groupingValue == GROUP_END || groupingValue == GROUP_NO_CHANGE)