package edu.ualberta.med.biobank.test.reports;
import gov.nih.nci.system.applicationservice.WritableApplicationService;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class PatientVisitSummaryPostProcessTester implements PostProcessTester {
private static final String CLINIC_SUM_CELL = "All Clinics";
private static final int STUDY_INDEX = 0;
private static final int NUM_COLS = 9;
private static final int NUM_SUMS = 7;
private static final int SUM_OFFSET = 2;
@Override
public List<Object> postProcess(WritableApplicationService appService,
Collection<Object> results) {
if (results.size() == 0) {
return new ArrayList<Object>();
}
List<Object> postProcessedResults = new ArrayList<Object>();
String lastStudy = null;
long[] sums = new long[NUM_SUMS];
Arrays.fill(sums, 0);
for (Object row : results) {
Object[] cells = (Object[]) row;
if ((lastStudy != null) && !lastStudy.equals(cells[STUDY_INDEX])) {
postProcessedResults.add(getSumRow(lastStudy, sums));
postProcessedResults.add(getBlankRow());
Arrays.fill(sums, 0); // reset sums
}
for (int i = 0; i < sums.length; i++) {
if (cells[i + 2] instanceof Number) {
sums[i] += ((Number) cells[i + SUM_OFFSET]).longValue();
}
}
postProcessedResults.add(transformRow(cells)); // keep original
lastStudy = (String) cells[STUDY_INDEX];
}
postProcessedResults.add(getSumRow(lastStudy, sums));
return postProcessedResults;
}
private static Object[] getSumRow(String study, long[] sums) {
List<Object> newRow = new ArrayList<Object>();
newRow.addAll(Arrays.asList(study, CLINIC_SUM_CELL));
for (int i = 0; i < sums.length; i++) {
newRow.add(sums[i]);
}
return newRow.toArray();
}
private static Object[] getBlankRow() {
Object[] blankRow = new Object[NUM_COLS];
Arrays.fill(blankRow, "");
return blankRow;
}
private static Object[] transformRow(Object[] cells) {
Object[] row = new Object[NUM_COLS];
for (int i = 0; i < row.length; i++) {
if (cells[i] instanceof Number) {
row[i] = ((Number) cells[i]).longValue();
} else {
row[i] = cells[i];
}
}
return row;
}
}