Skip to content

Commit

Permalink
tu
Browse files Browse the repository at this point in the history
Signed-off-by: maissa SOUISSI <[email protected]>
  • Loading branch information
souissimai committed Jun 10, 2024
1 parent a009166 commit 3f1d20b
Show file tree
Hide file tree
Showing 3 changed files with 176 additions and 46 deletions.
53 changes: 53 additions & 0 deletions src/main/java/com/powsybl/sld/server/GeoDataService.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,18 @@
* @author Maissa SOUISSI <maissa.souissi at rte-france.com>
*/

import com.fasterxml.jackson.databind.ObjectMapper;
import com.powsybl.iidm.network.Line;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.Substation;
import com.powsybl.iidm.network.extensions.LinePosition;
import com.powsybl.iidm.network.extensions.LinePositionAdder;
import com.powsybl.iidm.network.extensions.SubstationPosition;
import com.powsybl.iidm.network.extensions.SubstationPositionAdder;
import com.powsybl.sld.server.dto.Coordinate;
import com.powsybl.sld.server.dto.LineGeoData;
import com.powsybl.sld.server.dto.SubstationGeoData;
import com.powsybl.sld.server.utils.GeoDataUtils;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
Expand All @@ -19,7 +31,9 @@
import org.springframework.web.util.UriComponentsBuilder;

import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;

@Service
public class GeoDataService {
Expand Down Expand Up @@ -83,4 +97,43 @@ public String getSubstationsGraphics(UUID networkUuid, String variantId, List<St

return restTemplate.getForObject(path, String.class);
}

public void assignSubstationGeoData(Network network, UUID networkUuid, String variantId, List<Substation> substations) {

List<SubstationGeoData> substationsGeoData = GeoDataUtils.fromStringToSubstationGeoData(getSubstationsGraphics(networkUuid, variantId, null), new ObjectMapper());
Map<String, Coordinate> substationGeoDataMap = substationsGeoData.stream()
.collect(Collectors.toMap(SubstationGeoData::getId, SubstationGeoData::getCoordinate));

for (Substation substation : substations) {
if (network.getSubstation(substation.getId()).getExtension(SubstationPosition.class) == null) {
com.powsybl.sld.server.dto.Coordinate coordinate = substationGeoDataMap.get(substation.getId());
if (coordinate != null) {
network.getSubstation(substation.getId())
.newExtension(SubstationPositionAdder.class)
.withCoordinate(new com.powsybl.iidm.network.extensions.Coordinate(coordinate.getLat(), coordinate.getLon()))
.add();
}
}

}
}

public void assignLineGeoData(Network network, UUID networkUuid, String variantId, List<Line> lines) {
List<LineGeoData> linesGeoData = GeoDataUtils.fromStringToLineGeoData(getLinesGraphics(networkUuid, variantId, null), new ObjectMapper());
Map<String, List<com.powsybl.sld.server.dto.Coordinate>> lineGeoDataMap = linesGeoData.stream()
.collect(Collectors.toMap(LineGeoData::getId, LineGeoData::getCoordinates));
for (Line line : lines) {
if (network.getLine(line.getId()).getExtension(LinePosition.class) == null) {
List<com.powsybl.sld.server.dto.Coordinate> coordinates = lineGeoDataMap.get(line.getId());
if (coordinates != null) {
network.getLine(line.getId())
.newExtension(LinePositionAdder.class)
.withCoordinates(coordinates)
.add();
}
}
}
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@
*/
package com.powsybl.sld.server;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.powsybl.iidm.network.Line;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.Substation;
import com.powsybl.iidm.network.VoltageLevel;
import com.powsybl.iidm.network.extensions.*;
import com.powsybl.nad.NadParameters;
import com.powsybl.nad.NetworkAreaDiagram;
import com.powsybl.nad.build.iidm.VoltageLevelFilter;
Expand All @@ -21,12 +19,9 @@
import com.powsybl.nad.svg.iidm.TopologicalStyleProvider;
import com.powsybl.network.store.client.NetworkStoreService;
import com.powsybl.network.store.client.PreloadingStrategy;
import com.powsybl.sld.server.dto.LineGeoData;
import com.powsybl.sld.server.dto.SubstationGeoData;
import com.powsybl.sld.server.dto.SvgAndMetadata;
import com.powsybl.sld.server.dto.VoltageLevelInfos;
import com.powsybl.sld.server.utils.DiagramUtils;
import com.powsybl.sld.server.utils.GeoDataUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.http.HttpStatus;
Expand All @@ -37,7 +32,6 @@
import java.io.StringWriter;
import java.io.UncheckedIOException;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

/**
Expand Down Expand Up @@ -90,45 +84,8 @@ public SvgAndMetadata generateNetworkAreaDiagramSvg(UUID networkUuid, String var
private void getGeoDataCoordinates(Network network, UUID networkUuid, String variantId, List<VoltageLevel> voltageLevels) {
// Geographical Position for lines and substations related to voltageLevels
List<Substation> substations = getSubstations(voltageLevels);
assignSubstationGeoData(network, networkUuid, variantId, substations);
assignLineGeoData(network, networkUuid, variantId, getLines(voltageLevels));
}

private void assignSubstationGeoData(Network network, UUID networkUuid, String variantId, List<Substation> substations) {

List<SubstationGeoData> substationsGeoData = GeoDataUtils.fromStringToSubstationGeoData(geoDataService.getSubstationsGraphics(networkUuid, variantId, null), new ObjectMapper());
Map<String, com.powsybl.sld.server.dto.Coordinate> substationGeoDataMap = substationsGeoData.stream()
.collect(Collectors.toMap(SubstationGeoData::getId, SubstationGeoData::getCoordinate));

for (Substation substation : substations) {
if (network.getSubstation(substation.getId()).getExtension(SubstationPosition.class) == null) {
com.powsybl.sld.server.dto.Coordinate coordinate = substationGeoDataMap.get(substation.getId());
if (coordinate != null) {
network.getSubstation(substation.getId())
.newExtension(SubstationPositionAdder.class)
.withCoordinate(new Coordinate(coordinate.getLat(), coordinate.getLon()))
.add();
}
}

}
}

private void assignLineGeoData(Network network, UUID networkUuid, String variantId, List<Line> lines) {
List<LineGeoData> linesGeoData = GeoDataUtils.fromStringToLineGeoData(geoDataService.getLinesGraphics(networkUuid, variantId, null), new ObjectMapper());
Map<String, List<com.powsybl.sld.server.dto.Coordinate>> lineGeoDataMap = linesGeoData.stream()
.collect(Collectors.toMap(LineGeoData::getId, LineGeoData::getCoordinates));
for (Line line : lines) {
if (network.getLine(line.getId()).getExtension(LinePosition.class) == null) {
List<com.powsybl.sld.server.dto.Coordinate> coordinates = lineGeoDataMap.get(line.getId());
if (coordinates != null) {
network.getLine(line.getId())
.newExtension(LinePositionAdder.class)
.withCoordinates(coordinates)
.add();
}
}
}
geoDataService.assignSubstationGeoData(network, networkUuid, variantId, substations);
geoDataService.assignLineGeoData(network, networkUuid, variantId, getLines(voltageLevels));
}

private List<Substation> getSubstations(List<VoltageLevel> voltages) {
Expand Down
122 changes: 121 additions & 1 deletion src/test/java/com/powsybl/sld/server/GeoDataServiceTest.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
package com.powsybl.sld.server;

/*
* Copyright (c) 2023, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

import com.fasterxml.jackson.databind.ObjectMapper;
import com.powsybl.iidm.network.*;
import com.powsybl.iidm.network.extensions.LinePosition;
import com.powsybl.iidm.network.extensions.SubstationPosition;
import com.powsybl.network.store.client.NetworkStoreService;
import com.powsybl.network.store.client.PreloadingStrategy;
import com.powsybl.sld.server.dto.LineGeoData;
import com.powsybl.sld.server.utils.GeoDataUtils;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentMatchers;
Expand All @@ -15,22 +24,100 @@
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.when;

public class GeoDataServiceTest {

private static final String VARIANT_1_ID = "variant_1";
private static final String VARIANT_2_ID = "variant_2";
private final String baseUri = "http://geo-data-server/";
@Mock
private RestTemplate restTemplate;
@InjectMocks
private GeoDataService geoDataService;
@Mock
private NetworkStoreService networkStoreService;

public static Network createNetwork() {
Network network = Network.create("test", "test");
Substation substationFr1 = network.newSubstation()
.setId("subFr1")
.setCountry(Country.FR)
.setTso("RTE")
.add();
VoltageLevel voltageLevelFr1A = substationFr1.newVoltageLevel()
.setId("vlFr1A")
.setName("vlFr1A")
.setNominalV(440.0)
.setHighVoltageLimit(400.0)
.setLowVoltageLimit(200.0)
.setTopologyKind(TopologyKind.BUS_BREAKER)
.add();
voltageLevelFr1A.getBusBreakerView().newBus()
.setId("busFr1A")
.setName("busFr1A")
.add();
VoltageLevel voltageLevelFr1B = substationFr1.newVoltageLevel()
.setId("vlFr1B").setName("vlFr1B")
.setNominalV(200.0)
.setHighVoltageLimit(400.0)
.setLowVoltageLimit(200.0)
.setTopologyKind(TopologyKind.BUS_BREAKER)
.add();
voltageLevelFr1B.getBusBreakerView().newBus()
.setId("busFr1B")
.setName("busFr1B")
.add();

Substation substationFr2 = network.newSubstation()
.setId("subFr2")
.setCountry(Country.FR)
.setTso("RTE")
.add();
VoltageLevel voltageLevelFr2A = substationFr2.newVoltageLevel()
.setId("vlFr2A")
.setName("vlFr2A")
.setNominalV(440.0)
.setHighVoltageLimit(400.0)
.setLowVoltageLimit(200.0)
.setTopologyKind(TopologyKind.BUS_BREAKER)
.add();
voltageLevelFr2A.getBusBreakerView().newBus()
.setId("busFr2A")
.setName("busFr2A")
.add();
Line lineFr1 = network.newLine()
.setId("lineFr1")
.setVoltageLevel1("vlFr2A")
.setBus1("busFr2A")
.setConnectableBus1("busFr2A")
.setVoltageLevel2("vlFr2A")
.setBus2("busFr2A")
.setConnectableBus2("busFr2A")
.setR(3.0)
.setX(33.0)
.setG1(0.0)
.setB1(386E-6 / 2)
.setG2(0.0)
.setB2(386E-6 / 2)
.add();
network.getVariantManager().cloneVariant(VariantManagerConstants.INITIAL_VARIANT_ID, VARIANT_1_ID);
network.getVariantManager().cloneVariant(VariantManagerConstants.INITIAL_VARIANT_ID, VARIANT_2_ID);

return network;
}

@Before
public void setUp() {
MockitoAnnotations.openMocks(this);
MockitoAnnotations.initMocks(this);
geoDataService.setGeoDataServerBaseUri(baseUri);
}

Expand Down Expand Up @@ -91,4 +178,37 @@ public void testGetSubstationsGraphicsWithoutVariantId() {

assertEquals(expectedResponse, response);
}

@Test
public void testAssignSubstationGeoData() throws Exception {
UUID testNetworkId = UUID.fromString("7928181c-7977-4592-ba19-88027e4254e4");
given(networkStoreService.getNetwork(testNetworkId, PreloadingStrategy.COLLECTION)).willReturn(createNetwork());
Network network = networkStoreService.getNetwork(testNetworkId, PreloadingStrategy.COLLECTION);
String substationGeoDataJson = "[{\"id\":\"subFr1\",\"coordinate\":{\"lat\":48.8588443,\"lon\":2.2943506}},{\"id\":\"subFr2\",\"coordinate\":{\"lat\":51.507351,\"lon\":1.127758}}]";
when(geoDataService.getSubstationsGraphics(testNetworkId, VARIANT_1_ID, null)).thenReturn(substationGeoDataJson);

geoDataService.assignSubstationGeoData(network, testNetworkId, VARIANT_1_ID, List.of(network.getSubstation("subFr1")));
assertEquals(network.getSubstation("subFr1").getExtension(SubstationPosition.class).getCoordinate(), new com.powsybl.iidm.network.extensions.Coordinate(48.8588443, 2.2943506));
assertEquals(network.getSubstation("subFr2").getExtension(SubstationPosition.class), null);
}

@Test
public void testAssignLineGeoData() throws Exception {
UUID testNetworkId = UUID.fromString("7928181c-7977-4592-ba19-88027e4254e4");
given(networkStoreService.getNetwork(testNetworkId, PreloadingStrategy.COLLECTION)).willReturn(createNetwork());
Network network = networkStoreService.getNetwork(testNetworkId, PreloadingStrategy.COLLECTION);
String lineGeoDataJson = "[{\"id\":\"lineFr1\",\"coordinates\":[{\"lat\":48.8588443,\"lon\":2.2943506},{\"lat\":48.8588444,\"lon\":2.2943507}]},{\"id\":\"lineFr2\",\"coordinates\":[{\"lat\":51.507351,\"lon\":-0.127758},{\"lat\":51.507352,\"lon\":-0.127759}]}]";
when(geoDataService.getLinesGraphics(testNetworkId, VARIANT_1_ID, null)).thenReturn(lineGeoDataJson);

List<LineGeoData> linesGeoData = GeoDataUtils.fromStringToLineGeoData(lineGeoDataJson, new ObjectMapper());
Map<String, List<com.powsybl.sld.server.dto.Coordinate>> lineGeoDataMap = linesGeoData.stream()
.collect(Collectors.toMap(LineGeoData::getId, LineGeoData::getCoordinates));

// Convert Iterable to List
List<Line> lines = StreamSupport.stream(network.getLines().spliterator(), false)
.collect(Collectors.toList());

geoDataService.assignLineGeoData(network, testNetworkId, VARIANT_1_ID, lines);
assertNotNull("Line position will not be null", network.getLine("lineFr1").getExtension(LinePosition.class));
}
}

0 comments on commit 3f1d20b

Please sign in to comment.