7
7
package org .gridsuite .shortcircuit .server .service ;
8
8
9
9
import com .fasterxml .jackson .databind .ObjectMapper ;
10
+ import com .fasterxml .jackson .databind .node .ArrayNode ;
11
+ import com .github .fge .jsonpatch .JsonPatch ;
12
+ import com .github .fge .jsonpatch .JsonPatchException ;
10
13
import com .powsybl .security .LimitViolationType ;
11
14
import com .powsybl .shortcircuit .InitialVoltageProfileMode ;
12
15
import com .powsybl .shortcircuit .ShortCircuitParameters ;
15
18
import com .powsybl .ws .commons .LogUtils ;
16
19
import com .univocity .parsers .csv .CsvWriter ;
17
20
import com .univocity .parsers .csv .CsvWriterSettings ;
21
+ import jakarta .persistence .EntityManager ;
22
+ import lombok .SneakyThrows ;
18
23
import org .gridsuite .shortcircuit .server .ShortCircuitException ;
19
24
import org .gridsuite .shortcircuit .server .dto .*;
20
25
import org .gridsuite .shortcircuit .server .entities .*;
26
+ import org .gridsuite .shortcircuit .server .repositories .ParametersRepository ;
21
27
import org .gridsuite .shortcircuit .server .repositories .ShortCircuitAnalysisResultRepository ;
28
+ import org .gridsuite .shortcircuit .server .util .Utils ;
22
29
import org .slf4j .Logger ;
23
30
import org .slf4j .LoggerFactory ;
24
- import org .springframework .beans .factory .annotation .Autowired ;
25
31
import org .springframework .data .domain .Page ;
26
32
import org .springframework .data .domain .Pageable ;
33
+ import org .springframework .http .MediaType ;
34
+ import org .springframework .lang .Nullable ;
27
35
import org .springframework .stereotype .Service ;
28
36
import org .springframework .transaction .annotation .Transactional ;
29
37
30
- import java .io .*;
38
+ import java .io .ByteArrayOutputStream ;
39
+ import java .io .IOException ;
31
40
import java .nio .charset .StandardCharsets ;
32
41
import java .util .*;
33
42
import java .util .concurrent .TimeUnit ;
@@ -48,25 +57,29 @@ public class ShortCircuitService {
48
57
49
58
//TODO tmp migration
50
59
private static final List <VoltageRange > CEI909_VOLTAGE_PROFILE = List .of (
51
- new VoltageRange (10.0 , 199.99 , 1.1 ),
52
- new VoltageRange (200.0 , 299.99 , 1.09 ),
53
- new VoltageRange (300.0 , 500.0 , 1.05 )
60
+ new VoltageRange (10.0 , 199.99 , 1.1 ),
61
+ new VoltageRange (200.0 , 299.99 , 1.09 ),
62
+ new VoltageRange (300.0 , 500.0 , 1.05 )
54
63
);
55
64
56
- @ Autowired
57
- NotificationService notificationService ;
58
-
59
- private UuidGeneratorService uuidGeneratorService ;
60
-
61
- private ShortCircuitAnalysisResultRepository resultRepository ;
62
-
63
- private ObjectMapper objectMapper ;
64
-
65
- public ShortCircuitService (NotificationService notificationService , UuidGeneratorService uuidGeneratorService , ShortCircuitAnalysisResultRepository resultRepository , ObjectMapper objectMapper ) {
65
+ private final NotificationService notificationService ;
66
+ private final UuidGeneratorService uuidGeneratorService ;
67
+ private final ShortCircuitAnalysisResultRepository resultRepository ;
68
+ private final ParametersRepository parametersRepository ;
69
+ private final ObjectMapper objectMapper ;
70
+ private final EntityManager entityManager ;
71
+
72
+ public ShortCircuitService (NotificationService notificationService ,
73
+ UuidGeneratorService uuidGeneratorService ,
74
+ ShortCircuitAnalysisResultRepository resultRepository ,
75
+ ParametersRepository parametersRepository ,
76
+ ObjectMapper objectMapper , EntityManager entityManager ) {
66
77
this .notificationService = Objects .requireNonNull (notificationService );
67
78
this .uuidGeneratorService = Objects .requireNonNull (uuidGeneratorService );
68
79
this .resultRepository = Objects .requireNonNull (resultRepository );
69
80
this .objectMapper = Objects .requireNonNull (objectMapper );
81
+ this .parametersRepository = parametersRepository ;
82
+ this .entityManager = entityManager ;
70
83
}
71
84
72
85
public UUID runAndSaveResult (ShortCircuitRunContext runContext ) {
@@ -124,28 +137,29 @@ private static FeederResult fromEntity(FeederResultEntity feederResultEntity) {
124
137
return new FeederResult (feederResultEntity .getConnectableId (), feederResultEntity .getCurrent (), feederResultEntity .getPositiveMagnitude ());
125
138
}
126
139
127
- //TODO tmp migration
128
- public static AnalysisParametersEntity toEntity (ShortCircuitParameters parameters , ShortCircuitPredefinedConfiguration shortCircuitPredefinedConfiguration ) {
129
- Objects .requireNonNull (parameters );
130
- return new AnalysisParametersEntity (parameters .isWithLimitViolations (),
131
- parameters .isWithVoltageResult (),
132
- parameters .isWithFortescueResult (),
133
- parameters .isWithFeederResult (),
134
- parameters .getStudyType (),
135
- parameters .getMinVoltageDropProportionalThreshold (),
136
- parameters .isWithLoads (),
137
- parameters .isWithShuntCompensators (),
138
- parameters .isWithVSCConverterStations (),
139
- parameters .isWithNeutralPosition (),
140
- parameters .getInitialVoltageProfileMode (),
141
- shortCircuitPredefinedConfiguration );
140
+ private static AnalysisParametersEntity toEntity (ShortCircuitParametersInfos parametersInfos ) {
141
+ final ShortCircuitParameters parameters = parametersInfos .parameters ();
142
+ return new AnalysisParametersEntity (
143
+ parameters .isWithLimitViolations (),
144
+ parameters .isWithVoltageResult (),
145
+ parameters .isWithFortescueResult (),
146
+ parameters .isWithFeederResult (),
147
+ parameters .getStudyType (),
148
+ parameters .getMinVoltageDropProportionalThreshold (),
149
+ parameters .isWithLoads (),
150
+ parameters .isWithShuntCompensators (),
151
+ parameters .isWithVSCConverterStations (),
152
+ parameters .isWithNeutralPosition (),
153
+ parameters .getInitialVoltageProfileMode (),
154
+ parametersInfos .predefinedParameters ()
155
+ );
142
156
}
143
157
144
- //TODO tmp migration
145
- public static ShortCircuitParameters fromEntity (AnalysisParametersEntity entity ) {
158
+ private static ShortCircuitParametersInfos fromEntity (AnalysisParametersEntity entity ) {
146
159
Objects .requireNonNull (entity );
147
- List <VoltageRange > voltageRanges = InitialVoltageProfileMode .CONFIGURED .equals (entity .getInitialVoltageProfileMode ()) ? CEI909_VOLTAGE_PROFILE : null ;
148
- return new ShortCircuitParameters ()
160
+ return new ShortCircuitParametersInfos (
161
+ entity .getPredefinedParameters (),
162
+ new ShortCircuitParameters ()
149
163
.setStudyType (entity .getStudyType ())
150
164
.setMinVoltageDropProportionalThreshold (entity .getMinVoltageDropProportionalThreshold ())
151
165
.setWithFeederResult (entity .isWithFeederResult ())
@@ -157,11 +171,20 @@ public static ShortCircuitParameters fromEntity(AnalysisParametersEntity entity)
157
171
.setWithVSCConverterStations (entity .isWithVscConverterStations ())
158
172
.setWithNeutralPosition (entity .isWithNeutralPosition ())
159
173
.setInitialVoltageProfileMode (entity .getInitialVoltageProfileMode ())
160
- .setVoltageRanges (voltageRanges );
174
+ .setVoltageRanges (InitialVoltageProfileMode .CONFIGURED .equals (entity .getInitialVoltageProfileMode ()) ? CEI909_VOLTAGE_PROFILE : null ),
175
+ CEI909_VOLTAGE_PROFILE
176
+ );
161
177
}
162
178
163
- //TODO tmp migration
164
- public static ShortCircuitParameters getDefaultShortCircuitParameters () {
179
+ private static ShortCircuitParametersInfos getDefaultDtoParameters () {
180
+ return new ShortCircuitParametersInfos (
181
+ ShortCircuitPredefinedConfiguration .ICC_MAX_WITH_CEI909 ,
182
+ getDefaultShortCircuitParameters (),
183
+ CEI909_VOLTAGE_PROFILE
184
+ );
185
+ }
186
+
187
+ private static ShortCircuitParameters getDefaultShortCircuitParameters () {
165
188
return new ShortCircuitParameters ()
166
189
.setStudyType (StudyType .TRANSIENT )
167
190
.setMinVoltageDropProportionalThreshold (20 )
@@ -178,14 +201,23 @@ public static ShortCircuitParameters getDefaultShortCircuitParameters() {
178
201
.setVoltageRanges (null );
179
202
}
180
203
181
- //TODO tmp migration
182
- public static ShortCircuitParametersInfos toShortCircuitParametersInfo (AnalysisParametersEntity entity ) {
183
- Objects .requireNonNull (entity );
184
- return ShortCircuitParametersInfos .builder ()
185
- .predefinedParameters (entity .getPredefinedParameters ())
186
- .parameters (fromEntity (entity ))
187
- .cei909VoltageRanges (CEI909_VOLTAGE_PROFILE )
188
- .build ();
204
+ private static void updateEntity (AnalysisParametersEntity parametersEntity , final ShortCircuitParametersInfos parametersInfos ) {
205
+ parametersEntity .setPredefinedParameters (parametersInfos .predefinedParameters ());
206
+ final ShortCircuitParameters scParameters = parametersInfos .parameters ();
207
+ parametersEntity .setWithLimitViolations (scParameters .isWithLimitViolations ());
208
+ parametersEntity .setWithVoltageResult (scParameters .isWithVoltageResult ());
209
+ parametersEntity .setWithFortescueResult (scParameters .isWithFortescueResult ());
210
+ parametersEntity .setWithFeederResult (scParameters .isWithFeederResult ());
211
+ parametersEntity .setStudyType (scParameters .getStudyType ());
212
+ parametersEntity .setMinVoltageDropProportionalThreshold (scParameters .getMinVoltageDropProportionalThreshold ());
213
+ parametersEntity .setWithLoads (scParameters .isWithLoads ());
214
+ parametersEntity .setWithShuntCompensators (scParameters .isWithShuntCompensators ());
215
+ parametersEntity .setWithVscConverterStations (scParameters .isWithVSCConverterStations ());
216
+ parametersEntity .setWithNeutralPosition (scParameters .isWithNeutralPosition ());
217
+ parametersEntity .setInitialVoltageProfileMode (scParameters .getInitialVoltageProfileMode ());
218
+ //scParameters.isDetailedReport()
219
+ //scParameters.getVoltageRanges()
220
+ //scParameters.getSubTransientCoefficient()
189
221
}
190
222
191
223
private static ShortCircuitAnalysisResultEntity sortByElementId (ShortCircuitAnalysisResultEntity result ) {
@@ -396,4 +428,64 @@ public List<LimitViolationType> getLimitTypes(UUID resultUuid) {
396
428
public List <com .powsybl .shortcircuit .Fault .FaultType > getFaultTypes (UUID resultUuid ) {
397
429
return resultRepository .findFaultTypes (resultUuid );
398
430
}
431
+
432
+ public Optional <ShortCircuitParametersInfos > getParameters (final UUID parametersUuid ) {
433
+ return parametersRepository .findById (parametersUuid ).map (ShortCircuitService ::fromEntity );
434
+ }
435
+
436
+ public void deleteParameters (final UUID parametersUuid ) {
437
+ parametersRepository .deleteById (parametersUuid );
438
+ }
439
+
440
+ @ Transactional
441
+ public Optional <UUID > duplicateParameters (UUID sourceParametersUuid ) {
442
+ return parametersRepository .findById (sourceParametersUuid )
443
+ .map (entity -> {
444
+ entityManager .detach (entity );
445
+ entity .setId (null );
446
+ return entity ;
447
+ })
448
+ .map (parametersRepository ::save )
449
+ .map (AnalysisParametersEntity ::getId );
450
+ }
451
+
452
+ private ShortCircuitParametersInfos updateDto (ShortCircuitParametersInfos parameters , @ Nullable final MediaType contentType , final String parametersPatch )
453
+ throws IllegalArgumentException , IOException , JsonPatchException {
454
+ if (contentType == null ) {
455
+ throw new IllegalArgumentException ("Content-Type is mandatory" );
456
+ } else if (Utils .APPLICATION_JSON_PATCH .equalsTypeAndSubtype (contentType )) {
457
+ return objectMapper .treeToValue (JsonPatch .fromJson (objectMapper .readValue (parametersPatch , ArrayNode .class ))
458
+ .apply (objectMapper .valueToTree (parameters )), ShortCircuitParametersInfos .class );
459
+ } else if (MediaType .APPLICATION_JSON .equalsTypeAndSubtype (contentType )) {
460
+ return objectMapper .readerForUpdating (parameters ).readValue (parametersPatch );
461
+ } else {
462
+ throw new IllegalArgumentException ("Unsupported content type: " + contentType );
463
+ }
464
+ }
465
+
466
+ @ SneakyThrows
467
+ public UUID createParameters (@ Nullable final MediaType contentType , @ Nullable final String parametersPatch ) {
468
+ ShortCircuitParametersInfos parameters = getDefaultDtoParameters ();
469
+ if (parametersPatch != null ) {
470
+ parameters = updateDto (parameters , contentType , parametersPatch );
471
+ }
472
+ return parametersRepository .save (toEntity (parameters )).getId ();
473
+ }
474
+
475
+ @ SneakyThrows
476
+ public boolean updateParameters (final UUID parametersUuid , @ Nullable final MediaType contentType , @ Nullable final String parametersPatch ) {
477
+ AnalysisParametersEntity parameters = parametersRepository .findById (parametersUuid ).orElse (null );
478
+ if (parameters == null ) {
479
+ return false ;
480
+ } else {
481
+ if (parametersPatch == null ) {
482
+ // we simply reset
483
+ updateEntity (parameters , getDefaultDtoParameters ());
484
+ } else {
485
+ updateEntity (parameters , updateDto (fromEntity (parameters ), contentType , parametersPatch ));
486
+ }
487
+ parametersRepository .save (parameters );
488
+ return true ;
489
+ }
490
+ }
399
491
}
0 commit comments