Skip to content

Commit dea00f9

Browse files
authored
Merge pull request #98 from com-pas/release/0.0.2
Release/0.0.2
2 parents 9042e08 + a61eb41 commit dea00f9

File tree

15 files changed

+548
-56
lines changed

15 files changed

+548
-56
lines changed

pom.xml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,19 @@
4848
<dependency>
4949
<groupId>org.junit.jupiter</groupId>
5050
<artifactId>junit-jupiter-api</artifactId>
51-
<version>5.7.2</version>
51+
<version>5.8.1</version>
5252
<scope>test</scope>
5353
</dependency>
5454
<dependency>
5555
<groupId>org.junit.jupiter</groupId>
5656
<artifactId>junit-jupiter-engine</artifactId>
57-
<version>5.7.2</version>
57+
<version>5.8.1</version>
58+
<scope>test</scope>
59+
</dependency>
60+
<dependency>
61+
<groupId>org.junit.jupiter</groupId>
62+
<artifactId>junit-jupiter-params</artifactId>
63+
<version>5.8.1</version>
5864
<scope>test</scope>
5965
</dependency>
6066
<dependency>

sct-commons/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@
6060
<artifactId>junit-jupiter-engine</artifactId>
6161
<scope>test</scope>
6262
</dependency>
63+
<dependency>
64+
<groupId>org.junit.jupiter</groupId>
65+
<artifactId>junit-jupiter-params</artifactId>
66+
<scope>test</scope>
67+
</dependency>
6368
<dependency>
6469
<groupId>org.hamcrest</groupId>
6570
<artifactId>hamcrest</artifactId>

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/SclService.java

Lines changed: 55 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,9 @@
77
import lombok.NonNull;
88
import lombok.extern.slf4j.Slf4j;
99
import org.apache.commons.lang3.tuple.Pair;
10-
import org.lfenergy.compas.scl2007b4.model.SCL;
11-
import org.lfenergy.compas.scl2007b4.model.TExtRef;
12-
import org.lfenergy.compas.scl2007b4.model.TPredefinedBasicTypeEnum;
13-
import org.lfenergy.compas.scl2007b4.model.TPredefinedCDCEnum;
10+
import org.lfenergy.compas.scl2007b4.model.*;
1411
import org.lfenergy.compas.sct.commons.Utils;
15-
import org.lfenergy.compas.sct.commons.dto.ConnectedApDTO;
16-
import org.lfenergy.compas.sct.commons.dto.ControlBlock;
17-
import org.lfenergy.compas.sct.commons.dto.ExtRefBindingInfo;
18-
import org.lfenergy.compas.sct.commons.dto.ExtRefInfo;
19-
import org.lfenergy.compas.sct.commons.dto.ExtRefSignalInfo;
20-
import org.lfenergy.compas.sct.commons.dto.ExtRefSourceInfo;
21-
import org.lfenergy.compas.sct.commons.dto.HeaderDTO;
22-
import org.lfenergy.compas.sct.commons.dto.ResumedDataTemplate;
23-
import org.lfenergy.compas.sct.commons.dto.SubNetworkDTO;
12+
import org.lfenergy.compas.sct.commons.dto.*;
2413
import org.lfenergy.compas.sct.commons.exception.ScdException;
2514
import org.lfenergy.compas.sct.commons.scl.com.CommunicationAdapter;
2615
import org.lfenergy.compas.sct.commons.scl.dtt.DataTypeTemplateAdapter;
@@ -31,12 +20,10 @@
3120
import org.lfenergy.compas.sct.commons.scl.ied.DAITracker;
3221
import org.lfenergy.compas.sct.commons.scl.ied.IEDAdapter;
3322
import org.lfenergy.compas.sct.commons.scl.ied.LDeviceAdapter;
23+
import org.lfenergy.compas.sct.commons.scl.sstation.SubstationAdapter;
24+
import org.lfenergy.compas.sct.commons.scl.sstation.VoltageLevelAdapter;
3425

35-
import java.util.ArrayList;
36-
import java.util.List;
37-
import java.util.Optional;
38-
import java.util.Set;
39-
import java.util.UUID;
26+
import java.util.*;
4027
import java.util.stream.Collectors;
4128

4229
@Slf4j
@@ -47,9 +34,9 @@ public class SclService {
4734

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

50-
public static SclRootAdapter initScl(String hVersion, String hRevision) throws ScdException {
51-
UUID hId = UUID.randomUUID();
52-
return new SclRootAdapter(hId.toString(),hVersion,hRevision);
37+
public static SclRootAdapter initScl(Optional<UUID> hId, String hVersion, String hRevision) throws ScdException {
38+
UUID headerId = hId.orElseGet(UUID::randomUUID);
39+
return new SclRootAdapter(headerId.toString(), hVersion, hRevision);
5340
}
5441

5542
public static SclRootAdapter addHistoryItem(SCL scd, String who, String what, String why){
@@ -336,4 +323,51 @@ public static Set<Pair<Integer, String>> getEnumTypeElements(SCL scd, String idE
336323
.map(tEnumVal -> Pair.of(tEnumVal.getOrd(),tEnumVal.getValue()))
337324
.collect(Collectors.toSet());
338325
}
326+
327+
public static SclRootAdapter addSubstation(@NonNull SCL scd, @NonNull SCL ssd) throws ScdException {
328+
SclRootAdapter scdRootAdapter = new SclRootAdapter(scd);
329+
SclRootAdapter ssdRootAdapter = new SclRootAdapter(ssd);
330+
if(scdRootAdapter.getCurrentElem().getSubstation().size() > 1
331+
|| ssdRootAdapter.currentElem.getSubstation().size() != 1) {
332+
throw new ScdException("SCD file must have one or zero Substation and " +
333+
"SCD file must have one Substation. The files are rejected.");
334+
}
335+
TSubstation ssdTSubstation = ssdRootAdapter.currentElem.getSubstation().get(0);
336+
if(scdRootAdapter.getCurrentElem().getSubstation().isEmpty()) {
337+
scdRootAdapter.getCurrentElem().getSubstation().add(ssdTSubstation);
338+
return scdRootAdapter;
339+
} else {
340+
TSubstation scdTSubstation = scdRootAdapter.currentElem.getSubstation().get(0);
341+
if(scdTSubstation.getName().equalsIgnoreCase(ssdTSubstation.getName())) {
342+
SubstationAdapter scdSubstationAdapter = scdRootAdapter.getSubstationAdapter(scdTSubstation.getName());
343+
for(TVoltageLevel tvl : ssdTSubstation.getVoltageLevel()){
344+
updateVoltageLevel(scdSubstationAdapter, tvl);
345+
}
346+
} else throw new ScdException("SCD file must have only one Substation and the Substation name from SSD file is" +
347+
" different from the one in SCD file. The files are rejected.");
348+
}
349+
return scdRootAdapter;
350+
}
351+
352+
private static void updateVoltageLevel(@NonNull SubstationAdapter scdSubstationAdapter, TVoltageLevel vl) throws ScdException {
353+
if(scdSubstationAdapter.getVoltageLevelAdapter(vl.getName()).isPresent()) {
354+
VoltageLevelAdapter scdVoltageLevelAdapter = scdSubstationAdapter.getVoltageLevelAdapter(vl.getName())
355+
.orElseThrow(() -> new ScdException("Unable to create VoltageLevelAdapter"));
356+
for (TBay tbay: vl.getBay()) {
357+
updateBay(scdVoltageLevelAdapter, tbay);
358+
}
359+
} else {
360+
scdSubstationAdapter.getCurrentElem().getVoltageLevel().add(vl);
361+
}
362+
}
363+
364+
private static void updateBay(@NonNull VoltageLevelAdapter scdVoltageLevelAdapter, TBay tBay) {
365+
if(scdVoltageLevelAdapter.getBayAdapter(tBay.getName()).isPresent()){
366+
scdVoltageLevelAdapter.getCurrentElem().getBay()
367+
.removeIf(t -> t.getName().equalsIgnoreCase(tBay.getName()));
368+
scdVoltageLevelAdapter.getCurrentElem().getBay().add(tBay);
369+
} else {
370+
scdVoltageLevelAdapter.getCurrentElem().getBay().add(tBay);
371+
}
372+
}
339373
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// SPDX-FileCopyrightText: 2021 RTE FRANCE
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
package org.lfenergy.compas.sct.commons.scl.sstation;
5+
6+
import org.lfenergy.compas.scl2007b4.model.TBay;
7+
import org.lfenergy.compas.sct.commons.exception.ScdException;
8+
import org.lfenergy.compas.sct.commons.scl.SclElementAdapter;
9+
10+
public class BayAdapter extends SclElementAdapter<VoltageLevelAdapter, TBay> {
11+
12+
public BayAdapter(VoltageLevelAdapter parentAdapter){super(parentAdapter);}
13+
14+
public BayAdapter(VoltageLevelAdapter parentAdapter, TBay currentElem){
15+
super (parentAdapter, currentElem);
16+
}
17+
18+
public BayAdapter(VoltageLevelAdapter parentAdapter, String bayName) throws ScdException {
19+
super(parentAdapter);
20+
TBay tBay = parentAdapter.getCurrentElem().getBay()
21+
.stream()
22+
.filter(bay -> bay.getName().equals(bayName))
23+
.findFirst()
24+
.orElseThrow(() -> new ScdException("Unknown Bay name :" + bayName));
25+
setCurrentElem(tBay);
26+
}
27+
28+
@Override
29+
protected boolean amChildElementRef() {
30+
return parentAdapter.getCurrentElem().getBay().contains(currentElem);
31+
}
32+
}

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/sstation/SubstationAdapter.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import org.lfenergy.compas.sct.commons.scl.SclElementAdapter;
1010
import org.lfenergy.compas.sct.commons.scl.SclRootAdapter;
1111

12+
import java.util.Optional;
13+
1214
public class SubstationAdapter extends SclElementAdapter<SclRootAdapter, TSubstation> {
1315

1416
public SubstationAdapter(SclRootAdapter parentAdapter) {
@@ -33,4 +35,12 @@ public SubstationAdapter(SclRootAdapter parentAdapter, String ssName) throws Scd
3335
protected boolean amChildElementRef() {
3436
return parentAdapter.getCurrentElem().getSubstation().contains(currentElem);
3537
}
38+
39+
public Optional<VoltageLevelAdapter> getVoltageLevelAdapter(String vLevelName) {
40+
return currentElem.getVoltageLevel()
41+
.stream()
42+
.filter(tVoltageLevel -> tVoltageLevel.getName().equals(vLevelName))
43+
.map(tVoltageLevel -> new VoltageLevelAdapter(this, tVoltageLevel))
44+
.findFirst();
45+
}
3646
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// SPDX-FileCopyrightText: 2021 RTE FRANCE
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
package org.lfenergy.compas.sct.commons.scl.sstation;
5+
6+
import org.lfenergy.compas.scl2007b4.model.TVoltageLevel;
7+
import org.lfenergy.compas.sct.commons.exception.ScdException;
8+
import org.lfenergy.compas.sct.commons.scl.SclElementAdapter;
9+
10+
import java.util.Optional;
11+
12+
public class VoltageLevelAdapter extends SclElementAdapter<SubstationAdapter, TVoltageLevel> {
13+
14+
public VoltageLevelAdapter(SubstationAdapter parentAdapter) {super(parentAdapter);}
15+
16+
public VoltageLevelAdapter(SubstationAdapter substationAdapter, TVoltageLevel currentElem){
17+
super(substationAdapter, currentElem);
18+
}
19+
20+
public VoltageLevelAdapter(SubstationAdapter parentAdapter, String vLevelName) throws ScdException {
21+
super(parentAdapter);
22+
TVoltageLevel tVoltageLevel = parentAdapter.getCurrentElem().getVoltageLevel()
23+
.stream()
24+
.filter(vLevel -> vLevel.getName().equals(vLevelName))
25+
.findFirst()
26+
.orElseThrow(() -> new ScdException("Unknown VoltageLevel name :" + vLevelName));
27+
setCurrentElem(tVoltageLevel);
28+
}
29+
30+
31+
@Override
32+
protected boolean amChildElementRef() {
33+
return parentAdapter.getCurrentElem().getVoltageLevel().contains(currentElem);
34+
}
35+
36+
public Optional<BayAdapter> getBayAdapter(String bayName) {
37+
return currentElem.getBay()
38+
.stream()
39+
.filter(tBay -> tBay.getName().equals(bayName))
40+
.map(tBay -> new BayAdapter(this, tBay))
41+
.findFirst();
42+
}
43+
}

sct-commons/src/test/java/org/lfenergy/compas/sct/commons/scl/SclServiceTest.java

Lines changed: 63 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,43 +5,23 @@
55
package org.lfenergy.compas.sct.commons.scl;
66

77
import org.junit.jupiter.api.Test;
8-
import org.lfenergy.compas.scl2007b4.model.SCL;
9-
import org.lfenergy.compas.scl2007b4.model.TExtRef;
10-
import org.lfenergy.compas.scl2007b4.model.THeader;
11-
import org.lfenergy.compas.scl2007b4.model.THitem;
12-
import org.lfenergy.compas.scl2007b4.model.TLLN0Enum;
13-
import org.lfenergy.compas.scl2007b4.model.TServiceType;
14-
import org.lfenergy.compas.scl2007b4.model.TVal;
15-
import org.lfenergy.compas.sct.commons.dto.DTO;
16-
import org.lfenergy.compas.sct.commons.dto.HeaderDTO;
17-
import org.lfenergy.compas.sct.commons.testhelpers.MarshallerWrapper;
18-
import org.lfenergy.compas.sct.commons.dto.ConnectedApDTO;
19-
import org.lfenergy.compas.sct.commons.dto.DaTypeName;
20-
import org.lfenergy.compas.sct.commons.dto.DoTypeName;
21-
import org.lfenergy.compas.sct.commons.dto.ExtRefBindingInfo;
22-
import org.lfenergy.compas.sct.commons.dto.ExtRefInfo;
23-
import org.lfenergy.compas.sct.commons.dto.ExtRefSignalInfo;
24-
import org.lfenergy.compas.sct.commons.dto.ExtRefSourceInfo;
25-
import org.lfenergy.compas.sct.commons.dto.LNodeDTO;
26-
import org.lfenergy.compas.sct.commons.dto.ResumedDataTemplate;
27-
import org.lfenergy.compas.sct.commons.dto.SubNetworkDTO;
8+
import org.junit.jupiter.params.ParameterizedTest;
9+
import org.junit.jupiter.params.provider.ValueSource;
10+
import org.lfenergy.compas.scl2007b4.model.*;
11+
import org.lfenergy.compas.sct.commons.dto.*;
2812
import org.lfenergy.compas.sct.commons.exception.ScdException;
2913
import org.lfenergy.compas.sct.commons.scl.ied.IEDAdapter;
3014
import org.lfenergy.compas.sct.commons.scl.ied.LDeviceAdapter;
3115
import org.lfenergy.compas.sct.commons.scl.ied.LN0Adapter;
16+
import org.lfenergy.compas.sct.commons.testhelpers.MarshallerWrapper;
3217
import org.lfenergy.compas.sct.commons.testhelpers.SclTestMarshaller;
3318

3419
import java.util.List;
20+
import java.util.Optional;
3521
import java.util.Set;
3622
import java.util.UUID;
3723

38-
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
39-
import static org.junit.jupiter.api.Assertions.assertEquals;
40-
import static org.junit.jupiter.api.Assertions.assertFalse;
41-
import static org.junit.jupiter.api.Assertions.assertNotNull;
42-
import static org.junit.jupiter.api.Assertions.assertNull;
43-
import static org.junit.jupiter.api.Assertions.assertThrows;
44-
import static org.junit.jupiter.api.Assertions.assertTrue;
24+
import static org.junit.jupiter.api.Assertions.*;
4525

4626
class SclServiceTest {
4727

@@ -314,15 +294,23 @@ void testGetDAI() throws Exception {
314294
@Test
315295
void testInitScl(){
316296
assertDoesNotThrow(
317-
() -> SclService.initScl("hVersion","hRevision")
297+
() -> SclService.initScl(Optional.empty(), "hVersion","hRevision")
298+
);
299+
}
300+
301+
@Test
302+
void testInitScl_With_hId_shouldNotThrowError(){
303+
UUID hid = UUID.randomUUID();
304+
assertDoesNotThrow(
305+
() -> SclService.initScl(Optional.of(hid),"hVersion","hRevision")
318306
);
319307
}
320308

321309
@Test
322310
void testUpdateHeader() {
323311

324312
SclRootAdapter sclRootAdapter = assertDoesNotThrow(
325-
() -> SclService.initScl("hVersion","hRevision")
313+
() -> SclService.initScl(Optional.empty(),"hVersion","hRevision")
326314
);
327315
UUID hId = UUID.fromString(sclRootAdapter.getHeaderAdapter().getHeaderId());
328316
HeaderDTO headerDTO = DTO.createHeaderDTO(hId);
@@ -363,4 +351,50 @@ void testGetEnumTypeElements() throws Exception {
363351
);
364352
assertFalse(enumList.isEmpty());
365353
}
354+
355+
@ParameterizedTest
356+
@ValueSource(strings = {"/scd-substation-import-ssd/ssd_with_2_substations.xml", "/scd-substation-import-ssd/ssd_without_substations.xml"})
357+
void testAddSubstation_Check_SSD_Validity(String ssdFileName) throws Exception {
358+
SCL scd = SclTestMarshaller.getSCLFromFile("/scl-root-test-schema-conf/add_ied_test.xml");
359+
SCL ssd = SclTestMarshaller.getSCLFromFile(ssdFileName);
360+
361+
assertThrows(ScdException.class,
362+
() ->SclService.addSubstation(scd, ssd));
363+
}
364+
365+
@Test
366+
void testAddSubstation_SCD_Without_Substation() throws Exception {
367+
SCL scd = SclTestMarshaller.getSCLFromFile("/scl-root-test-schema-conf/add_ied_test.xml");
368+
SclRootAdapter scdRootAdapter = new SclRootAdapter(scd);
369+
SCL ssd = SclTestMarshaller.getSCLFromFile("/scd-substation-import-ssd/ssd.xml");
370+
SclRootAdapter ssdRootAdapter = new SclRootAdapter(ssd);
371+
SclRootAdapter expectedScdAdapter = SclService.addSubstation(scd, ssd);
372+
373+
assertNotEquals(scdRootAdapter, expectedScdAdapter);
374+
assertEquals(expectedScdAdapter.getCurrentElem().getSubstation(), ssdRootAdapter.getCurrentElem().getSubstation());
375+
}
376+
377+
@Test
378+
void testAddSubstation_SCD_With_Different_Substation_Name() throws Exception {
379+
SCL scd = SclTestMarshaller.getSCLFromFile("/scd-substation-import-ssd/scd_with_substation_name_different.xml");
380+
SCL ssd = SclTestMarshaller.getSCLFromFile("/scd-substation-import-ssd/ssd.xml");
381+
382+
assertThrows(ScdException.class,
383+
() ->SclService.addSubstation(scd, ssd));
384+
}
385+
386+
@Test
387+
void testAddSubstation_SCD_With_Substation() throws Exception {
388+
SCL scd = SclTestMarshaller.getSCLFromFile("/scd-substation-import-ssd/scd_with_substation.xml");
389+
SclRootAdapter scdRootAdapter = new SclRootAdapter(scd);
390+
SCL ssd = SclTestMarshaller.getSCLFromFile("/scd-substation-import-ssd/ssd.xml");
391+
SclRootAdapter ssdRootAdapter = new SclRootAdapter(ssd);
392+
SclRootAdapter expectedScdAdapter = SclService.addSubstation(scd, ssd);
393+
TSubstation expectedTSubstation = expectedScdAdapter.getCurrentElem().getSubstation().get(0);
394+
TSubstation tSubstation = ssdRootAdapter.getCurrentElem().getSubstation().get(0);
395+
396+
assertNotEquals(scdRootAdapter, expectedScdAdapter);
397+
assertEquals(expectedTSubstation.getName(), tSubstation.getName());
398+
assertEquals(expectedTSubstation.getVoltageLevel().size(), tSubstation.getVoltageLevel().size());
399+
}
366400
}

0 commit comments

Comments
 (0)