1515import org .lfenergy .compas .sct .commons .scl .PrivateService ;
1616import org .lfenergy .compas .sct .commons .scl .SclElementAdapter ;
1717import org .lfenergy .compas .sct .commons .scl .SclRootAdapter ;
18+ import org .lfenergy .compas .sct .commons .util .MonitoringLnClassEnum ;
1819import org .lfenergy .compas .sct .commons .util .ServicesConfigEnum ;
1920import org .lfenergy .compas .sct .commons .util .Utils ;
2021
21- import java .util .List ;
22- import java .util .Map ;
23- import java .util .Objects ;
24- import java .util .Optional ;
22+ import java .util .*;
2523import java .util .function .Function ;
2624import java .util .stream .Stream ;
2725
6260public class IEDAdapter extends SclElementAdapter <SclRootAdapter , TIED > {
6361
6462 private static final String MESSAGE_LDEVICE_INST_NOT_FOUND = "LDevice.inst '%s' not found in IED '%s'" ;
63+ private static final String DO_GOCBREF = "GoCBRef" ;
64+ private static final String DO_SVCBREF = "SvCBRef" ;
65+ private static final String LDSUIED_LDINST = "LDSUIED" ;
6566
6667 /**
6768 * Constructor
@@ -91,10 +92,10 @@ public IEDAdapter(SclRootAdapter parentAdapter, TIED currentElem) {
9192 public IEDAdapter (SclRootAdapter parentAdapter , String iedName ) throws ScdException {
9293 super (parentAdapter );
9394 TIED ied = parentAdapter .getCurrentElem ().getIED ()
94- .stream ()
95- .filter (tied -> tied .getName ().equals (iedName ))
96- .findFirst ()
97- .orElseThrow (() -> new ScdException ("Unknown IED name :" + iedName ));
95+ .stream ()
96+ .filter (tied -> tied .getName ().equals (iedName ))
97+ .findFirst ()
98+ .orElseThrow (() -> new ScdException ("Unknown IED name :" + iedName ));
9899 setCurrentElem (ied );
99100 }
100101
@@ -326,47 +327,50 @@ public Optional<TCompasBay> getPrivateCompasBay() {
326327
327328 /**
328329 * Checks if Controls, DataSets and FCDAs of IED respect config limitation
330+ *
329331 * @return empty list if all IED respect limits, otherwise list of errors
330332 */
331333 public List <SclReportItem > checkDataGroupCoherence () {
332334 return streamAccessPointAdapters ()
333335 .flatMap (accessPointAdapter ->
334336 Stream .concat (
335- accessPointAdapter .checkFCDALimitations ().stream (),
336- Stream .of (
337- accessPointAdapter .checkControlsLimitation (ServicesConfigEnum .DATASET ),
338- accessPointAdapter .checkControlsLimitation (ServicesConfigEnum .REPORT ),
339- accessPointAdapter .checkControlsLimitation (ServicesConfigEnum .GSE ),
340- accessPointAdapter .checkControlsLimitation (ServicesConfigEnum .SMV ))
341- .flatMap (Optional ::stream )
337+ accessPointAdapter .checkFCDALimitations ().stream (),
338+ Stream .of (
339+ accessPointAdapter .checkControlsLimitation (ServicesConfigEnum .DATASET ),
340+ accessPointAdapter .checkControlsLimitation (ServicesConfigEnum .REPORT ),
341+ accessPointAdapter .checkControlsLimitation (ServicesConfigEnum .GSE ),
342+ accessPointAdapter .checkControlsLimitation (ServicesConfigEnum .SMV ))
343+ .flatMap (Optional ::stream )
342344 )
343345 )
344346 .toList ();
345347 }
346348
347349 /**
348350 * Checks if Controls and FCDAs of source IEDs respect config limitation
351+ *
349352 * @return empty list if all IED respect limits, otherwise list of errors
350353 */
351354 public List <SclReportItem > checkBindingDataGroupCoherence () {
352- return streamAccessPointAdapters ()
355+ return streamAccessPointAdapters ()
353356 .flatMap (accessPointAdapter -> {
354357 AccessPointAdapter .ExtRefAnalyzeRecord extRefAnalyzeRecord = accessPointAdapter .getAllCoherentExtRefForAnalyze ();
355358 return Stream .of (
356- extRefAnalyzeRecord .sclReportItems ().stream (),
357- accessPointAdapter .checkLimitationForBoundIedFcdas (extRefAnalyzeRecord .tExtRefs ()).stream (),
358- accessPointAdapter .checkLimitationForBoundIEDControls (extRefAnalyzeRecord .tExtRefs ()).stream ())
359- .flatMap (Function .identity ());
359+ extRefAnalyzeRecord .sclReportItems ().stream (),
360+ accessPointAdapter .checkLimitationForBoundIedFcdas (extRefAnalyzeRecord .tExtRefs ()).stream (),
361+ accessPointAdapter .checkLimitationForBoundIEDControls (extRefAnalyzeRecord .tExtRefs ()).stream ())
362+ .flatMap (Function .identity ());
360363 }).toList ();
361364 }
362365
363366 private Stream <AccessPointAdapter > streamAccessPointAdapters () {
364367 return currentElem .getAccessPoint ().stream ()
365- .map (tAccessPoint -> new AccessPointAdapter (this , tAccessPoint ));
368+ .map (tAccessPoint -> new AccessPointAdapter (this , tAccessPoint ));
366369 }
367370
368371 /**
369372 * Get value of private type COMPAS-ICDHeader
373+ *
370374 * @return COMPAS-ICDHeader private value if present, else empty Optional
371375 */
372376 public Optional <TCompasICDHeader > getCompasICDHeader () {
@@ -375,10 +379,40 @@ public Optional<TCompasICDHeader> getCompasICDHeader() {
375379
376380 /**
377381 * Get value of private type COMPAS-SystemVersion
382+ *
378383 * @return COMPAS-SystemVersion private value if present, else empty Optional
379384 */
380385 public Optional <TCompasSystemVersion > getCompasSystemVersion () {
381386 return PrivateService .extractCompasPrivate (currentElem , TCompasSystemVersion .class );
382387 }
383388
389+ /**
390+ * Update and/or create Monitoring LNs (LSVS and LGOS) into LDSUIED for each bound ExtRef of each LDevice
391+ *
392+ * @return a list of SclReport Objects that contains errors
393+ */
394+ public List <SclReportItem > manageMonitoringLns () {
395+ List <SclReportItem > sclReportItems = new ArrayList <>();
396+ findLDeviceAdapterByLdInst (LDSUIED_LDINST ).ifPresent (lDeviceAdapter -> {
397+ lDeviceAdapter .manageMonitoringLns (retrieveAllExtRefForServiceType (TServiceType .GOOSE ), DO_GOCBREF , MonitoringLnClassEnum .LGOS )
398+ .ifPresent (sclReportItems ::add );
399+ lDeviceAdapter .manageMonitoringLns (retrieveAllExtRefForServiceType (TServiceType .SMV ), DO_SVCBREF , MonitoringLnClassEnum .LSVS )
400+ .ifPresent (sclReportItems ::add );
401+ });
402+ return sclReportItems ;
403+ }
404+
405+ private List <TExtRef > retrieveAllExtRefForServiceType (TServiceType tServiceType ) {
406+ return streamLDeviceAdapters ()
407+ .map (LDeviceAdapter ::getLN0Adapter )
408+ .filter (AbstractLNAdapter ::hasInputs )
409+ .map (LN0Adapter ::getInputsAdapter )
410+ .map (InputsAdapter ::filterDuplicatedExtRefs )
411+ .flatMap (List ::stream )
412+ .filter (tExtRef -> tExtRef .isSetServiceType () && tExtRef .isSetSrcCBName () &&
413+ tServiceType .equals (tExtRef .getServiceType ()))
414+ .toList ();
415+ }
416+
417+
384418}
0 commit comments