package gov.nysenate.openleg.processor.law; import gov.nysenate.openleg.config.Environment; import gov.nysenate.openleg.dao.base.LimitOffset; import gov.nysenate.openleg.dao.base.SortOrder; import gov.nysenate.openleg.dao.law.data.LawFileDao; import gov.nysenate.openleg.model.law.LawFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; import java.time.LocalDateTime; import java.util.List; @Service public class ManagedLawProcessService implements LawProcessService { private static final Logger logger = LoggerFactory.getLogger(ManagedLawProcessService.class); @Autowired private Environment env; @Autowired private LawFileDao lawFileDao; @Autowired private LawProcessor lawProcessor; /** {@inheritDoc}*/ @Override public int collate() { return collateLawFiles(); } /** {@inheritDoc} */ @Override public int ingest() { return processPendingLawFiles(); } /** {@inheritDoc} */ @Override public String getCollateType() { return "law file"; } /** {@inheritDoc} */ @Override public int collateLawFiles() { int numCollated = 0; try { List<LawFile> lawFiles = lawFileDao.getIncomingLawFiles(SortOrder.ASC, LimitOffset.ALL); for (LawFile lf : lawFiles) { lf.setPendingProcessing(true); lawFileDao.archiveAndUpdateLawFile(lf); numCollated++; } } catch (IOException ex) { logger.error("Failed to retrieve incoming laws from the file system.", ex); } logger.debug("Collated {} law files.", numCollated); return numCollated; } /** {@inheritDoc} */ @Override public List<LawFile> getPendingLawFiles(LimitOffset limitOffset) { return lawFileDao.getPendingLawFiles(SortOrder.ASC, limitOffset); } /** {@inheritDoc} */ @Override public void processLawFiles(List<LawFile> lawFiles) { for (LawFile lawFile : lawFiles) { if (!env.isProcessingEnabled()) break; // Process the law file lawProcessor.process(lawFile); lawFile.setProcessedCount(lawFile.getProcessedCount() + 1); lawFile.setPendingProcessing(false); lawFile.setProcessedDateTime(LocalDateTime.now()); lawFileDao.updateLawFile(lawFile); } } /** {@inheritDoc} */ @Override public int processPendingLawFiles() { List<LawFile> lawFiles = getPendingLawFiles(LimitOffset.ALL); processLawFiles(lawFiles); return lawFiles.size(); } }