Merge branch 'DEVELOP' of ssh://git.eclipse.org:29418/openk-usermodules/org.eclipse.openk-usermodules.gridFailureInformation.backend into SI-1967-Fix-Zuordnen-doppelter-Stationen
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 cca3561..229ce91 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
@@ -214,15 +214,21 @@
 
     private void storeStations( TblFailureInformation tblToStore, List<UUID> stationIds ) {
         List<TblStation> stationList = resolveStationIds(stationIds);
+        Set<TblStation> stationSet = new HashSet<>(stationList);
+        if(stationList.size() > stationSet.size()){
+            throw new OperationDeniedException(OperationType.INSERT, "double.assignment.of.stations");
+        }
         List<TblFailureInformationStation> tblFailureStations
                 = failureInformationStationRepository.findByFkTblFailureInformation(tblToStore.getId());
         failureInformationStationRepository.deleteAll(tblFailureStations);
-        stationList.forEach(x-> {
+
+        stationSet.forEach(x-> {
             TblFailureInformationStation newRecord = new TblFailureInformationStation();
             newRecord.setStationStationId(x.getStationId());
             newRecord.setFkTblFailureInformation(tblToStore.getId());
             failureInformationStationRepository.save(newRecord);
         });
+
     }
 
     private FailureInformationDto processGrid(FailureInformationDto failureInfoDto, GfiProcessState forcedState) {
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationStationService.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationStationService.java
index 66b1955..19bff4e 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationStationService.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationStationService.java
@@ -90,7 +90,7 @@
         Optional<TblFailureInformationStation> fiStation = failureInformationStationRepository.findByFkTblFailureInformationAndStationStationId(failureInformation.getId(), station.getStationId());
 
         if (fiStation.isPresent()) {
-            throw new OperationDeniedException(OperationType.INSERT, "assignment.already.existing");
+            throw new OperationDeniedException(OperationType.INSERT, "double.assignment.of.stations");
         }
 
         TblFailureInformationStation assignmentToSave = new TblFailureInformationStation();
diff --git a/gfsBackendService/src/main/resources/application_localdev.yml b/gfsBackendService/src/main/resources/application_localdev.yml
index 75a0f69..6e0498d 100644
--- a/gfsBackendService/src/main/resources/application_localdev.yml
+++ b/gfsBackendService/src/main/resources/application_localdev.yml
@@ -14,6 +14,7 @@
 spring:
   datasource:
     url: jdbc:postgresql://entopticadirx:5432/GridFailureInfoDevelop
+    #url: jdbc:postgresql://entopticadirx:5432/GridFailureInfoDevServer
     username: ${GFI_DB_USERNAME}
     password: ${GFI_DB_PASSWORD}
     max-active: 5
diff --git a/gfsBackendService/src/main/resources/messages.properties b/gfsBackendService/src/main/resources/messages.properties
index ad05c7b..2c82171 100644
--- a/gfsBackendService/src/main/resources/messages.properties
+++ b/gfsBackendService/src/main/resources/messages.properties
@@ -16,5 +16,7 @@
 channel.not.existing=der \u00fcbergebene Kanal existiert nicht.
 channel.already.existing=der \u00fcbergebene Kanal existiert bereits für diese Störungsinformation.
 delete.not.allowed=es dürfen nur Störungsmeldungen im Status 'neu' oder 'geplant' gelöscht werden.
+double.assignment.of.stations=Eine Störmeldung darf eine Station nur einmal enthalten.
+
 
 
diff --git a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationServiceTest.java b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationServiceTest.java
index 2512edb..a63d6eb 100644
--- a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationServiceTest.java
+++ b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationServiceTest.java
@@ -27,6 +27,7 @@
 import org.eclipse.openk.gridfailureinformation.viewmodel.FailureInformationDto;
 import org.eclipse.openk.gridfailureinformation.viewmodel.FailureInformationPublicationChannelDto;
 import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.stubbing.Answer;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,8 +46,7 @@
 
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.*;
 
 //import java.sql.Date;
 @Log4j2
@@ -148,6 +148,13 @@
     @Test
     public void shouldStoreFailureInformation() {
         FailureInformationDto fiDto = MockDataHelper.mockFailureInformationDto();
+        List<UUID> stationList = new ArrayList<>();
+        stationList.add(UUID.fromString("8a5fb5ca-d26d-11ea-87d0-0242ac130003"));
+        stationList.add(UUID.fromString("8a5fb2aa-d26d-11ea-87d0-0242ac130003"));
+        stationList.add(UUID.fromString("a1375ec8-d26e-11ea-87d0-0242ac130003"));
+
+        fiDto.setStationIds(stationList);
+
         TblFailureInformation fiTbl = MockDataHelper.mockTblFailureInformation();
         RefFailureClassification refFailureClassification = MockDataHelper.mockRefFailureClassification();
         RefStatus refStatus = MockDataHelper.mockRefStatusCreated();
@@ -155,8 +162,12 @@
         RefRadius refRadius = MockDataHelper.mockRefRadius();
         RefExpectedReason refExpectedReason = MockDataHelper.mockRefExpectedReason();
         List<HtblFailureInformation> hFailureList = MockDataHelper.mockHistTblFailureInformationList();
+
         TblStation tblStation = MockDataHelper.mockTblStation();
-        TblDistributionGroup tblDistributionGroup = MockDataHelper.mockTblDistributionGroup();
+        TblStation tblStation2 = MockDataHelper.mockTblStation2();
+        TblStation tblStation3 = MockDataHelper.mockTblStation3();
+
+        //TblDistributionGroup tblDistributionGroup = Mock.mockTblD
 
         when(failureInformationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(fiTbl));
         when(branchRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refBranch));
@@ -165,8 +176,9 @@
         when(radiusRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refRadius));
         when(expectedReasonRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refExpectedReason));
         when(histFailureInformationRepository.findByUuid(any(UUID.class))).thenReturn(hFailureList);
-        when(stationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblStation));
-        when(distributionGroupRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblDistributionGroup));
+        when(stationRepository.findByUuid(eq(UUID.fromString("8a5fb2aa-d26d-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation));
+        when(stationRepository.findByUuid(eq(UUID.fromString("8a5fb5ca-d26d-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation2));
+        when(stationRepository.findByUuid(eq(UUID.fromString("a1375ec8-d26e-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation3));
 
         when(failureInformationRepository.save(any(TblFailureInformation.class)))
                 .then((Answer<TblFailureInformation>) invocation -> {
@@ -211,6 +223,9 @@
         refStatus.setId(GfiProcessState.PLANNED.getStatusValue());
 
         TblStation tblStation = MockDataHelper.mockTblStation();
+        TblStation tblStation2 = MockDataHelper.mockTblStation2();
+        TblStation tblStation3 = MockDataHelper.mockTblStation3();
+
         List<TblAddress> addressList = MockDataHelper.mockTblAddressList();
         TblDistributionGroup tblDistributionGroup = MockDataHelper.mockTblDistributionGroup();
 
@@ -224,6 +239,13 @@
         fiDto.setRadiusId(null);
         fiDto.setExpectedReasonId(null);
 
+        List<UUID> stationList = new ArrayList<>();
+        stationList.add(UUID.fromString("8a5fb5ca-d26d-11ea-87d0-0242ac130003"));
+        stationList.add(UUID.fromString("8a5fb2aa-d26d-11ea-87d0-0242ac130003"));
+        stationList.add(UUID.fromString("a1375ec8-d26e-11ea-87d0-0242ac130003"));
+
+        fiDto.setStationIds(stationList);
+
         TblFailureInformation fiTbl = MockDataHelper.mockTblFailureInformation();
         fiTbl.setId(777L);
         fiTbl.setRefBranch(null);
@@ -236,7 +258,9 @@
         when(statusRepository.findByUuid(any( UUID.class ))).thenReturn(Optional.of(refStatus));
         when(failureInformationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(fiTbl));
         when(stationRepository.findByStationId(anyString())).thenReturn(Optional.of(tblStation));
-        when(stationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblStation));
+        when(stationRepository.findByUuid(eq(UUID.fromString("8a5fb2aa-d26d-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation));
+        when(stationRepository.findByUuid(eq(UUID.fromString("8a5fb5ca-d26d-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation2));
+        when(stationRepository.findByUuid(eq(UUID.fromString("a1375ec8-d26e-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation3));
         when(addressRepository.findByStationId(anyString())).thenReturn(addressList);
 
         when(failureInformationRepository.save(any(TblFailureInformation.class)))
@@ -438,7 +462,8 @@
         when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(refStatus));
         when(radiusRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refRadius));
         when(stationRepository.findByStationId(anyString())).thenReturn(Optional.of(tblStation));
-        when(stationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblStation));
+        //when(stationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblStation));
+
         when(addressRepository.findByStationId(anyString())).thenReturn(addressList);
 
         //ExpectedReason cannot be found
@@ -454,14 +479,21 @@
 
     @Test
     public void shouldStoreNewFailureInformation() {
-        FailureInformationDto fiDto = MockDataHelper.mockFailureInformationDto();
         TblFailureInformation fiTbl = MockDataHelper.mockTblFailureInformation();
+        FailureInformationDto fiDto = MockDataHelper.mockFailureInformationDto();
+        List<UUID> stationList = new ArrayList<>();
+        stationList.add(UUID.fromString("8a5fb5ca-d26d-11ea-87d0-0242ac130003"));
+        stationList.add(UUID.fromString("8a5fb2aa-d26d-11ea-87d0-0242ac130003"));
+        stationList.add(UUID.fromString("a1375ec8-d26e-11ea-87d0-0242ac130003"));
+        fiDto.setStationIds(stationList);
         RefFailureClassification refFailureClassification = MockDataHelper.mockRefFailureClassification();
         RefStatus refStatus = MockDataHelper.mockRefStatusCreated();
         RefBranch refBranch = MockDataHelper.mockRefBranch();
         RefRadius refRadius = MockDataHelper.mockRefRadius();
         RefExpectedReason refExpectedReason = MockDataHelper.mockRefExpectedReason();
         TblStation tblStation = MockDataHelper.mockTblStation();
+        TblStation tblStation2 = MockDataHelper.mockTblStation2();
+        TblStation tblStation3 = MockDataHelper.mockTblStation3();
         TblDistributionGroup tblDistributionGroup = MockDataHelper.mockTblDistributionGroup();
         List<TblFailureInformationPublicationChannel> publicationChannelList = MockDataHelper.mockTblFailureInformationPublicationChannelList();
 
@@ -472,7 +504,9 @@
         when(statusRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refStatus));
         when(radiusRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refRadius));
         when(expectedReasonRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refExpectedReason));
-        when(stationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblStation));
+        when(stationRepository.findByUuid(eq(UUID.fromString("8a5fb2aa-d26d-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation));
+        when(stationRepository.findByUuid(eq(UUID.fromString("8a5fb5ca-d26d-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation2));
+        when(stationRepository.findByUuid(eq(UUID.fromString("a1375ec8-d26e-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation3));
         when(distributionGroupRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblDistributionGroup));
         when(failureInformationPublicationChannelRepository.findByTblFailureInformation(any(TblFailureInformation.class))).thenReturn(publicationChannelList);
 
@@ -520,6 +554,11 @@
     @Test
     public void shouldInsertNewFailureInformation() {
         FailureInformationDto fiDto = MockDataHelper.mockFailureInformationDto();
+        List<UUID> stationList = new ArrayList<>();
+        stationList.add(UUID.fromString("8a5fb5ca-d26d-11ea-87d0-0242ac130003"));
+        stationList.add(UUID.fromString("8a5fb2aa-d26d-11ea-87d0-0242ac130003"));
+        stationList.add(UUID.fromString("a1375ec8-d26e-11ea-87d0-0242ac130003"));
+        fiDto.setStationIds(stationList);
         TblFailureInformation fiTbl = MockDataHelper.mockTblFailureInformation();
         RefFailureClassification refFailureClassification = MockDataHelper.mockRefFailureClassification();
         RefStatus refStatus = MockDataHelper.mockRefStatusCreated();
@@ -527,6 +566,8 @@
         RefRadius refRadius = MockDataHelper.mockRefRadius();
         RefExpectedReason refExpectedReason = MockDataHelper.mockRefExpectedReason();
         TblStation tblStation = MockDataHelper.mockTblStation();
+        TblStation tblStation2 = MockDataHelper.mockTblStation2();
+        TblStation tblStation3 = MockDataHelper.mockTblStation3();
         TblDistributionGroup tblDistributionGroup = MockDataHelper.mockTblDistributionGroup();
         List<TblFailureInformationPublicationChannel> publicationChannelList = MockDataHelper.mockTblFailureInformationPublicationChannelList();
 
@@ -537,7 +578,9 @@
         when(statusRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refStatus));
         when(radiusRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refRadius));
         when(expectedReasonRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refExpectedReason));
-        when(stationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblStation));
+        when(stationRepository.findByUuid(eq(UUID.fromString("8a5fb2aa-d26d-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation));
+        when(stationRepository.findByUuid(eq(UUID.fromString("8a5fb5ca-d26d-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation2));
+        when(stationRepository.findByUuid(eq(UUID.fromString("a1375ec8-d26e-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation3));
         when(distributionGroupRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblDistributionGroup));
         when(failureInformationPublicationChannelRepository.findByTblFailureInformation(any(TblFailureInformation.class))).thenReturn(publicationChannelList);
 
@@ -872,6 +915,11 @@
 
         RefStatus statusQualified =  MockDataHelper.mockRefStatusQUALIFIED();
         FailureInformationDto dto = MockDataHelper.mockFailureInformationDto();
+        List<UUID> stationList = new ArrayList<>();
+        stationList.add(UUID.fromString("8a5fb5ca-d26d-11ea-87d0-0242ac130003"));
+        stationList.add(UUID.fromString("8a5fb2aa-d26d-11ea-87d0-0242ac130003"));
+        stationList.add(UUID.fromString("a1375ec8-d26e-11ea-87d0-0242ac130003"));
+        dto.setStationIds(stationList);
         dto.setVoltageLevel(Constants.VOLTAGE_LEVEL_HS);
         dto.setStatusExtern(null);
         TblFailureInformation tblFailureInformation = MockDataHelper.mockTblFailureInformation();
@@ -883,6 +931,8 @@
         RefExpectedReason refExpectedReason = MockDataHelper.mockRefExpectedReason();
         TblDistributionGroup tblDistributionGroup = MockDataHelper.mockTblDistributionGroup();
         TblStation tblStation = MockDataHelper.mockTblStation();
+        TblStation tblStation2 = MockDataHelper.mockTblStation2();
+        TblStation tblStation3 = MockDataHelper.mockTblStation3();
         List<TblFailureInformationPublicationChannel> pubChannelList = MockDataHelper.mockTblFailureInformationPublicationChannelList();
 
         dto.setStatusInternId(statusQualified.getUuid());
@@ -897,7 +947,9 @@
         when(radiusRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refRadius));
         when(expectedReasonRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refExpectedReason));
         when(distributionGroupRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblDistributionGroup));
-        when(stationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblStation));
+        when(stationRepository.findByUuid(eq(UUID.fromString("8a5fb2aa-d26d-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation));
+        when(stationRepository.findByUuid(eq(UUID.fromString("8a5fb5ca-d26d-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation2));
+        when(stationRepository.findByUuid(eq(UUID.fromString("a1375ec8-d26e-11ea-87d0-0242ac130003")))).thenReturn(Optional.of(tblStation3));
         when(failureInformationPublicationChannelRepository.findByTblFailureInformation(any(TblFailureInformation.class))).thenReturn(pubChannelList);
         when(failureInformationRepository.save(any(TblFailureInformation.class))).thenReturn(tblFailureInformation);
 
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 71ffe74..7c36ac3 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
@@ -959,6 +959,22 @@
         return tblStation;
     }
 
+    public static TblStation mockTblStation3(){
+
+        TblStation tblStation = new TblStation();
+        tblStation.setId(323232L);
+        tblStation.setUuid(UUID.randomUUID());
+        tblStation.setSdox1(new BigDecimal(44.111));
+        tblStation.setSdoy1(new BigDecimal(9.777));
+        tblStation.setG3efid(3456L);
+        tblStation.setStationId("464646");
+        tblStation.setStationName("Mittlere Strasse 58");
+        tblStation.setLongitude(new BigDecimal(48.987444));
+        tblStation.setLatitude(new BigDecimal(12.121212));
+
+        return tblStation;
+    }
+
     public static List<TblStation> mockTblStationList(){
 
         List<TblStation> stationList = new LinkedList();