package charts.builder.spreadsheet;
import java.awt.Dimension;
import java.io.IOException;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.jfree.data.category.CategoryDataset;
import org.supercsv.io.CsvListWriter;
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.Loads;
import charts.jfree.ADCDataset;
import charts.jfree.Attribute;
import charts.jfree.AttributeMap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
public class LoadsTotalBuilder extends LoadsBuilder {
public LoadsTotalBuilder() {
super(ChartType.LOADS);
}
@Override
protected Drawable getDrawable(JFreeContext ctx) {
return Loads.createChart((ADCDataset)ctx.dataset(), ctx.type(), new Dimension(800, 500));
}
@Override
protected String getCsv(JFreeContext ctx) {
final Region region = ctx.region();
final String period = ctx.parameters().get(PERIOD);
final CategoryDataset dataset = (CategoryDataset)ctx.dataset();
return Csv.write(new CsvWriter() {
@Override
public void write(CsvListWriter csv) throws IOException {
@SuppressWarnings("unchecked")
List<String> columnKeys = dataset.getColumnKeys();
@SuppressWarnings("unchecked")
List<String> rowKeys = dataset.getRowKeys();
final List<String> heading = ImmutableList.<String>builder()
.add(String.format("%s %s load reductions", region, period))
.addAll(rowKeys)
.build();
csv.write(heading);
for (String col : columnKeys) {
List<String> line = Lists.newLinkedList();
line.add(col);
for (String row : rowKeys) {
line.add(formatNumber("%.1f",
dataset.getValue(row, col)));
}
csv.write(line);
}
}});
}
@Override
public ADCDataset createDataset(Context ctx) {
final String period = ctx.parameters().get(PERIOD);
if(StringUtils.isBlank(period)) {
return null;
}
SpreadsheetDataSource ds = ctx.datasource();
Region region = ctx.region();
ADCDataset dataset = new ADCDataset();
Integer row = ROWS.get(region);
if(row == null) {
throw new RuntimeException("unknown region "+region);
}
row--;
try {
for(Indicator indicator : Indicator.values()) {
if(indicator.include()) {
dataset.addValue(selectAsDouble(ds, region, indicator, period),
region.getProperName() , indicator.getLabel());
}
}
return dataset;
} catch(MissingDataException e) {
throw new RuntimeException(e);
}
}
@Override
public AttributeMap defaults(ChartType type) {
return new AttributeMap.Builder().
putAll(super.defaults(type)).
put(Attribute.TITLE, "${region} cumulative load reductions to ${lastPeriodyyyy}").
put(Attribute.X_AXIS_LABEL, "Pollutants").
build();
}
}