@@ -137,25 +137,24 @@ public Optional<TDAI> getDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDaFilter doLi
137137 }
138138
139139 @ Override
140- public void updateOrCreateDOAndDAInstances (TAnyLN tAnyLN , DoLinkedToDa doLinkedToDa ) {
141- createDoiSdiDaiChainIfNotExists (tAnyLN , doLinkedToDa .dataObject (), doLinkedToDa .dataAttribute ())
142- .ifPresent (tdai -> {
143- List <DaVal > daiVals = doLinkedToDa .dataAttribute ().getDaiValues ();
144- if (!hasSettingGroup (tdai ) && daiVals .size () == 1 && daiVals .getFirst ().settingGroup () == null ) {
145- String value = daiVals .getFirst ().val ();
146- tdai .getVal ().stream ().findFirst ()
147- .ifPresentOrElse (tVal -> tVal .setValue (value ),
148- () -> tdai .getVal ().add (newVal (value )));
149- } else {
150- for (DaVal daVal : daiVals ) {
151- tdai .getVal ().stream ()
152- .filter (tValElem -> tValElem .isSetSGroup () && tValElem .getSGroup () == daVal .settingGroup ())
153- .findFirst ()
154- .ifPresentOrElse (tVal -> tVal .setValue (daVal .val ()),
155- () -> tdai .getVal ().add (newVal (daVal .val (), daVal .settingGroup ())));
156- }
157- }
158- });
140+ public TDAI updateOrCreateDOAndDAInstances (TAnyLN tAnyLN , DoLinkedToDa doLinkedToDa ) {
141+ TDAI tdai = createDoiSdiDaiChainIfNotExists (tAnyLN , doLinkedToDa .dataObject (), doLinkedToDa .dataAttribute ());
142+ List <DaVal > daiVals = doLinkedToDa .dataAttribute ().getDaiValues ();
143+ if (!hasSettingGroup (tdai ) && daiVals .size () == 1 && daiVals .getFirst ().settingGroup () == null ) {
144+ String value = daiVals .getFirst ().val ();
145+ tdai .getVal ().stream ().findFirst ()
146+ .ifPresentOrElse (tVal -> tVal .setValue (value ),
147+ () -> tdai .getVal ().add (newVal (value )));
148+ } else {
149+ for (DaVal daVal : daiVals ) {
150+ tdai .getVal ().stream ()
151+ .filter (tValElem -> tValElem .isSetSGroup () && tValElem .getSGroup () == daVal .settingGroup ())
152+ .findFirst ()
153+ .ifPresentOrElse (tVal -> tVal .setValue (daVal .val ()),
154+ () -> tdai .getVal ().add (newVal (daVal .val (), daVal .settingGroup ())));
155+ }
156+ }
157+ return tdai ;
159158 }
160159
161160 @ Override
@@ -166,17 +165,20 @@ public DoLinkedToDa getDoLinkedToDaCompletedFromDAI(TIED tied, String ldInst, TA
166165 if (tdai .isSetVal ()) {
167166 result .dataAttribute ().addDaVal (tdai .getVal ());
168167 }
168+ if (tdai .isSetValKind ()) {
169+ result .dataAttribute ().setValKind (tdai .getValKind ());
170+ }
169171 if (result .dataAttribute ().getFc () == TFCEnum .SG || result .dataAttribute ().getFc () == TFCEnum .SE ) {
170172 if (hasSettingGroup (tdai )) {
171173 boolean isIedHasConfSG = tied .isSetAccessPoint () &&
172- tied .getAccessPoint ().stream ()
173- .filter (tAccessPoint -> tAccessPoint .getServer () != null
174- && tAccessPoint .getServer ().getLDevice ().stream ()
175- .anyMatch (tlDevice -> tlDevice .getInst ().equals (ldInst )))
176- .anyMatch (tAccessPoint -> tAccessPoint .isSetServices ()
177- && tAccessPoint .getServices () != null
178- && tAccessPoint .getServices ().getSettingGroups () != null
179- && tAccessPoint .getServices ().getSettingGroups ().getConfSG () != null );
174+ tied .getAccessPoint ().stream ()
175+ .filter (tAccessPoint -> tAccessPoint .getServer () != null
176+ && tAccessPoint .getServer ().getLDevice ().stream ()
177+ .anyMatch (tlDevice -> tlDevice .getInst ().equals (ldInst )))
178+ .anyMatch (tAccessPoint -> tAccessPoint .isSetServices ()
179+ && tAccessPoint .getServices () != null
180+ && tAccessPoint .getServices ().getSettingGroups () != null
181+ && tAccessPoint .getServices ().getSettingGroups ().getConfSG () != null );
180182 result .dataAttribute ().setValImport ((!tdai .isSetValImport () || tdai .isValImport ()) && isIedHasConfSG );
181183 } else {
182184 log .warn ("Inconsistency in the SCD file - DAI= {} with fc= {} must have a sGroup attribute" , tdai .getName (), result .dataAttribute ().getFc ());
@@ -193,59 +195,60 @@ private boolean hasSettingGroup(TDAI tdai) {
193195 return tdai .isSetVal () && tdai .getVal ().stream ().anyMatch (tVal -> tVal .isSetSGroup () && tVal .getSGroup () > 0 );
194196 }
195197
196- private Optional <TDAI > createDoiSdiDaiChainIfNotExists (TAnyLN tAnyLN , DataObject dataObject , DataAttribute dataAttribute ) {
197- List <String > structInstances = new ArrayList <>(dataObject .getSdoNames ());
198- structInstances .add (dataAttribute .getDaName ());
199- structInstances .addAll (dataAttribute .getBdaNames ());
198+ private TDAI createDoiSdiDaiChainIfNotExists (TAnyLN tAnyLN , DataObject dataObject , DataAttribute dataAttribute ) {
199+ if (StringUtils .isBlank (dataObject .getDoName ()) || StringUtils .isBlank (dataAttribute .getDaName ())) {
200+ throw new IllegalArgumentException ("Missing DO or DA name in parameters : doName=%s, daName=%s" .formatted (dataObject .getDoName (), dataAttribute .getDaName ()));
201+ }
202+ List <String > sdiNames = new ArrayList <>(dataObject .getSdoNames ());
203+ sdiNames .add (dataAttribute .getDaName ());
204+ sdiNames .addAll (dataAttribute .getBdaNames ());
205+ String doiName = dataObject .getDoName ();
206+ String daiName = sdiNames .removeLast ();
200207
201- TDOI doi = tAnyLN .getDOI ().stream ().filter (doi1 -> doi1 .getName ().equals (dataObject . getDoName () ))
208+ TDOI doi = tAnyLN .getDOI ().stream ().filter (doi1 -> doi1 .getName ().equals (doiName ))
202209 .findFirst ()
203210 .orElseGet (() -> {
204211 TDOI newDOI = new TDOI ();
205- newDOI .setName (dataObject . getDoName () );
212+ newDOI .setName (doiName );
206213 tAnyLN .getDOI ().add (newDOI );
207214 return newDOI ;
208215 });
209- if (structInstances .size () > 1 ) {
210- TSDI firstSDI = findOrCreateSDIFromDOI (doi , structInstances .getFirst ());
211- TSDI lastSDI = findOrCreateSDIByStructName (firstSDI , structInstances );
212- if (structInstances .size () == 1 ) {
213- return lastSDI .getSDIOrDAI ().stream ()
214- .filter (tUnNaming -> tUnNaming .getClass ().equals (TDAI .class ))
215- .map (TDAI .class ::cast )
216- .filter (tdai -> tdai .getName ().equals (structInstances .getFirst ()))
217- .map (tdai -> {
218- if (tdai .isSetValImport ()) {
219- tdai .setValImport (dataAttribute .isValImport ());
220- }
221- return tdai ;
222- })
223- .findFirst ()
224- .or (() -> {
225- TDAI newDAI = new TDAI ();
226- newDAI .setName (structInstances .getFirst ());
227- lastSDI .getSDIOrDAI ().add (newDAI );
228- return Optional .of (newDAI );
229- });
230- }
231- } else if (structInstances .size () == 1 ) {
232- return doi .getSDIOrDAI ().stream ()
233- .filter (tUnNaming -> tUnNaming .getClass ().equals (TDAI .class ))
234- .map (TDAI .class ::cast )
235- .filter (tdai -> tdai .getName ().equals (structInstances .getFirst ()))
236- .map (tdai -> {
237- if (tdai .isSetValImport ()) tdai .setValImport (dataAttribute .isValImport ());
238- return tdai ;
239- })
240- .findFirst ()
241- .or (() -> {
242- TDAI newDAI = new TDAI ();
243- newDAI .setName (structInstances .getFirst ());
244- doi .getSDIOrDAI ().add (newDAI );
245- return Optional .of (newDAI );
246- });
216+
217+ // case 1: No SDI
218+ if (sdiNames .isEmpty ()) {
219+ List <TUnNaming > sdiOrDAI = doi .getSDIOrDAI ();
220+ return findOrCreateDai (dataAttribute , sdiOrDAI , daiName );
247221 }
248- return Optional .empty ();
222+ // case 2: with SDI
223+ String firstSdiName = sdiNames .removeFirst ();
224+ TSDI firstSdi = this .getSdiByName (doi , firstSdiName )
225+ .orElseGet (() -> {
226+ TSDI tsdi = new TSDI ();
227+ tsdi .setName (firstSdiName );
228+ doi .getSDIOrDAI ().add (tsdi );
229+ return tsdi ;
230+ });
231+ TSDI lastSDI = sdiNames .isEmpty () ? firstSdi : findOrCreateSdiChain (firstSdi , sdiNames );
232+ List <TUnNaming > sdiOrDAI = lastSDI .getSDIOrDAI ();
233+ return findOrCreateDai (dataAttribute , sdiOrDAI , daiName );
234+ }
235+
236+ private TDAI findOrCreateDai (DataAttribute dataAttribute , List <TUnNaming > sdiOrDAI , String daiName ) {
237+ return sdiOrDAI .stream ()
238+ .filter (tUnNaming -> tUnNaming .getClass ().equals (TDAI .class ))
239+ .map (TDAI .class ::cast )
240+ .filter (tdai -> tdai .getName ().equals (daiName ))
241+ .findFirst ()
242+ .map (tdai -> {
243+ if (tdai .isSetValImport ()) tdai .setValImport (dataAttribute .isValImport ());
244+ return tdai ;
245+ })
246+ .orElseGet (() -> {
247+ TDAI newDAI = new TDAI ();
248+ newDAI .setName (daiName );
249+ sdiOrDAI .add (newDAI );
250+ return newDAI ;
251+ });
249252 }
250253
251254 private TSDI findSDIByStructName (TSDI tsdi , List <String > sdiNames ) {
@@ -258,26 +261,6 @@ private TSDI findSDIByStructName(TSDI tsdi, List<String> sdiNames) {
258261 .orElse (tsdi );
259262 }
260263
261- private TSDI findOrCreateSDIFromDOI (TDOI doi , String sdiName ) {
262- return this .getSdiByName (doi , sdiName )
263- .orElseGet (() -> {
264- TSDI tsdi = new TSDI ();
265- tsdi .setName (sdiName );
266- doi .getSDIOrDAI ().add (tsdi );
267- return tsdi ;
268- });
269- }
270-
271- private TSDI findOrCreateSDIFromSDI (TSDI sdi , String sdiName ) {
272- return this .getSdiByName (sdi , sdiName )
273- .orElseGet (() -> {
274- TSDI tsdi = new TSDI ();
275- tsdi .setName (sdiName );
276- sdi .getSDIOrDAI ().add (tsdi );
277- return tsdi ;
278- });
279- }
280-
281264 private Optional <TSDI > getSdiByName (TDOI doi , String sdiName ) {
282265 return doi .getSDIOrDAI ().stream ()
283266 .filter (unNaming -> unNaming .getClass ().equals (TSDI .class ))
@@ -297,13 +280,22 @@ private Optional<TSDI> getSdiByName(TSDI sdi, String sdiName) {
297280
298281 /**
299282 * @param sdi TSDI
300- * @param structName list start with sdi name
283+ * @param sdiNames list start with sdi name
301284 * @return already existing TSDI or newly created TSDI from given TSDI
302285 */
303- private TSDI findOrCreateSDIByStructName (TSDI sdi , List <String > structName ) {
304- structName .removeFirst ();
305- if (structName .isEmpty () || structName .size () == 1 ) return sdi ;
306- return findOrCreateSDIByStructName (findOrCreateSDIFromSDI (sdi , structName .getFirst ()), structName );
286+ private TSDI findOrCreateSdiChain (TSDI sdi , List <String > sdiNames ) {
287+ TSDI sdiToGet = getSdiByName (sdi , sdiNames .getFirst ())
288+ .orElseGet (() -> {
289+ TSDI tsdi = new TSDI ();
290+ tsdi .setName (sdiNames .getFirst ());
291+ sdi .getSDIOrDAI ().add (tsdi );
292+ return tsdi ;
293+ });
294+ List <String > remainingSdiNames = sdiNames .subList (1 , sdiNames .size ());
295+ if (remainingSdiNames .isEmpty ()) {
296+ return sdiToGet ;
297+ }
298+ return findOrCreateSdiChain (sdiToGet , remainingSdiNames );
307299 }
308300
309301}
0 commit comments