1313import org .lfenergy .compas .sct .commons .api .SclEditor ;
1414import org .lfenergy .compas .sct .commons .domain .DaVal ;
1515import org .lfenergy .compas .sct .commons .domain .DataRef ;
16+ import org .lfenergy .compas .sct .commons .domain .DoLinkedToDa ;
1617import org .lfenergy .compas .sct .commons .dto .*;
1718import org .lfenergy .compas .sct .commons .exception .ScdException ;
1819import org .lfenergy .compas .sct .commons .scl .ExtRefService ;
@@ -47,6 +48,7 @@ public class SclService implements SclEditor {
4748 private static final String DO_GOCBREF = "GoCBRef" ;
4849 private static final String DO_SVCBREF = "SvCBRef" ;
4950 private static final String DA_SETSRCREF = "setSrcRef" ;
51+ private static final String DA_SETSRCCB = "setSrcCB" ;
5052
5153 private final IedService iedService ;
5254 private final LdeviceService ldeviceService ;
@@ -248,12 +250,17 @@ private void manageMonitoringLns(List<IedSource> iedSources, SCL scd, TIED tied,
248250 List <TLN > lgosOrLsvsLns = lnService .getFilteredLns (ldsuiedLdevice , tln -> monitoringLnClassEnum .value ().equals (tln .getLnClass ().getFirst ())).toList ();
249251 if (lgosOrLsvsLns .isEmpty ())
250252 errorHandler .get ().add (SclReportItem .warning (tied .getName () + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum .value (), "There is no LN %s present in LDevice" .formatted (monitoringLnClassEnum .value ())));
251- DataRef dataRef = new DataRef (doName , List .of (), DA_SETSRCREF , List .of ());
252- lgosOrLsvsLns .forEach (lgosOrLsvs -> dataTypeTemplateService .findDoLinkedToDa (scd .getDataTypeTemplates (), lgosOrLsvs .getLnType (), dataRef )
253+ DataRef dataRefDaRef = new DataRef (doName , List .of (), DA_SETSRCREF , List .of ());
254+ DataRef dataRefDaCb = new DataRef (doName , List .of (), DA_SETSRCCB , List .of ());
255+ dataRefSetDaVal (iedSources , scd , tied , ldsuiedLdevice , doName , monitoringLnClassEnum , lgosOrLsvsLns , dataRefDaRef , dataRefDaCb );
256+ }
257+
258+ private void dataRefSetDaVal (List <IedSource > iedSources , SCL scd , TIED tied , TLDevice ldsuiedLdevice , String doName , MonitoringLnClassEnum monitoringLnClassEnum , List <TLN > lgosOrLsvsLns , DataRef dataRefDaRef , DataRef dataRefDaCB ) {
259+ lgosOrLsvsLns .forEach (lgosOrLsvs -> dataTypeTemplateService .findDoLinkedToDa (scd .getDataTypeTemplates (), lgosOrLsvs .getLnType (), dataRefDaRef )
253260 .map (doLinkedToDa -> lnService .getDoLinkedToDaCompletedFromDAI (tied , LDEVICE_LDSUIED , lgosOrLsvs , doLinkedToDa ))
254261 .filter (doLinkedToDa -> {
255262 if (!doLinkedToDa .isUpdatable ())
256- errorHandler .get ().add (SclReportItem .warning (tied .getName () + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum .value () + "/DOI@name=\" " + doName + "\" /DAI@name=\" setSrcRef \" /Val" , "The DAI cannot be updated" ));
263+ errorHandler .get ().add (SclReportItem .warning (tied .getName () + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum .value () + "/DOI@name=\" " + doName + "\" /DAI@name=\" " + dataRefDaRef . daName () + " \" /Val" , "The DAI cannot be updated" ));
257264 return doLinkedToDa .isUpdatable ();
258265 })
259266 .ifPresent (doLinkedToDa -> {
@@ -268,13 +275,30 @@ private void manageMonitoringLns(List<IedSource> iedSources, SCL scd, TIED tied,
268275 doLinkedToDa .dataAttribute ().getDaiValues ().clear ();
269276 doLinkedToDa .dataAttribute ().getDaiValues ().add (newVal );
270277 lnService .updateOrCreateDOAndDAInstances (lnToAdd , doLinkedToDa );
271- log .info ("Processing %d IED Source in LDName=%s - added LN (lnClass=%s, inst=%s, prefix=%s) - update DOI(name=%s)/DAI(name=%s) with value=%s" .formatted (iedSources .size (), ldsuiedLdevice .getLdName (), lgosOrLsvs .getLnClass ().getFirst (), String .valueOf (i + 1 ), lgosOrLsvs .getPrefix (), doName , DA_SETSRCREF , newVal .val ()));
278+ addValDaCB (scd , tied , doName , monitoringLnClassEnum , dataRefDaCB , lgosOrLsvs , newVal , lnToAdd );
279+ log .info ("Processing %d IED Source in LDName=%s - added LN (lnClass=%s, inst=%s, prefix=%s) - update DOI(name=%s)/DAI(name=%s) with value=%s" .formatted (iedSources .size (), ldsuiedLdevice .getLdName (), lgosOrLsvs .getLnClass ().getFirst (), String .valueOf (i + 1 ), lgosOrLsvs .getPrefix (), doName , dataRefDaCB .daName (), newVal .val ()));
272280 ldsuiedLdevice .getLN ().add (lnToAdd );
273281 }
274282 ldsuiedLdevice .getLN ().remove (lgosOrLsvs ); //We can remove this LGOS or LSVS as we already added new ones
275283 }));
276284 }
277285
286+ private void addValDaCB (SCL scd , TIED tied , String doName , MonitoringLnClassEnum monitoringLnClassEnum , DataRef dataRefDaCB , TLN lgosOrLsvs , DaVal newVal , TLN lnToAdd ) {
287+ Optional <DoLinkedToDa > daCB = dataTypeTemplateService .findDoLinkedToDa (scd .getDataTypeTemplates (), lgosOrLsvs .getLnType (), dataRefDaCB );
288+ daCB .ifPresent (doLinkedToDaCB -> {
289+ DoLinkedToDa doLinkedToDaCBCopy = lnService .getDoLinkedToDaCompletedFromDAI (tied , LDEVICE_LDSUIED , lgosOrLsvs , doLinkedToDaCB );
290+ if (doLinkedToDaCBCopy .isUpdatable ()) {
291+ doLinkedToDaCBCopy .dataAttribute ().getDaiValues ().clear ();
292+ doLinkedToDaCBCopy .dataAttribute ().getDaiValues ().add (newVal );
293+ lnService .updateOrCreateDOAndDAInstances (lnToAdd , doLinkedToDaCBCopy );
294+ }
295+ else {
296+ errorHandler .get ().add (SclReportItem .warning (
297+ tied .getName () + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum .value () + "/DOI@name=\" " + doName + "\" /DAI@name=\" " + dataRefDaCB .daName () + "\" /Val" , "The DAI cannot be updated" ));
298+ }
299+ });
300+ }
301+
278302 record IedSource (String iedName , String srcCBName , String srcLdInst , TServiceType serviceType ){}
279303
280304}
0 commit comments