| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- package cz.senslog.watchdog.messagebroker.email;
- import cz.senslog.watchdog.config.EmailMessageBrokerConfig;
- import cz.senslog.watchdog.config.MessageBrokerType;
- import cz.senslog.watchdog.domain.*;
- import cz.senslog.watchdog.messagebroker.MessageBroker;
- import cz.senslog.watchdog.messagebroker.MessageBrokerHandler;
- import cz.senslog.watchdog.messagebroker.MessageStatus;
- import cz.senslog.watchdog.messagebroker.writer.HtmlTableWriter;
- import cz.senslog.watchdog.messagebroker.writer.TableWriter;
- import cz.senslog.watchdog.provider.Record;
- import org.apache.logging.log4j.LogManager;
- import org.apache.logging.log4j.Logger;
- import javax.mail.*;
- import javax.mail.internet.*;
- import java.time.Instant;
- import java.time.format.DateTimeFormatter;
- import java.util.*;
- import static cz.senslog.watchdog.util.TimeConverter.dayToSec;
- import static java.time.format.DateTimeFormatter.ofPattern;
- import static javax.mail.Message.RecipientType.TO;
- public class EmailMessageBroker implements MessageBroker {
- private static final String BREAK_LINE = "<br />";
- private static final Logger logger = LogManager.getLogger(EmailMessageBroker.class);
- private final EmailMessageBrokerConfig config;
- private final Session session;
- public EmailMessageBroker(EmailMessageBrokerConfig config) {
- this.config = config;
- this.session = openSession(config);
- }
- private Session openSession(EmailMessageBrokerConfig config) {
- Properties props = new Properties();
- props.put("mail.smtp.host", config.getHost());
- props.put("mail.smtp.port", config.getPort());
- props.put("mail.smtp.auth", "true");
- props.put("mail.smtp.starttls.enable", "true");
- props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
- Authenticator auth = new Authenticator() {
- protected PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(config.getUsername(), config.getPass());
- }
- };
- return Session.getInstance(props, auth);
- }
- private Message createMessage(Report report) throws MessagingException {
- Message message = new MimeMessage(session);
- message.setFrom(new InternetAddress(config.getSender()));
- message.setRecipients(TO, InternetAddress.parse(config.getRecipient()));
- message.setSubject(config.getSubject());
- MimeBodyPart mimeBodyPart = new MimeBodyPart();
- StringBuilder content = new StringBuilder();
- TableWriter tableWriter = HtmlTableWriter.createWithHeader("width: 100%;", "background-color: #dddddd")
- .cell("unitName (unitId)").cell("sensorName (sensorId)").cell("timestamp").cell("reported").cell("status").end();
- String reportedTime = report.getCreated().format(ofPattern("yyyy-MM-dd HH:mm:ss"));
- final String rowStyle = "border: 1px solid #dddddd; text-align: left; padding: 8px;";
- for (SimpleReport simpleReport : report.getReports()) {
- if (simpleReport.getRecord() instanceof ObservationInfo) {
- ObservationInfo observation = (ObservationInfo)simpleReport.getRecord();
- Source source = observation.getSource();
- boolean isOk = simpleReport.getStatus().equals(StatusReport.OK);
- String unitCell = String.format("%s (%s)", source.getUnit().getName(), source.getUnit().getId());
- String sensorCell = String.format("%s (%s)", source.getSensor().getName(), source.getSensor().getId());
- tableWriter.row(rowStyle + (isOk ? "background-color: #CCFFCC" : "background-color: #FFCCCC"))
- .cell(unitCell, rowStyle)
- .cell(sensorCell, rowStyle)
- .cell(observation.getTimestamp().toString(), rowStyle)
- .cell(reportedTime, rowStyle)
- .cell(simpleReport.getStatus().name(), rowStyle)
- .end();
- }
- }
- content.append(tableWriter.table()).append(BREAK_LINE);
- mimeBodyPart.setContent(content.toString(), "text/html");
- Multipart multipart = new MimeMultipart();
- multipart.addBodyPart(mimeBodyPart);
- message.setContent(multipart);
- return message;
- }
- @Override
- public void send(Report report, MessageBrokerHandler status) {
- if (report == null) {
- logger.info("Nothing to send. The receive report is null.");
- status.handle(new MessageStatus(null, "No report to send.")); return;
- }
- try {
- Message message = createMessage(report);
- logger.info("Sending a message via email.");
- Transport.send(message);
- logger.info("The message was send successfully.");
- status.handle(new MessageStatus(report));
- } catch (MessagingException e) {
- logger.catching(e);
- status.handle(new MessageStatus(report, e.getMessage()));
- }
- // vanish();
- }
- @Override
- public MessageBrokerType getType() {
- return MessageBrokerType.EMAIL;
- }
- public Record[] vanish() {
- Instant deadline = Instant.now().minusSeconds(dayToSec(config.getVanishPeriodDays()));
- List<Record> deletedRecords = new ArrayList<>();
- Iterator<Record> iterator = Collections.emptyListIterator();
- while(iterator.hasNext()) {
- Record record = iterator.next();
- if (record.getTimestamp().isBefore(deadline)) {
- deletedRecords.add(record);
- iterator.remove();
- }
- }
- return deletedRecords.toArray(new Record[0]);
- }
- }
|