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}