Merge branch 'DEVELOP' of ssh://git.eclipse.org:29418/openk-usermodules/org.eclipse.openk-usermodules.gridFailureInformation.backend into SI-1020-Detailansicht-Radius-Polygon

merge conflicts resolved
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/StationController.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/StationController.java
index 51d2f2a..16ff8a4 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/StationController.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/StationController.java
@@ -15,6 +15,7 @@
 package org.eclipse.openk.gridfailureinformation.controller;
 
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 import lombok.extern.log4j.Log4j2;
@@ -22,11 +23,12 @@
 import org.eclipse.openk.gridfailureinformation.viewmodel.StationDto;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.annotation.Secured;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
 
 @Log4j2
 @RestController
@@ -43,4 +45,14 @@
     public List<StationDto> findStations() {
         return stationService.getStations();
     }
+
+    @Secured({"ROLE_GRID-FAILURE-ADMIN", "ROLE_GRID-FAILURE-READER", "ROLE_GRID-FAILURE-CREATOR", "ROLE_GRID-FAILURE-QUALIFIER", "ROLE_GRID-FAILURE-PUBLISHER"})
+    @ApiOperation(value = "Holen der Polygon-Koordinaten für die  übergebenen Stationen")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
+    @PostMapping("/polygon-coordinates")
+    public List<ArrayList<BigDecimal>> getPolygonCoordinates(
+            @ApiParam(name="listStationUuids", value= "Liste der Stationen, für die gemeinsame Polygon-Koordinaten erstellt werden sollen", required = true)
+            @RequestBody List<UUID> listStationUuids) {
+        return stationService.getPolygonCoordinates(listStationUuids);
+    }
 }
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/mapper/FailureInformationMapper.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/mapper/FailureInformationMapper.java
index e3a8d09..c72720e 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/mapper/FailureInformationMapper.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/mapper/FailureInformationMapper.java
@@ -16,10 +16,8 @@
 
 import org.eclipse.openk.gridfailureinformation.model.TblDistributionGroup;
 import org.eclipse.openk.gridfailureinformation.model.TblFailureInformation;
-import org.eclipse.openk.gridfailureinformation.model.TblFailureInformationPublicationChannel;
 import org.eclipse.openk.gridfailureinformation.model.TblStation;
-import org.eclipse.openk.gridfailureinformation.viewmodel.FailureInformationDto;
-import org.eclipse.openk.gridfailureinformation.viewmodel.ForeignFailureDataDto;
+import org.eclipse.openk.gridfailureinformation.model.TblFailureInformationPublicationChannel;import org.eclipse.openk.gridfailureinformation.viewmodel.FailureInformationDto;import org.eclipse.openk.gridfailureinformation.viewmodel.ForeignFailureDataDto;
 import org.mapstruct.*;
 
 import java.util.LinkedList;
@@ -81,6 +79,15 @@
 
         failureInformationDto.setStationIds( stations != null ? stations.stream().map(TblStation::getUuid).collect(Collectors.toList()) : new LinkedList<>());
     }
+
+//    @AfterMapping
+//    default void populateStationUuids(TblFailureInformation source, @MappingTarget FailureInformationDto failureInformationDto){
+//        Set<TblStation> sourceList = source.getStations();
+//
+//        failureInformationDto.setStationUuids( sourceList != null ? sourceList.stream().map(TblStation::getUuid).collect(Collectors.toList()) : new LinkedList<>());
+//    }
+
+
     @AfterMapping
     default void populatePublicationChannels(TblFailureInformation source, @MappingTarget FailureInformationDto failureInformationDto){
         List<TblFailureInformationPublicationChannel> sourceList = source.getPublicationChannelList();
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationService.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationService.java
index 6e536ab..bdcb5b2 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationService.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationService.java
@@ -314,7 +314,7 @@
             destTblFailureInformation.setRefStatusExtern(null);
         }
     }
-
+    
     private void resolveFailureClassification(TblFailureInformation destTblFailureInformation, FailureInformationDto sourceDto) {
         if( sourceDto.getFailureClassificationId() != null ) {
             destTblFailureInformation.setRefFailureClassification( failureClassificationRepository
@@ -633,57 +633,65 @@
             return;
         }
 
-        List<TblAddress> allAdresses = new ArrayList<TblAddress>();
-
-        // Holen der Adressen, die fuer die Stoerungsinformation relevant sind
-        for (UUID stationUuid : stationUuids ) {
-            TblStation tblStation = stationRepository
-                    .findByUuid(stationUuid)
-                    .orElse( null );
-
-            if( tblStation == null ) {
-                log.warn("station "+ stationUuid.toString() + "not found ");
-            } else {
-                List<TblAddress> addressListForStation = addressRepository.findByStationId(tblStation.getStationId());
-                if (addressListForStation.isEmpty()) {
-                    log.debug("Station " + stationUuid.toString() + "has no addresses.");
-
-                } else {
-                    allAdresses.addAll(addressListForStation);
-                }
-            }
-        }
-
-        List<Point> addressPoints = new LinkedList<>();
-        // Hinzufügen der gefundenen Adressen zur Liste der Adresspunkte
-        // (Multiplikation mit 1000000 notwendig zur Erlangung von ganzzahligen Werten für die Übergabe an GrahamScan)
-        allAdresses
-                .forEach(x->addressPoints.add
-                        (new Point(( x.getLatitude().setScale(6,RoundingMode.FLOOR).movePointRight(6)).intValue(),
-                                   (x.getLongitude().setScale(6,RoundingMode.FLOOR).movePointRight(6)).intValue())));
-
-        if( addressPoints.isEmpty()) {
-            log.debug("Failure information " + failureInformationDto.getUuid().toString() + " has no addresses");
-            return;
-        }
-
-        // GrahamScan über die Adresspunkte zum Erhalt der äußeren Punkte, die ein Polygon bilden
-        List<Point> polygonPoints = GrahamScan.getConvexHull(addressPoints);
-
-        List<ArrayList<BigDecimal>> addressPolygonPoints = new LinkedList<>();
-        // Verpacken der Polygonpunkte in eine Liste von Arrays (longitude/latitude) die ins DTO der Störungsmeldung geschrieben wird
-        // (Division durch 1000000 notwendig zur Wiedererlangung der ursprünglichen Werte)
-
-        for( Point point: polygonPoints ){
-            ArrayList<BigDecimal> twoValues =  new ArrayList<>();
-            twoValues.add(BigDecimal.valueOf(point.getX()).movePointLeft(6));
-            twoValues.add(BigDecimal.valueOf(point.getY()).movePointLeft(6));
-            addressPolygonPoints.add(twoValues);
-        }
+        List<ArrayList<BigDecimal>> addressPolygonPoints = getPolygonCoordinatesForStationUuids(stationUuids);
 
         if(!addressPolygonPoints.isEmpty()) {
             failureInformationDto.setAddressPolygonPoints(addressPolygonPoints);
         }
     }
 
+
+public List<ArrayList<BigDecimal>> getPolygonCoordinatesForStationUuids (List<UUID> stationUuids) {
+
+    List<TblAddress> allAdresses = new ArrayList<TblAddress>();
+    List<ArrayList<BigDecimal>> addressPolygonPoints = new LinkedList<>();
+
+    // Holen der Adressen, die fuer die Stoerungsinformation relevant sind
+    for (UUID stationUuid : stationUuids) {
+        TblStation tblStation = stationRepository
+                .findByUuid(stationUuid)
+                .orElse(null);
+
+        if (tblStation == null) {
+            log.warn("station " + stationUuid.toString() + "not found ");
+        } else {
+            List<TblAddress> addressListForStation = addressRepository.findByStationId(tblStation.getStationId());
+            if (addressListForStation.isEmpty()) {
+                log.debug("Station " + stationUuid.toString() + "has no addresses.");
+
+            } else {
+                allAdresses.addAll(addressListForStation);
+            }
+        }
+    }
+
+    List<Point> addressPoints = new LinkedList<>();
+    // Hinzufügen der gefundenen Adressen zur Liste der Adresspunkte
+    // (Multiplikation mit 1000000 notwendig zur Erlangung von ganzzahligen Werten für die Übergabe an GrahamScan)
+    allAdresses
+            .forEach(x -> addressPoints.add
+                    (new Point((x.getLatitude().setScale(6, RoundingMode.FLOOR).movePointRight(6)).intValue(),
+                            (x.getLongitude().setScale(6, RoundingMode.FLOOR).movePointRight(6)).intValue())));
+
+    if (addressPoints.isEmpty()) {
+        log.debug("No addresses for the given stations available");
+        return addressPolygonPoints;
+    }
+
+    // GrahamScan über die Adresspunkte zum Erhalt der äußeren Punkte, die ein Polygon bilden
+    List<Point> polygonPoints = GrahamScan.getConvexHull(addressPoints);
+
+
+    // Verpacken der Polygonpunkte in eine Liste von Arrays (longitude/latitude) die ins DTO der Störungsmeldung geschrieben wird
+    // (Division durch 1000000 notwendig zur Wiedererlangung der ursprünglichen Werte)
+    for (Point point : polygonPoints) {
+        ArrayList<BigDecimal> twoValues = new ArrayList<>();
+        twoValues.add(BigDecimal.valueOf(point.getX()).movePointLeft(6));
+        twoValues.add(BigDecimal.valueOf(point.getY()).movePointLeft(6));
+        addressPolygonPoints.add(twoValues);
+    }
+
+    return addressPolygonPoints;
+}
+
 }
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/StationService.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/StationService.java
index db229af..2e833ae 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/StationService.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/StationService.java
@@ -21,8 +21,11 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.UUID;
 import java.util.stream.Collectors;
 
 @Service
@@ -34,6 +37,9 @@
     @Autowired
     private StationMapper stationMapper;
 
+    @Autowired
+    private FailureInformationService failureInformationService;
+
     public List<StationDto> getStations() {
         return stationRepository.findAll().stream()
                 .map(stationMapper::toStationDto)
@@ -49,4 +55,9 @@
         return null;
     }
 
+    public List<ArrayList<BigDecimal>> getPolygonCoordinates(List<UUID> stationUuids) {
+        List<ArrayList<BigDecimal>> polygonPoints = failureInformationService.getPolygonCoordinatesForStationUuids(stationUuids);
+        return polygonPoints;
+    }
+
 }
diff --git a/gfsBackendService/src/main/resources/db/migration/V0_34__CREATE_GFI_DB.sql b/gfsBackendService/src/main/resources/db/migration/V0_34__CREATE_GFI_DB.sql
index 3aa153e..21d275b 100644
--- a/gfsBackendService/src/main/resources/db/migration/V0_34__CREATE_GFI_DB.sql
+++ b/gfsBackendService/src/main/resources/db/migration/V0_34__CREATE_GFI_DB.sql
@@ -51,7 +51,7 @@
 DROP SEQUENCE IF EXISTS public.TBL_FAILURE_INFORMATION_DISTRIBUTION_GROUP_ID_SEQ;
 
 DROP TABLE IF EXISTS public.TBL_FAILURE_INFORMATION_PUBLICATION_CHANNEL;
-DROP SEQUENCE IF EXISTS public.TBL_FAILURE_INFORMATION_PUBLICATION_CHANNEL_SEQ
+DROP SEQUENCE IF EXISTS public.TBL_FAILURE_INFORMATION_PUBLICATION_CHANNEL_SEQ;
 
 -- ---------------------------------------------
 -- TABLE VERSION
diff --git a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/controller/StationControllerTest.java b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/controller/StationControllerTest.java
index 54e1c64..7969038 100644
--- a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/controller/StationControllerTest.java
+++ b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/controller/StationControllerTest.java
@@ -14,7 +14,9 @@
  */
 package org.eclipse.openk.gridfailureinformation.controller;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.eclipse.openk.gridfailureinformation.GridFailureInformationApplication;
+import org.eclipse.openk.gridfailureinformation.service.FailureInformationService;
 import org.eclipse.openk.gridfailureinformation.service.StationService;
 import org.eclipse.openk.gridfailureinformation.support.MockDataHelper;
 import org.eclipse.openk.gridfailureinformation.viewmodel.StationDto;
@@ -27,10 +29,15 @@
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.web.servlet.MockMvc;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
 
+import static org.mockito.ArgumentMatchers.anyList;
 import static org.mockito.Mockito.when;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
@@ -42,6 +49,9 @@
     @MockBean
     private StationService stationService;
 
+    @MockBean
+    private FailureInformationService failureInformationService;
+
     @Autowired
     private MockMvc mockMvc;
 
@@ -56,4 +66,17 @@
                 .andExpect(content().contentType(MediaType.APPLICATION_JSON));
     }
 
+    @Test
+    public void shouldReturnPolygonCoordinates() throws Exception {
+        List<ArrayList<BigDecimal>> coordinatesList = MockDataHelper.mockPolygonCoordinatesList();
+        when(failureInformationService.getPolygonCoordinatesForStationUuids(anyList())).thenReturn(coordinatesList);
+
+        List<UUID> uuidList = MockDataHelper.mockUuidList();
+
+        mockMvc.perform(post("/stations/polygon-coordinates")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(uuidList)))
+                .andExpect(status().is2xxSuccessful());
+    }
+
 }
\ No newline at end of file
diff --git a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/StationServiceTest.java b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/StationServiceTest.java
index 242a4e2..6447bdf 100644
--- a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/StationServiceTest.java
+++ b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/StationServiceTest.java
@@ -26,11 +26,15 @@
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.test.context.ContextConfiguration;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.UUID;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyList;
 import static org.mockito.Mockito.when;
 
 //@RunWith(SpringRunner.class)
@@ -43,6 +47,9 @@
     private StationService stationService;
 
     @MockBean
+    private FailureInformationService failureInformationService;
+
+    @MockBean
     private StationRepository stationRepository;
 
     @Test
@@ -65,5 +72,17 @@
         assertEquals(stationDto.getUuid(), mockTblStation.getUuid());
     }
 
+    @Test
+    public void shouldGetPolygonCoordinates() {
+
+        List<UUID> uuidList =  MockDataHelper.mockUuidList();
+        List<ArrayList<BigDecimal>> mockPolygonCoordinatesList = MockDataHelper.mockPolygonCoordinatesList();
+
+        when(failureInformationService.getPolygonCoordinatesForStationUuids((anyList()))).thenReturn(mockPolygonCoordinatesList);
+
+        List<ArrayList<BigDecimal>>  polygonCoordinatesList =  stationService.getPolygonCoordinates(uuidList);
+
+        assertEquals(mockPolygonCoordinatesList.size(), polygonCoordinatesList.size());
+    }
 
 }
diff --git a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/support/MockDataHelper.java b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/support/MockDataHelper.java
index dad19bd..51bb487 100644
--- a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/support/MockDataHelper.java
+++ b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/support/MockDataHelper.java
@@ -1266,4 +1266,36 @@
         return tfipChannel;
     }
 
+    public static List<ArrayList<BigDecimal>> mockPolygonCoordinatesList(){
+
+        List<ArrayList<BigDecimal>> cordinatesList = new LinkedList<>();
+
+        ArrayList<BigDecimal> firstCoordinate = new ArrayList<>();
+        firstCoordinate.add(new BigDecimal(53.5));
+        firstCoordinate.add(new BigDecimal(2.7));
+
+        ArrayList<BigDecimal> secondCoordinate = new ArrayList<>();
+        secondCoordinate.add(new BigDecimal(52.8));
+        secondCoordinate.add(new BigDecimal(2.1));
+
+        ArrayList<BigDecimal> thirdCoordinate = new ArrayList<>();
+        thirdCoordinate.add(new BigDecimal(53.66));
+        thirdCoordinate.add(new BigDecimal(2.33));
+
+        ArrayList<BigDecimal> fourthCoordinate = new ArrayList<>();
+        fourthCoordinate.add(new BigDecimal(52.9));
+        fourthCoordinate.add(new BigDecimal(2.0));
+
+        ArrayList<BigDecimal> fifthCoordinate = new ArrayList<>();
+        fifthCoordinate.add(new BigDecimal(53.45));
+        fifthCoordinate.add(new BigDecimal(2.77));
+
+        cordinatesList.add(firstCoordinate);
+        cordinatesList.add(secondCoordinate);
+        cordinatesList.add(thirdCoordinate);
+        cordinatesList.add(fourthCoordinate);
+        cordinatesList.add(fifthCoordinate);
+
+        return cordinatesList;
+    }
 }