Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release/0.0.2 #98

Merged
merged 19 commits into from
Apr 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
5bde1ec
Update SCL initialisation method to allow the creation with a specifi…
SaintierFr Mar 14, 2022
db9c164
Merge pull request #72 from com-pas/71-create-new-scd-file-with-speci…
AliouDIAITE Mar 29, 2022
d3e2cd3
[#57] : add Voltage Level and Bay adapters and tests
AliouDIAITE Mar 22, 2022
7372597
[#57] : WIP services and tests add substation to scd
AliouDIAITE Mar 23, 2022
a6683e7
[#57] : Done add substation from ssd to scd
AliouDIAITE Mar 24, 2022
b68d6f6
[#57] : Add tests
AliouDIAITE Mar 25, 2022
9eb3345
Update sct-commons/src/test/resources/scd-substation-import-ssd/scd_w…
AliouDIAITE Mar 30, 2022
266c2d9
Update sct-commons/src/test/resources/scd-substation-import-ssd/scd_w…
AliouDIAITE Mar 30, 2022
f50f875
Update sct-commons/src/test/resources/scd-substation-import-ssd/scd_w…
AliouDIAITE Mar 30, 2022
cfcaeff
Update sct-commons/src/test/resources/scd-substation-import-ssd/scd_w…
AliouDIAITE Mar 30, 2022
7509714
Update sct-commons/src/test/resources/scd-substation-import-ssd/scd_w…
AliouDIAITE Mar 30, 2022
9c73c63
Update sct-commons/src/test/resources/scd-substation-import-ssd/ssd.xml
AliouDIAITE Mar 30, 2022
a9ed218
Update sct-commons/src/test/resources/scd-substation-import-ssd/ssd_w…
AliouDIAITE Mar 30, 2022
687952f
Update sct-commons/src/test/resources/scd-substation-import-ssd/ssd_w…
AliouDIAITE Mar 30, 2022
d27f5e5
Update sct-commons/src/test/resources/scd-substation-import-ssd/ssd_w…
AliouDIAITE Mar 30, 2022
e6a6852
Update sct-commons/src/test/resources/scd-substation-import-ssd/ssd.xml
AliouDIAITE Mar 30, 2022
7cef056
[#57] : file correction && add new test
AliouDIAITE Mar 30, 2022
b1ca3d4
[#57] : replace tests by ParametrerizedTest , update pom and remove u…
AliouDIAITE Mar 30, 2022
a61eb41
Merge pull request #73 from com-pas/feat/57-Import-SSD-Substation-Int…
AliouDIAITE Apr 4, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,19 @@
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.2</version>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.7.2</version>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
Expand Down
5 changes: 5 additions & 0 deletions sct-commons/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,9 @@
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;
import org.lfenergy.compas.scl2007b4.model.SCL;
import org.lfenergy.compas.scl2007b4.model.TExtRef;
import org.lfenergy.compas.scl2007b4.model.TPredefinedBasicTypeEnum;
import org.lfenergy.compas.scl2007b4.model.TPredefinedCDCEnum;
import org.lfenergy.compas.scl2007b4.model.*;
import org.lfenergy.compas.sct.commons.Utils;
import org.lfenergy.compas.sct.commons.dto.ConnectedApDTO;
import org.lfenergy.compas.sct.commons.dto.ControlBlock;
import org.lfenergy.compas.sct.commons.dto.ExtRefBindingInfo;
import org.lfenergy.compas.sct.commons.dto.ExtRefInfo;
import org.lfenergy.compas.sct.commons.dto.ExtRefSignalInfo;
import org.lfenergy.compas.sct.commons.dto.ExtRefSourceInfo;
import org.lfenergy.compas.sct.commons.dto.HeaderDTO;
import org.lfenergy.compas.sct.commons.dto.ResumedDataTemplate;
import org.lfenergy.compas.sct.commons.dto.SubNetworkDTO;
import org.lfenergy.compas.sct.commons.dto.*;
import org.lfenergy.compas.sct.commons.exception.ScdException;
import org.lfenergy.compas.sct.commons.scl.com.CommunicationAdapter;
import org.lfenergy.compas.sct.commons.scl.dtt.DataTypeTemplateAdapter;
Expand All @@ -31,12 +20,10 @@
import org.lfenergy.compas.sct.commons.scl.ied.DAITracker;
import org.lfenergy.compas.sct.commons.scl.ied.IEDAdapter;
import org.lfenergy.compas.sct.commons.scl.ied.LDeviceAdapter;
import org.lfenergy.compas.sct.commons.scl.sstation.SubstationAdapter;
import org.lfenergy.compas.sct.commons.scl.sstation.VoltageLevelAdapter;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.*;
import java.util.stream.Collectors;

@Slf4j
Expand All @@ -47,9 +34,9 @@ public class SclService {

private SclService(){ throw new IllegalStateException("SclService class"); }

public static SclRootAdapter initScl(String hVersion, String hRevision) throws ScdException {
UUID hId = UUID.randomUUID();
return new SclRootAdapter(hId.toString(),hVersion,hRevision);
public static SclRootAdapter initScl(Optional<UUID> hId, String hVersion, String hRevision) throws ScdException {
UUID headerId = hId.orElseGet(UUID::randomUUID);
return new SclRootAdapter(headerId.toString(), hVersion, hRevision);
}

public static SclRootAdapter addHistoryItem(SCL scd, String who, String what, String why){
Expand Down Expand Up @@ -336,4 +323,51 @@ public static Set<Pair<Integer, String>> getEnumTypeElements(SCL scd, String idE
.map(tEnumVal -> Pair.of(tEnumVal.getOrd(),tEnumVal.getValue()))
.collect(Collectors.toSet());
}

public static SclRootAdapter addSubstation(@NonNull SCL scd, @NonNull SCL ssd) throws ScdException {
SclRootAdapter scdRootAdapter = new SclRootAdapter(scd);
SclRootAdapter ssdRootAdapter = new SclRootAdapter(ssd);
if(scdRootAdapter.getCurrentElem().getSubstation().size() > 1
|| ssdRootAdapter.currentElem.getSubstation().size() != 1) {
throw new ScdException("SCD file must have one or zero Substation and " +
"SCD file must have one Substation. The files are rejected.");
}
TSubstation ssdTSubstation = ssdRootAdapter.currentElem.getSubstation().get(0);
if(scdRootAdapter.getCurrentElem().getSubstation().isEmpty()) {
scdRootAdapter.getCurrentElem().getSubstation().add(ssdTSubstation);
return scdRootAdapter;
} else {
TSubstation scdTSubstation = scdRootAdapter.currentElem.getSubstation().get(0);
if(scdTSubstation.getName().equalsIgnoreCase(ssdTSubstation.getName())) {
SubstationAdapter scdSubstationAdapter = scdRootAdapter.getSubstationAdapter(scdTSubstation.getName());
for(TVoltageLevel tvl : ssdTSubstation.getVoltageLevel()){
updateVoltageLevel(scdSubstationAdapter, tvl);
}
} else throw new ScdException("SCD file must have only one Substation and the Substation name from SSD file is" +
" different from the one in SCD file. The files are rejected.");
}
return scdRootAdapter;
}

private static void updateVoltageLevel(@NonNull SubstationAdapter scdSubstationAdapter, TVoltageLevel vl) throws ScdException {
if(scdSubstationAdapter.getVoltageLevelAdapter(vl.getName()).isPresent()) {
VoltageLevelAdapter scdVoltageLevelAdapter = scdSubstationAdapter.getVoltageLevelAdapter(vl.getName())
.orElseThrow(() -> new ScdException("Unable to create VoltageLevelAdapter"));
for (TBay tbay: vl.getBay()) {
updateBay(scdVoltageLevelAdapter, tbay);
}
} else {
scdSubstationAdapter.getCurrentElem().getVoltageLevel().add(vl);
}
}

private static void updateBay(@NonNull VoltageLevelAdapter scdVoltageLevelAdapter, TBay tBay) {
if(scdVoltageLevelAdapter.getBayAdapter(tBay.getName()).isPresent()){
scdVoltageLevelAdapter.getCurrentElem().getBay()
.removeIf(t -> t.getName().equalsIgnoreCase(tBay.getName()));
scdVoltageLevelAdapter.getCurrentElem().getBay().add(tBay);
} else {
scdVoltageLevelAdapter.getCurrentElem().getBay().add(tBay);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// SPDX-FileCopyrightText: 2021 RTE FRANCE
//
// SPDX-License-Identifier: Apache-2.0
package org.lfenergy.compas.sct.commons.scl.sstation;

import org.lfenergy.compas.scl2007b4.model.TBay;
import org.lfenergy.compas.sct.commons.exception.ScdException;
import org.lfenergy.compas.sct.commons.scl.SclElementAdapter;

public class BayAdapter extends SclElementAdapter<VoltageLevelAdapter, TBay> {

public BayAdapter(VoltageLevelAdapter parentAdapter){super(parentAdapter);}

public BayAdapter(VoltageLevelAdapter parentAdapter, TBay currentElem){
super (parentAdapter, currentElem);
}

public BayAdapter(VoltageLevelAdapter parentAdapter, String bayName) throws ScdException {
super(parentAdapter);
TBay tBay = parentAdapter.getCurrentElem().getBay()
.stream()
.filter(bay -> bay.getName().equals(bayName))
.findFirst()
.orElseThrow(() -> new ScdException("Unknown Bay name :" + bayName));
setCurrentElem(tBay);
}

@Override
protected boolean amChildElementRef() {
return parentAdapter.getCurrentElem().getBay().contains(currentElem);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import org.lfenergy.compas.sct.commons.scl.SclElementAdapter;
import org.lfenergy.compas.sct.commons.scl.SclRootAdapter;

import java.util.Optional;

public class SubstationAdapter extends SclElementAdapter<SclRootAdapter, TSubstation> {

public SubstationAdapter(SclRootAdapter parentAdapter) {
Expand All @@ -33,4 +35,12 @@ public SubstationAdapter(SclRootAdapter parentAdapter, String ssName) throws Scd
protected boolean amChildElementRef() {
return parentAdapter.getCurrentElem().getSubstation().contains(currentElem);
}

public Optional<VoltageLevelAdapter> getVoltageLevelAdapter(String vLevelName) {
return currentElem.getVoltageLevel()
.stream()
.filter(tVoltageLevel -> tVoltageLevel.getName().equals(vLevelName))
.map(tVoltageLevel -> new VoltageLevelAdapter(this, tVoltageLevel))
.findFirst();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// SPDX-FileCopyrightText: 2021 RTE FRANCE
//
// SPDX-License-Identifier: Apache-2.0
package org.lfenergy.compas.sct.commons.scl.sstation;

import org.lfenergy.compas.scl2007b4.model.TVoltageLevel;
import org.lfenergy.compas.sct.commons.exception.ScdException;
import org.lfenergy.compas.sct.commons.scl.SclElementAdapter;

import java.util.Optional;

public class VoltageLevelAdapter extends SclElementAdapter<SubstationAdapter, TVoltageLevel> {

public VoltageLevelAdapter(SubstationAdapter parentAdapter) {super(parentAdapter);}

public VoltageLevelAdapter(SubstationAdapter substationAdapter, TVoltageLevel currentElem){
super(substationAdapter, currentElem);
}

public VoltageLevelAdapter(SubstationAdapter parentAdapter, String vLevelName) throws ScdException {
super(parentAdapter);
TVoltageLevel tVoltageLevel = parentAdapter.getCurrentElem().getVoltageLevel()
.stream()
.filter(vLevel -> vLevel.getName().equals(vLevelName))
.findFirst()
.orElseThrow(() -> new ScdException("Unknown VoltageLevel name :" + vLevelName));
setCurrentElem(tVoltageLevel);
}


@Override
protected boolean amChildElementRef() {
return parentAdapter.getCurrentElem().getVoltageLevel().contains(currentElem);
}

public Optional<BayAdapter> getBayAdapter(String bayName) {
return currentElem.getBay()
.stream()
.filter(tBay -> tBay.getName().equals(bayName))
.map(tBay -> new BayAdapter(this, tBay))
.findFirst();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,43 +5,23 @@
package org.lfenergy.compas.sct.commons.scl;

import org.junit.jupiter.api.Test;
import org.lfenergy.compas.scl2007b4.model.SCL;
import org.lfenergy.compas.scl2007b4.model.TExtRef;
import org.lfenergy.compas.scl2007b4.model.THeader;
import org.lfenergy.compas.scl2007b4.model.THitem;
import org.lfenergy.compas.scl2007b4.model.TLLN0Enum;
import org.lfenergy.compas.scl2007b4.model.TServiceType;
import org.lfenergy.compas.scl2007b4.model.TVal;
import org.lfenergy.compas.sct.commons.dto.DTO;
import org.lfenergy.compas.sct.commons.dto.HeaderDTO;
import org.lfenergy.compas.sct.commons.testhelpers.MarshallerWrapper;
import org.lfenergy.compas.sct.commons.dto.ConnectedApDTO;
import org.lfenergy.compas.sct.commons.dto.DaTypeName;
import org.lfenergy.compas.sct.commons.dto.DoTypeName;
import org.lfenergy.compas.sct.commons.dto.ExtRefBindingInfo;
import org.lfenergy.compas.sct.commons.dto.ExtRefInfo;
import org.lfenergy.compas.sct.commons.dto.ExtRefSignalInfo;
import org.lfenergy.compas.sct.commons.dto.ExtRefSourceInfo;
import org.lfenergy.compas.sct.commons.dto.LNodeDTO;
import org.lfenergy.compas.sct.commons.dto.ResumedDataTemplate;
import org.lfenergy.compas.sct.commons.dto.SubNetworkDTO;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.lfenergy.compas.scl2007b4.model.*;
import org.lfenergy.compas.sct.commons.dto.*;
import org.lfenergy.compas.sct.commons.exception.ScdException;
import org.lfenergy.compas.sct.commons.scl.ied.IEDAdapter;
import org.lfenergy.compas.sct.commons.scl.ied.LDeviceAdapter;
import org.lfenergy.compas.sct.commons.scl.ied.LN0Adapter;
import org.lfenergy.compas.sct.commons.testhelpers.MarshallerWrapper;
import org.lfenergy.compas.sct.commons.testhelpers.SclTestMarshaller;

import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;

import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;

class SclServiceTest {

Expand Down Expand Up @@ -314,15 +294,23 @@ void testGetDAI() throws Exception {
@Test
void testInitScl(){
assertDoesNotThrow(
() -> SclService.initScl("hVersion","hRevision")
() -> SclService.initScl(Optional.empty(), "hVersion","hRevision")
);
}

@Test
void testInitScl_With_hId_shouldNotThrowError(){
UUID hid = UUID.randomUUID();
assertDoesNotThrow(
() -> SclService.initScl(Optional.of(hid),"hVersion","hRevision")
);
}

@Test
void testUpdateHeader() {

SclRootAdapter sclRootAdapter = assertDoesNotThrow(
() -> SclService.initScl("hVersion","hRevision")
() -> SclService.initScl(Optional.empty(),"hVersion","hRevision")
);
UUID hId = UUID.fromString(sclRootAdapter.getHeaderAdapter().getHeaderId());
HeaderDTO headerDTO = DTO.createHeaderDTO(hId);
Expand Down Expand Up @@ -363,4 +351,50 @@ void testGetEnumTypeElements() throws Exception {
);
assertFalse(enumList.isEmpty());
}

@ParameterizedTest
@ValueSource(strings = {"/scd-substation-import-ssd/ssd_with_2_substations.xml", "/scd-substation-import-ssd/ssd_without_substations.xml"})
void testAddSubstation_Check_SSD_Validity(String ssdFileName) throws Exception {
SCL scd = SclTestMarshaller.getSCLFromFile("/scl-root-test-schema-conf/add_ied_test.xml");
SCL ssd = SclTestMarshaller.getSCLFromFile(ssdFileName);

assertThrows(ScdException.class,
() ->SclService.addSubstation(scd, ssd));
}

@Test
void testAddSubstation_SCD_Without_Substation() throws Exception {
SCL scd = SclTestMarshaller.getSCLFromFile("/scl-root-test-schema-conf/add_ied_test.xml");
SclRootAdapter scdRootAdapter = new SclRootAdapter(scd);
SCL ssd = SclTestMarshaller.getSCLFromFile("/scd-substation-import-ssd/ssd.xml");
SclRootAdapter ssdRootAdapter = new SclRootAdapter(ssd);
SclRootAdapter expectedScdAdapter = SclService.addSubstation(scd, ssd);

assertNotEquals(scdRootAdapter, expectedScdAdapter);
assertEquals(expectedScdAdapter.getCurrentElem().getSubstation(), ssdRootAdapter.getCurrentElem().getSubstation());
}

@Test
void testAddSubstation_SCD_With_Different_Substation_Name() throws Exception {
SCL scd = SclTestMarshaller.getSCLFromFile("/scd-substation-import-ssd/scd_with_substation_name_different.xml");
SCL ssd = SclTestMarshaller.getSCLFromFile("/scd-substation-import-ssd/ssd.xml");

assertThrows(ScdException.class,
() ->SclService.addSubstation(scd, ssd));
}

@Test
void testAddSubstation_SCD_With_Substation() throws Exception {
SCL scd = SclTestMarshaller.getSCLFromFile("/scd-substation-import-ssd/scd_with_substation.xml");
SclRootAdapter scdRootAdapter = new SclRootAdapter(scd);
SCL ssd = SclTestMarshaller.getSCLFromFile("/scd-substation-import-ssd/ssd.xml");
SclRootAdapter ssdRootAdapter = new SclRootAdapter(ssd);
SclRootAdapter expectedScdAdapter = SclService.addSubstation(scd, ssd);
TSubstation expectedTSubstation = expectedScdAdapter.getCurrentElem().getSubstation().get(0);
TSubstation tSubstation = ssdRootAdapter.getCurrentElem().getSubstation().get(0);

assertNotEquals(scdRootAdapter, expectedScdAdapter);
assertEquals(expectedTSubstation.getName(), tSubstation.getName());
assertEquals(expectedTSubstation.getVoltageLevel().size(), tSubstation.getVoltageLevel().size());
}
}
Loading