package gov.nysenate.openleg.service.spotcheck.base; import gov.nysenate.openleg.util.DateUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Store; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; public abstract class SimpleCheckMailService extends BaseCheckMailService { private static final Logger logger = LoggerFactory.getLogger(SimpleCheckMailService.class); /** * Saves the text of all emails in the email receiving folder that have subjects that match the given pattern */ protected int checkMail(Pattern subjectPattern) { Store store = null; int savedReports = 0; try { logger.info("checking for " + getCheckMailType() + " emails..."); store = mailUtils.getCheckMailStore(); Folder sourceFolder = mailUtils.navigateToFolder(environment.getEmailReceivingFolder(), store); Folder archiveFolder = mailUtils.navigateToFolder(environment.getEmailProcessedFolder(), store); sourceFolder.open(Folder.READ_WRITE); List<Message> messages = getMatchingMessages(subjectPattern, sourceFolder); logger.info("found {} messages", messages.size()); List<Message> savedMessages = new ArrayList<>(); for (Message message : messages) { try { saveMessageBody(message, getSaveFile(message)); savedMessages.add(message); } catch (Exception ex) { logger.error("Could not save message {}", message.getSubject()); } } logger.info("archiving messages"); moveToArchive(sourceFolder, archiveFolder, savedMessages.toArray(new Message[messages.size()])); } catch (MessagingException ex) { logger.error("CheckMail Error\n{}", ExceptionUtils.getStackTrace(ex)); } finally { try { if (store != null) { store.close(); } } catch (MessagingException ignored) {} } return savedReports; } /** Designates where a matched message will be saved */ protected abstract File getSaveFile(Message message) throws MessagingException; protected abstract String getCheckMailType(); protected String getSentDateString(Message message) throws MessagingException { return DateUtils.getLocalDateTime(message.getSentDate()).format(DateUtils.BASIC_ISO_DATE_TIME); } /** Gets all messages from the source folder whose subjects match the given pattern */ private ArrayList<Message> getMatchingMessages(Pattern subjectPattern, Folder sourceFolder) throws MessagingException { ArrayList<Message> messages = new ArrayList<>(); for (Message message : sourceFolder.getMessages()) { if (subjectPattern.matcher(message.getSubject()).matches()) { messages.add(message); } } return messages; } }