package gov.nysenate.openleg.service.process;
import com.google.common.collect.Range;
import gov.nysenate.openleg.config.Environment;
import gov.nysenate.openleg.dao.base.LimitOffset;
import gov.nysenate.openleg.dao.base.PaginatedList;
import gov.nysenate.openleg.dao.base.SortOrder;
import gov.nysenate.openleg.dao.process.DataProcessLogDao;
import gov.nysenate.openleg.model.process.DataProcessRun;
import gov.nysenate.openleg.model.process.DataProcessRunInfo;
import gov.nysenate.openleg.model.process.DataProcessUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import static java.util.stream.Collectors.toList;
@Service
public class SimpleDataProcessLogService implements DataProcessLogService
{
@Autowired private Environment env;
@Autowired private DataProcessLogDao processLogDao;
/** {@inheritDoc} */
@Override
public Optional<DataProcessRun> getRun(int processId) {
try {
return Optional.of(processLogDao.getRun(processId));
}
catch (EmptyResultDataAccessException ex) {
return Optional.empty();
}
}
@Override
public Optional<DataProcessRunInfo> getRunInfo(int processId) {
Optional<DataProcessRun> run = getRun(processId);
if (run.isPresent()) {
return Optional.of(getRunInfoFromRun(run.get()));
}
return Optional.empty();
}
/** {@inheritDoc} */
@Override
public PaginatedList<DataProcessRunInfo> getRunInfos(Range<LocalDateTime> dateTimeRange, LimitOffset limOff,
boolean showActivityOnly) {
PaginatedList<DataProcessRun> runs = processLogDao.getRuns(dateTimeRange, showActivityOnly, SortOrder.DESC, limOff);
List<DataProcessRunInfo> runInfos = runs.getResults().stream().map(this::getRunInfoFromRun).collect(toList());
return new PaginatedList<>(runs.getTotal(), runs.getLimOff(), runInfos);
}
/** {@inheritDoc} */
@Override
public PaginatedList<DataProcessUnit> getUnits(int processId, LimitOffset limOff) {
return processLogDao.getUnits(processId, SortOrder.DESC, limOff);
}
/** {@inheritDoc} */
@Override
public DataProcessRun startNewRun(LocalDateTime startDateTime, String invoker) {
DataProcessRun run = new DataProcessRun(0, startDateTime, invoker);
if (env.isProcessLoggingEnabled()) {
processLogDao.insertRun(run);
}
return run;
}
/** {@inheritDoc} */
@Override
public void addUnit(int processId, DataProcessUnit unit) {
if (env.isProcessLoggingEnabled()) {
processLogDao.insertUnit(processId, unit);
}
}
/** {@inheritDoc} */
@Override
public void finishRun(DataProcessRun run) {
if (env.isProcessLoggingEnabled()) {
run.setEndDateTime(LocalDateTime.now());
processLogDao.updateRun(run);
}
}
private DataProcessRunInfo getRunInfoFromRun(DataProcessRun run) {
DataProcessRunInfo runInfo = new DataProcessRunInfo(run);
List<DataProcessUnit> firstAndLastUnits = processLogDao.getFirstAndLastUnits(run.getProcessId());
if (!firstAndLastUnits.isEmpty()) {
runInfo.setFirstProcessed(Optional.of(firstAndLastUnits.get(0)));
if (firstAndLastUnits.size() > 1) {
runInfo.setLastProcessed(Optional.of(firstAndLastUnits.get(1)));
}
}
return runInfo;
}
}