package org.libreplan.web.planner.chart;
import static java.util.Arrays.asList;
import java.util.Collections;
import java.util.SortedMap;
import org.joda.time.LocalDate;
import org.libreplan.business.planner.chart.ILoadChartData;
import org.libreplan.business.workingday.EffortDuration;
import org.zkforge.timeplot.Plotinfo;
import org.zkoss.ganttz.util.Interval;
public abstract class StandardLoadChartFiller extends LoadChartFiller {
@Override
protected Plotinfo[] getPlotInfo(Interval interval) {
final ILoadChartData data = getDataOn(interval);
Plotinfo plotInfoLoad = createPlotinfoFromDurations(getLoad(data), interval);
plotInfoLoad.setFillColor(COLOR_ASSIGNED_LOAD);
plotInfoLoad.setLineWidth(0);
Plotinfo plotInfoMax = createPlotinfoFromDurations(getCalendarMaximumAvailability(data), interval);
plotInfoMax.setLineColor(COLOR_CAPABILITY_LINE);
plotInfoMax.setFillColor("#FFFFFF");
plotInfoMax.setLineWidth(2);
Plotinfo plotInfoOverload = createPlotinfoFromDurations(getOverload(data), interval);
plotInfoOverload.setFillColor(COLOR_OVERLOAD);
plotInfoOverload.setLineWidth(0);
return new Plotinfo[] { plotInfoOverload, plotInfoMax, plotInfoLoad };
}
protected abstract ILoadChartData getDataOn(Interval interval);
protected LocalDate getStart(LocalDate explicitlySpecifiedStart, Interval interval) {
return explicitlySpecifiedStart == null
? interval.getStart()
: Collections.max(asList(explicitlySpecifiedStart, interval.getStart()));
}
@SuppressWarnings("unchecked")
protected LocalDate getEnd(LocalDate explicitlySpecifiedEnd, Interval interval) {
return explicitlySpecifiedEnd == null
? interval.getFinish()
: Collections.min(asList(explicitlySpecifiedEnd, interval.getFinish()));
}
private SortedMap<LocalDate, EffortDuration> getLoad(ILoadChartData data) {
return groupAsNeededByZoom(data.getLoad());
}
private SortedMap<LocalDate, EffortDuration> getOverload(ILoadChartData data) {
return groupAsNeededByZoom(data.getOverload());
}
private SortedMap<LocalDate, EffortDuration> getCalendarMaximumAvailability(ILoadChartData data) {
return groupAsNeededByZoom(data.getAvailability());
}
}