package org.libreplan.web.resourceload;
import java.util.List;
import java.util.concurrent.Callable;
import org.apache.commons.lang3.Validate;
import org.joda.time.LocalDate;
import org.libreplan.business.common.BaseEntity;
import org.libreplan.business.planner.entities.DayAssignment;
import org.libreplan.business.resources.entities.Resource;
import org.libreplan.web.resourceload.ResourceLoadParameters.Paginator;
import org.zkoss.ganttz.data.resourceload.LoadTimeLine;
import org.zkoss.ganttz.timetracker.zoom.ZoomLevel;
import org.zkoss.ganttz.util.Interval;
public class ResourceLoadDisplayData {
private final List<LoadTimeLine> timeLines;
private final Interval viewInterval;
private final Paginator<? extends BaseEntity> paginator;
private final Callable<List<Resource>> resourcesConsidered;
private final Callable<List<DayAssignment>> assignmentsConsidered;
public ResourceLoadDisplayData(
List<LoadTimeLine> timeLines,
Paginator<? extends BaseEntity> paginator,
Callable<List<Resource>> resourcesConsidered,
Callable<List<DayAssignment>> assignmentsConsidered) {
Validate.notNull(timeLines);
Validate.notNull(paginator);
Validate.notNull(resourcesConsidered);
Validate.notNull(assignmentsConsidered);
this.timeLines = timeLines;
this.viewInterval = getViewIntervalFrom(timeLines);
this.paginator = paginator;
this.resourcesConsidered = cached(resourcesConsidered);
this.assignmentsConsidered = cached(assignmentsConsidered);
}
private static <T> Callable<T> cached(Callable<T> callable) {
return new CachedCallable<>(callable);
}
private static <T> T resolve(Callable<T> callable) {
try {
return callable.call();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static class CachedCallable<T> implements Callable<T> {
private final Callable<T> callable;
private T result;
public CachedCallable(Callable<T> callable) {
Validate.notNull(callable);
this.callable = callable;
}
@Override
public T call() throws Exception {
if (result != null) {
return result;
}
result = callable.call();
return result;
}
}
private static Interval getViewIntervalFrom(List<LoadTimeLine> timeLines) {
return LoadTimeLine.getIntervalFrom(timeLines);
}
public List<LoadTimeLine> getLoadTimeLines() {
return timeLines;
}
public Interval getViewInterval() {
return viewInterval;
}
public ZoomLevel getInitialZoomLevel() {
Interval interval = getViewInterval();
return ZoomLevel.getDefaultZoomByDates(
new LocalDate(interval.getStart()),
new LocalDate(interval.getFinish()));
}
public Paginator<? extends BaseEntity> getPaginator() {
return paginator;
}
public List<Resource> getResourcesConsidered() {
return resolve(resourcesConsidered);
}
public List<DayAssignment> getDayAssignmentsConsidered() {
return resolve(assignmentsConsidered);
}
}