package de.pbauerochse.worklogviewer.domain.timerangeprovider;
import de.pbauerochse.worklogviewer.domain.ReportTimerange;
import de.pbauerochse.worklogviewer.domain.TimerangeProvider;
import de.pbauerochse.worklogviewer.util.ExceptionUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
/**
* @author Patrick Bauerochse
* @since 07.07.15
*/
public class TimerangeProviderFactory {
private static final Logger LOGGER = LoggerFactory.getLogger(TimerangeProviderFactory.class);
private static final Map<ReportTimerange, Class<? extends TimerangeProvider>> REPORT_TIMERANGE_TO_PROVIDER_CLASS = new HashMap<>(4);
static {
REPORT_TIMERANGE_TO_PROVIDER_CLASS.put(ReportTimerange.LAST_MONTH, LastMonthTimerangeProvider.class);
REPORT_TIMERANGE_TO_PROVIDER_CLASS.put(ReportTimerange.LAST_WEEK, LastWeekTimerangeProvider.class);
REPORT_TIMERANGE_TO_PROVIDER_CLASS.put(ReportTimerange.THIS_MONTH, CurrentMonthTimerangeProvider.class);
REPORT_TIMERANGE_TO_PROVIDER_CLASS.put(ReportTimerange.THIS_WEEK, CurrentWeekTimerangeProvider.class);
}
public static TimerangeProvider getTimerangeProvider(ReportTimerange timerange, LocalDate startDate, LocalDate endDate) {
Class<? extends TimerangeProvider> timerangeProviderClass = REPORT_TIMERANGE_TO_PROVIDER_CLASS.get(timerange);
TimerangeProvider timerangeProvider = null;
if (timerangeProviderClass != null) {
try {
timerangeProvider = timerangeProviderClass.newInstance();
} catch (InstantiationException e) {
LOGGER.error("Could not instanttiate class {}", timerangeProviderClass.getName(), e);
throw ExceptionUtil.getIllegalArgumentException("exceptions.internal", e);
} catch (IllegalAccessException e) {
LOGGER.error("Could not instanttiate class {}", timerangeProviderClass.getName(), e);
throw ExceptionUtil.getIllegalArgumentException("exceptions.internal", e);
}
}
if (timerangeProvider == null) {
timerangeProvider = new CustomTimerangeProvider(startDate, endDate);
}
LOGGER.info("Using timerange provider class {}", timerangeProvider.getClass());
return timerangeProvider;
}
}