diff --git a/Hogajama/configuration/local_configuration/03_configure_no_mongo.cli.NOMONGO b/Hogajama/configuration/local_configuration/03_configure_no_mongo.cli.NOMONGO
new file mode 100644
index 00000000..b5ece017
--- /dev/null
+++ b/Hogajama/configuration/local_configuration/03_configure_no_mongo.cli.NOMONGO
@@ -0,0 +1 @@
+/system-property=hogarama.sensordata.storage:add(value="dummy")
diff --git a/Hogajama/hogajama-domain/pom.xml b/Hogajama/hogajama-domain/pom.xml
index b5123486..02be72a6 100644
--- a/Hogajama/hogajama-domain/pom.xml
+++ b/Hogajama/hogajama-domain/pom.xml
@@ -94,6 +94,11 @@
provided
+
+ org.apache.commons
+ commons-collections4
+
+
org.assertj
@@ -110,11 +115,6 @@
mockito-junit-jupiter
test
-
- org.apache.commons
- commons-collections4
- test
-
diff --git a/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/annotations/DummyDAO.java b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/annotations/DummyDAO.java
new file mode 100644
index 00000000..0db52ff8
--- /dev/null
+++ b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/annotations/DummyDAO.java
@@ -0,0 +1,21 @@
+package com.gepardec.hogarama.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import jakarta.inject.Qualifier;
+
+@Qualifier
+@Inherited
+@Retention(RUNTIME)
+@Target({METHOD, FIELD, PARAMETER, TYPE})
+public @interface DummyDAO {
+
+}
diff --git a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/testdata/DummyData.java b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/dao/dummydata/DummyData.java
similarity index 95%
rename from Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/testdata/DummyData.java
rename to Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/dao/dummydata/DummyData.java
index 8362c076..8bbec870 100644
--- a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/testdata/DummyData.java
+++ b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/dao/dummydata/DummyData.java
@@ -1,4 +1,4 @@
-package com.gepardec.hogarama.testdata;
+package com.gepardec.hogarama.dao.dummydata;
import java.util.ArrayList;
import java.util.Calendar;
diff --git a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/DummySensorDAO.java b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/dao/dummydata/DummySensorDAO.java
similarity index 64%
rename from Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/DummySensorDAO.java
rename to Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/dao/dummydata/DummySensorDAO.java
index 93c23598..5c717993 100644
--- a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/DummySensorDAO.java
+++ b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/dao/dummydata/DummySensorDAO.java
@@ -1,23 +1,28 @@
-package com.gepardec.hogarama.dao;
+package com.gepardec.hogarama.dao.dummydata;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
-import java.util.stream.Collectors;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Named;
import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.gepardec.hogarama.domain.sensor.SensorDataDAO;
+import com.gepardec.hogarama.domain.watering.WateringData;
+import com.gepardec.hogarama.annotations.DummyDAO;
import com.gepardec.hogarama.domain.sensor.SensorData;
-import com.gepardec.hogarama.testdata.DummyData;
@Named("dummyHabaramaDao")
+@DummyDAO
@RequestScoped
public class DummySensorDAO implements SensorDataDAO {
+ private static final Logger LOG = LoggerFactory.getLogger(DummySensorDAO.class);
+
private static final int MAX_NUMBER_OF_SENSORS = 10;
private static final int MAX_NUMBER_OF_DATA = 10000;
private List sensorDatas;
@@ -32,14 +37,6 @@ public DummySensorDAO(List sensorDatas) {
this.sensorDatas = sensorDatas;
}
- @Override
- public List getAllSensors() {
- return CollectionUtils.emptyIfNull(sensorDatas)
- .stream()
- .map(SensorData::getSensorName).distinct()
- .collect(Collectors.toList());
- }
-
@Override
public List getAllData(Integer maxNumber, String sensorName, Date from, Date to) {
Comparator comp = new Comparator() {
@@ -57,18 +54,13 @@ public int compare(SensorData o1, SensorData o2) {
}
@Override
- public String getLocationBySensorName(String sensorName) {
- return CollectionUtils.emptyIfNull(sensorDatas)
- .stream()
- .filter(s -> sensorName.equals(s.getSensorName()))
- .map(SensorData::getLocation)
- .findFirst()
- .orElse(DummyData.UNKNOW_LOCATION);
+ public void save(SensorData data){
+ LOG.info("Don't write SensorData since DummySensorDAO. Data: {}", data);
}
@Override
- public void save(SensorData data){
- return;
+ public void saveActorEvent(WateringData data) {
+ LOG.info("Don't write WateringData since DummySensorDAO. Data: {}", data);
}
}
diff --git a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/LastNRecordCollector.java b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/dao/dummydata/LastNRecordCollector.java
similarity index 92%
rename from Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/LastNRecordCollector.java
rename to Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/dao/dummydata/LastNRecordCollector.java
index dc0d1bcc..bbd64bbc 100644
--- a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/LastNRecordCollector.java
+++ b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/dao/dummydata/LastNRecordCollector.java
@@ -1,4 +1,4 @@
-package com.gepardec.hogarama.dao;
+package com.gepardec.hogarama.dao.dummydata;
import java.util.ArrayDeque;
import java.util.ArrayList;
diff --git a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/SensorDataPredicate.java b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/dao/dummydata/SensorDataPredicate.java
similarity index 77%
rename from Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/SensorDataPredicate.java
rename to Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/dao/dummydata/SensorDataPredicate.java
index 0e98d928..fd6a6af1 100644
--- a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/SensorDataPredicate.java
+++ b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/dao/dummydata/SensorDataPredicate.java
@@ -1,10 +1,8 @@
-package com.gepardec.hogarama.dao;
+package com.gepardec.hogarama.dao.dummydata;
import java.util.Date;
import java.util.function.Predicate;
-import jakarta.validation.constraints.NotNull;
-
import com.gepardec.hogarama.domain.sensor.SensorData;
public class SensorDataPredicate implements Predicate {
@@ -13,7 +11,7 @@ public class SensorDataPredicate implements Predicate {
private Date from;
private Date to;
- public SensorDataPredicate(@NotNull String sensorName, Date from, Date to) {
+ public SensorDataPredicate(String sensorName, Date from, Date to) {
super();
this.sensorName = sensorName;
this.from = from;
diff --git a/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/sensor/SensorDataDAO.java b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/sensor/SensorDataDAO.java
index 461fb8bb..b24021f8 100644
--- a/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/sensor/SensorDataDAO.java
+++ b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/sensor/SensorDataDAO.java
@@ -3,11 +3,13 @@
import java.util.Date;
import java.util.List;
+import com.gepardec.hogarama.domain.watering.WateringData;
+
public interface SensorDataDAO {
- List getAllSensors();
List getAllData(Integer maxNumber, String sensorName, Date from, Date to);
- String getLocationBySensorName(String sensorName);
void save(SensorData sensorData);
+
+ void saveActorEvent(WateringData data);
}
diff --git a/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/sensor/SensorNamesCache.java b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/sensor/SensorNamesCache.java
index 92815cbb..f70a1acc 100644
--- a/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/sensor/SensorNamesCache.java
+++ b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/sensor/SensorNamesCache.java
@@ -3,14 +3,20 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.gepardec.hogarama.domain.unitmanagement.context.UserContext;
+import com.gepardec.hogarama.domain.unitmanagement.dao.SensorDAO;
+import com.gepardec.hogarama.domain.unitmanagement.entity.Sensor;
+
import jakarta.ejb.Singleton;
import jakarta.ejb.Startup;
+import jakarta.enterprise.context.Dependent;
import jakarta.inject.Inject;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
-@Startup
@Singleton
public class SensorNamesCache {
@@ -19,30 +25,44 @@ public class SensorNamesCache {
private static final Logger log = LoggerFactory.getLogger(SensorNamesCache.class);
@Inject
- private SensorDataDAO habaramaDao;
+ private SensorDAO sensorDAO;
+
+ @Inject
+ private UserContext userContext;
- private List sensorNames = new ArrayList<>();
+ private List sensors;
private long cacheTime = 0;
- public synchronized void loadSensorsFromDB() {
+ private synchronized void loadSensorsFromDB() {
if(isStale()) {
log.info("Load the sensorNames from the database");
- sensorNames.clear();
- sensorNames = habaramaDao.getAllSensors();
+ sensors.clear();
+ sensors = sensorDAO.getAllSensorsForUser(userContext.getUser());
+ sensors.stream().forEach(s -> s.getUnit()); // lazyload Units
cacheTime = (new Date()).getTime();
}
}
- public List getSensorNames() {
+ public List getSensors() {
if(isStale()) {
loadSensorsFromDB();
}
- return sensorNames;
+ return sensors.stream()
+ .map(s -> s.getName())
+ .collect(Collectors.toList());
}
private boolean isStale() {
- return sensorNames.isEmpty() || ((new Date()).getTime() - cacheTime) > TEN_SECONDS ;
+ return sensors.isEmpty() || ((new Date()).getTime() - cacheTime) > TEN_SECONDS ;
+ }
+
+ public String getLocationBySensorName(String sensorName) {
+ return getSensor(sensorName).get().getUnit().getName();
+ }
+
+ private Optional getSensor(String sensorName) {
+ return sensors.stream().filter(s -> s.getName().equals(sensorName)).findFirst();
}
}
diff --git a/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/watering/ActorControlService.java b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/watering/ActorControlService.java
index 750621a8..b08b7087 100644
--- a/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/watering/ActorControlService.java
+++ b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/watering/ActorControlService.java
@@ -2,6 +2,7 @@
// TODO do we want to integrate this service into the new unitmanagement ActorService
public interface ActorControlService {
- void sendActorMessage(String location, String sensorName, Integer duration);
+
+ void sendActorMessage(WateringData data);
}
diff --git a/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/watering/WateringData.java b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/watering/WateringData.java
index f83e7a37..a028bf4d 100644
--- a/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/watering/WateringData.java
+++ b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/watering/WateringData.java
@@ -28,6 +28,10 @@ public WateringData(Date time, String name, String location, Integer duration){
this.duration = duration;
}
+ public WateringData(String name, String location, Integer duration){
+ this(new Date(), name, location, duration);
+ }
+
public WateringData(String id, Date time, String name, String location, Integer duration) {
this(time, name, location,duration);
this.id = id;
@@ -102,4 +106,11 @@ public int hashCode() {
result = prime * result + ((duration == null) ? 0 : duration.hashCode());
return result;
}
+
+ @Override
+ public String toString() {
+ return "WateringData [id=" + id + ", time=" + time + ", name=" + name + ", location=" + location + ", duration="
+ + duration + "]";
+ }
+
}
diff --git a/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/watering/WateringService.java b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/watering/WateringService.java
index 6ef1b0b3..1eed35b8 100644
--- a/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/watering/WateringService.java
+++ b/Hogajama/hogajama-domain/src/main/java/com/gepardec/hogarama/domain/watering/WateringService.java
@@ -13,6 +13,8 @@
import org.slf4j.LoggerFactory;
import jakarta.inject.Inject;
+
+import java.util.Date;
import java.util.Optional;
public class WateringService {
@@ -81,7 +83,28 @@ private void invokeActorIfNeeded(WateringRule config, int dur, String location)
location
).set(dur);
- actorSvc.sendActorMessage(location, config.getActorName(), dur);
+ sendActorMessage(new WateringData(config.getActorName(), location, dur));
+ }
+ }
+
+ public void sendActorMessage(WateringData data) {
+
+ checkParametersOrFail(data);
+
+ sensorDataDAO.saveActorEvent(data);
+
+ actorSvc.sendActorMessage(data);
+
+ }
+
+ protected void checkParametersOrFail(WateringData data ) {
+ String location = data.getLocation();
+ String actorName = data.getName();
+ Integer duration = data.getDuration();
+
+ if (location == null || location.isEmpty() || actorName == null || actorName.isEmpty() || duration == null) {
+ Metrics.exceptionsThrown.labels("hogarama_services", "IllegalArgumentException", "ActorServiceImpl.checkParametersOrFail").inc();
+ throw new IllegalArgumentException(String.format("Supplied parameters '%s', '%s', '%s' must not be empty or null", location, actorName, duration));
}
}
diff --git a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/TestCaseLastNRecordCollector.java b/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/dummydata/TestCaseLastNRecordCollector.java
similarity index 92%
rename from Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/TestCaseLastNRecordCollector.java
rename to Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/dummydata/TestCaseLastNRecordCollector.java
index 7e0e8d1f..a55fa218 100644
--- a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/TestCaseLastNRecordCollector.java
+++ b/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/dao/dummydata/TestCaseLastNRecordCollector.java
@@ -1,4 +1,4 @@
-package com.gepardec.hogarama.dao;
+package com.gepardec.hogarama.dao.dummydata;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -7,7 +7,8 @@
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Test;
+
public class TestCaseLastNRecordCollector {
diff --git a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/domain/sensor/TestCaseSensorDataPredicate.java b/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/domain/sensor/TestCaseSensorDataPredicate.java
index 6adbac7c..1ce6a177 100644
--- a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/domain/sensor/TestCaseSensorDataPredicate.java
+++ b/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/domain/sensor/TestCaseSensorDataPredicate.java
@@ -8,9 +8,10 @@
import java.util.List;
import java.util.stream.Collectors;
-import com.gepardec.hogarama.dao.SensorDataPredicate;
-import com.gepardec.hogarama.testdata.DummyData;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Test;
+
+import com.gepardec.hogarama.dao.dummydata.DummyData;
+import com.gepardec.hogarama.dao.dummydata.SensorDataPredicate;
public class TestCaseSensorDataPredicate {
diff --git a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/domain/watering/WateringServiceTest.java b/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/domain/watering/WateringServiceTest.java
index 2eb05cb7..1ea9bb93 100644
--- a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/domain/watering/WateringServiceTest.java
+++ b/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/domain/watering/WateringServiceTest.java
@@ -1,8 +1,7 @@
package com.gepardec.hogarama.domain.watering;
-import com.gepardec.hogarama.dao.DummySensorDAO;
+import com.gepardec.hogarama.dao.dummydata.DummySensorDAO;
import com.gepardec.hogarama.domain.sensor.SensorData;
-import com.gepardec.hogarama.domain.sensor.SensorDataDAO;
import com.gepardec.hogarama.domain.sensor.SensorNormalizer;
import com.gepardec.hogarama.domain.unitmanagement.cache.ActorCache;
import com.gepardec.hogarama.domain.unitmanagement.cache.SensorCache;
@@ -10,6 +9,7 @@
import com.gepardec.hogarama.domain.unitmanagement.entity.Sensor;
import com.gepardec.hogarama.domain.unitmanagement.entity.Unit;
import com.gepardec.hogarama.testdata.TestDataProducer;
+
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
@@ -42,7 +42,6 @@ public class WateringServiceTest {
public void setUp() {
actorCache = Mockito.mock(ActorCache.class);
sensorCache = Mockito.mock(SensorCache.class);
- SensorDataDAO sensorDataDAO = Mockito.mock(SensorDataDAO.class);
sensorNormalizer = Mockito.mock(SensorNormalizer.class);
Mockito.when(actorCache.getByDeviceId(Mockito.any())).thenReturn(Optional.of(newActor()));
Mockito.when(sensorCache.getByDeviceId(Mockito.any())).thenReturn(Optional.of(newSensor()));
@@ -192,10 +191,10 @@ public boolean wasCalled() {
}
@Override
- public void sendActorMessage(String location, String actorName, Integer duration) {
- assertEquals(this.location, location);
- assertEquals(this.actorName, actorName);
- assertEquals(this.duration, duration);
+ public void sendActorMessage(WateringData actorData) {
+ assertEquals(this.location, actorData.getLocation());
+ assertEquals(this.actorName, actorData.getName());
+ assertEquals(this.duration, actorData.getDuration());
wasCalled = true;
}
diff --git a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/testdata/DummyDataTest.java b/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/testdata/DummyDataTest.java
index 6fc10f9c..4e63b57f 100644
--- a/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/testdata/DummyDataTest.java
+++ b/Hogajama/hogajama-domain/src/test/java/com/gepardec/hogarama/testdata/DummyDataTest.java
@@ -8,8 +8,10 @@
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import com.gepardec.hogarama.domain.sensor.SensorData;
+import org.junit.jupiter.api.Test;
+
+import com.gepardec.hogarama.dao.dummydata.DummyData;
+import com.gepardec.hogarama.domain.sensor.SensorData;
public class DummyDataTest {
diff --git a/Hogajama/hogajama-rs/src/main/java/com/gepardec/hogarama/rest/ActorApiImpl.java b/Hogajama/hogajama-rs/src/main/java/com/gepardec/hogarama/rest/ActorApiImpl.java
index 66bfe322..96d8ab71 100644
--- a/Hogajama/hogajama-rs/src/main/java/com/gepardec/hogarama/rest/ActorApiImpl.java
+++ b/Hogajama/hogajama-rs/src/main/java/com/gepardec/hogarama/rest/ActorApiImpl.java
@@ -1,20 +1,21 @@
package com.gepardec.hogarama.rest;
+import com.gepardec.hogarama.domain.watering.WateringData;
+import com.gepardec.hogarama.domain.watering.WateringService;
+
import jakarta.inject.Inject;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.SecurityContext;
-import com.gepardec.hogarama.domain.watering.ActorControlService;
-
public class ActorApiImpl implements ActorApi {
@Inject
- ActorControlService pumpService;
+ WateringService wateringService;
@Override
public Response sendActorMessage(String location, String actorName, Integer duration,
SecurityContext securityContext) {
- pumpService.sendActorMessage(location, actorName, duration);
+ wateringService.sendActorMessage(new WateringData(actorName, location, duration));
return Response.ok().build();
}
}
diff --git a/Hogajama/hogajama-rs/src/main/java/com/gepardec/hogarama/rest/SensorApiImpl.java b/Hogajama/hogajama-rs/src/main/java/com/gepardec/hogarama/rest/SensorApiImpl.java
index 84ba3156..ea0476d8 100644
--- a/Hogajama/hogajama-rs/src/main/java/com/gepardec/hogarama/rest/SensorApiImpl.java
+++ b/Hogajama/hogajama-rs/src/main/java/com/gepardec/hogarama/rest/SensorApiImpl.java
@@ -29,11 +29,11 @@ public class SensorApiImpl implements SensorApi, Serializable {
private WateringDAO wateringDAO;
@Inject
- private SensorNamesCache sensorNamesCache;
+ private SensorNamesCache sensorCache;
@Override
public Response getAllSensors(SecurityContext securityContext) {
- return Response.ok(sensorNamesCache.getSensorNames()).build();
+ return Response.ok(sensorCache.getSensors()).build();
}
@@ -70,7 +70,7 @@ public Response getAllWateringDataMaxNumber(Boolean onlyDataFromToday, Integer m
@Override
public Response getLocationBySensorName(String sensorName, SecurityContext securityContext) {
- return Response.ok(habaramaDAO.getLocationBySensorName(sensorName)).build();
+ return Response.ok(sensorCache.getLocationBySensorName(sensorName)).build();
}
private Date getTodayStartTime() {
diff --git a/Hogajama/hogajama-services/pom.xml b/Hogajama/hogajama-services/pom.xml
index bfa8950f..4c2be856 100644
--- a/Hogajama/hogajama-services/pom.xml
+++ b/Hogajama/hogajama-services/pom.xml
@@ -21,6 +21,10 @@
org.mongodb.morphia
morphia
+
+ org.apache.commons
+ commons-collections4
+
org.junit.jupiter
junit-jupiter
diff --git a/Hogajama/hogajama-services/src/main/java/com/gepardec/hogarama/service/ActorControlServiceImpl.java b/Hogajama/hogajama-services/src/main/java/com/gepardec/hogarama/service/ActorControlServiceImpl.java
index ca1ae1d9..4dd7f762 100644
--- a/Hogajama/hogajama-services/src/main/java/com/gepardec/hogarama/service/ActorControlServiceImpl.java
+++ b/Hogajama/hogajama-services/src/main/java/com/gepardec/hogarama/service/ActorControlServiceImpl.java
@@ -1,50 +1,32 @@
package com.gepardec.hogarama.service;
-import java.util.Date;
import java.util.Optional;
-import jakarta.inject.Inject;
-
import org.json.JSONObject;
-import org.mongodb.morphia.Datastore;
import org.slf4j.Logger;
-import com.gepardec.hogarama.domain.metrics.Metrics;
import com.gepardec.hogarama.domain.watering.ActorControlService;
import com.gepardec.hogarama.domain.watering.WateringData;
import com.gepardec.hogarama.mocks.cli.MqttClient;
-public class ActorControlServiceImpl implements ActorControlService {
+import jakarta.inject.Inject;
- @Inject
- private Datastore db;
+public class ActorControlServiceImpl implements ActorControlService {
@Inject
private Logger log;
@Override
- public void sendActorMessage(String location, String actorName, Integer duration) {
+ public void sendActorMessage(WateringData actorData) {
- log.info("sendActorMessage: location: {}, actorName: {}, duration: {}", location, actorName, duration);
- checkParametersOrFail(location, actorName, duration);
+ log.info("sendActorMessage: {}", actorData.toString());
MqttClient mqttClient = new MqttClient().defaultConnection().
- withTopic(Optional.ofNullable(System.getenv("AMQ_TOPICS")).orElse("actor." + location + "." + actorName)).
+ withTopic(Optional.ofNullable(System.getenv("AMQ_TOPICS")).orElse("actor." + actorData.getLocation() + "." + actorData.getName())).
build();
-
-
- WateringData data = new WateringData(new Date(), actorName, location, duration);
- db.save(data);
- JSONObject json = new JSONObject(data);
- String message = json.toString();
- mqttClient.connectAndPublish(message);
+
+ mqttClient.connectAndPublish(new JSONObject(actorData).toString());
}
- protected void checkParametersOrFail(String location, String actorName, Integer duration) {
- if (location == null || location.isEmpty() || actorName == null || actorName.isEmpty() || duration == null) {
- Metrics.exceptionsThrown.labels("hogarama_services", "IllegalArgumentException", "ActorServiceImpl.checkParametersOrFail").inc();
- throw new IllegalArgumentException(String.format("Supplied parameters '%s', '%s', '%s' must not be empty or null", location, actorName, duration));
- }
- }
}
diff --git a/Hogajama/hogajama-services/src/main/java/com/gepardec/hogarama/service/dao/SensorDataDAOImpl.java b/Hogajama/hogajama-services/src/main/java/com/gepardec/hogarama/service/dao/SensorDataDAOImpl.java
index 59dfb35e..92a140da 100644
--- a/Hogajama/hogajama-services/src/main/java/com/gepardec/hogarama/service/dao/SensorDataDAOImpl.java
+++ b/Hogajama/hogajama-services/src/main/java/com/gepardec/hogarama/service/dao/SensorDataDAOImpl.java
@@ -1,50 +1,28 @@
package com.gepardec.hogarama.service.dao;
-import com.gepardec.hogarama.domain.metrics.Metrics;
-import com.gepardec.hogarama.domain.sensor.SensorDataDAO;
-import com.gepardec.hogarama.domain.sensor.SensorData;
-import com.gepardec.hogarama.domain.sensor.SensorNormalizer;
-import com.mongodb.client.DistinctIterable;
-import com.mongodb.client.MongoCollection;
-import com.mongodb.client.MongoIterable;
+import java.util.Date;
+import java.util.List;
+
import org.apache.commons.lang3.StringUtils;
-import org.bson.Document;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.query.FindOptions;
import org.mongodb.morphia.query.Query;
+import com.gepardec.hogarama.annotations.MongoDAO;
+import com.gepardec.hogarama.domain.metrics.Metrics;
+import com.gepardec.hogarama.domain.sensor.SensorData;
+import com.gepardec.hogarama.domain.sensor.SensorDataDAO;
+import com.gepardec.hogarama.domain.watering.WateringData;
+
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
-import jakarta.persistence.NoResultException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+@MongoDAO
@ApplicationScoped
public class SensorDataDAOImpl implements SensorDataDAO {
@Inject
private Datastore datastore;
- @Inject
- private MongoCollection collection;
-
- @Inject
- SensorNormalizer sensorNormalizer;
-
- @Override
- public List getAllSensors() {
-
- DistinctIterable sensors = collection.distinct("sensorName", String.class);
- Metrics.requestsTotal.labels("hogajama_services", "getAllSensors").inc();
- return createResultList(sensors);
- }
-
- private List createResultList(MongoIterable sourceIterable) {
-
- List result = new ArrayList<>();
- sourceIterable.into(result);
- return result;
- }
@Override
public List getAllData(Integer maxNumber, String sensorName, Date from, Date to) {
@@ -55,7 +33,7 @@ public List getAllData(Integer maxNumber, String sensorName, Date fr
limitQueryByDate(from, to, query);
FindOptions numberLimitOption = getFindOptionsWithMaxNumber(maxNumber);
- return sensorNormalizer.normalize(query.asList(numberLimitOption));
+ return query.asList(numberLimitOption);
}
private void limitQueryBySensor(String sensorName, Query query) {
@@ -84,28 +62,14 @@ private FindOptions getFindOptionsWithMaxNumber(Integer maxNumber) {
return findOptions;
}
- @Override
- /**
- * TODO: rewrite query and logic with single result
- */
- public String getLocationBySensorName(String sensorName) {
-
- Metrics.requestsTotal.labels("hogajama_services", "getLocationBySensorName").inc();
- Query query = datastore.createQuery(SensorData.class).order("-_id");
- limitQueryBySensor(sensorName, query);
-
- FindOptions numberLimitOption = getFindOptionsWithMaxNumber(1);
- List sensors = query.asList(numberLimitOption);
- if (!sensors.isEmpty()) {
- return sensors.get(0).getLocation();
- } else {
- Metrics.exceptionsThrown.labels("hogarama_services", "NoResultException", "SensorDAOImple.getLocationBySensorName").inc();
- throw new NoResultException("Could not find location by sensorName");
- }
+ public void save(SensorData data){
+ datastore.save(data);
}
- public void save(SensorData data){
+ @Override
+ public void saveActorEvent(WateringData data) {
datastore.save(data);
+
}
}
diff --git a/Hogajama/hogajama-services/src/main/java/com/gepardec/hogarama/service/dao/WateringSetup.java b/Hogajama/hogajama-services/src/main/java/com/gepardec/hogarama/service/dao/WateringSetup.java
index eb714a3d..ddd5bf12 100644
--- a/Hogajama/hogajama-services/src/main/java/com/gepardec/hogarama/service/dao/WateringSetup.java
+++ b/Hogajama/hogajama-services/src/main/java/com/gepardec/hogarama/service/dao/WateringSetup.java
@@ -2,12 +2,15 @@
import jakarta.enterprise.inject.Produces;
import jakarta.inject.Inject;
+import jakarta.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.gepardec.hogarama.annotations.DummyDAO;
import com.gepardec.hogarama.annotations.MongoDAO;
import com.gepardec.hogarama.annotations.PostgresDAO;
+import com.gepardec.hogarama.domain.sensor.SensorDataDAO;
import com.gepardec.hogarama.domain.unitmanagement.dao.PostgresWateringRuleDAO;
import com.gepardec.hogarama.domain.watering.WateringRuleDAO;
@@ -21,14 +24,20 @@ public class WateringSetup {
@Inject @PostgresDAO
private PostgresWateringRuleDAO postgresDAO;
+ @Inject @MongoDAO
+ private SensorDataDAO mongoSensorDataDAO;
+
+ @Inject @DummyDAO
+ private SensorDataDAO dummySensorDataDAO;
+
@Produces
WateringRuleDAO createWateringRuleDao() {
switch (System.getProperty("hogarama.rules.storage", "postgres")) {
case "postgres":
- LOG.debug("Produce PostgresWateringRuleDAO");
+ LOG.info("Produce PostgresWateringRuleDAO");
return postgresDAO;
case "mongo":
- LOG.debug("Produce MongoWateringRuleDAO");
+ LOG.info("Produce MongoWateringRuleDAO");
return mongoDAO;
default:
throw new RuntimeException(System.getProperty("hogarama.rules.storage", "postgres")
@@ -36,4 +45,20 @@ WateringRuleDAO createWateringRuleDao() {
+ " Allowed values are 'postgres' or 'mongo'.");
}
}
+
+ @Produces
+ SensorDataDAO createSensorDataDAO() {
+ switch (System.getProperty("hogarama.sensordata.storage", "mongo")) {
+ case "mongo":
+ LOG.info("Produce mongoSensorDataDAO");
+ return mongoSensorDataDAO;
+ case "dummy":
+ LOG.info("Produce dummySensorDataDAO");
+ return dummySensorDataDAO;
+ default:
+ throw new RuntimeException(System.getProperty("hogarama.sensordata.storage", "mongo")
+ + " is not valid for the System Property hogarama.sensordata.storage."
+ + " Allowed values are 'mongo' or 'dummy'.");
+ }
+ }
}
diff --git a/Hogajama/hogajama-services/src/test/java/com/gepardec/hogarama/service/ActorControlServiceImplTest.java b/Hogajama/hogajama-services/src/test/java/com/gepardec/hogarama/domain/watering/ActorControlServiceImplTest.java
similarity index 72%
rename from Hogajama/hogajama-services/src/test/java/com/gepardec/hogarama/service/ActorControlServiceImplTest.java
rename to Hogajama/hogajama-services/src/test/java/com/gepardec/hogarama/domain/watering/ActorControlServiceImplTest.java
index 3e919957..ff98c20b 100644
--- a/Hogajama/hogajama-services/src/test/java/com/gepardec/hogarama/service/ActorControlServiceImplTest.java
+++ b/Hogajama/hogajama-services/src/test/java/com/gepardec/hogarama/domain/watering/ActorControlServiceImplTest.java
@@ -1,4 +1,4 @@
-package com.gepardec.hogarama.service;
+package com.gepardec.hogarama.domain.watering;
import static org.junit.jupiter.api.Assertions.fail;
@@ -8,18 +8,21 @@
import org.mockito.InjectMocks;
import org.mockito.junit.jupiter.MockitoExtension;
+import com.gepardec.hogarama.domain.watering.WateringData;
+import com.gepardec.hogarama.domain.watering.WateringService;
+
@ExtendWith(MockitoExtension.class)
public class ActorControlServiceImplTest {
@InjectMocks
- private ActorControlServiceImpl actorService;
+ private WateringService actorService;
@Test
public void testCheckParametersOrFailOk() {
String sensorName = "Palmlilie";
String location = "Vienna";
- actorService.checkParametersOrFail(location, sensorName, 5);
+ actorService.checkParametersOrFail(new WateringData(sensorName, location, 5));
}
@Test
@@ -28,7 +31,7 @@ public void testCheckParametersOrFailNoParameters() {
String location = null;
try {
- actorService.checkParametersOrFail(location, sensorName, 5);
+ actorService.checkParametersOrFail(new WateringData(sensorName, location, 5));
fail("Expected exception due to missing parameters.");
} catch(IllegalArgumentException e) {
Assertions.assertEquals("Supplied parameters 'null', 'null', '5' must not be empty or null", e.getMessage());
@@ -41,7 +44,7 @@ public void testCheckParametersOrFailEmptyParameters() {
String location = "";
try {
- actorService.checkParametersOrFail(location, sensorName, 5);
+ actorService.checkParametersOrFail(new WateringData(sensorName, location, 5));
fail("Expected exception due to missing parameters.");
} catch(IllegalArgumentException e) {
Assertions.assertEquals("Supplied parameters '', '', '5' must not be empty or null", e.getMessage());
diff --git a/Hogajama/pom.xml b/Hogajama/pom.xml
index dc253f14..3d4c62b6 100644
--- a/Hogajama/pom.xml
+++ b/Hogajama/pom.xml
@@ -38,8 +38,8 @@
28.0.1.Final
- 1.8
- 1.8
+ 17
+ 17
20200518
1.4
@@ -335,8 +335,8 @@
maven-compiler-plugin
${maven-compiler-plugin.version}
- 1.8
- 1.8
+ ${maven.compiler.source}
+ ${maven.compiler.target}