package charts.builder.spreadsheet;
import java.awt.Color;
import java.awt.Dimension;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesDataItem;
import org.jfree.data.time.Year;
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.CotsOutbreak;
import charts.jfree.ATSCollection;
import charts.jfree.Attribute;
import charts.jfree.AttributeMap;
public class CotsOutbreakBuilder extends JFreeBuilder {
private static final String TITLE = "Crown-of-thorns starfish outbreaks";
public CotsOutbreakBuilder() {
super(ChartType.COTS_OUTBREAK);
}
private boolean isCotsOutbreakSpreadsheet(SpreadsheetDataSource datasource) {
try {
return "TOTALOUTBREAKS".equalsIgnoreCase(datasource.select("B1")
.getValue());
} catch (MissingDataException e) {
return false;
}
}
@Override
protected ATSCollection createDataset(Context ctx) {
if(ctx.region() == Region.GBR) {
TimeSeries s1 = new TimeSeries("outbreaks");
try {
for (int i = 2; true; i++) {
String year = ctx.datasource().select("A" + i).getValue();
String outbreaks = ctx.datasource().select("B" + i).getValue();
if (StringUtils.isBlank(year) || StringUtils.isBlank(outbreaks))
break;
double val = Double.parseDouble(outbreaks);
s1.add(new Year(parseYear(year)), val);
}
} catch (Exception e) {
}
ATSCollection dataset = new ATSCollection();
dataset.addSeries(s1);
return dataset;
} else {
return null;
}
}
private int parseYear(String y) {
y = StringUtils.strip(y);
if (y.contains(".")) {
y = StringUtils.substringBefore(y, ".");
}
return Integer.parseInt(y);
}
@Override
public boolean canHandle(SpreadsheetDataSource datasource) {
return isCotsOutbreakSpreadsheet(datasource);
}
@Override
public AttributeMap defaults(ChartType type) {
return new AttributeMap.Builder().
put(Attribute.TITLE, TITLE).
put(Attribute.X_AXIS_LABEL, "Year").
put(Attribute.Y_AXIS_LABEL, "Outbreaks").
put(Attribute.SERIES_COLOR, Color.blue).
build();
}
@Override
protected Drawable getDrawable(JFreeContext ctx) {
return new CotsOutbreak().createChart(
(ATSCollection)ctx.dataset(), new Dimension(750, 500));
}
@SuppressWarnings("unchecked")
@Override
protected String getCsv(final JFreeContext ctx) {
return Csv.write(new CsvWriter() {
@Override
public void write(CsvListWriter csv) throws IOException {
final DateFormat yearOnly = new SimpleDateFormat("YYYY");
csv.write("Year", "Outbreaks");
final List<TimeSeriesDataItem> items = ((ATSCollection)ctx.dataset()).getSeries(0)
.getItems();
for (TimeSeriesDataItem i : items) {
csv.write(yearOnly.format(i.getPeriod().getStart()), i.getValue()
.intValue() + "");
}
}});
}
}