package com.metservice.kanban.charts.burnup; import static com.metservice.kanban.charts.ChartUtils.nextWorkingDayAfter; import static com.metservice.kanban.charts.burnup.BurnUpChartSeriesNames.BACKLOG; import static com.metservice.kanban.charts.burnup.BurnUpChartSeriesNames.COMPLETE; import org.jfree.data.category.DefaultCategoryDataset; import org.joda.time.LocalDate; public final class ProjectedDatasetPopulator { private final BurnUpDataModel model; public ProjectedDatasetPopulator(BurnUpDataModel model) { this.model = model; } public void populateDataset(DefaultCategoryDataset dataset) { double totalSize = model.getTotalSizeOnDate(model.getCurrentDate()); double completedSize = model.getCompletedSizeOnDate(model.getCurrentDate()); int elapsedDays = model.getWorkingDays().size() - 1; double pointsCompletedPerDay = completedSize / elapsedDays; if (pointsCompletedPerDay <= 0) { return; } LocalDate date = model.getCurrentDate(); while (completedSize <= totalSize - pointsCompletedPerDay) { completedSize += pointsCompletedPerDay; date = nextWorkingDayAfter(date); dataset.addValue(completedSize, COMPLETE, date); dataset.addValue(totalSize - completedSize, BACKLOG, date); } } public LocalDate getProjectedEndDate() { double totalSize = model.getTotalSizeOnDate(model.getCurrentDate()); double completedSize = model.getCompletedSizeOnDate(model.getCurrentDate()); int elapsedDays = model.getWorkingDays().size() - 1; double pointsCompletedPerDay = completedSize / elapsedDays; if (pointsCompletedPerDay <= 0) { return null; } LocalDate date = model.getCurrentDate(); while (completedSize <= totalSize - pointsCompletedPerDay) { completedSize += pointsCompletedPerDay; date = nextWorkingDayAfter(date); } return date; } }