package edu.pdx.cs410J.grader.poa;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import com.google.common.io.CharStreams;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import edu.pdx.cs410J.grader.EmailAttachmentProcessor;
import edu.pdx.cs410J.grader.GraderEmailAccount;
import javax.mail.Message;
import javax.mail.MessagingException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.Date;
@Singleton
public class POASubmissionsDownloader {
private final EventBus bus;
@Inject
public POASubmissionsDownloader(EventBus bus) {
this.bus = bus;
this.bus.register(this);
}
@Subscribe
public void downloadSubmissions(EmailCredentials credentials) throws MessagingException {
GraderEmailAccount account = new GraderEmailAccount(credentials.getEmailAddress(), credentials.getPassword());
account.fetchAttachmentsFromUnreadMessagesInFolder("poa", new POAAttachmentProcessor());
}
private void extractPOASubmissionFromAttachment(Message message, String fileName, InputStream inputStream) {
try {
String submitter = getSender(message);
LocalDateTime submitTime = getTimeMessageWasSent(message);
String content = extractPOAContentFrom(inputStream);
POASubmission submission = POASubmission.builder()
.setSubject(message.getSubject())
.setSubmitter(submitter)
.setSubmitTime(submitTime)
.setContent(content)
.create();
this.bus.post(submission);
} catch (IOException | MessagingException ex) {
throw new IllegalStateException("While working with message", ex);
}
}
private String extractPOAContentFrom(InputStream inputStream) throws IOException {
StringWriter sw = new StringWriter();
CharStreams.copy(new InputStreamReader(inputStream), sw);
return sw.toString();
}
private LocalDateTime getTimeMessageWasSent(Message message) throws MessagingException {
Date date = message.getSentDate();
return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
}
private String getSender(Message message) throws MessagingException {
return message.getFrom()[0].toString();
}
private class POAAttachmentProcessor implements EmailAttachmentProcessor {
@Override
public void processAttachment(Message message, String fileName, InputStream inputStream) {
extractPOASubmissionFromAttachment(message, fileName, inputStream);
}
@Override
public Iterable<? extends String> getSupportedContentTypes() {
return Arrays.asList("text/plain", "text/html");
}
}
}