package charts.builder.spreadsheet; import java.io.IOException; import java.util.List; import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.supercsv.io.CsvListWriter; import charts.AbstractChart; import charts.Chart; import charts.ChartDescription; import charts.ChartType; import charts.Drawable; import charts.Region; import charts.builder.DataSource.MissingDataException; import charts.builder.csv.Csv; import charts.builder.csv.CsvWriter; import charts.graphics.ProgressTable; import charts.graphics.ProgressTable.Dataset; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; public class ProgressTableBuilder extends AbstractProgressTableBuilder { public Set<ProgressTable.Indicator> ALLOWED_INDICATORS = new ImmutableSet.Builder<ProgressTable.Indicator>() .add(ProgressTable.Indicator.GRAZING) .add(ProgressTable.Indicator.SUGARCANE) .add(ProgressTable.Indicator.GRAIN) .add(ProgressTable.Indicator.HORTICULTURE) .add(ProgressTable.Indicator.GROUNDCOVER) .add(ProgressTable.Indicator.NITROGEN) .add(ProgressTable.Indicator.SEDIMENT) .add(ProgressTable.Indicator.PESTICIDES) .build(); public ProgressTableBuilder() { super(Lists.newArrayList( ChartType.PROGRESS_TABLE, ChartType.PROGRESS_TABLE_REGION)); } public abstract static class ProgressTableChart extends AbstractChart { public abstract ProgressTable.Dataset dataset(); } @Override public Chart build(Context ctx) { final SpreadsheetDataSource datasource = ctx.datasource(); final ChartType type = ctx.type(); final Region region = ctx.region(); final ProgressTable.Dataset ds; try { ds = getDataset(datasource, type==ChartType.PROGRESS_TABLE_REGION?region:null); } catch (MissingDataException e) { // TODO: Handle this better throw new RuntimeException(e); } if (region == Region.GBR || type == ChartType.PROGRESS_TABLE_REGION) { final ProgressTable pt = new ProgressTable(ds); return new ProgressTableChart() { @Override public ChartDescription getDescription() { return new ChartDescription(type, region); } @Override public Drawable getChart() { return pt; } @Override public Dataset dataset() { return ds; } @Override public String getCSV() throws UnsupportedFormatException { return Csv.write(new CsvWriter() { @Override public void write(CsvListWriter csv) throws IOException { { final List<String> cList = Lists.newLinkedList(); cList.add(""); for (ProgressTable.Column c : ds.columns) { cList.add(c.header); } csv.write(cList); } for (ProgressTable.Row r : ds.rows) { final List<String> rList = Lists.newLinkedList(); rList.add(r.header); for (ProgressTable.Cell c : r.cells) { if (c.condition == null) { rList.add(""); } else { rList.add(String.format("%s (%s)", c.condition, c.progress)); } } csv.write(rList); } }}); } }; } return null; } @Override protected List<ProgressTable.Column> getColumns(SpreadsheetDataSource ds, Region region) throws MissingDataException { List<ProgressTable.Column> columns = Lists.newArrayList(); int col = 2; while (StringUtils.isNotBlank(ds.select(0, col).asString())) { ProgressTable.Indicator indicator = getIndicator(ds.select(0, col).asString(), region); if (ALLOWED_INDICATORS.contains(indicator)) { columns.add(new ProgressTable.Column( indicator.getLabel(), ds.select(1, col).asString(), ds.select(2, col).asString())); } col++; } return columns; } }