@@ -54,7 +54,7 @@ public class SclService implements SclEditor {
5454 private final DataTypeTemplateReader dataTypeTemplateService ;
5555
5656 @ Getter
57- private final List <SclReportItem > errorHanlder = new ArrayList <>( );
57+ private final ThreadLocal < List <SclReportItem >> errorHandler = ThreadLocal . withInitial ( ArrayList :: new );
5858
5959 @ Override
6060 public SCL initScl (final UUID hId , final String hVersion , final String hRevision ) throws ScdException {
@@ -221,37 +221,41 @@ public List<SclReportItem> updateDoInRef(SCL scd) {
221221
222222 @ Override
223223 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+ });
239241 });
240- });
241- return errorHanlder ;
242+ return errorHandler .get ();
243+ } finally {
244+ errorHandler .remove ();
245+ }
242246 }
243247
244248 private void manageMonitoringLns (List <IedSource > iedSources , SCL scd , TIED tied , TLDevice ldsuiedLdevice , String doName , MonitoringLnClassEnum monitoringLnClassEnum ) {
245249 List <TLN > lgosOrLsvsLns = lnService .getFilteredLns (ldsuiedLdevice , tln -> monitoringLnClassEnum .value ().equals (tln .getLnClass ().getFirst ())).toList ();
246250 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 ())));
248252 DoLinkedToDaFilter doLinkedToDaFilter = new DoLinkedToDaFilter (doName , List .of (), DA_SETSRCREF , List .of ());
249253 lgosOrLsvsLns .forEach (lgosOrLsvs -> dataTypeTemplateService .getFilteredDoLinkedToDa (scd .getDataTypeTemplates (), lgosOrLsvs .getLnType (), doLinkedToDaFilter )
250254 .map (doLinkedToDa -> lnService .getDoLinkedToDaCompletedFromDAI (tied , LDEVICE_LDSUIED , lgosOrLsvs , doLinkedToDa ))
251255 .findFirst ()
252256 .filter (doLinkedToDa -> {
253257 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" ));
255259 return doLinkedToDa .isUpdatable ();
256260 })
257261 .ifPresent (doLinkedToDa -> {
0 commit comments