@@ -191,27 +191,11 @@ public void restoreNetworkModifications(UUID groupUuid, @NonNull List<UUID> modi
191191 networkModificationRepository .getModificationsCount (groupUuid , false ));
192192 }
193193
194- @ Transactional
195194 public NetworkModificationsResult createNetworkModification (@ NonNull UUID groupUuid , @ NonNull ModificationInfos modificationInfo , @ NonNull List <ModificationApplicationContext > applicationContexts ) {
195+ // We call 2 methods having a distinct Transaction. This is important for this use-case: when we create a Modification M on a built node,
196+ // we want M to be inserted in database even if apply(M) raises an exception.
196197 List <ModificationEntity > modificationEntities = networkModificationRepository .saveModificationInfos (groupUuid , List .of (modificationInfo ));
197-
198- return new NetworkModificationsResult (modificationEntities .stream ().map (ModificationEntity ::getId ).toList (),
199- applyModifications (groupUuid , modificationEntities , applicationContexts ));
200- }
201-
202- /**
203- * Apply modifications on several networks
204- */
205- private List <Optional <NetworkModificationResult >> applyModifications (UUID groupUuid , List <ModificationEntity > modifications , List <ModificationApplicationContext > applicationContexts ) {
206- return applicationContexts .stream ().map (modificationApplicationContext ->
207- applyModifications (
208- modificationApplicationContext .networkUuid (),
209- modificationApplicationContext .variantId (),
210- new ModificationApplicationGroup (groupUuid ,
211- modifications .stream ().filter (m -> !modificationApplicationContext .excludedModifications ().contains (m .getId ())).toList (),
212- new ReportInfos (modificationApplicationContext .reportUuid (), modificationApplicationContext .reporterId ())
213- ))
214- ).toList ();
198+ return modificationApplicator .applyNewNetworkModification (modificationEntities .getFirst ().getId (), groupUuid , applicationContexts );
215199 }
216200
217201 public Network cloneNetworkVariant (UUID networkUuid ,
@@ -292,7 +276,7 @@ public NetworkModificationsResult moveModifications(@NonNull UUID destinationGro
292276 // update origin/destinations groups to cut and paste all modificationsToMove
293277 List <ModificationEntity > modificationEntities = networkModificationRepository .moveModifications (destinationGroupUuid , originGroupUuid , modificationsToMoveUuids , beforeModificationUuid );
294278
295- List <Optional <NetworkModificationResult >> result = applyModifications && !modificationEntities .isEmpty () ? applyModifications (destinationGroupUuid , modificationEntities , applicationContexts ) : List .of ();
279+ List <Optional <NetworkModificationResult >> result = applyModifications && !modificationEntities .isEmpty () ? modificationApplicator . applyModifications (destinationGroupUuid , modificationEntities , applicationContexts ) : List .of ();
296280 return new NetworkModificationsResult (modificationEntities .stream ().map (ModificationEntity ::getId ).toList (), result );
297281 }
298282
@@ -316,22 +300,6 @@ public Map<UUID, UUID> duplicateGroup(UUID sourceGroupUuid, UUID groupUuid) {
316300 }
317301 }
318302
319- private Optional <NetworkModificationResult > applyModifications (UUID networkUuid , String variantId , ModificationApplicationGroup modificationGroupInfos ) {
320- if (!modificationGroupInfos .modifications ().isEmpty ()) {
321- PreloadingStrategy preloadingStrategy = modificationGroupInfos .modifications ().stream ()
322- .map (ModificationEntity ::getType )
323- .map (ModificationType ::valueOf )
324- .reduce (ModificationType ::maxStrategy ).map (ModificationType ::getStrategy ).orElse (PreloadingStrategy .NONE );
325- NetworkInfos networkInfos = getNetworkInfos (networkUuid , variantId , preloadingStrategy );
326-
327- // try to apply the duplicated modifications (incremental mode)
328- if (networkInfos .isVariantPresent ()) {
329- return Optional .of (modificationApplicator .applyModifications (modificationGroupInfos , networkInfos ));
330- }
331- }
332- return Optional .empty ();
333- }
334-
335303 @ Transactional
336304 public NetworkModificationsResult duplicateModifications (@ NonNull UUID targetGroupUuid , UUID originGroupUuid , @ NonNull List <UUID > modificationsUuids , @ NonNull List <ModificationApplicationContext > applicationContexts ) {
337305 if (originGroupUuid != null && !modificationsUuids .isEmpty ()) { // Duplicate modifications from a group or from a list only
@@ -341,15 +309,15 @@ public NetworkModificationsResult duplicateModifications(@NonNull UUID targetGro
341309 List <ModificationEntity > duplicateModifications = networkModificationRepository .saveModificationInfos (targetGroupUuid , modificationInfos );
342310 return new NetworkModificationsResult (
343311 duplicateModifications .stream ().map (ModificationEntity ::getId ).toList (),
344- applyModifications (targetGroupUuid , duplicateModifications , applicationContexts )
312+ modificationApplicator . applyModifications (targetGroupUuid , duplicateModifications , applicationContexts )
345313 );
346314 }
347315
348316 @ Transactional
349317 public NetworkModificationsResult insertCompositeModifications (@ NonNull UUID targetGroupUuid , @ NonNull List <UUID > modificationsUuids , @ NonNull List <ModificationApplicationContext > applicationContexts ) {
350318 List <ModificationInfos > modificationInfos = networkModificationRepository .getCompositeModificationsInfos (modificationsUuids );
351319 List <ModificationEntity > modificationEntities = networkModificationRepository .saveModificationInfos (targetGroupUuid , modificationInfos );
352- return new NetworkModificationsResult (modificationEntities .stream ().map (ModificationEntity ::getId ).toList (), applyModifications (targetGroupUuid , modificationEntities , applicationContexts ));
320+ return new NetworkModificationsResult (modificationEntities .stream ().map (ModificationEntity ::getId ).toList (), modificationApplicator . applyModifications (targetGroupUuid , modificationEntities , applicationContexts ));
353321 }
354322
355323 @ Transactional
0 commit comments