Skip to content

Commit

Permalink
Feature NOMONGO to use dummy implementation instead of Mongo for sens…
Browse files Browse the repository at this point in the history
…or data and actor events
  • Loading branch information
ErhardSiegl committed May 10, 2024
1 parent 8daf383 commit dcaa336
Show file tree
Hide file tree
Showing 24 changed files with 204 additions and 153 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/system-property=hogarama.sensordata.storage:add(value="dummy")
10 changes: 5 additions & 5 deletions Hogajama/hogajama-domain/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,11 @@
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
</dependency>

<!-- Test Start -->
<dependency>
<groupId>org.assertj</groupId>
Expand All @@ -110,11 +115,6 @@
<artifactId>mockito-junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<scope>test</scope>
</dependency>
<!-- Test End -->
</dependencies>

Expand Down
Original file line number Diff line number Diff line change
@@ -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 {

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.gepardec.hogarama.testdata;
package com.gepardec.hogarama.dao.dummydata;

import java.util.ArrayList;
import java.util.Calendar;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<SensorData> sensorDatas;
Expand All @@ -32,14 +37,6 @@ public DummySensorDAO(List<SensorData> sensorDatas) {
this.sensorDatas = sensorDatas;
}

@Override
public List<String> getAllSensors() {
return CollectionUtils.emptyIfNull(sensorDatas)
.stream()
.map(SensorData::getSensorName).distinct()
.collect(Collectors.toList());
}

@Override
public List<SensorData> getAllData(Integer maxNumber, String sensorName, Date from, Date to) {
Comparator<SensorData> comp = new Comparator<SensorData>() {
Expand All @@ -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);
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.gepardec.hogarama.dao;
package com.gepardec.hogarama.dao.dummydata;

import java.util.ArrayDeque;
import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<SensorData> {
Expand All @@ -13,7 +11,7 @@ public class SensorDataPredicate implements Predicate<SensorData> {
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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
import java.util.Date;
import java.util.List;

import com.gepardec.hogarama.domain.watering.WateringData;

public interface SensorDataDAO {

List<String> getAllSensors();
List<SensorData> getAllData(Integer maxNumber, String sensorName, Date from, Date to);
String getLocationBySensorName(String sensorName);

void save(SensorData sensorData);

void saveActorEvent(WateringData data);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -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<String> sensorNames = new ArrayList<>();
private List<Sensor> 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<String> getSensorNames() {
public List<String> 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<Sensor> getSensor(String sensorName) {
return sensors.stream().filter(s -> s.getName().equals(sensorName)).findFirst();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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);

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 + "]";
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import org.slf4j.LoggerFactory;

import jakarta.inject.Inject;

import java.util.Date;
import java.util.Optional;

public class WateringService {
Expand Down Expand Up @@ -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));
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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 {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
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;
import com.gepardec.hogarama.domain.unitmanagement.entity.Actor;
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;
Expand Down Expand Up @@ -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()));
Expand Down Expand Up @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down
Loading

0 comments on commit dcaa336

Please sign in to comment.