EmailMessageBroker.java 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package cz.senslog.watchdog.messagebroker.broker;
  2. import cz.senslog.watchdog.config.EmailMessageBrokerConfig;
  3. import cz.senslog.watchdog.config.MessageBrokerType;
  4. import cz.senslog.watchdog.core.connection.EmailServerConnection;
  5. import cz.senslog.watchdog.domain.*;
  6. import cz.senslog.watchdog.messagebroker.MessageBroker;
  7. import cz.senslog.watchdog.messagebroker.MessageBrokerHandler;
  8. import cz.senslog.watchdog.messagebroker.MessageStatus;
  9. import cz.senslog.watchdog.messagebroker.writer.HtmlTableWriter;
  10. import cz.senslog.watchdog.messagebroker.writer.TableWriter;
  11. import org.apache.logging.log4j.LogManager;
  12. import org.apache.logging.log4j.Logger;
  13. import javax.mail.*;
  14. import java.util.*;
  15. import static java.time.format.DateTimeFormatter.ofPattern;
  16. public class EmailMessageBroker implements MessageBroker {
  17. private static final String BREAK_LINE = "<br />";
  18. private static final Logger logger = LogManager.getLogger(EmailMessageBroker.class);
  19. private final EmailServerConnection serverConnection;
  20. private final EmailMessageBrokerConfig messageConfig;
  21. public EmailMessageBroker(EmailServerConnection serverConnection, EmailMessageBrokerConfig messageConfig) {
  22. this.serverConnection = serverConnection;
  23. this.messageConfig = messageConfig;
  24. }
  25. private String createMessage(Report report) {
  26. StringBuilder content = new StringBuilder();
  27. final String rowStyle = "border: 1px solid #dddddd; text-align: left; padding: 8px;";
  28. boolean isMessages = !report.getMessages().isEmpty();
  29. boolean isRecords = !report.getReports().isEmpty();
  30. if (!report.getOperationProperties().isEmpty()) {
  31. TableWriter tableSourceWriter = HtmlTableWriter.createWithHeader("width: 100%;", "background-color: #dddddd")
  32. .cell("Operation Type").cell("Operation Value").end();
  33. for (Map.Entry<String, String> operationEntry : report.getOperationProperties().entrySet()) {
  34. tableSourceWriter.row(rowStyle)
  35. .cell(operationEntry.getKey(), rowStyle)
  36. .cell(operationEntry.getValue(), rowStyle)
  37. .end();
  38. }
  39. content.append(tableSourceWriter.table()).append(BREAK_LINE);
  40. }
  41. if (isMessages || !isRecords) {
  42. TableWriter tableMsgWriter = HtmlTableWriter.createWithHeader("width: 100%;", "background-color: #dddddd")
  43. .cell("Messages").end();
  44. for (String message : report.getMessages()) {
  45. tableMsgWriter.row(rowStyle).cell(message, rowStyle).end();
  46. }
  47. if (!isRecords) {
  48. tableMsgWriter.row(rowStyle).cell("All received observations are valid.");
  49. }
  50. content.append(tableMsgWriter.table()).append(BREAK_LINE);
  51. }
  52. if (isRecords) {
  53. TableWriter tableReportWriter = HtmlTableWriter.createWithHeader("width: 100%;", "background-color: #dddddd")
  54. .cell("unitName (unitId)").cell("sensorName (sensorId)").cell("timestamp").cell("reported").cell("status").end();
  55. String reportedTime = report.getCreated().format(ofPattern("yyyy-MM-dd HH:mm:ss"));
  56. report.getReports().sort(Comparator.comparing(SimpleReport::getStatus).reversed());
  57. for (SimpleReport simpleReport : report.getReports()) {
  58. boolean isOk = simpleReport.getStatus().equals(StatusReport.OK);
  59. if (simpleReport.getRecord() instanceof ObservationInfo) {
  60. ObservationInfo observation = (ObservationInfo) simpleReport.getRecord();
  61. Source source = observation.getSource();
  62. String unitCell = String.format("%s (%s)", source.getUnit().getName(), source.getUnit().getId());
  63. String sensorCell = String.format("%s (%s)", source.getSensor().getName(), source.getSensor().getId());
  64. tableReportWriter.row(rowStyle + "background-color: " + (isOk ? "#CCFFCC" : "#FFCCCC"))
  65. .cell(unitCell, rowStyle)
  66. .cell(sensorCell, rowStyle)
  67. .cell(observation.getTimestamp().toString(), rowStyle)
  68. .cell(reportedTime, rowStyle)
  69. .cell(simpleReport.getStatus().name(), rowStyle)
  70. .end();
  71. }
  72. }
  73. content.append(tableReportWriter.table()).append(BREAK_LINE);
  74. }
  75. return content.toString();
  76. }
  77. @Override
  78. public void send(Report report, MessageBrokerHandler status) {
  79. if (report == null) {
  80. logger.info("Nothing to send. The receive report is null.");
  81. status.handle(new MessageStatus(null, "No report to send.")); return;
  82. }
  83. try {
  84. logger.info("Sending a message via email.");
  85. serverConnection.send(createMessage(report), messageConfig);
  86. logger.info("The message was send successfully.");
  87. status.handle(new MessageStatus(report));
  88. } catch (MessagingException e) {
  89. logger.catching(e);
  90. status.handle(new MessageStatus(report, e.getMessage()));
  91. }
  92. }
  93. @Override
  94. public MessageBrokerType getType() {
  95. return MessageBrokerType.EMAIL;
  96. }
  97. }