diff --git a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/api/MqttRequestHandler.java b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/api/MqttRequestHandler.java index 5804bc8a79206d1535ad428c415ef8afdf9076b2..7bee87cc87332fe77c5cb48f4fa8e4995aab0e2a 100644 --- a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/api/MqttRequestHandler.java +++ b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/api/MqttRequestHandler.java @@ -1,23 +1,22 @@ package ipos.project.DataModellntegration.SimpleSceneIntegration.api; import com.google.protobuf.InvalidProtocolBufferException; -import ipos.models.GenericSensor; import ipos.models.SimpleScene; import ipos.models.SimpleScene.IposMonitoringRequest; -import ipos.project.DataModellntegration.SimpleSceneIntegration.SimpleSceneIntegration; import ipos.project.DataModellntegration.SimpleSceneIntegration.service.SimpleSceneTransformer; -import ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest; +import ipos.project.DataModellntegration.iPos_Datamodel.*; +import ipos.project.UseCaseController.Administration; import ipos.project.UseCaseController.PositionMonitoring; import ipos.project.config.mqtt.Handler; import ipos.project.config.mqtt.MqttListener; import ipos.project.mapper.ProtoJsonMap; import org.apache.logging.log4j.LogManager; import org.eclipse.paho.client.mqttv3.MqttMessage; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsTemplate; +import java.util.List; + // subscribe to the topic. It's example @MqttListener("usertopic/IposConfigWrapper") @@ -34,19 +33,70 @@ public class MqttRequestHandler implements Handler { // method that handle new message from the topic public void handle(MqttMessage message) { try { + // TODO: Zwischen JSON und Protobuf unterscheiden können SimpleScene.IposConfigWrapper iposConfigWrapper = ProtoJsonMap.fromJson(message.toString(), SimpleScene.IposConfigWrapper.class); // IposMonitoringRequest monReqProto = IposMonitoringRequest.parseFrom(message.getPayload()); LOG.info("IposConfigWrapper received: \n" + iposConfigWrapper.toString()); - for (IposMonitoringRequest monReq : iposConfigWrapper.getMonitoringRequestsList()){ - MonitoringRequest monReqInternal = SimpleSceneTransformer.monReq_SScene2Internal(monReq); - PositionMonitoring.receiveMessage(monReqInternal); - // TODO: send request via JMS to MonitoringController - } + // Annahme: iposConfigWrapper enthält für leere Felder leere Listen und nicht null + processMonitoringRequests(iposConfigWrapper); + processRefSystems(iposConfigWrapper.getRefSystemsList()); + processFrameConfigs(iposConfigWrapper.getFramesList()); // should be done not before refSystem-processing, as it might require one of the processed refSystems + processObjectConfigs(iposConfigWrapper.getObjectConfigsList()); + processPois(iposConfigWrapper.getPoisList()); // this.jmsTemplate.convertAndSend("/request123", monReqInternal); // submit request to the internal broker } catch (InvalidProtocolBufferException e) { e.printStackTrace(); } } + + /* + private SimpleScene.IposConfigWrapper replaceNullByEmptyList(SimpleScene.IposConfigWrapper configWrapper) { + SimpleScene.IposConfigWrapper.Builder configWrapper_NoNull = SimpleScene.IposConfigWrapper.newBuilder(); + configWrapper_NoNull.add; + } + */ + + private void processPois(List<SimpleScene.POI> poisList) { + for (SimpleScene.POI poi : poisList){ + POI poi_internal = SimpleSceneTransformer.poi_SScene2Internal(poi); + Administration.handlePoi(poi_internal); + } + } + + private void processRefSystems(List<SimpleScene.RefSystem> refSystemsList) { + for (SimpleScene.RefSystem refSystem : refSystemsList){ + ReferenceSystem refSystem_internal = SimpleSceneTransformer.refSystem_SScene2Internal(refSystem); + Administration.handleRefSystem(refSystem_internal); + } + } + + private void processObjectConfigs(List<SimpleScene.IposObjectConfig> objectConfigsList) { + for( SimpleScene.IposObjectConfig objConfig : objectConfigsList){ + Agent agent = SimpleSceneTransformer.agent_SScene2Internal(objConfig); + Administration.handleAgent(agent); + } + } + + private void processFrameConfigs(List<SimpleScene.IposFrameConfig> frames){ + /* + if (null == frames){ + LOG.info("ConfigWrapper-message contains no Frame-definitions"); + return; + } + */ + for( SimpleScene.IposFrameConfig frame : frames){ + Zone zone = SimpleSceneTransformer.zone_SScene2Internal(frame); + Administration.handleZone(zone); + } + } + + private void processMonitoringRequests(SimpleScene.IposConfigWrapper iposConfigWrapper) { + for (IposMonitoringRequest monReq : iposConfigWrapper.getMonitoringRequestsList()){ + MonitoringRequest monReqInternal = SimpleSceneTransformer.monReq_SScene2Internal(monReq); + PositionMonitoring.receiveMessage(monReqInternal); + // TODO: send request via JMS to MonitoringController + } + } } diff --git a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java index 1003df2905c5a6fdfdc0e6446754817d099d83e6..43dd1a52552aab190d7c6838f1324bb055c16871 100644 --- a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java +++ b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java @@ -92,4 +92,99 @@ public class SimpleSceneTransformer { protoPoint3D.setX(internalPoint3D.getX()).setY(internalPoint3D.getY()).setZ(internalPoint3D.getZ()); return protoPoint3D; } + + public static Zone zone_SScene2Internal(SimpleScene.IposFrameConfig frame) { + Zone zone = modelFactory.createZone(); + zone.setId(frame.getId()); + zone.setName(frame.getId()); + for (SimpleScene.IposSpace space_proto : frame.getSpaceList()){ + Space space = space_SScene2Internal(space_proto); + zone.getSpace().add(space); + } + return zone; + } + + private static Space space_SScene2Internal(SimpleScene.IposSpace space_proto) { + Space space = modelFactory.createSpace(); + space.setX(space_proto.getX()); + space.setY(space_proto.getY()); + space.setZ(space_proto.getZ()); + space.setCentrePoint(placing_SScene2Internal(space_proto.getPosition(),space_proto.getOrientation())); + return space; + } + + private static Placing placing_SScene2Internal(SimpleScene.IposPosition position, SimpleScene.IposSimpleOrientation orientation) { + Placing placing = modelFactory.createPlacing(); + placing.setPosition(position_SScene2Internal(position)); + placing.setOrientation(orientation_SScene2Internal(orientation)); + return placing; + } + + private static Orientation orientation_SScene2Internal(SimpleScene.IposSimpleOrientation orientation_proto) { + Quaternion orientation = (Quaternion) modelFactory.createOrientation(); + orientation.setX(orientation_proto.getX()); + orientation.setY(orientation_proto.getY()); + orientation.setZ(orientation_proto.getZ()); + orientation.setW(orientation_proto.getW()); + return orientation; + } + + private static Position position_SScene2Internal(SimpleScene.IposPosition position_proto) { + Position position = modelFactory.createPosition(); + position.setReferenceSystem(PositionMonitoring.getReferenceSystemByIdOrNull(position_proto.getRefSystemId())); + position.setPoint(point_SScene2Internal(position_proto.getPoint())); + position.setAccuracy(accuracy_SScene2Internal(position_proto.getAccuracy())); + return position; + } + + private static Accuracy accuracy_SScene2Internal(float accuracy_proto) { + Gaussian accuracy = modelFactory.createGaussian(); + accuracy.setConfidenceInterval(accuracy_proto); + return accuracy; + } + + private static Point point_SScene2Internal(SimpleScene.IposPoint3D point_proto) { + Point3D point = modelFactory.createPoint3D(); + point.setX(point_proto.getX()); + point.setY(point_proto.getY()); + point.setZ(point_proto.getZ()); + return point; + } + + /** + * It is the job of this function to create Agent- and LocalizableObject-objects. + * If is not the job of this function to checker whether agent/lobject-Objects + * do already exist for the respective ids. + * @param objConfig + * @return + */ + public static Agent agent_SScene2Internal(SimpleScene.IposObjectConfig objConfig) { + Agent agent = modelFactory.createAgent(); + agent.setAgentType(objConfig.getAgentType()); + agent.setId(objConfig.getAgentId()); + LocalizableObject lObject = modelFactory.createLocalizableObject(); + lObject.setSensorType(objConfig.getSensorType()); + lObject.setId(objConfig.getSensorId()); + lObject.setAgent(agent); + agent.getLObject().add(lObject); + return agent; + } + + public static ReferenceSystem refSystem_SScene2Internal(SimpleScene.RefSystem refSystem_proto) { + ReferenceSystem refSystem = modelFactory.createReferenceSystem(); + refSystem.setId(refSystem.getId()); + refSystem.setName(refSystem.getId()); + if (null != refSystem_proto.getPosition() && null != refSystem_proto.getOrientation()) { + refSystem.setOrigin(placing_SScene2Internal(refSystem_proto.getPosition(), refSystem_proto.getOrientation())); + } + return refSystem; + } + + public static POI poi_SScene2Internal(SimpleScene.POI poi_proto) { + POI poi = modelFactory.createPOI(); + poi.setDescription(poi_proto.getDescription()); + poi.setData(poi_proto.getDataMap()); + poi.setPosition(position_SScene2Internal(poi_proto.getPosition())); + return poi; + } } diff --git a/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java b/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java index 8791d240af1919d00fed6fdd78994282a048239f..4738688fa8b544b65e3be58e081f9784389b9a94 100644 --- a/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java +++ b/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java @@ -73,6 +73,15 @@ public class PositionMonitoring { return null; } + public static ReferenceSystem getReferenceSystemByIdOrNull(String refSystemId){ + for (ReferenceSystem refSystem : wm.getReferenceSystem()){ + if(refSystem.getId().equals(refSystemId)){ + return refSystem; + } + } + return null; + } + private POI createPOI(Position position, String description, Map<String, String> data){ POI poi = modelFactory.createPOI(); poi.setPosition(position); @@ -185,6 +194,7 @@ public class PositionMonitoring { // @JmsListener(destination = "/PositionEvent", containerFactory = "jmsListenFactory") public static void receiveMessage(PositionEvent posEvent) { + // TODO: Update currentPlacing attribute of the affected localizableObject LOG.info("Received <" + posEvent + ">"); List<Tuple3<PositionEvent, String, String>> entryNotifications = new LinkedList<>(); for (eventFilter eFilter : eventFilters){