Skip to content

Commit

Permalink
Merge pull request #98 from com-pas/release/0.0.2
Browse files Browse the repository at this point in the history
Release/0.0.2
  • Loading branch information
AliouDIAITE authored Apr 21, 2022
2 parents 9042e08 + a61eb41 commit dea00f9
Show file tree
Hide file tree
Showing 15 changed files with 548 additions and 56 deletions.
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

0 comments on commit dea00f9

Please sign in to comment.