package nl.ipo.cds.etl;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import javax.inject.Inject;
import static nl.ipo.cds.domain.RefreshPolicy.*;
import nl.ipo.cds.dao.ManagerDao;
import nl.ipo.cds.domain.Dataset;
import nl.ipo.cds.domain.DatasetType;
import nl.ipo.cds.domain.EtlJob;
//import nl.idgis.commons.jobexecutor.Job;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
public class RefreshPolicyGuard {
private static final Log technicalLog = LogFactory.getLog(RefreshPolicyGuard.class);
private ManagerDao managerDao;
public RefreshPolicyGuard() {
super();
}
public RefreshPolicyGuard(ManagerDao managerDao) {
super();
this.managerDao = managerDao;
}
/**
* Checks whether a data refresh is allowed for the given job.
*
* @param current
* current ETL job, must not be <code>null</code>
* @param lastSuccess
* last successful ETL job, must not be <code>null</code>
* @return
* <code>true</code>, if refresh is allowed, <code>false</code> otherwise
*/
boolean isRefreshAllowed (final EtlJob current, final EtlJob lastSuccess) {
technicalLog.debug("lastSuccessfulJob: " + lastSuccess);
if (current.isForceExecution()) {
technicalLog.debug("refresh ok: execution has been forced interactively");
return true;
} else if (lastSuccess == null) {
technicalLog.debug("refresh ok: no prior successful execution");
return true;
}
//DatasetType datasetType = current.getDatasetType();
//W1502 019
technicalLog.debug("managerDao +++++++++++++++++++++++ " + this.managerDao);
Dataset dataset = this.managerDao.getDatasetBy(current.getBronhouder(), current.getDatasetType(), current.getUuid());
boolean isRefreshAllowed = false;
switch (dataset.getRefreshPolicy()){
case IF_MODIFIED_METADATA:
case IF_MODIFIED_HTTP_HEADER:
isRefreshAllowed = hasMetadataUpdateDatumChanged (current, lastSuccess);
if (isRefreshAllowed) {
technicalLog.debug("refresh ok: last modification info changed");
} else {
technicalLog.debug("refresh veto: last modification info unchanged");
}
break;
case ONCE_A_DAY:
isRefreshAllowed = lastExecutionOnAnotherDay (current, lastSuccess);
if (isRefreshAllowed) {
technicalLog.debug("refresh ok: based on date (once a day)");
} else {
technicalLog.debug("refresh veto: based on date (once a day)");
}
break;
default:
throw new RuntimeException("Internal error: Unhandled case '" + dataset.getRefreshPolicy() + "'");
}
return isRefreshAllowed;
}
private boolean hasMetadataUpdateDatumChanged(final EtlJob current, final EtlJob lastSuccess) {
final Timestamp lastSuccessMetadataUpdate = lastSuccess.getMetadataUpdateDatum();
final Timestamp currentMetadataUpdateDatum = current.getMetadataUpdateDatum();
technicalLog.debug("lastSuccessfulJob.metadataUpdateDatum: " + lastSuccessMetadataUpdate);
technicalLog.debug("job.metadataUpdateDatum: " + currentMetadataUpdateDatum);
return lastSuccessMetadataUpdate == null || !lastSuccessMetadataUpdate.equals(currentMetadataUpdateDatum);
}
private boolean lastExecutionOnAnotherDay(final EtlJob current, final EtlJob lastSuccess) {
final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
final String lastSuccessStartDate = dateFormat.format(lastSuccess.getStartTime());
final String currentStartDate = dateFormat.format(current.getStartTime());
return !lastSuccessStartDate.equals(currentStartDate);
}
}