From 39392a5202ecdaaaba157c206d4a71f643bb0b45 Mon Sep 17 00:00:00 2001
From: Frank Rohde <frank.rohde@tu-dresden.de>
Date: Thu, 23 Sep 2021 22:13:55 +0200
Subject: [PATCH] GenericSensorValueProcessor receives JSON-SensorPositionEvent
 and transforms it into Protobuf-SensorPositionEvent and
 Internal-PositionEvent fixed IndexOutOfBounds-Exception in
 PositionMonitoringController-Initcode eventFilter verification-code uses
 correct return-values

---
 .../eventfilter/eventFilter.java              |  5 +-
 src/main/java/ipos/project/MainApp.java       |  2 +-
 .../GenericSensorValueProcessor.java          | 28 ++++++
 .../Service/GenericSensorTransformer.java     | 98 +++++++++++++++++++
 .../api/MqttPositionHandler.java              | 19 +++-
 .../UseCaseController/PositionMonitoring.java | 22 ++---
 6 files changed, 155 insertions(+), 19 deletions(-)
 create mode 100644 src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java
 create mode 100644 src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java

diff --git a/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java b/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java
index 653c24b..164eb42 100644
--- a/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java
+++ b/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java
@@ -107,15 +107,16 @@ public class eventFilter {
         boolean flag = false; //false for pass, true for block
         if (null == event.getPlacing() || null == event.getPlacing().getPosition() || null == event.getPlacing().getPosition().getPoint()){
             System.out.println("EventFilter: Warning: Received event with unknown Position. Sensor-id: " + event.getSensorId());
-            return false;
+            return true;
         }
         if (null == lObject){
             System.out.println("EventFilter: Warning: Received event from sensor with unknown sensor-id: " + event.getSensorId());
-            return false;
+            return true;
         }
         Agent agent = lObject.getAgent();
         if (null == agent){
             System.out.println("EventFilter: Warning: Received event for sensor-id with unknown agent. Sensor-id: " + lObject.getId());
+            return true;
         }
 
         System.out.println("Filter structure: " + filterStructure[0] + ", " + filterStructure[1] + ", " + filterStructure[2] + ", " + filterStructure[3] + ", " + filterStructure[4] + ", " + filterStructure[5] + ", " + filterStructure[6] + ", " + filterStructure[7]);
diff --git a/src/main/java/ipos/project/MainApp.java b/src/main/java/ipos/project/MainApp.java
index 62704a8..9de63c5 100644
--- a/src/main/java/ipos/project/MainApp.java
+++ b/src/main/java/ipos/project/MainApp.java
@@ -14,7 +14,7 @@ import java.text.ParseException;
 @EnableJpaRepositories("ipos.project.DataModellntegration.iPos_Datamodel.impl")
 public class MainApp {
 	public static void main(String[] args) throws ParseException {
-		TestEventFilter.test();
+		// TestEventFilter.test();
 		SpringApplication.run(MainApp.class, args);
 	}
 }
diff --git a/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java b/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java
new file mode 100644
index 0000000..36fd606
--- /dev/null
+++ b/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java
@@ -0,0 +1,28 @@
+package ipos.project.SensorValueIntegration;
+
+import ipos.models.SimpleScene.IposPosition;
+import ipos.project.DataModellntegration.SimpleSceneIntegration.service.impl.ExternalPubServiceImpl;
+import ipos.project.mapper.ProtoJsonMap;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.stereotype.Component;
+
+@Component
+public class GenericSensorValueProcessor {
+    private final Logger LOG = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private ExternalPubServiceImpl mqttService;
+
+    @JmsListener(destination = "/positions", containerFactory = "jmsListenFactory")
+    public void receiveMessage(IposPosition pos) {
+        LOG.trace("Data integration get: " + pos);
+        // we can translate a class into a string using several methods: 1) `.toString()` 2) `JsonFormat` in `ProtoJsonMap`
+        String jsonPos = ProtoJsonMap.toJson(pos);
+        if (jsonPos != null) {
+            this.mqttService.publish("test51/subscribe/positions", jsonPos, 0, false);
+        }
+    }
+}
diff --git a/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java b/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java
new file mode 100644
index 0000000..f3c87c9
--- /dev/null
+++ b/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java
@@ -0,0 +1,98 @@
+package ipos.project.SensorValueIntegration.Service;
+
+import com.google.protobuf.ProtocolStringList;
+import ipos.models.GenericSensor;
+import ipos.models.SimpleScene;
+import ipos.project.DataModellntegration.iPos_Datamodel.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class GenericSensorTransformer {
+
+    private static IPos_DatamodelFactory modelFactory = IPos_DatamodelFactory.eINSTANCE;
+
+   private static List<String> toJavaStringList(ProtocolStringList protoList){
+        List<String> javaList = new ArrayList<String>();
+        for(int i = 0; i < protoList.size(); i++ ){
+            javaList.set(i, protoList.get(i));
+        }
+        return javaList;
+    }
+
+    public static SimpleScene.IposMonitoringRequest monReq_Internal2SScene(){
+        return null;
+    }
+
+    public static PositionEvent posEvent_GSensor2Internal(GenericSensor.SensorPositionEvent protoSensPosEvent) {
+        PositionEvent positionEvent = modelFactory.createPositionEvent();
+        positionEvent.setTimeStamp(protoSensPosEvent.getLastPosUpdate());
+        positionEvent.setSensorId(protoSensPosEvent.getSensorId());
+
+        // TODO: Zugriff auf Weltmodell ermöglichen um Bezugssystem-Objekt beschaffen zu können
+        positionEvent.setPlacing(
+                createPlacing(
+                        createPosition(
+                                createPoint3D(
+                                        protoSensPosEvent.getPosition().getPoint().getX(),
+                                        protoSensPosEvent.getPosition().getPoint().getY(),
+                                        protoSensPosEvent.getPosition().getPoint().getZ()
+                                ),
+                                protoSensPosEvent.getPosition().getAccuracy(),
+                                createReferenceSystem("ROOT", "ROOT", null)
+                        ),
+                        createOrientation(
+                                protoSensPosEvent.getOrientation().getX(),
+                                protoSensPosEvent.getOrientation().getY(),
+                                protoSensPosEvent.getOrientation().getZ(),
+                                protoSensPosEvent.getOrientation().getW()
+                        )
+                ));
+        return positionEvent;
+    }
+
+    private static ReferenceSystem createReferenceSystem(String name, String id, Placing origin){
+        ReferenceSystem refSystem = modelFactory.createReferenceSystem();
+        refSystem.setName(name);
+        refSystem.setId(id);
+        refSystem.setOrigin(origin);
+        return refSystem;
+    }
+
+    private static Placing createPlacing(Position position, Orientation orientation){
+        Placing placing = modelFactory.createPlacing();
+        placing.setPosition(position);
+        placing.setOrientation(orientation);
+        return placing;
+    }
+
+    private static Position createPosition(Point3D point3D, Float accuracy, ReferenceSystem refSystem){
+        Position position = modelFactory.createPosition();
+        position.setPoint(point3D);
+        Gaussian accrcy = modelFactory.createGaussian();
+        accrcy.setConfidenceInterval(accuracy);
+        position.setAccuracy(accrcy);
+        position.setReferenceSystem(refSystem);
+        return position;
+    }
+
+    private static Point3D createPoint3D(float x, float y, float z){
+        Point3D point3D = modelFactory.createPoint3D();
+        point3D.setX(x);
+        point3D.setY(y);
+        point3D.setZ(z);
+        return point3D;
+    }
+
+    private static Quaternion createOrientation(float x, float y, float z, float w){
+        Quaternion quaternion = modelFactory.createQuaternion();
+        quaternion.setX(x);
+        quaternion.setY(y);
+        quaternion.setZ(z);
+        quaternion.setW(w);
+        return quaternion;
+    }
+
+}
+
+
diff --git a/src/main/java/ipos/project/SensorValueIntegration/api/MqttPositionHandler.java b/src/main/java/ipos/project/SensorValueIntegration/api/MqttPositionHandler.java
index 900e8bd..f680e20 100644
--- a/src/main/java/ipos/project/SensorValueIntegration/api/MqttPositionHandler.java
+++ b/src/main/java/ipos/project/SensorValueIntegration/api/MqttPositionHandler.java
@@ -1,7 +1,11 @@
 package ipos.project.SensorValueIntegration.api;
 
 import com.google.protobuf.InvalidProtocolBufferException;
+import ipos.models.GenericSensor.SensorPositionEvent;
 import ipos.models.SimpleScene.IposPosition;
+import ipos.models.GenericSensor.SensorEventWrapper;
+import ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent;
+import ipos.project.SensorValueIntegration.Service.GenericSensorTransformer;
 import ipos.project.config.mqtt.Handler;
 import ipos.project.config.mqtt.MqttListener;
 import ipos.project.mapper.ProtoJsonMap;
@@ -13,7 +17,7 @@ import org.springframework.jms.core.JmsTemplate;
 
 
 // subscribe to the topic
-@MqttListener("test51/publish/positions")
+@MqttListener("usertopic/SensorPositionEvent")
 public class MqttPositionHandler implements Handler {
 
     private final Logger LOG = LoggerFactory.getLogger(getClass());
@@ -27,12 +31,17 @@ public class MqttPositionHandler implements Handler {
     // method that handle new message from the topic
     public void handle(MqttMessage message) {
         try {
-            IposPosition pos = ProtoJsonMap.fromJson(message.toString(), IposPosition.class);
+            System.out.println("Received MQTT-message: " + message.toString());
+            SensorPositionEvent protoSensPosEvent = ProtoJsonMap.fromJson(message.toString(), SensorPositionEvent.class);
+            // example-JSON: {"sensorId": "UWB_1", "position": {"refSystemId": "ROOT", "point": {"x": 3.0,"y": 2.0,"z": 3.0}, "accuracy": 1.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "lastPosUpdate": "2021-09-14T09:41:20+00:00"}
             //IposPosition pos = IposPosition.parseFrom(message.toString().getBytes());
-            assert pos != null;
-            LOG.info("IposPosition received: \n" + pos);
+            assert protoSensPosEvent != null;
+            LOG.info("SensorPositionEvent received: \n" + protoSensPosEvent);
+            PositionEvent positionEvent = GenericSensorTransformer.posEvent_GSensor2Internal(protoSensPosEvent);
+            System.out.println("Transformed Protobuf-SensorPositionEvent into Internal-PositionEvent: " + positionEvent.toString() + ", " + positionEvent.getPlacing().getPosition().getPoint().toString() + ", " + positionEvent.getPlacing().getOrientation().toString());
 
-            this.jmsTemplate.convertAndSend("/positions", pos); // submit position to the internal broker
+            // ggf. anstatt JMS einfach den PositionMonitoringController per Funktionsaufruf aufrufen
+            this.jmsTemplate.convertAndSend("/PositionEvent", protoSensPosEvent); // submit position to the internal broker
             //TODO: fix message converter for the internal broker
         } catch (InvalidProtocolBufferException e) {
             LOG.error("Invalid mqtt message:", e);
diff --git a/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java b/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java
index c79d743..b08953f 100644
--- a/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java
+++ b/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java
@@ -22,17 +22,17 @@ public class PositionMonitoring {
     List<eventFilter> eventFilters = new ArrayList<eventFilter>();
     private IPos_DatamodelFactory modelFactory = IPos_DatamodelFactory.eINSTANCE;
 
-    public void initialize(){
+    public PositionMonitoring(){
         wm = modelFactory.createWorldModel();
-        wm.getReferenceSystem().set(0, createReferenceSystem("ROOT", "ROOT", null));
-        wm.getPois().set(0, createPOI(createPosition(createPoint3D(1.4f, 2.0f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken1", new HashMap<String,String>()));
-        wm.getPois().set(1, createPOI(createPosition(createPoint3D(3.7f, -2.0f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken2", new HashMap<String,String>()));
-        wm.getPois().set(2, createPOI(createPosition(createPoint3D(-2.4f, -0.5f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken3", new HashMap<String,String>()));
-        wm.getZoneMap().set(0, modelFactory.createZoneMap());
+        wm.getReferenceSystem().add(createReferenceSystem("ROOT", "ROOT", null));
+        wm.getPois().add(createPOI(createPosition(createPoint3D(1.4f, 2.0f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken1", new HashMap<String,String>()));
+        wm.getPois().add(createPOI(createPosition(createPoint3D(3.7f, -2.0f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken2", new HashMap<String,String>()));
+        wm.getPois().add(createPOI(createPosition(createPoint3D(-2.4f, -0.5f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken3", new HashMap<String,String>()));
+        wm.getZoneMap().add(modelFactory.createZoneMap());
         List<Space> spaces = Arrays.asList(createSpace(3.0f, 3.0f, 3.0f, createPlacing(createPosition(createPoint3D(1.1f, 0.9f, 0f), 1f, wm.getReferenceSystem().get(0)), createOrientation(0f, 0f, 0f, 0f))));
-        wm.getZoneMap().get(0).getZone().set(0, createZone("cobot1_warning_zone", "cobot1_warning_zone", spaces));
-        wm.getAgent().set(0, createAgent("Employee1", "HUMAN", null ));
-        wm.getAgent().get(0).getLObject().set(0, createLobject("UWB_1", "UWB", wm.getAgent().get(0), null));
+        wm.getZoneMap().get(0).getZone().add(createZone("cobot1_warning_zone", "cobot1_warning_zone", spaces));
+        wm.getAgent().add(createAgent("Employee1", "HUMAN"));
+        wm.getAgent().get(0).getLObject().add(createLobject("UWB_1", "UWB", wm.getAgent().get(0), null));
     }
 
     private POI createPOI(Position position, String description, Map<String, String> data){
@@ -43,11 +43,10 @@ public class PositionMonitoring {
         return poi;
     }
 
-    private Agent createAgent(String id, String type, List<LocalizableObject> lobjects){
+    private Agent createAgent(String id, String type){
         Agent agent = modelFactory.createAgent();
         agent.setId(id);
         agent.setAgentType(type);
-        agent.getLObject().addAll(lobjects);
         return agent;
     }
 
@@ -135,6 +134,7 @@ public class PositionMonitoring {
         readConfig.setWM(wm);
         readConfig.readFilterConfigFromMonitoringRequest(monReq, config);
         filter.init(config);
+        eventFilters.add(filter);
     }
 
     @JmsListener(destination = "/PositionEvent", containerFactory = "jmsListenFactory")
-- 
GitLab