4
4
5
5
package org .lfenergy .compas .sct .commons ;
6
6
7
+ import org .apache .commons .lang3 .StringUtils ;
7
8
import org .lfenergy .compas .scl2007b4 .model .*;
9
+ import org .lfenergy .compas .sct .commons .api .DataTypeTemplateReader ;
10
+ import org .lfenergy .compas .sct .commons .domain .DataAttribute ;
11
+ import org .lfenergy .compas .sct .commons .domain .DataObject ;
12
+ import org .lfenergy .compas .sct .commons .domain .DoLinkedToDa ;
13
+ import org .lfenergy .compas .sct .commons .domain .DoLinkedToDaFilter ;
14
+
15
+ import java .util .*;
16
+ import java .util .function .Predicate ;
17
+ import java .util .stream .Stream ;
8
18
9
19
import static org .lfenergy .compas .sct .commons .util .CommonConstants .MOD_DO_NAME ;
10
20
import static org .lfenergy .compas .sct .commons .util .CommonConstants .STVAL_DA_NAME ;
11
21
12
- public class DataTypeTemplatesService {
22
+ public class DataTypeTemplatesService implements DataTypeTemplateReader {
13
23
14
24
final LnodeTypeService lnodeTypeService = new LnodeTypeService ();
15
25
final DoTypeService doTypeService = new DoTypeService ();
26
+ final DaTypeService daTypeService = new DaTypeService ();
16
27
final DoService doService = new DoService ();
28
+ final SDOOrDAService sdoOrDAService = new SDOOrDAService ();
29
+ final BDAService bdaService = new BDAService ();
17
30
18
31
/**
19
32
* verify if DO(name=Mod)/DA(name=stVal) exists in DataTypeTemplate
@@ -33,14 +46,116 @@ public class DataTypeTemplatesService {
33
46
*/
34
47
public boolean isDoModAndDaStValExist (TDataTypeTemplates dtt , String lNodeTypeId ) {
35
48
return lnodeTypeService .findLnodeType (dtt , lNodeType -> lNodeTypeId .equals (lNodeType .getId ()))
36
- .map (lNodeType -> doService .findDo (lNodeType , tdo -> MOD_DO_NAME .equals (tdo .getName ()))
37
- .map (tdo -> doTypeService .findDoType (dtt , doType -> tdo .getType ().equals (doType .getId ()))
38
- .map (doType -> doType .getSDOOrDA ().stream ()
39
- .filter (sdoOrDa -> sdoOrDa .getClass ().equals (TDA .class ))
40
- .map (TDA .class ::cast )
41
- .anyMatch (tda -> STVAL_DA_NAME .equals (tda .getName ())))
42
- .orElse (false ))
43
- .orElse (false ))
44
- .orElse (false );
49
+ .flatMap (lNodeType -> doService .findDo (lNodeType , tdo -> MOD_DO_NAME .equals (tdo .getName ()))
50
+ .flatMap (tdo -> doTypeService .findDoType (dtt , doType -> tdo .getType ().equals (doType .getId ()))
51
+ .map (doType -> sdoOrDAService .findDA (doType , tda -> STVAL_DA_NAME .equals (tda .getName ())).isPresent ())))
52
+ .orElse (false );
53
+ }
54
+
55
+ @ Override
56
+ public Stream <DoLinkedToDa > getAllDoLinkedToDa (TDataTypeTemplates dtt ) {
57
+ return lnodeTypeService .getLnodeTypes (dtt )
58
+ .flatMap (tlNodeType -> {
59
+ DoLinkedToDa doLinkedToDa = new DoLinkedToDa ();
60
+ doLinkedToDa .setDataObject (new DataObject ());
61
+ doLinkedToDa .setDataAttribute (new DataAttribute ());
62
+ return tlNodeType .getDO ()
63
+ .stream ()
64
+ .map (tdo -> doTypeService .findDoType (dtt , tdoType -> tdoType .getId ().equals (tdo .getType ()))
65
+ .map (doType -> {
66
+ doLinkedToDa .getDataObject ().setDoName (tdo .getName ());
67
+ return doTypeService .getAllSDOLinkedToDa (dtt , doType , doLinkedToDa ).stream ();
68
+ }))
69
+ .filter (Optional ::isPresent )
70
+ .flatMap (Optional ::orElseThrow );
71
+ });
72
+ }
73
+
74
+ @ Override
75
+ public Stream <DoLinkedToDa > getFilteredDoLinkedToDa (TDataTypeTemplates dtt , String lNodeTypeId , DoLinkedToDaFilter doLinkedToDaFilter ) {
76
+ return lnodeTypeService .findLnodeType (dtt , tlNodeType -> tlNodeType .getId ().equals (lNodeTypeId ))
77
+ .stream ()
78
+ .flatMap (tlNodeType -> doService .getFilteredDos (tlNodeType , tdo -> StringUtils .isBlank (doLinkedToDaFilter .getDoName ())
79
+ || (StringUtils .isNotBlank (doLinkedToDaFilter .getDoName ()) && doLinkedToDaFilter .getDoName ().equals (tdo .getName ())))
80
+ .flatMap (tdo -> {
81
+ DoLinkedToDa doLinkedToDa = new DoLinkedToDa ();
82
+ DataObject dataObject = new DataObject ();
83
+ dataObject .setDoName (tdo .getName ());
84
+ doLinkedToDa .setDataObject (dataObject );
85
+ doLinkedToDa .setDataAttribute (new DataAttribute ());
86
+ return doTypeService .findDoType (dtt , tdoType -> tdoType .getId ().equals (tdo .getType ()))
87
+ .stream ()
88
+ .flatMap (tdoType -> {
89
+ doLinkedToDa .getDataObject ().setCdc (tdoType .getCdc ());
90
+ return doTypeService .getAllSDOLinkedToDa (dtt , tdoType , doLinkedToDa ).stream ()
91
+ .filter (doLinkedToDa1 -> StringUtils .isBlank (doLinkedToDaFilter .getDoName ()) || doLinkedToDa1 .getDoRef ().startsWith (doLinkedToDaFilter .getDoRef ())
92
+ && StringUtils .isBlank (doLinkedToDaFilter .getDaName ()) || doLinkedToDa1 .getDaRef ().startsWith (doLinkedToDaFilter .getDaRef ()));
93
+ });
94
+ }));
45
95
}
96
+
97
+ @ Override
98
+ public Optional <DoLinkedToDa > findDoLinkedToDa (TDataTypeTemplates dtt , String lNodeTypeId , DoLinkedToDa doLinkedToDa ) {
99
+ List <String > dataRefList = new ArrayList <>(doLinkedToDa .getDataObject ().getSdoNames ());
100
+ dataRefList .addAll (doLinkedToDa .getDataAttribute ().getBdaNames ());
101
+
102
+ return lnodeTypeService .findLnodeType (dtt , lNodeType -> lNodeTypeId .equals (lNodeType .getId ()))
103
+ .flatMap (lNodeType -> doService .findDo (lNodeType , tdo -> tdo .getName ().equals (doLinkedToDa .getDataObject ().getDoName ()))
104
+ // Search DoType for each DO
105
+ .flatMap (tdo -> doTypeService .findDoType (dtt , doType -> doType .getId ().equals (tdo .getType ()))
106
+ .flatMap (tdoType -> {
107
+ // Search last DoType from DOType (SDO) > DOType (SDO)
108
+ TDOType lastDoType = findDOTypeBySdoName (dtt , tdoType , dataRefList );
109
+ // Search first DA from last DoType
110
+ return sdoOrDAService .findDA (lastDoType , tda1 -> tda1 .getName ().equals (doLinkedToDa .getDataAttribute ().getDaName ()))
111
+ .flatMap (tda -> {
112
+ // Check if first DA is STRUCT or not
113
+ if (!tda .getBType ().equals (TPredefinedBasicTypeEnum .STRUCT )) {
114
+ return Optional .of (doLinkedToDa );
115
+ }
116
+ // Search first DaType from DOType (from last DOType where DA is STRUCT)
117
+ return getDATypeByDaName (dtt , lastDoType , tda .getName ())
118
+ .flatMap (tdaType -> {
119
+ // Search last DAType from first DAType
120
+ TDAType lastDAType = findDATypeByBdaName (dtt , tdaType , tbda -> tbda .isSetBType ()
121
+ && tbda .getBType ().equals (TPredefinedBasicTypeEnum .STRUCT ), dataRefList );
122
+
123
+ // last DAType should contain BDA not STRUCT
124
+ if (dataRefList .size () != 1 ) return Optional .empty ();
125
+ String lastBdaName = dataRefList .getFirst ();
126
+ return bdaService .findBDA (lastDAType , tbda -> tbda .getName ().equals (lastBdaName )
127
+ && !tbda .getBType ().equals (TPredefinedBasicTypeEnum .STRUCT ))
128
+ .flatMap (tbda -> Optional .of (doLinkedToDa ));
129
+ });
130
+ });
131
+ })
132
+ ));
133
+ }
134
+
135
+ private Optional <TDAType > getDATypeByDaName (TDataTypeTemplates dtt , TDOType tdoType , String daName ) {
136
+ return sdoOrDAService .findDA (tdoType , tda -> tda .getName ().equals (daName ))
137
+ .flatMap (tda -> daTypeService .findDaType (dtt , tda .getType ()));
138
+ }
139
+
140
+ private TDOType findDOTypeBySdoName (TDataTypeTemplates dtt , TDOType tdoType , List <String > sdoNames ) {
141
+ if (sdoNames .isEmpty ()) return tdoType ;
142
+ return sdoOrDAService .findSDO (tdoType , tsdo -> tsdo .getName ().equals (sdoNames .getFirst ()))
143
+ .flatMap (tsdo -> doTypeService .findDoType (dtt , tdoType2 -> tdoType2 .getId ().equals (tsdo .getType ())))
144
+ .map (tdoType2 -> {
145
+ sdoNames .removeFirst ();
146
+ return findDOTypeBySdoName (dtt , tdoType2 , sdoNames );
147
+ }).orElse (tdoType );
148
+ }
149
+
150
+ private TDAType findDATypeByBdaName (TDataTypeTemplates dtt , TDAType tdaType , Predicate <TBDA > tbdaPredicate , List <String > bdaNames ) {
151
+ if (bdaNames .isEmpty ()) return tdaType ;
152
+ return bdaService .getFilteredBDAs (tdaType , tbdaPredicate )
153
+ .findFirst ()
154
+ .flatMap (tbda -> daTypeService .findDaType (dtt , tbda .getType ()))
155
+ .map (tdaType2 -> {
156
+ bdaNames .removeFirst ();
157
+ return findDATypeByBdaName (dtt , tdaType2 , tbdaPredicate , bdaNames );
158
+ }).orElse (tdaType );
159
+ }
160
+
46
161
}
0 commit comments