package cz.senslog.watchdog.messagebroker.broker; import cz.senslog.watchdog.config.EmailMessageBrokerConfig; import cz.senslog.watchdog.config.MessageBrokerType; import cz.senslog.watchdog.core.connection.EmailServerConnection; 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 org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.mail.*; import java.util.*; import static java.time.format.DateTimeFormatter.ofPattern; public class EmailMessageBroker implements MessageBroker { private static final String BREAK_LINE = "
"; private static final Logger logger = LogManager.getLogger(EmailMessageBroker.class); private final EmailServerConnection serverConnection; private final EmailMessageBrokerConfig messageConfig; public EmailMessageBroker(EmailServerConnection serverConnection, EmailMessageBrokerConfig messageConfig) { this.serverConnection = serverConnection; this.messageConfig = messageConfig; } private String createMessage(Report report) { StringBuilder content = new StringBuilder(); final String rowStyle = "border: 1px solid #dddddd; text-align: left; padding: 8px;"; boolean isMessages = !report.getMessages().isEmpty(); boolean isRecords = !report.getReports().isEmpty(); if (!report.getOperationProperties().isEmpty()) { TableWriter tableSourceWriter = HtmlTableWriter.createWithHeader("width: 100%;", "background-color: #dddddd") .cell("Operation Type").cell("Operation Value").end(); for (Map.Entry operationEntry : report.getOperationProperties().entrySet()) { tableSourceWriter.row(rowStyle) .cell(operationEntry.getKey(), rowStyle) .cell(operationEntry.getValue(), rowStyle) .end(); } content.append(tableSourceWriter.table()).append(BREAK_LINE); } if (isMessages || !isRecords) { TableWriter tableMsgWriter = HtmlTableWriter.createWithHeader("width: 100%;", "background-color: #dddddd") .cell("Messages").end(); for (String message : report.getMessages()) { tableMsgWriter.row(rowStyle).cell(message, rowStyle).end(); } if (!isRecords) { tableMsgWriter.row(rowStyle).cell("All received observations are valid."); } content.append(tableMsgWriter.table()).append(BREAK_LINE); } if (isRecords) { TableWriter tableReportWriter = 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")); report.getReports().sort(Comparator.comparing(SimpleReport::getStatus).reversed()); for (SimpleReport simpleReport : report.getReports()) { boolean isOk = simpleReport.getStatus().equals(StatusReport.OK); if (simpleReport.getRecord() instanceof ObservationInfo) { ObservationInfo observation = (ObservationInfo) simpleReport.getRecord(); Source source = observation.getSource(); String unitCell = String.format("%s (%s)", source.getUnit().getName(), source.getUnit().getId()); String sensorCell = String.format("%s (%s)", source.getSensor().getName(), source.getSensor().getId()); tableReportWriter.row(rowStyle + "background-color: " + (isOk ? "#CCFFCC" : "#FFCCCC")) .cell(unitCell, rowStyle) .cell(sensorCell, rowStyle) .cell(observation.getTimestamp().toString(), rowStyle) .cell(reportedTime, rowStyle) .cell(simpleReport.getStatus().name(), rowStyle) .end(); } } content.append(tableReportWriter.table()).append(BREAK_LINE); } return content.toString(); } @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 { logger.info("Sending a message via email."); serverConnection.send(createMessage(report), messageConfig); 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())); } } @Override public MessageBrokerType getType() { return MessageBrokerType.EMAIL; } }