package gov.nysenate.openleg.processor.hearing; import gov.nysenate.openleg.dao.base.LimitOffset; import gov.nysenate.openleg.dao.hearing.PublicHearingFileDao; import gov.nysenate.openleg.model.hearing.PublicHearingFile; import gov.nysenate.openleg.model.hearing.PublicHearingId; 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; import java.util.Map; import java.util.TreeMap; @Service public class ManagedPublicHearingProcessService implements PublicHearingProcessService { private static Logger logger = LoggerFactory.getLogger(ManagedPublicHearingProcessService.class); @Autowired private PublicHearingFileDao publicHearingFileDao; @Autowired private PublicHearingParser publicHearingParser; /** --- Implemented Methods --- */ /** {@inheritDoc} */ @Override public int collate() { return collatePublicHearingFiles(); } /** {@inheritDoc} */ @Override public int ingest() { return processPendingPublicHearingFiles(); } /** {@inheritDoc} */ @Override public String getCollateType() { return "public hearing file"; } /** {@inheritDoc} */ @Override public int collatePublicHearingFiles() { int numCollated = 0; try { List<PublicHearingFile> publicHearingFiles; do { publicHearingFiles = publicHearingFileDao.getIncomingPublicHearingFiles(LimitOffset.FIFTY); for (PublicHearingFile file : publicHearingFiles) { file.setPendingProcessing(true); file.setArchived(false); publicHearingFileDao.updatePublicHearingFile(file); publicHearingFileDao.archivePublicHearingFile(file); numCollated++; } } while (!publicHearingFiles.isEmpty()); } catch (IOException ex) { logger.error("Error retrieving public hearing files during collation.", ex); } return numCollated; } /** {@inheritDoc} */ @Override public List<PublicHearingFile> getPendingPublicHearingFiles(LimitOffset limitOffset) { return publicHearingFileDao.getPendingPublicHearingFile(limitOffset); } /** {@inheritDoc} */ @Override public int processPublicHearingFiles(List<PublicHearingFile> publicHearingFiles) { int processCount = 0; for (PublicHearingFile file : publicHearingFiles) { try { logger.info("Processing PublicHearingFile: " + file.getFileName()); publicHearingParser.process(file); file.setProcessedCount(file.getProcessedCount() + 1); file.setPendingProcessing(false); file.setProcessedDateTime(LocalDateTime.now()); publicHearingFileDao.updatePublicHearingFile(file); processCount++; } catch (IOException ex) { logger.error("Error reading from PublicHearingFile: " + file.getFileName(), ex); } } return processCount; } /** {@inheritDoc} */ @Override public int processPendingPublicHearingFiles() { List<PublicHearingFile> publicHearingFiles; int processCount = 0; do { publicHearingFiles = getPendingPublicHearingFiles(LimitOffset.FIFTY); processCount += processPublicHearingFiles(publicHearingFiles); } while (!publicHearingFiles.isEmpty()); return processCount; } /** {@inheritDoc} */ @Override public void updatePendingProcessing(PublicHearingId publicHearingId, boolean pendingProcessing) { throw new UnsupportedOperationException(); } }