44
55package org .lfenergy .compas .sct .commons ;
66
7+ import lombok .RequiredArgsConstructor ;
78import org .lfenergy .compas .scl2007b4 .model .*;
89import org .lfenergy .compas .sct .commons .api .DataTypeTemplateReader ;
910import org .lfenergy .compas .sct .commons .domain .DataAttribute ;
1011import org .lfenergy .compas .sct .commons .domain .DataObject ;
1112import org .lfenergy .compas .sct .commons .domain .DataRef ;
1213import org .lfenergy .compas .sct .commons .domain .DoLinkedToDa ;
1314
14- import java .util .ArrayList ;
1515import java .util .List ;
1616import java .util .Optional ;
17- import java .util .function .Predicate ;
1817import java .util .stream .Stream ;
1918
19+ import static org .lfenergy .compas .scl2007b4 .model .TPredefinedBasicTypeEnum .STRUCT ;
20+
21+ @ RequiredArgsConstructor
2022public class DataTypeTemplatesService implements DataTypeTemplateReader {
2123
22- final LnodeTypeService lnodeTypeService = new LnodeTypeService ();
23- final DoTypeService doTypeService = new DoTypeService ();
24- final DaTypeService daTypeService = new DaTypeService ();
25- final DoService doService = new DoService ();
26- final DaService daService = new DaService ();
27- final SdoService sdoService = new SdoService ();
28- final BDAService bdaService = new BDAService ();
24+ /**
25+ * Create a new instance without passing dependency.
26+ * This will create a new instance of each dependency
27+ */
28+ public DataTypeTemplatesService () {
29+ this (new LnodeTypeService (), new DoTypeService (new DaTypeService (), new DaService (), new SdoService (), new BDAService ()), new DaTypeService (), new DoService (), new DaService (), new SdoService (), new BDAService ());
30+ }
31+
32+ final LnodeTypeService lnodeTypeService ;
33+ final DoTypeService doTypeService ;
34+ final DaTypeService daTypeService ;
35+ final DoService doService ;
36+ final DaService daService ;
37+ final SdoService sdoService ;
38+ final BDAService bdaService ;
2939
3040 @ Override
3141 public Stream <DoLinkedToDa > getAllDoLinkedToDa (TDataTypeTemplates dtt ) {
@@ -41,7 +51,7 @@ public Stream<DoLinkedToDa> getAllDoLinkedToDa(TDataTypeTemplates dtt, String lN
4151 return lnodeTypeService .findLnodeType (dtt , lNodeTypeId )
4252 .stream ()
4353 .flatMap (tlNodeType -> doService .getDos (tlNodeType )
44- .flatMap (tdo -> getAllDoLinkedToDa (dtt , tdo )));
54+ .flatMap (tdo -> getAllDoLinkedToDa (dtt , tdo )));
4555 }
4656
4757 @ Override
@@ -68,46 +78,57 @@ private Stream<DoLinkedToDa> getAllDoLinkedToDa(TDataTypeTemplates dtt, TDO tdo)
6878
6979 @ Override
7080 public Optional <DoLinkedToDa > findDoLinkedToDa (TDataTypeTemplates dtt , String lNodeTypeId , DataRef dataRef ) {
71- List <String > dataRefList = new ArrayList <>(dataRef .sdoNames ());
72- dataRefList .addAll (dataRef .bdaNames ());
73-
7481 return lnodeTypeService .findLnodeType (dtt , lNodeTypeId )
7582 .flatMap (lNodeType -> doService .findDo (lNodeType , dataRef .doName ())
7683 // Search DoType for each DO
7784 .flatMap (tdo -> doTypeService .findDoType (dtt , tdo .getType ())
7885 .flatMap (tdoType -> {
7986 // Search last DoType from DOType (SDO) > DOType (SDO)
80- TDOType lastDoType = findDOTypeBySdoName (dtt , tdoType , dataRefList );
87+ Optional <TDOType > optLastDoType = findDOTypeBySdoName (dtt , tdoType , dataRef .sdoNames ());
88+ if (optLastDoType .isEmpty ()) {
89+ // it means that one of the SDO in dataRef.sdoNames() is missing
90+ return Optional .empty ();
91+ }
8192 // Prepare DataObject
8293 DataObject dataObject = new DataObject (tdo .getName (), tdoType .getCdc (), dataRef .sdoNames ());
8394 // Search first DA from last DoType
84- return daService .findDA (lastDoType , dataRef .daName ())
95+ return daService .findDA (optLastDoType . get () , dataRef .daName ())
8596 .flatMap (tda -> {
8697 // Prepare DataAttribute
8798 DataAttribute dataAttribute = new DataAttribute ();
8899 dataAttribute .setDaName (tda .getName ());
89100 dataAttribute .setFc (tda .getFc ());
90- // Check if first DA is STRUCT or not
91- if (!tda .getBType ().equals (TPredefinedBasicTypeEnum .STRUCT )) {
92- dataAttribute .addDaVal (tda .getVal ());
93- dataAttribute .setBType (tda .getBType ());
94- dataAttribute .setType (tda .getType ());
95- dataAttribute .setValImport (tda .isValImport ());
96- dataAttribute .setValKind (tda .getValKind ());
97- return Optional .of (new DoLinkedToDa (dataObject , dataAttribute ));
101+ // 1. case dataRef.bdaNames() is empty
102+ if (dataRef .bdaNames ().isEmpty ()) {
103+ if (tda .getBType () != STRUCT ) {
104+ // It's a match, because DA has no BDA and dataRef.bdaNames() is empty
105+ dataAttribute .addDaVal (tda .getVal ());
106+ dataAttribute .setBType (tda .getBType ());
107+ dataAttribute .setType (tda .getType ());
108+ dataAttribute .setValImport (tda .isValImport ());
109+ dataAttribute .setValKind (tda .getValKind ());
110+ return Optional .of (new DoLinkedToDa (dataObject , dataAttribute ));
111+ }
112+ // else, the DA is a STRUCT, so it has a BDA, but dataRef.bdaNames() is empty
113+ return Optional .empty ();
114+ }
115+ // 2. case dataRef.bdaNames() is not empty
116+ if (tda .getBType () != STRUCT ) {
117+ // the DA is not STRUCT, so it has no BDA, but dataRef.bdaNames() is not empty
118+ return Optional .empty ();
98119 }
99120 // Search first DaType from DOType (from last DOType where DA is STRUCT)
100- return getDATypeByDaName (dtt , lastDoType , tda .getName ())
121+ return getDATypeByDaName (dtt , optLastDoType . get () , tda .getName ())
101122 .flatMap (tdaType -> {
102- // Search last DAType from first DAType
103- TDAType lastDAType = findDATypeByBdaName (dtt , tdaType , tbda -> tbda . isSetBType ()
104- && tbda . getBType (). equals ( TPredefinedBasicTypeEnum . STRUCT ), dataRefList );
105-
106- // last DAType should contain BDA not STRUCT
107- if ( dataRefList . size () != 1 ) return Optional . empty ();
108- String lastBdaName = dataRefList . getFirst ();
109- return bdaService . findBDA ( lastDAType , tbda -> tbda . getName ().equals ( lastBdaName )
110- && ! tbda .getBType (). equals ( TPredefinedBasicTypeEnum . STRUCT ) )
123+ // Search last STRUCT DAType
124+ Optional < TDAType > optLastStructDAType = findStructDATypeByBdaName (dtt , tdaType , dataRef . bdaNames (). subList ( 0 , dataRef . bdaNames (). size () - 1 ));
125+ if ( optLastStructDAType . isEmpty ()) {
126+ // it means that one of the BDA in dataRef.bdaNames() is missing
127+ return Optional . empty ();
128+ }
129+ // Search last BDA, which must not be a STRUCT
130+ String lastBdaName = dataRef . bdaNames ().getLast ();
131+ return bdaService . findBDA ( optLastStructDAType . get (), tbda -> tbda . getName (). equals ( lastBdaName ) && tbda .getBType () != STRUCT )
111132 .flatMap (tbda -> {
112133 dataAttribute .getBdaNames ().addAll (dataRef .bdaNames ());
113134 dataAttribute .setBType (tbda .getBType ());
@@ -139,25 +160,23 @@ private Optional<TDAType> getDATypeByDaName(TDataTypeTemplates dtt, TDOType tdoT
139160 .flatMap (tda -> daTypeService .findDaType (dtt , tda .getType ()));
140161 }
141162
142- private TDOType findDOTypeBySdoName (TDataTypeTemplates dtt , TDOType tdoType , List <String > sdoNames ) {
143- if (sdoNames .isEmpty ()) return tdoType ;
163+ private Optional <TDOType > findDOTypeBySdoName (TDataTypeTemplates dtt , TDOType tdoType , List <String > sdoNames ) {
164+ if (sdoNames .isEmpty ()) {
165+ return Optional .of (tdoType );
166+ }
144167 return sdoService .findSDO (tdoType , sdoNames .getFirst ())
145168 .flatMap (tsdo -> doTypeService .findDoType (dtt , tsdo .getType ()))
146- .map (tdoType2 -> {
147- sdoNames .removeFirst ();
148- return findDOTypeBySdoName (dtt , tdoType2 , sdoNames );
149- }).orElse (tdoType );
169+ .flatMap (tdoType2 -> findDOTypeBySdoName (dtt , tdoType2 , sdoNames .subList (1 , sdoNames .size ())));
150170 }
151171
152- private TDAType findDATypeByBdaName (TDataTypeTemplates dtt , TDAType tdaType , Predicate <TBDA > tbdaPredicate , List <String > bdaNames ) {
153- if (bdaNames .isEmpty ()) return tdaType ;
154- return bdaService .getFilteredBDAs (tdaType , tbdaPredicate )
172+ private Optional <TDAType > findStructDATypeByBdaName (TDataTypeTemplates dtt , TDAType tdaType , List <String > bdaNames ) {
173+ if (bdaNames .isEmpty ()) {
174+ return Optional .of (tdaType );
175+ }
176+ return bdaService .getFilteredBDAs (tdaType , tbda -> tbda .getName ().equals (bdaNames .getFirst ()) && tbda .getBType () == STRUCT )
155177 .findFirst ()
156178 .flatMap (tbda -> daTypeService .findDaType (dtt , tbda .getType ()))
157- .map (tdaType2 -> {
158- bdaNames .removeFirst ();
159- return findDATypeByBdaName (dtt , tdaType2 , tbdaPredicate , bdaNames );
160- }).orElse (tdaType );
179+ .flatMap (tdaType2 -> findStructDATypeByBdaName (dtt , tdaType2 , bdaNames .subList (1 , bdaNames .size ())));
161180 }
162181
163182}
0 commit comments