From 6deb4683b5653215c383292e421e0a0143aca66f Mon Sep 17 00:00:00 2001 From: yatharthranjan Date: Tue, 13 Feb 2018 17:20:50 +0000 Subject: [PATCH 1/9] Update Dockerfile for new build --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 62c73008..c8d09ecc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -47,4 +47,4 @@ COPY --from=builder /code/radar-backend-*/lib/* /usr/lib/ # Load topics validator COPY ./src/main/docker/radar-backend-init /usr/bin -CMD ["radar-backend-init"] +ENTRYPOINT ["radar-backend-init"] From ea2157f162b68a38dc1624b1039ab809d1c8f2f3 Mon Sep 17 00:00:00 2001 From: yatharthranjan Date: Thu, 15 Feb 2018 12:20:31 +0000 Subject: [PATCH 2/9] Send email notifications based on ProjectId --- radar.yml | 18 +++++-- .../org/radarcns/config/MonitorConfig.java | 12 ++--- .../org/radarcns/config/NotifyConfig.java | 30 ++++++++++++ .../radarcns/monitor/BatteryLevelMonitor.java | 11 +++-- .../radarcns/monitor/DisconnectMonitor.java | 16 +++++-- .../radarcns/monitor/KafkaMonitorFactory.java | 28 +++++------ .../java/org/radarcns/util/EmailSenders.java | 47 +++++++++++++++++++ 7 files changed, 130 insertions(+), 32 deletions(-) create mode 100644 src/main/java/org/radarcns/config/NotifyConfig.java create mode 100644 src/main/java/org/radarcns/util/EmailSenders.java diff --git a/radar.yml b/radar.yml index 79ac7ca9..7859daaf 100644 --- a/radar.yml +++ b/radar.yml @@ -43,9 +43,14 @@ rest_proxy: #======================== Battery level monitor ========================# battery_monitor: + notify: + - project_id: test + email_address: + - test@thehyve.nl + - project_id: s2 + email_address: + - radar@thehyve.nl level: LOW - email_address: - - radar@thehyve.nl email_host: localhost email_port: 25 email_user: no-reply@radarcns.org @@ -54,8 +59,13 @@ battery_monitor: #======================= Disconnection monitor==========================# disconnect_monitor: - email_address: - - test@thehyve.nl + notify: + - project_id: test + email_address: + - test@thehyve.nl + - project_id: s2 + email_address: + - radar@thehyve.nl email_host: localhost email_port: 25 email_user: no-reply@radarcns.org diff --git a/src/main/java/org/radarcns/config/MonitorConfig.java b/src/main/java/org/radarcns/config/MonitorConfig.java index d969c93f..7e132db6 100644 --- a/src/main/java/org/radarcns/config/MonitorConfig.java +++ b/src/main/java/org/radarcns/config/MonitorConfig.java @@ -23,8 +23,8 @@ * POJO representing a monitor configuration */ public class MonitorConfig { - @JsonProperty("email_address") - private List emailAddress; + @JsonProperty("notify") + private List notifyConfig; @JsonProperty("email_host") private String emailHost; @@ -43,12 +43,12 @@ public class MonitorConfig { @JsonProperty("message") private String message = null; - public List getEmailAddress() { - return emailAddress; + public List getNotifyConfig() { + return notifyConfig; } - public void setEmailAddress(List emailAddress) { - this.emailAddress = emailAddress; + public void setNotifyConfig(List notifyConfig) { + this.notifyConfig = notifyConfig; } public List getTopics() { diff --git a/src/main/java/org/radarcns/config/NotifyConfig.java b/src/main/java/org/radarcns/config/NotifyConfig.java new file mode 100644 index 00000000..14d751db --- /dev/null +++ b/src/main/java/org/radarcns/config/NotifyConfig.java @@ -0,0 +1,30 @@ +package org.radarcns.config; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class NotifyConfig { + @JsonProperty("project_id") + private String projectId; + + @JsonProperty("email_address") + private List emailAddress; + + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public List getEmailAddress() { + return emailAddress; + } + + public void setEmailAddress(List email_address) { + this.emailAddress = email_address; + } +} diff --git a/src/main/java/org/radarcns/monitor/BatteryLevelMonitor.java b/src/main/java/org/radarcns/monitor/BatteryLevelMonitor.java index 61b1ba09..ec3bee9f 100644 --- a/src/main/java/org/radarcns/monitor/BatteryLevelMonitor.java +++ b/src/main/java/org/radarcns/monitor/BatteryLevelMonitor.java @@ -31,6 +31,7 @@ import org.radarcns.kafka.ObservationKey; import org.radarcns.monitor.BatteryLevelMonitor.BatteryLevelState; import org.radarcns.util.EmailSender; +import org.radarcns.util.EmailSenders; import org.radarcns.util.RadarSingletonFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,7 +44,7 @@ public class BatteryLevelMonitor extends AbstractKafkaMonitor { private static final Logger logger = LoggerFactory.getLogger(BatteryLevelMonitor.class); - private final EmailSender sender; + private final EmailSenders senders; private final Status minLevel; private final long logInterval; private long messageNumber; @@ -52,19 +53,19 @@ public class BatteryLevelMonitor extends * BatteryLevelMonitor constructor. * @param radar RADAR properties * @param topics topics to monitor, each of which has a "batteryLevel" value field - * @param sender email sender for notifications, null if no notifications should be sent. + * @param senders email sender for notifications, null if no notifications should be sent. * @param minLevel minimum battery level, below which a notification should be sent * @param logInterval every how many messages to log, 0 for no log messages */ public BatteryLevelMonitor(RadarPropertyHandler radar, Collection topics, - EmailSender sender, Status minLevel, long logInterval) { + EmailSenders senders, Status minLevel, long logInterval) { super(radar, topics, "battery_monitors", "1", new BatteryLevelState()); Properties props = new Properties(); props.setProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest"); configure(props); - this.sender = sender; + this.senders = senders; this.minLevel = minLevel == null ? Status.CRITICAL : minLevel; this.logInterval = logInterval; } @@ -108,6 +109,8 @@ protected void evaluateRecord(ConsumerRecord recor } private void updateStatus(ObservationKey key, Status status) { + + EmailSender sender = senders.getEmailSender(key.getProjectId()); if (sender == null) { return; } diff --git a/src/main/java/org/radarcns/monitor/DisconnectMonitor.java b/src/main/java/org/radarcns/monitor/DisconnectMonitor.java index 1a7bcb14..f4ed8a73 100644 --- a/src/main/java/org/radarcns/monitor/DisconnectMonitor.java +++ b/src/main/java/org/radarcns/monitor/DisconnectMonitor.java @@ -42,6 +42,7 @@ import org.radarcns.kafka.ObservationKey; import org.radarcns.monitor.DisconnectMonitor.DisconnectMonitorState; import org.radarcns.util.EmailSender; +import org.radarcns.util.EmailSenders; import org.radarcns.util.Monitor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,7 +57,7 @@ public class DisconnectMonitor extends AbstractKafkaMonitor< private final ScheduledExecutorService scheduler; private final long timeUntilReportedMissing; - private final EmailSender sender; + private final EmailSenders senders; private final Format dayFormat; private final int numRepetitions; private final long repeatInterval; @@ -65,9 +66,9 @@ public class DisconnectMonitor extends AbstractKafkaMonitor< private final String message; public DisconnectMonitor(RadarPropertyHandler radar, Collection topics, String groupId, - EmailSender sender) { + EmailSenders senders) { super(radar, topics, groupId, "1", new DisconnectMonitorState()); - this.sender = sender; + this.senders = senders; this.dayFormat = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.SHORT, Locale.US); this.scheduler = Executors.newSingleThreadScheduledExecutor(); @@ -169,6 +170,11 @@ private void scheduleRepetition(final String key, final MissingRecordsReport rep private void reportMissing(String keyString, MissingRecordsReport report) { ObservationKey key = getStateStore().stringToKey(keyString); + + EmailSender sender = senders.getEmailSender(key.getProjectId()); + if(sender == null) + return; + long timeout = report.getTimeout(); logger.info("Device {} timeout {} (message {} of {}). Reporting it missing.", key, timeout, report.getMessageNumber(), numRepetitions); @@ -202,6 +208,10 @@ private void reportMissing(String keyString, MissingRecordsReport report) { } private void reportRecovered(ObservationKey key, long reportedMissingTime) { + EmailSender sender = senders.getEmailSender(key.getProjectId()); + if(sender == null) + return; + logger.info("Device {} seen again. Reporting it recovered.", key); try { Date reportedMissingDate = new Date(reportedMissingTime); diff --git a/src/main/java/org/radarcns/monitor/KafkaMonitorFactory.java b/src/main/java/org/radarcns/monitor/KafkaMonitorFactory.java index d49babac..8423459b 100644 --- a/src/main/java/org/radarcns/monitor/KafkaMonitorFactory.java +++ b/src/main/java/org/radarcns/monitor/KafkaMonitorFactory.java @@ -23,14 +23,13 @@ import java.util.Collections; import java.util.List; import java.util.Locale; +import java.util.stream.Collector; import java.util.stream.Collectors; -import org.radarcns.config.BatteryMonitorConfig; -import org.radarcns.config.DisconnectMonitorConfig; -import org.radarcns.config.MonitorConfig; -import org.radarcns.config.RadarBackendOptions; -import org.radarcns.config.RadarPropertyHandler; -import org.radarcns.config.SourceStatisticsMonitorConfig; +import java.util.stream.Stream; + +import org.radarcns.config.*; import org.radarcns.util.EmailSender; +import org.radarcns.util.EmailSenders; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -106,7 +105,7 @@ private KafkaMonitor createBatteryLevelMonitor() throws IOException { } BatteryLevelMonitor.Status minLevel = BatteryLevelMonitor.Status.CRITICAL; - EmailSender sender = getSender(config); + EmailSenders senders = getSenders(config); Collection topics = getTopics(config, "android_empatica_e4_battery_level"); if (config.getLevel() != null) { @@ -121,7 +120,7 @@ private KafkaMonitor createBatteryLevelMonitor() throws IOException { } long logInterval = config.getLogInterval(); - return new BatteryLevelMonitor(properties, topics, sender, minLevel, logInterval); + return new BatteryLevelMonitor(properties, topics, senders, minLevel, logInterval); } private KafkaMonitor createDisconnectMonitor() @@ -131,16 +130,15 @@ private KafkaMonitor createDisconnectMonitor() logger.warn("Disconnect monitor is not configured. Cannot start it."); return null; } - EmailSender sender = getSender(config); + EmailSenders senders = getSenders(config); Collection topics = getTopics(config, "android_empatica_e4_temperature"); - return new DisconnectMonitor(properties, topics, "disconnect_monitor", sender); + return new DisconnectMonitor(properties, topics, "disconnect_monitor", senders); } - private EmailSender getSender(MonitorConfig config) throws IOException { - if (config != null && config.getEmailAddress() != null) { - return new EmailSender(config.getEmailHost(), config.getEmailPort(), - config.getEmailUser(), - config.getEmailAddress()); + + private EmailSenders getSenders(MonitorConfig config) throws IOException { + if (config != null && config.getNotifyConfig() != null) { + return new EmailSenders(config); } return null; } diff --git a/src/main/java/org/radarcns/util/EmailSenders.java b/src/main/java/org/radarcns/util/EmailSenders.java new file mode 100644 index 00000000..6e8c8723 --- /dev/null +++ b/src/main/java/org/radarcns/util/EmailSenders.java @@ -0,0 +1,47 @@ +package org.radarcns.util; + +import org.radarcns.config.MonitorConfig; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class EmailSenders { + + private Map emailSenderMap; + + public EmailSenders(MonitorConfig config) { + emailSenderMap = new HashMap<>(); + addSender(config); + } + + private void addSender(MonitorConfig config) { + + config.getNotifyConfig().stream().forEach(s -> { + try { + emailSenderMap.put(s.getProjectId(), + new EmailSender(config.getEmailHost(), config.getEmailPort(), + config.getEmailUser(), s.getEmailAddress())); + } catch (IOException exc) { + exc.printStackTrace(); + } + }); + } + + public EmailSender getEmailSender(String projectId) { + return emailSenderMap.get(projectId); + + } + + private void putEmailSender(String projectId, EmailSender sender) { + emailSenderMap.put(projectId, sender); + } + + public Map getEmailSenderMap() { + return emailSenderMap; + } + + public void setEmailSenderMap(Map emailSenderMap) { + this.emailSenderMap = emailSenderMap; + } +} From 5a7bf9f1f7fac0204794b38b0dde91d9a4c6f94d Mon Sep 17 00:00:00 2001 From: yatharthranjan Date: Thu, 15 Feb 2018 16:31:22 +0000 Subject: [PATCH 3/9] update unit tests to use Project based EmailSender --- .gitignore | 3 +++ .../org/radarcns/config/NotifyConfig.java | 8 ++++++ .../java/org/radarcns/util/EmailSenders.java | 25 ++++++++++++++----- .../monitor/BatteryLevelMonitorTest.java | 15 +++++++---- .../monitor/DisconnectMonitorTest.java | 16 ++++++++---- .../monitor/KafkaMonitorFactoryTest.java | 18 ++++++------- 6 files changed, 59 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index e28a6d6a..0df21acd 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,6 @@ smtp.env /out/ /libs/ + +# Distribution +/radar-backend-* \ No newline at end of file diff --git a/src/main/java/org/radarcns/config/NotifyConfig.java b/src/main/java/org/radarcns/config/NotifyConfig.java index 14d751db..d2997521 100644 --- a/src/main/java/org/radarcns/config/NotifyConfig.java +++ b/src/main/java/org/radarcns/config/NotifyConfig.java @@ -1,5 +1,6 @@ package org.radarcns.config; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; @@ -12,6 +13,13 @@ public class NotifyConfig { private List emailAddress; + @JsonCreator + public NotifyConfig(@JsonProperty("project_id") String projectId, + @JsonProperty("email_address") List emailAddress) { + this.projectId = projectId; + this.emailAddress = emailAddress; + } + public String getProjectId() { return projectId; } diff --git a/src/main/java/org/radarcns/util/EmailSenders.java b/src/main/java/org/radarcns/util/EmailSenders.java index 6e8c8723..9d778a57 100644 --- a/src/main/java/org/radarcns/util/EmailSenders.java +++ b/src/main/java/org/radarcns/util/EmailSenders.java @@ -3,37 +3,47 @@ import org.radarcns.config.MonitorConfig; import java.io.IOException; +import java.io.UncheckedIOException; import java.util.HashMap; import java.util.Map; public class EmailSenders { private Map emailSenderMap; + IOException exception; - public EmailSenders(MonitorConfig config) { + public EmailSenders() { emailSenderMap = new HashMap<>(); - addSender(config); } - private void addSender(MonitorConfig config) { + public EmailSenders(MonitorConfig config) throws IOException{ + emailSenderMap = new HashMap<>(); + addSender(config); + } + private void addSender(MonitorConfig config) throws IOException{ + exception = null; config.getNotifyConfig().stream().forEach(s -> { try { emailSenderMap.put(s.getProjectId(), new EmailSender(config.getEmailHost(), config.getEmailPort(), config.getEmailUser(), s.getEmailAddress())); } catch (IOException exc) { - exc.printStackTrace(); + exception = exc; } }); + + if(exception != null) + throw exception; } + + public EmailSender getEmailSender(String projectId) { return emailSenderMap.get(projectId); - } - private void putEmailSender(String projectId, EmailSender sender) { + public void putEmailSender(String projectId, EmailSender sender) { emailSenderMap.put(projectId, sender); } @@ -44,4 +54,7 @@ public Map getEmailSenderMap() { public void setEmailSenderMap(Map emailSenderMap) { this.emailSenderMap = emailSenderMap; } + + + } diff --git a/src/test/java/org/radarcns/monitor/BatteryLevelMonitorTest.java b/src/test/java/org/radarcns/monitor/BatteryLevelMonitorTest.java index 023c91e9..0c8bfbae 100644 --- a/src/test/java/org/radarcns/monitor/BatteryLevelMonitorTest.java +++ b/src/test/java/org/radarcns/monitor/BatteryLevelMonitorTest.java @@ -19,9 +19,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasEntry; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.*; import static org.radarcns.monitor.BatteryLevelMonitor.Status.LOW; import java.io.File; @@ -39,6 +37,7 @@ import org.radarcns.monitor.BatteryLevelMonitor.BatteryLevelState; import org.radarcns.passive.empatica.EmpaticaE4BatteryLevel; import org.radarcns.util.EmailSender; +import org.radarcns.util.EmailSenders; import org.radarcns.util.YamlPersistentStateStore; public class BatteryLevelMonitorTest { @@ -49,8 +48,11 @@ public class BatteryLevelMonitorTest { private long offset; private long timeReceived; private int timesSent; + private EmailSenders senders; private EmailSender sender; + private static final String PROJECT_ID = "test"; + @Test public void evaluateRecord() throws Exception { offset = 1000L; @@ -58,13 +60,16 @@ public void evaluateRecord() throws Exception { timesSent = 0; sender = mock(EmailSender.class); + senders = new EmailSenders(); + senders.putEmailSender(PROJECT_ID, sender); + ConfigRadar config = KafkaMonitorFactoryTest .getBatteryMonitorConfig(25252, folder); RadarPropertyHandler properties = KafkaMonitorFactoryTest .getRadarPropertyHandler(config, folder); BatteryLevelMonitor monitor = new BatteryLevelMonitor(properties, - Collections.singletonList("mytopic"), sender, LOW, 10L); + Collections.singletonList("mytopic"), senders, LOW, 10L); sendMessage(monitor, 1.0f, false); sendMessage(monitor, 1.0f, false); @@ -83,7 +88,7 @@ public void evaluateRecord() throws Exception { private void sendMessage(BatteryLevelMonitor monitor, float batteryLevel, boolean sentMessage) throws MessagingException { Record key = new Record(ObservationKey.getClassSchema()); - key.put("projectId", "test"); + key.put("projectId", PROJECT_ID); key.put("sourceId", "1"); key.put("userId", "me"); diff --git a/src/test/java/org/radarcns/monitor/DisconnectMonitorTest.java b/src/test/java/org/radarcns/monitor/DisconnectMonitorTest.java index 88c239b9..e1b67ed7 100644 --- a/src/test/java/org/radarcns/monitor/DisconnectMonitorTest.java +++ b/src/test/java/org/radarcns/monitor/DisconnectMonitorTest.java @@ -47,6 +47,7 @@ import org.radarcns.monitor.DisconnectMonitor.DisconnectMonitorState; import org.radarcns.monitor.DisconnectMonitor.MissingRecordsReport; import org.radarcns.util.EmailSender; +import org.radarcns.util.EmailSenders; import org.radarcns.util.YamlPersistentStateStore; public class DisconnectMonitorTest { @@ -58,8 +59,11 @@ public class DisconnectMonitorTest { private int timesSent; private Schema keySchema; private Schema valueSchema; + private EmailSenders senders; private EmailSender sender; + private static final String PROJECT_ID = "test"; + @Before public void setUp() { Parser parser = new Parser(); @@ -77,6 +81,8 @@ public void setUp() { timeReceived = 2000L; timesSent = 0; sender = mock(EmailSender.class); + senders = new EmailSenders(); + senders.putEmailSender(PROJECT_ID, sender); } public void evaluateRecords() throws Exception { @@ -95,7 +101,7 @@ public void evaluateRecords() throws Exception { .getRadarPropertyHandler(config, folder); DisconnectMonitor monitor = new DisconnectMonitor(properties, - Collections.singletonList("mytopic"), "mygroup", sender); + Collections.singletonList("mytopic"), "mygroup", senders); monitor.startScheduler(); assertEquals(timeout, monitor.getPollTimeout()); @@ -131,7 +137,7 @@ public void evaluateRecordsWithScheduledAlerts() throws Exception { private void sendMessage(DisconnectMonitor monitor, String source, int sentMessages) { Record key = new Record(keySchema); - key.put("projectId", "test"); + key.put("projectId", PROJECT_ID); key.put("sourceId", source); key.put("userId", "me"); @@ -150,9 +156,9 @@ public void retrieveState() throws Exception { File base = folder.newFolder(); YamlPersistentStateStore stateStore = new YamlPersistentStateStore(base); DisconnectMonitorState state = new DisconnectMonitorState(); - ObservationKey key1 = new ObservationKey("test", "a", "b"); - ObservationKey key2 = new ObservationKey("test", "b", "c"); - ObservationKey key3 = new ObservationKey("test", "c", "d"); + ObservationKey key1 = new ObservationKey(PROJECT_ID, "a", "b"); + ObservationKey key2 = new ObservationKey(PROJECT_ID, "b", "c"); + ObservationKey key3 = new ObservationKey(PROJECT_ID, "c", "d"); long now = System.currentTimeMillis(); state.getLastSeen().put(stateStore.keyToString(key1), now); state.getLastSeen().put(stateStore.keyToString(key2), now + 1L); diff --git a/src/test/java/org/radarcns/monitor/KafkaMonitorFactoryTest.java b/src/test/java/org/radarcns/monitor/KafkaMonitorFactoryTest.java index 50715ea9..7c054950 100644 --- a/src/test/java/org/radarcns/monitor/KafkaMonitorFactoryTest.java +++ b/src/test/java/org/radarcns/monitor/KafkaMonitorFactoryTest.java @@ -26,6 +26,7 @@ import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -34,14 +35,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.radarcns.config.BatteryMonitorConfig; -import org.radarcns.config.ConfigRadar; -import org.radarcns.config.DisconnectMonitorConfig; -import org.radarcns.config.RadarBackendOptions; -import org.radarcns.config.RadarPropertyHandler; -import org.radarcns.config.RadarPropertyHandlerImpl; -import org.radarcns.config.SourceStatisticsMonitorConfig; -import org.radarcns.config.YamlConfigLoader; +import org.radarcns.config.*; import org.radarcns.util.EmailServerRule; public class KafkaMonitorFactoryTest { @@ -129,7 +123,9 @@ public static ConfigRadar createBasicConfig(TemporaryFolder folder) throws IOExc public static DisconnectMonitorConfig getDisconnectMonitorConfig(int port) { DisconnectMonitorConfig disconnectConfig = new DisconnectMonitorConfig(); - disconnectConfig.setEmailAddress(Collections.singletonList("test@localhost")); + List notifyConfigs = new ArrayList<>(); + notifyConfigs.add(new NotifyConfig("test",Collections.singletonList("test@localhost"))); + disconnectConfig.setNotifyConfig(notifyConfigs); disconnectConfig.setEmailHost("localhost"); disconnectConfig.setEmailPort(port); disconnectConfig.setTimeout(1L); @@ -145,7 +141,9 @@ public static ConfigRadar getDisconnectMonitorConfig(int port, TemporaryFolder f public static BatteryMonitorConfig getBatteryMonitorConfig(int port) { BatteryMonitorConfig batteryConfig = new BatteryMonitorConfig(); - batteryConfig.setEmailAddress(Collections.singletonList("test@localhost")); + List notifyConfigs = new ArrayList<>(); + notifyConfigs.add(new NotifyConfig("test",Collections.singletonList("test@localhost"))); + batteryConfig.setNotifyConfig(notifyConfigs); batteryConfig.setEmailHost("localhost"); batteryConfig.setEmailPort(port); batteryConfig.setLevel("LOW"); From 082974d0c8da8f70471f423945d709ec5bf593d5 Mon Sep 17 00:00:00 2001 From: yatharthranjan Date: Thu, 15 Feb 2018 16:43:37 +0000 Subject: [PATCH 4/9] update integrationTest radar.yml --- radar.yml | 4 ++-- .../resources/org/radarcns/kafka/radar.yml | 12 ++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/radar.yml b/radar.yml index 7859daaf..8edc3f87 100644 --- a/radar.yml +++ b/radar.yml @@ -44,7 +44,7 @@ rest_proxy: #======================== Battery level monitor ========================# battery_monitor: notify: - - project_id: test + - project_id: s1 email_address: - test@thehyve.nl - project_id: s2 @@ -60,7 +60,7 @@ battery_monitor: #======================= Disconnection monitor==========================# disconnect_monitor: notify: - - project_id: test + - project_id: s1 email_address: - test@thehyve.nl - project_id: s2 diff --git a/src/integrationTest/resources/org/radarcns/kafka/radar.yml b/src/integrationTest/resources/org/radarcns/kafka/radar.yml index 7391b8fe..319653d0 100644 --- a/src/integrationTest/resources/org/radarcns/kafka/radar.yml +++ b/src/integrationTest/resources/org/radarcns/kafka/radar.yml @@ -41,15 +41,19 @@ schema_registry: protocol: http battery_monitor: + notify: + - project_id: test + email_address: + - notifier@email level: LOW - email_address: - - notifier@email topics: - android_empatica_e4_battery_level disconnect_monitor: - email_address: - - notifier2@email + notify: + - project_id: test + email_address: + - notifier@email email_host: localhost email_port: 25 email_user: sender@email From c5f08fdd94a3e06129d8b6fd9c593b5d2df01b2b Mon Sep 17 00:00:00 2001 From: yatharthranjan Date: Thu, 15 Feb 2018 16:54:35 +0000 Subject: [PATCH 5/9] pmd fixes --- src/main/java/org/radarcns/config/NotifyConfig.java | 4 ++-- src/main/java/org/radarcns/monitor/DisconnectMonitor.java | 7 +++++-- .../java/org/radarcns/monitor/KafkaMonitorFactory.java | 3 --- src/main/java/org/radarcns/util/EmailSenders.java | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/radarcns/config/NotifyConfig.java b/src/main/java/org/radarcns/config/NotifyConfig.java index d2997521..9d37099a 100644 --- a/src/main/java/org/radarcns/config/NotifyConfig.java +++ b/src/main/java/org/radarcns/config/NotifyConfig.java @@ -32,7 +32,7 @@ public List getEmailAddress() { return emailAddress; } - public void setEmailAddress(List email_address) { - this.emailAddress = email_address; + public void setEmailAddress(List emailAddress) { + this.emailAddress = emailAddress; } } diff --git a/src/main/java/org/radarcns/monitor/DisconnectMonitor.java b/src/main/java/org/radarcns/monitor/DisconnectMonitor.java index f4ed8a73..78f4ea00 100644 --- a/src/main/java/org/radarcns/monitor/DisconnectMonitor.java +++ b/src/main/java/org/radarcns/monitor/DisconnectMonitor.java @@ -172,8 +172,9 @@ private void reportMissing(String keyString, MissingRecordsReport report) { ObservationKey key = getStateStore().stringToKey(keyString); EmailSender sender = senders.getEmailSender(key.getProjectId()); - if(sender == null) + if(sender == null) { return; + } long timeout = report.getTimeout(); logger.info("Device {} timeout {} (message {} of {}). Reporting it missing.", key, @@ -209,8 +210,10 @@ private void reportMissing(String keyString, MissingRecordsReport report) { private void reportRecovered(ObservationKey key, long reportedMissingTime) { EmailSender sender = senders.getEmailSender(key.getProjectId()); - if(sender == null) + if(sender == null) { return; + } + logger.info("Device {} seen again. Reporting it recovered.", key); try { diff --git a/src/main/java/org/radarcns/monitor/KafkaMonitorFactory.java b/src/main/java/org/radarcns/monitor/KafkaMonitorFactory.java index 8423459b..18db4dea 100644 --- a/src/main/java/org/radarcns/monitor/KafkaMonitorFactory.java +++ b/src/main/java/org/radarcns/monitor/KafkaMonitorFactory.java @@ -23,12 +23,9 @@ import java.util.Collections; import java.util.List; import java.util.Locale; -import java.util.stream.Collector; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.radarcns.config.*; -import org.radarcns.util.EmailSender; import org.radarcns.util.EmailSenders; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/org/radarcns/util/EmailSenders.java b/src/main/java/org/radarcns/util/EmailSenders.java index 9d778a57..55efb6c6 100644 --- a/src/main/java/org/radarcns/util/EmailSenders.java +++ b/src/main/java/org/radarcns/util/EmailSenders.java @@ -3,7 +3,6 @@ import org.radarcns.config.MonitorConfig; import java.io.IOException; -import java.io.UncheckedIOException; import java.util.HashMap; import java.util.Map; @@ -33,8 +32,9 @@ private void addSender(MonitorConfig config) throws IOException{ } }); - if(exception != null) + if(exception != null) { throw exception; + } } From dc162671257c80791c04b5b2e6f4518b204ad636 Mon Sep 17 00:00:00 2001 From: yatharthranjan Date: Fri, 16 Feb 2018 11:10:53 +0000 Subject: [PATCH 6/9] add documentation --- build.gradle | 2 +- radar.yml | 2 +- .../org/radarcns/config/NotifyConfig.java | 5 +++- .../radarcns/monitor/BatteryLevelMonitor.java | 1 + .../radarcns/monitor/DisconnectMonitor.java | 3 +++ .../java/org/radarcns/util/EmailSenders.java | 27 ++++++++++++++++++- 6 files changed, 36 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 2e84e0a0..2798073d 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ plugins { //---------------------------------------------------------------------------// group = 'org.radarcns' -version = '0.2.0' +version = '0.2.1-SNAPSHOT' ext.description = 'Kafka backend for processing device data.' mainClassName = 'org.radarcns.RadarBackend' diff --git a/radar.yml b/radar.yml index 8edc3f87..e996125a 100644 --- a/radar.yml +++ b/radar.yml @@ -43,7 +43,7 @@ rest_proxy: #======================== Battery level monitor ========================# battery_monitor: - notify: + notify: # Each project can have a number of email addresses - project_id: s1 email_address: - test@thehyve.nl diff --git a/src/main/java/org/radarcns/config/NotifyConfig.java b/src/main/java/org/radarcns/config/NotifyConfig.java index 9d37099a..8579e45c 100644 --- a/src/main/java/org/radarcns/config/NotifyConfig.java +++ b/src/main/java/org/radarcns/config/NotifyConfig.java @@ -5,6 +5,10 @@ import java.util.List; + +/** + * POJO to store each email Notification configuration. + */ public class NotifyConfig { @JsonProperty("project_id") private String projectId; @@ -12,7 +16,6 @@ public class NotifyConfig { @JsonProperty("email_address") private List emailAddress; - @JsonCreator public NotifyConfig(@JsonProperty("project_id") String projectId, @JsonProperty("email_address") List emailAddress) { diff --git a/src/main/java/org/radarcns/monitor/BatteryLevelMonitor.java b/src/main/java/org/radarcns/monitor/BatteryLevelMonitor.java index ec3bee9f..ad0398f4 100644 --- a/src/main/java/org/radarcns/monitor/BatteryLevelMonitor.java +++ b/src/main/java/org/radarcns/monitor/BatteryLevelMonitor.java @@ -110,6 +110,7 @@ protected void evaluateRecord(ConsumerRecord recor private void updateStatus(ObservationKey key, Status status) { + // Don't report if no email address for this projectId EmailSender sender = senders.getEmailSender(key.getProjectId()); if (sender == null) { return; diff --git a/src/main/java/org/radarcns/monitor/DisconnectMonitor.java b/src/main/java/org/radarcns/monitor/DisconnectMonitor.java index 78f4ea00..71ec47ee 100644 --- a/src/main/java/org/radarcns/monitor/DisconnectMonitor.java +++ b/src/main/java/org/radarcns/monitor/DisconnectMonitor.java @@ -171,6 +171,7 @@ private void scheduleRepetition(final String key, final MissingRecordsReport rep private void reportMissing(String keyString, MissingRecordsReport report) { ObservationKey key = getStateStore().stringToKey(keyString); + // Don't report if no email address for this projectId EmailSender sender = senders.getEmailSender(key.getProjectId()); if(sender == null) { return; @@ -209,6 +210,8 @@ private void reportMissing(String keyString, MissingRecordsReport report) { } private void reportRecovered(ObservationKey key, long reportedMissingTime) { + + // Don't report if no email address for this projectId EmailSender sender = senders.getEmailSender(key.getProjectId()); if(sender == null) { return; diff --git a/src/main/java/org/radarcns/util/EmailSenders.java b/src/main/java/org/radarcns/util/EmailSenders.java index 55efb6c6..671fe257 100644 --- a/src/main/java/org/radarcns/util/EmailSenders.java +++ b/src/main/java/org/radarcns/util/EmailSenders.java @@ -6,20 +6,45 @@ import java.util.HashMap; import java.util.Map; + +/** + * Class to store {@link EmailSender} associated with each project. + */ public class EmailSenders { private Map emailSenderMap; - IOException exception; + private IOException exception; + /** + * Default Constructor + */ public EmailSenders() { emailSenderMap = new HashMap<>(); } + /** + * Initialize the {@link EmailSender} map using the configuration. + * + * @param config Configuration of the Monitor containing project + * and email address mapping + * @throws IOException + */ public EmailSenders(MonitorConfig config) throws IOException{ emailSenderMap = new HashMap<>(); addSender(config); } + /** + * + * Parses the {@link MonitorConfig} to map the corresponding + * {@link EmailSender} to each project. A project can have a list of + * associated email addresses. + * + * @param config Configuration of the Monitor containing project + * and email address mapping + * @throws IOException + */ + private void addSender(MonitorConfig config) throws IOException{ exception = null; config.getNotifyConfig().stream().forEach(s -> { From cafbcd95443c2aee5141cfec0074b1b149edb658 Mon Sep 17 00:00:00 2001 From: Yatharth Ranjan Date: Tue, 20 Feb 2018 11:29:26 +0000 Subject: [PATCH 7/9] Update build.gradle --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2e84e0a0..2798073d 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ plugins { //---------------------------------------------------------------------------// group = 'org.radarcns' -version = '0.2.0' +version = '0.2.1-SNAPSHOT' ext.description = 'Kafka backend for processing device data.' mainClassName = 'org.radarcns.RadarBackend' From 960bdeee559061fd978d973cfc1d3bf1f329273d Mon Sep 17 00:00:00 2001 From: yatharthranjan Date: Tue, 20 Feb 2018 13:56:00 +0000 Subject: [PATCH 8/9] Updates based on PR comments --- .../radarcns/monitor/BatteryLevelMonitor.java | 2 +- .../radarcns/monitor/DisconnectMonitor.java | 4 +- .../radarcns/monitor/KafkaMonitorFactory.java | 2 +- .../java/org/radarcns/util/EmailSenders.java | 63 ++++--------------- .../monitor/BatteryLevelMonitorTest.java | 3 +- .../monitor/DisconnectMonitorTest.java | 3 +- 6 files changed, 19 insertions(+), 58 deletions(-) diff --git a/src/main/java/org/radarcns/monitor/BatteryLevelMonitor.java b/src/main/java/org/radarcns/monitor/BatteryLevelMonitor.java index ad0398f4..ea7dc396 100644 --- a/src/main/java/org/radarcns/monitor/BatteryLevelMonitor.java +++ b/src/main/java/org/radarcns/monitor/BatteryLevelMonitor.java @@ -111,7 +111,7 @@ protected void evaluateRecord(ConsumerRecord recor private void updateStatus(ObservationKey key, Status status) { // Don't report if no email address for this projectId - EmailSender sender = senders.getEmailSender(key.getProjectId()); + EmailSender sender = senders.getEmailSenderForProject(key.getProjectId()); if (sender == null) { return; } diff --git a/src/main/java/org/radarcns/monitor/DisconnectMonitor.java b/src/main/java/org/radarcns/monitor/DisconnectMonitor.java index 71ec47ee..f2da08d8 100644 --- a/src/main/java/org/radarcns/monitor/DisconnectMonitor.java +++ b/src/main/java/org/radarcns/monitor/DisconnectMonitor.java @@ -172,7 +172,7 @@ private void reportMissing(String keyString, MissingRecordsReport report) { ObservationKey key = getStateStore().stringToKey(keyString); // Don't report if no email address for this projectId - EmailSender sender = senders.getEmailSender(key.getProjectId()); + EmailSender sender = senders.getEmailSenderForProject(key.getProjectId()); if(sender == null) { return; } @@ -212,7 +212,7 @@ private void reportMissing(String keyString, MissingRecordsReport report) { private void reportRecovered(ObservationKey key, long reportedMissingTime) { // Don't report if no email address for this projectId - EmailSender sender = senders.getEmailSender(key.getProjectId()); + EmailSender sender = senders.getEmailSenderForProject(key.getProjectId()); if(sender == null) { return; } diff --git a/src/main/java/org/radarcns/monitor/KafkaMonitorFactory.java b/src/main/java/org/radarcns/monitor/KafkaMonitorFactory.java index 18db4dea..63c1d034 100644 --- a/src/main/java/org/radarcns/monitor/KafkaMonitorFactory.java +++ b/src/main/java/org/radarcns/monitor/KafkaMonitorFactory.java @@ -135,7 +135,7 @@ private KafkaMonitor createDisconnectMonitor() private EmailSenders getSenders(MonitorConfig config) throws IOException { if (config != null && config.getNotifyConfig() != null) { - return new EmailSenders(config); + return EmailSenders.parseConfig(config); } return null; } diff --git a/src/main/java/org/radarcns/util/EmailSenders.java b/src/main/java/org/radarcns/util/EmailSenders.java index 671fe257..32e9b9c6 100644 --- a/src/main/java/org/radarcns/util/EmailSenders.java +++ b/src/main/java/org/radarcns/util/EmailSenders.java @@ -1,6 +1,7 @@ package org.radarcns.util; import org.radarcns.config.MonitorConfig; +import org.radarcns.config.NotifyConfig; import java.io.IOException; import java.util.HashMap; @@ -12,26 +13,10 @@ */ public class EmailSenders { - private Map emailSenderMap; - private IOException exception; + private final Map emailSenderMap; - /** - * Default Constructor - */ - public EmailSenders() { - emailSenderMap = new HashMap<>(); - } - - /** - * Initialize the {@link EmailSender} map using the configuration. - * - * @param config Configuration of the Monitor containing project - * and email address mapping - * @throws IOException - */ - public EmailSenders(MonitorConfig config) throws IOException{ - emailSenderMap = new HashMap<>(); - addSender(config); + public EmailSenders(Map map) { + this.emailSenderMap = map; } /** @@ -45,41 +30,19 @@ public EmailSenders(MonitorConfig config) throws IOException{ * @throws IOException */ - private void addSender(MonitorConfig config) throws IOException{ - exception = null; - config.getNotifyConfig().stream().forEach(s -> { - try { - emailSenderMap.put(s.getProjectId(), - new EmailSender(config.getEmailHost(), config.getEmailPort(), - config.getEmailUser(), s.getEmailAddress())); - } catch (IOException exc) { - exception = exc; - } - }); - - if(exception != null) { - throw exception; + public static EmailSenders parseConfig(MonitorConfig config) throws IOException{ + Map map = new HashMap<>(); + for(NotifyConfig notifyConfig : config.getNotifyConfig()) { + map.put(notifyConfig.getProjectId(), + new EmailSender(config.getEmailHost(), config.getEmailPort(), + config.getEmailUser(), notifyConfig.getEmailAddress())); } - } - - - - public EmailSender getEmailSender(String projectId) { - return emailSenderMap.get(projectId); - } - public void putEmailSender(String projectId, EmailSender sender) { - emailSenderMap.put(projectId, sender); + return new EmailSenders(map); } - public Map getEmailSenderMap() { - return emailSenderMap; - } - - public void setEmailSenderMap(Map emailSenderMap) { - this.emailSenderMap = emailSenderMap; + public EmailSender getEmailSenderForProject(String projectId) { + return emailSenderMap.get(projectId); } - - } diff --git a/src/test/java/org/radarcns/monitor/BatteryLevelMonitorTest.java b/src/test/java/org/radarcns/monitor/BatteryLevelMonitorTest.java index 0c8bfbae..77185842 100644 --- a/src/test/java/org/radarcns/monitor/BatteryLevelMonitorTest.java +++ b/src/test/java/org/radarcns/monitor/BatteryLevelMonitorTest.java @@ -60,8 +60,7 @@ public void evaluateRecord() throws Exception { timesSent = 0; sender = mock(EmailSender.class); - senders = new EmailSenders(); - senders.putEmailSender(PROJECT_ID, sender); + senders = new EmailSenders(Collections.singletonMap(PROJECT_ID, sender)); ConfigRadar config = KafkaMonitorFactoryTest .getBatteryMonitorConfig(25252, folder); diff --git a/src/test/java/org/radarcns/monitor/DisconnectMonitorTest.java b/src/test/java/org/radarcns/monitor/DisconnectMonitorTest.java index e1b67ed7..6a59c284 100644 --- a/src/test/java/org/radarcns/monitor/DisconnectMonitorTest.java +++ b/src/test/java/org/radarcns/monitor/DisconnectMonitorTest.java @@ -81,8 +81,7 @@ public void setUp() { timeReceived = 2000L; timesSent = 0; sender = mock(EmailSender.class); - senders = new EmailSenders(); - senders.putEmailSender(PROJECT_ID, sender); + senders = new EmailSenders(Collections.singletonMap(PROJECT_ID, sender)); } public void evaluateRecords() throws Exception { From b18da3e6a2b887e776c97dcd1521dc6b1f51b271 Mon Sep 17 00:00:00 2001 From: Yatharth Ranjan Date: Wed, 21 Feb 2018 17:11:11 +0000 Subject: [PATCH 9/9] Bump version to 0.2.1 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2798073d..e36d42fe 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ plugins { //---------------------------------------------------------------------------// group = 'org.radarcns' -version = '0.2.1-SNAPSHOT' +version = '0.2.1' ext.description = 'Kafka backend for processing device data.' mainClassName = 'org.radarcns.RadarBackend'