Prechádzať zdrojové kódy

added unit and sensor name to the report

Lukas Cerny 4 rokov pred
rodič
commit
5a287b8248

+ 1 - 0
src/main/java/cz/senslog/watchdog/app/Application.java

@@ -61,6 +61,7 @@ public class Application extends Thread {
 
         Scheduler scheduler = Scheduler.createBuilder()
                     .addTask(watcher::check, period, startAtTime)
+//                    .addTask(watcher::check, period)
                 .build();
 
         scheduler.start();

+ 2 - 2
src/main/java/cz/senslog/watchdog/config/MonitoredObjectsConfig.java

@@ -149,8 +149,8 @@ public class MonitoredObjectsConfig {
 
     public Optional<Long> getInterval(Record record) {
         Source source = record.getSource();
-        String unitId = String.valueOf(source.getUnitId());
-        String sensorId = String.valueOf(source.getSensorId());
+        String unitId = String.valueOf(source.getUnit().getId());
+        String sensorId = String.valueOf(source.getSensor().getId());
         Unit unit = units.get(unitId);
         if (unit == null) {
             return Optional.empty();

+ 4 - 4
src/main/java/cz/senslog/watchdog/domain/ObservationInfo.java

@@ -14,8 +14,8 @@ public class ObservationInfo implements Record {
     private final Source source;
     private final OffsetDateTime timestamp;
 
-    public ObservationInfo(long unitId, long sensorId, OffsetDateTime timestamp) {
-        this.source = new Source(unitId, sensorId);
+    public ObservationInfo(Unit unit, Sensor sensor, OffsetDateTime timestamp) {
+        this.source = new Source(unit, sensor);
         this.timestamp = timestamp;
     }
 
@@ -38,8 +38,8 @@ public class ObservationInfo implements Record {
     @Override
     public void writeRow(TableRowWriter writer) {
         writer
-                .cell(valueOf(source.getUnitId()))
-                .cell(valueOf(source.getSensorId()))
+                .cell(String.format("%s (%s)", source.getUnit().getName(), source.getUnit().getId()))
+                .cell(String.format("%s (%s)", source.getSensor().getName(), source.getSensor().getId()))
                 .cell(valueOf(timestamp))
                 .end();
     }

+ 43 - 0
src/main/java/cz/senslog/watchdog/domain/Sensor.java

@@ -0,0 +1,43 @@
+package cz.senslog.watchdog.domain;
+
+import java.util.Objects;
+
+public class Sensor {
+
+    private final long id;
+    private final String name;
+
+    public Sensor(long id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        Sensor sensor = (Sensor) o;
+        return id == sensor.id;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id);
+    }
+
+    @Override
+    public String toString() {
+        return "Sensor{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                '}';
+    }
+}

+ 17 - 15
src/main/java/cz/senslog/watchdog/domain/Source.java

@@ -4,20 +4,22 @@ import java.util.Objects;
 
 public class Source {
 
-    private final long unitId;
-    private final long sensorId;
-
-    public Source(long unitId, long sensorId) {
-        this.unitId = unitId;
-        this.sensorId = sensorId;
+    private final Unit unit;
+    private final Sensor sensor;
+
+    public Source(Unit unit, Sensor sensor) {
+        Objects.requireNonNull(unit);
+        Objects.requireNonNull(sensor);
+        this.unit = unit;
+        this.sensor = sensor;
     }
 
-    public long getUnitId() {
-        return unitId;
+    public Unit getUnit() {
+        return unit;
     }
 
-    public long getSensorId() {
-        return sensorId;
+    public Sensor getSensor() {
+        return sensor;
     }
 
     @Override
@@ -25,20 +27,20 @@ public class Source {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         Source source = (Source) o;
-        return unitId == source.unitId &&
-                sensorId == source.sensorId;
+        return unit.equals(getUnit()) &&
+                sensor.equals(source.sensor);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(unitId, sensorId);
+        return Objects.hash(unit.getId(), sensor.getId());
     }
 
     @Override
     public String toString() {
         return "Source{" +
-                "unitId=" + unitId +
-                ", sensorId=" + sensorId +
+                "unit=" + unit +
+                ", sensor=" + sensor +
                 '}';
     }
 }

+ 43 - 0
src/main/java/cz/senslog/watchdog/domain/Unit.java

@@ -0,0 +1,43 @@
+package cz.senslog.watchdog.domain;
+
+import java.util.Objects;
+
+public class Unit {
+
+    private final long id;
+    private final String name;
+
+    public Unit(long id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        Unit unit = (Unit) o;
+        return id == unit.id;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id);
+    }
+
+    @Override
+    public String toString() {
+        return "Unit{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                '}';
+    }
+}

+ 11 - 8
src/main/java/cz/senslog/watchdog/messagebroker/email/EmailMessageBroker.java

@@ -2,13 +2,10 @@ package cz.senslog.watchdog.messagebroker.email;
 
 import cz.senslog.watchdog.config.EmailMessageBrokerConfig;
 import cz.senslog.watchdog.config.MessageBrokerType;
-import cz.senslog.watchdog.domain.ObservationInfo;
-import cz.senslog.watchdog.domain.SimpleReport;
-import cz.senslog.watchdog.domain.StatusReport;
+import cz.senslog.watchdog.domain.*;
 import cz.senslog.watchdog.messagebroker.MessageBroker;
 import cz.senslog.watchdog.messagebroker.MessageBrokerHandler;
 import cz.senslog.watchdog.messagebroker.MessageStatus;
-import cz.senslog.watchdog.domain.Report;
 import cz.senslog.watchdog.messagebroker.writer.HtmlTableWriter;
 import cz.senslog.watchdog.messagebroker.writer.TableWriter;
 import cz.senslog.watchdog.provider.Record;
@@ -66,16 +63,22 @@ public class EmailMessageBroker implements MessageBroker {
         StringBuilder content = new StringBuilder();
 
         TableWriter tableWriter = HtmlTableWriter.createWithHeader("width: 100%;", "background-color: #dddddd")
-                .cell("unitId").cell("sensorId").cell("timestamp").cell("reported").cell("status").end();
+                .cell("unitName (unitId)").cell("sensorName (sensorId)").cell("timestamp").cell("reported").cell("status").end();
 
         String reportedTime = report.getCreated().format(ofPattern("yyyy-MM-dd HH:mm:ss"));
         final String rowStyle = "border: 1px solid #dddddd; text-align: left; padding: 8px;";
         for (SimpleReport simpleReport : report.getReports()) {
             if (simpleReport.getRecord() instanceof ObservationInfo) {
                 ObservationInfo observation = (ObservationInfo)simpleReport.getRecord();
-                tableWriter.row(rowStyle + (simpleReport.getStatus().equals(StatusReport.OK) ? "background-color: #CCFFCC" : "background-color: #FFCCCC"))
-                            .cell(String.valueOf(observation.getSource().getUnitId()), rowStyle)
-                            .cell(String.valueOf(observation.getSource().getSensorId()), rowStyle)
+                Source source = observation.getSource();
+
+                boolean isOk = simpleReport.getStatus().equals(StatusReport.OK);
+                String unitCell = String.format("%s (%s)", source.getUnit().getName(), source.getUnit().getId());
+                String sensorCell = String.format("%s (%s)", source.getSensor().getName(), source.getSensor().getId());
+
+                tableWriter.row(rowStyle + (isOk ? "background-color: #CCFFCC" : "background-color: #FFCCCC"))
+                            .cell(unitCell, rowStyle)
+                            .cell(sensorCell, rowStyle)
                             .cell(observation.getTimestamp().toString(), rowStyle)
                             .cell(reportedTime, rowStyle)
                             .cell(simpleReport.getStatus().name(), rowStyle)

+ 4 - 2
src/main/java/cz/senslog/watchdog/provider/database/SensLogRepository.java

@@ -1,6 +1,8 @@
 package cz.senslog.watchdog.provider.database;
 
 import cz.senslog.watchdog.domain.ObservationInfo;
+import cz.senslog.watchdog.domain.Sensor;
+import cz.senslog.watchdog.domain.Unit;
 import org.jdbi.v3.core.Jdbi;
 
 import java.time.OffsetDateTime;
@@ -39,8 +41,8 @@ public class SensLogRepository {
                 )
                         .bind("groupName", groupName)
                         .map((rs, ctx) -> new ObservationInfo(
-                                rs.getLong("unit_id"),
-                                rs.getLong("sensor_id"),
+                                new Unit(rs.getLong("unit_id"), "unknown"),
+                                new Sensor(rs.getLong("sensor_id"), "unknown"),
                                 OffsetDateTime.parse(rs.getString("timestamp"), DATE_TIME_FORMATTER)
                         )).list()
         );

+ 89 - 18
src/main/java/cz/senslog/watchdog/provider/ws/WebServiceDataProvider.java

@@ -2,9 +2,12 @@ package cz.senslog.watchdog.provider.ws;
 
 import com.google.gson.reflect.TypeToken;
 import cz.senslog.watchdog.config.WebServiceConfig;
+import cz.senslog.watchdog.domain.Sensor;
+import cz.senslog.watchdog.domain.Unit;
 import cz.senslog.watchdog.provider.DataProvider;
 import cz.senslog.watchdog.domain.ObservationInfo;
 import cz.senslog.watchdog.provider.Record;
+import cz.senslog.watchdog.util.Tuple;
 import cz.senslog.watchdog.util.http.HttpClient;
 import cz.senslog.watchdog.util.http.HttpRequest;
 import cz.senslog.watchdog.util.http.HttpResponse;
@@ -19,12 +22,17 @@ import java.util.*;
 
 import static cz.senslog.watchdog.util.json.BasicJson.jsonToObject;
 import static java.time.format.DateTimeFormatter.ofPattern;
+import static java.util.Collections.emptyList;
+import static java.util.Collections.emptyMap;
 
 public class WebServiceDataProvider implements DataProvider {
 
     private static final Logger logger = LogManager.getLogger(WebServiceDataProvider.class);
 
-    private static final DateTimeFormatter PATTERN = ofPattern("yyyy-MM-dd HH:mm:ssX");
+    private static final String DEFAULT_NAME = "unknown";
+    private static final Tuple<String, Map<Long, String>> DEFAULT_UNIT_INFO = Tuple.of(DEFAULT_NAME, emptyMap());
+
+    private static final DateTimeFormatter TIMESTAMP_PATTERN = ofPattern("yyyy-MM-dd HH:mm:ssX");
 
     private final HttpClient httpClient = HttpClient.newHttpClient();
     private final WebServiceConfig config;
@@ -33,9 +41,60 @@ public class WebServiceDataProvider implements DataProvider {
         this.config = config;
     }
 
-    @Override
-    public List<Record> getLastRecords() {
 
+    /* Map<unitId, Tuple<unitName, Map<sensorId, sensorName>>> */
+    private Map<Long, Tuple<String, Map<Long, String>>> loadUnitsInfo() {
+        HttpRequest request = HttpRequest.newBuilder().GET()
+                .url(URLBuilder.newBuilder(config.getUrl(), "/DataService")
+                        .addParam("Operation", "GetUnits")
+                        .addParam("group", config.getGroup())
+                        .addParam("user", config.getUser())
+                        .build()
+                ).build();
+        logger.info("Getting new data from the server: {}.", request.getUrl());
+
+        HttpResponse response = httpClient.send(request);
+        logger.info("Received data with the status '{}' from the server {}.", response.getStatus(), request.getUrl());
+
+        if (response.isError()) {
+            logger.error("code: {}, message: {}", response.getStatus(), response.getBody());
+            return emptyMap();
+        }
+
+        Map<Long, Tuple<String, Map<Long, String>>> unitsInfo = new HashMap<>();
+
+        final Type unitInfoType = new TypeToken<Collection<Map<String, Object>>>() {}.getType();
+        List<Map<String, Object>> unitInfoList = jsonToObject(response.getBody(), unitInfoType);
+        for (Map<String, Object> unitInfo : unitInfoList) {
+            Object unitObj = unitInfo.get("unit");
+            if (unitObj instanceof Map) {
+                Map<?, ?> unitMap = (Map<?, ?>)unitObj;
+                String unitName = unitMap.get("description").toString();
+                long unitId = ((Double)unitMap.get("unitId")).longValue();
+
+                Map<Long, String> resultSensorInfo = new HashMap<>();
+                Object sensorsObj = unitInfo.get("sensors");
+                if (sensorsObj instanceof List) {
+                    List<?> sensorsList = (List<?>)sensorsObj;
+                    for (Object sensorInfoObj : sensorsList) {
+                        if (sensorInfoObj instanceof Map) {
+                            Map<?, ?> sensorMap = (Map<?, ?>)sensorInfoObj;
+                            String sensorName = sensorMap.get("sensorName").toString();
+                            long sensorId = ((Double)sensorMap.get("sensorId")).longValue();
+                            resultSensorInfo.put(sensorId, sensorName);
+                        }
+                    }
+                }
+
+                unitsInfo.put(unitId, Tuple.of(unitName, resultSensorInfo));
+            }
+
+        }
+
+        return unitsInfo;
+    }
+
+    private List<Map<String, Object>> loadLastObservations() {
         HttpRequest request = HttpRequest.newBuilder().GET()
                 .url(URLBuilder.newBuilder(config.getUrl(), "/SensorService")
                         .addParam("Operation", "GetLastObservations")
@@ -48,24 +107,36 @@ public class WebServiceDataProvider implements DataProvider {
         HttpResponse response = httpClient.send(request);
         logger.info("Received data with the status '{}' from the server {}.", response.getStatus(), request.getUrl());
 
-        if (response.isOk()) {
-            String jsonBody = response.getBody();
-            Type lastObsType = new TypeToken<Collection<Map<String, Object>>>() {}.getType();
-            List<Map<String, Object>> lastObservations = jsonToObject(jsonBody, lastObsType);
-            List<Record> observations = new ArrayList<>(lastObservations.size());
-            for (Map<String, Object> observationMap : lastObservations) {
-                long unitId = ((Double)observationMap.get("unitId")).longValue();
-                long sensorId = ((Double)observationMap.get("sensorId")).longValue();
-                String timestampStr = observationMap.get("timeStamp").toString();
-                OffsetDateTime timestamp = OffsetDateTime.parse(timestampStr, PATTERN);
-                observations.add(new ObservationInfo(unitId, sensorId, timestamp));
-            }
-            return observations;
-        } else {
+        if (response.isError()) {
             logger.error("code: {}, message: {}", response.getStatus(), response.getBody());
+            return emptyList();
         }
 
-        return Collections.emptyList();
+        final Type lastObsType = new TypeToken<Collection<Map<String, Object>>>() {}.getType();
+        return jsonToObject(response.getBody(), lastObsType);
+    }
+
+    @Override
+    public List<Record> getLastRecords() {
+
+        // Map<unitId, Tuple<unitName, Map<sensorId, sensorName>>>
+        Map<Long, Tuple<String, Map<Long, String>>> unitsInfo = loadUnitsInfo();
+        List<Map<String, Object>> lastObservations = loadLastObservations();
+
+        List<Record> observations = new ArrayList<>(lastObservations.size());
+        for (Map<String, Object> observationMap : lastObservations) {
+
+            long unitId = ((Double)observationMap.get("unitId")).longValue();
+            long sensorId = ((Double)observationMap.get("sensorId")).longValue();
+            String timestampStr = observationMap.get("timeStamp").toString();
+            OffsetDateTime timestamp = OffsetDateTime.parse(timestampStr, TIMESTAMP_PATTERN);
+
+            Tuple<String, Map<Long, String>> unitInfo = unitsInfo.getOrDefault(unitId, DEFAULT_UNIT_INFO);
+            Unit unit = new Unit(unitId, unitInfo.getItem1());
+            Sensor sensor = new Sensor(sensorId, unitInfo.getItem2().getOrDefault(sensorId, DEFAULT_NAME));
+            observations.add(new ObservationInfo(unit, sensor, timestamp));
+        }
+        return observations;
     }
 
 }