@@ -54,7 +54,7 @@ public class SclService implements SclEditor {
54
54
private final DataTypeTemplateReader dataTypeTemplateService ;
55
55
56
56
@ Getter
57
- private final List <SclReportItem > errorHanlder = new ArrayList <>( );
57
+ private final ThreadLocal < List <SclReportItem >> errorHandler = ThreadLocal . withInitial ( ArrayList :: new );
58
58
59
59
@ Override
60
60
public SCL initScl (final UUID hId , final String hVersion , final String hRevision ) throws ScdException {
@@ -221,37 +221,41 @@ public List<SclReportItem> updateDoInRef(SCL scd) {
221
221
222
222
@ Override
223
223
public List <SclReportItem > manageMonitoringLns (SCL scd ) {
224
- errorHanlder .clear ();
225
- iedService .getFilteredIeds (scd , ied -> !ied .getName ().contains (IED_TEST_NAME ))
226
- .forEach (tied -> {
227
- Map <TServiceType , List <IedSource >> serviceTypeToIedSource = ldeviceService .getLdevices (tied )
228
- .flatMap (tlDevice -> extRefReaderService .getExtRefs (tlDevice .getLN0 ()))
229
- .filter (tExtRef -> tExtRef .isSetServiceType () && tExtRef .isSetSrcCBName () && (tExtRef .getServiceType ().equals (TServiceType .GOOSE ) || tExtRef .getServiceType ().equals (TServiceType .SMV )))
230
- .collect (Collectors .groupingBy (tExtRef -> new IedSource (tExtRef .getIedName (), tExtRef .getSrcCBName (), tExtRef .getSrcLDInst (), tExtRef .getServiceType ())))
231
- .keySet ()
232
- .stream ()
233
- .collect (Collectors .groupingBy (IedSource ::serviceType ));
234
- ldeviceService .findLdevice (tied , LDEVICE_LDSUIED ).ifPresent (ldSUIEDLDevice -> {
235
- Optional .ofNullable (serviceTypeToIedSource .get (TServiceType .GOOSE ))
236
- .ifPresent (iedSourceKeys -> manageMonitoringLns (iedSourceKeys , scd , tied , ldSUIEDLDevice , DO_GOCBREF , MonitoringLnClassEnum .LGOS ));
237
- Optional .ofNullable (serviceTypeToIedSource .get (TServiceType .SMV ))
238
- .ifPresent (iedSourceKeys -> manageMonitoringLns (iedSourceKeys , scd , tied , ldSUIEDLDevice , DO_SVCBREF , MonitoringLnClassEnum .LSVS ));
224
+ errorHandler .get ().clear ();
225
+ try {
226
+ iedService .getFilteredIeds (scd , ied -> !ied .getName ().contains (IED_TEST_NAME ))
227
+ .forEach (tied -> {
228
+ Map <TServiceType , List <IedSource >> serviceTypeToIedSource = ldeviceService .getLdevices (tied )
229
+ .flatMap (tlDevice -> extRefReaderService .getExtRefs (tlDevice .getLN0 ()))
230
+ .filter (tExtRef -> tExtRef .isSetServiceType () && tExtRef .isSetSrcCBName () && (tExtRef .getServiceType ().equals (TServiceType .GOOSE ) || tExtRef .getServiceType ().equals (TServiceType .SMV )))
231
+ .collect (Collectors .groupingBy (tExtRef -> new IedSource (tExtRef .getIedName (), tExtRef .getSrcCBName (), tExtRef .getSrcLDInst (), tExtRef .getServiceType ())))
232
+ .keySet ()
233
+ .stream ()
234
+ .collect (Collectors .groupingBy (IedSource ::serviceType ));
235
+ ldeviceService .findLdevice (tied , LDEVICE_LDSUIED ).ifPresent (ldSUIEDLDevice -> {
236
+ Optional .ofNullable (serviceTypeToIedSource .get (TServiceType .GOOSE ))
237
+ .ifPresent (iedSourceKeys -> manageMonitoringLns (iedSourceKeys , scd , tied , ldSUIEDLDevice , DO_GOCBREF , MonitoringLnClassEnum .LGOS ));
238
+ Optional .ofNullable (serviceTypeToIedSource .get (TServiceType .SMV ))
239
+ .ifPresent (iedSourceKeys -> manageMonitoringLns (iedSourceKeys , scd , tied , ldSUIEDLDevice , DO_SVCBREF , MonitoringLnClassEnum .LSVS ));
240
+ });
239
241
});
240
- });
241
- return errorHanlder ;
242
+ return errorHandler .get ();
243
+ } finally {
244
+ errorHandler .remove ();
245
+ }
242
246
}
243
247
244
248
private void manageMonitoringLns (List <IedSource > iedSources , SCL scd , TIED tied , TLDevice ldsuiedLdevice , String doName , MonitoringLnClassEnum monitoringLnClassEnum ) {
245
249
List <TLN > lgosOrLsvsLns = lnService .getFilteredLns (ldsuiedLdevice , tln -> monitoringLnClassEnum .value ().equals (tln .getLnClass ().getFirst ())).toList ();
246
250
if (lgosOrLsvsLns .isEmpty ())
247
- errorHanlder .add (SclReportItem .warning (tied .getName () + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum .value (), "There is no LN %s present in LDevice" .formatted (monitoringLnClassEnum .value ())));
251
+ errorHandler . get () .add (SclReportItem .warning (tied .getName () + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum .value (), "There is no LN %s present in LDevice" .formatted (monitoringLnClassEnum .value ())));
248
252
DoLinkedToDaFilter doLinkedToDaFilter = new DoLinkedToDaFilter (doName , List .of (), DA_SETSRCREF , List .of ());
249
253
lgosOrLsvsLns .forEach (lgosOrLsvs -> dataTypeTemplateService .getFilteredDoLinkedToDa (scd .getDataTypeTemplates (), lgosOrLsvs .getLnType (), doLinkedToDaFilter )
250
254
.map (doLinkedToDa -> lnService .getDoLinkedToDaCompletedFromDAI (tied , LDEVICE_LDSUIED , lgosOrLsvs , doLinkedToDa ))
251
255
.findFirst ()
252
256
.filter (doLinkedToDa -> {
253
257
if (!doLinkedToDa .isUpdatable ())
254
- errorHanlder .add (SclReportItem .warning (tied .getName () + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum .value () + "/DOI@name=\" " + doName + "\" /DAI@name=\" setSrcRef\" /Val" , "The DAI cannot be updated" ));
258
+ errorHandler . get () .add (SclReportItem .warning (tied .getName () + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum .value () + "/DOI@name=\" " + doName + "\" /DAI@name=\" setSrcRef\" /Val" , "The DAI cannot be updated" ));
255
259
return doLinkedToDa .isUpdatable ();
256
260
})
257
261
.ifPresent (doLinkedToDa -> {
0 commit comments