This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 0ba6c8b488c690c49724527d7a7673c617d29de3 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jul 12 14:56:38 2016 +0200 Revue du moteur de synchronisation pour n'effectuer qu'un seule appel au call back utilisateur (See #7739) --- ...idirectionalReferentialSynchronizeCallback.java | 17 +++ ...ionalReferentialSynchronizeCallbackRequest.java | 43 ++++++++ ...onalReferentialSynchronizeCallbackRequests.java | 42 ++++++++ ...tionalReferentialSynchronizeCallbackResult.java | 33 ++++++ ...ionalReferentialSynchronizeCallbackResults.java | 36 +++++++ ...UnidirectionalReferentialSynchronizeEngine.java | 115 ++++++++++----------- ...nidirectionalReferentialSynchronizeRequest.java | 7 ++ .../UnidirectionalSynchronizeReferentialTest.java | 56 ++-------- 8 files changed, 243 insertions(+), 106 deletions(-) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallback.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallback.java new file mode 100644 index 0000000..638a983 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallback.java @@ -0,0 +1,17 @@ +package fr.ird.observe.services.service.actions.synchro; + +/** + * Le call back utilisateur pour lui permettre d'effectuer les remplacements sur les référentiels qui posent problèmes. + * + * Pour le moment on ne traite ici que les référentiels supprimés à distance et utilisés dans des données locales. + * + * Created on 12/07/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public interface UnidirectionalReferentialSynchronizeCallback { + + UnidirectionalReferentialSynchronizeCallbackResults askUserToReplaceRemovedReferentials(UnidirectionalReferentialSynchronizeCallbackRequests request); + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackRequest.java new file mode 100644 index 0000000..bcfbfbd --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackRequest.java @@ -0,0 +1,43 @@ +package fr.ird.observe.services.service.actions.synchro; + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; + +import java.util.Collection; + +/** + * Représente une demande du call back utilisateur pour un type de référentiel donné. + * + * Created on 12/07/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class UnidirectionalReferentialSynchronizeCallbackRequest<R extends ReferentialDto> { + + private final String referentialName; + private final ImmutableSet<ReferentialReference<R>> referentialsToReplace; + private final ImmutableSet<ReferentialReference<R>> availableReferentials; + + public String getReferentialName() { + return referentialName; + } + + public ImmutableSet<ReferentialReference<R>> getReferentialsToReplace() { + return referentialsToReplace; + } + + public ImmutableSet<ReferentialReference<R>> getAvailableReferentials() { + return availableReferentials; + } + + UnidirectionalReferentialSynchronizeCallbackRequest(String referentialName, + Collection<ReferentialReference<R>> referentialsToReplace, + Collection<ReferentialReference<R>> availableReferentials) { + this.referentialName = referentialName; + this.referentialsToReplace = ImmutableSet.copyOf(referentialsToReplace); + this.availableReferentials = ImmutableSet.copyOf(availableReferentials); + } + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackRequests.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackRequests.java new file mode 100644 index 0000000..9f59166 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackRequests.java @@ -0,0 +1,42 @@ +package fr.ird.observe.services.service.actions.synchro; + +import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; + +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * Représente l'ensemble des demandes au call back utilisateur. + * + * Created on 12/07/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class UnidirectionalReferentialSynchronizeCallbackRequests { + + private final Set<UnidirectionalReferentialSynchronizeCallbackRequest<?>> callbackRequests; + + public UnidirectionalReferentialSynchronizeCallbackRequests() { + callbackRequests = new LinkedHashSet<>(); + } + + public <R extends ReferentialDto> void addCallbackRequest(String referentialName, + Collection<ReferentialReference<R>> referentialsToReplace, + Collection<ReferentialReference<R>> availableReferentials) { + + UnidirectionalReferentialSynchronizeCallbackRequest<R> callbackRequest = new UnidirectionalReferentialSynchronizeCallbackRequest<>(referentialName, referentialsToReplace, availableReferentials); + callbackRequests.add(callbackRequest); + } + + public Set<UnidirectionalReferentialSynchronizeCallbackRequest<?>> getCallbackRequests() { + return callbackRequests; + } + + public boolean isNotEmpty() { + return !callbackRequests.isEmpty(); + } + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackResult.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackResult.java new file mode 100644 index 0000000..fe49053 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackResult.java @@ -0,0 +1,33 @@ +package fr.ird.observe.services.service.actions.synchro; + +import com.google.common.collect.ImmutableMap; + +import java.util.Map; + +/** + * Contient les résultats du call back utilisateur pour un type de référentiel donné. + * + * Created on 12/07/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class UnidirectionalReferentialSynchronizeCallbackResult { + + private final String referentialName; + private final ImmutableMap<String, String> ids; + + public String getReferentialName() { + return referentialName; + } + + public ImmutableMap<String, String> getIds() { + return ids; + } + + UnidirectionalReferentialSynchronizeCallbackResult(String referentialName, Map<String, String> ids) { + this.referentialName = referentialName; + this.ids = ImmutableMap.copyOf(ids); + } + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackResults.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackResults.java new file mode 100644 index 0000000..52fcce0 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackResults.java @@ -0,0 +1,36 @@ +package fr.ird.observe.services.service.actions.synchro; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Contient l'ensemble des résultats du call back utilisateur. + * + * Created on 12/07/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class UnidirectionalReferentialSynchronizeCallbackResults { + + private final Map<String, UnidirectionalReferentialSynchronizeCallbackResult> callbackResults; + + public UnidirectionalReferentialSynchronizeCallbackResults() { + callbackResults = new LinkedHashMap<>(); + } + + public void addCallbackResult(String referentialName, Map<String, String> ids) { + + UnidirectionalReferentialSynchronizeCallbackResult callbackResult = new UnidirectionalReferentialSynchronizeCallbackResult(referentialName, ids); + callbackResults.put(callbackResult.getReferentialName(), callbackResult); + + } + + public UnidirectionalReferentialSynchronizeCallbackResult getCallbackResult(String referentialName) { + return callbackResults.get(referentialName); + } + + public boolean containsReferentialName(String referentialName) { + return callbackResults.containsKey(referentialName); + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java index 5c3b8c5..3ec6089 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java @@ -22,11 +22,11 @@ public class UnidirectionalReferentialSynchronizeEngine implements Callable<Unid private final UnidirectionalReferentialSynchronizeLocalService localService; private final UnidirectionalReferentialSynchronizeRemoteService remoteService; - private final Callback callback; + private final UnidirectionalReferentialSynchronizeCallback callback; public UnidirectionalReferentialSynchronizeEngine(UnidirectionalReferentialSynchronizeLocalService localService, UnidirectionalReferentialSynchronizeRemoteService remoteService, - Callback callback) { + UnidirectionalReferentialSynchronizeCallback callback) { this.localService = localService; this.remoteService = remoteService; this.callback = callback; @@ -40,11 +40,57 @@ public class UnidirectionalReferentialSynchronizeEngine implements Callable<Unid UnidirectionalReferentialSynchronizeResult result = new UnidirectionalReferentialSynchronizeResult(); - Set<String> sqlRequests = new LinkedHashSet<>(); + + Set<UnidirectionalReferentialSynchronizeRequest.Builder<?>> referentialSynchronizeRequestBuilders = new LinkedHashSet<>(); + + UnidirectionalReferentialSynchronizeCallbackRequests callbackRequests = new UnidirectionalReferentialSynchronizeCallbackRequests(); + + + // Première étape pour construire les builder de requète et calculer au passage les ids à faire remplacer + // par l'utilisateur + for (String referentialName : remoteReferentialDiff.getReferentialNames()) { - UnidirectionalReferentialSynchronizeRequest<?> referentialSynchronizeRequest = - buildReferentialSynchronizeRequest(callback, referentialName, remoteReferentialDiff); + UnidirectionalReferentialSynchronizeRequest.Builder<?> referentialSynchronizeRequestBuilder = + computeReferentialSynchronizeRequestBuilder(referentialName, remoteReferentialDiff, callbackRequests); + + referentialSynchronizeRequestBuilders.add(referentialSynchronizeRequestBuilder); + + } + + boolean needCallback = callbackRequests.isNotEmpty(); + + UnidirectionalReferentialSynchronizeCallbackResults callbackResults = null; + + if (needCallback) { + + callbackResults = callback.askUserToReplaceRemovedReferentials(callbackRequests); + + } + + Set<String> sqlRequests = new LinkedHashSet<>(); + + // Second étape pour terminer la construction des builders de requètes et générer le code sql + + for (UnidirectionalReferentialSynchronizeRequest.Builder<?> referentialSynchronizeRequestBuilder : referentialSynchronizeRequestBuilders) { + + String referentialName = referentialSynchronizeRequestBuilder.getReferentialName(); + + if (needCallback && callbackResults.containsReferentialName(referentialName)) { + + // l'utilisateur a agit sur ce référentiel + UnidirectionalReferentialSynchronizeCallbackResult callbackResult = callbackResults.getCallbackResult(referentialName); + + Map<String, String> ids = callbackResult.getIds(); + + for (Map.Entry<String, String> entry : ids.entrySet()) { + referentialSynchronizeRequestBuilder.entityToReplace(entry.getKey(), entry.getValue()); + referentialSynchronizeRequestBuilder.entityToRemove(entry.getKey()); + } + + } + + UnidirectionalReferentialSynchronizeRequest<?> referentialSynchronizeRequest = referentialSynchronizeRequestBuilder.build(); result.flushRequest(referentialSynchronizeRequest); @@ -61,7 +107,7 @@ public class UnidirectionalReferentialSynchronizeEngine implements Callable<Unid } - private <R extends ReferentialDto> UnidirectionalReferentialSynchronizeRequest buildReferentialSynchronizeRequest(Callback callback, String referentialName, RemoteReferentialDiff remoteReferentialDiff) { + private <R extends ReferentialDto> UnidirectionalReferentialSynchronizeRequest.Builder<R> computeReferentialSynchronizeRequestBuilder(String referentialName, RemoteReferentialDiff remoteReferentialDiff, UnidirectionalReferentialSynchronizeCallbackRequests callbackRequests) { UnidirectionalReferentialSynchronizeRequest.Builder<R> builder = UnidirectionalReferentialSynchronizeRequest.builder(referentialName); @@ -92,69 +138,20 @@ public class UnidirectionalReferentialSynchronizeEngine implements Callable<Unid } - boolean needCallback = CollectionUtils.isNotEmpty(blockingIdsToRemove); - if (needCallback) { - // calcul de l'univers de référentiels disponibles pour les remplacements + if (needCallback) { ReferentialReferenceSet<R> availableReferenceSet = remoteService.getEnabledReferentialReferenceSet(referentialName); Set<ReferentialReference<R>> availableReferentials = availableReferenceSet.getReferences(); Set<ReferentialReference<R>> blockingReferentialsToRemove = localService.getLocalSourceReferentialToDelete(referentialName, blockingIdsToRemove); - CallbackRequest<R> callbackRequest = CallbackRequest.of(referentialName, blockingReferentialsToRemove, availableReferentials); - Map<String, String> referentialsToRemoveIds = callback.askUserToReplaceRemovedReferentials(callbackRequest); - for (Map.Entry<String, String> entry : referentialsToRemoveIds.entrySet()) { - builder.entityToReplace(entry.getKey(), entry.getValue()); - builder.entityToRemove(entry.getKey()); - } + + callbackRequests.addCallbackRequest(referentialName, blockingReferentialsToRemove, availableReferentials); } - UnidirectionalReferentialSynchronizeRequest referentialSynchronizeRequest = builder.build(); - return referentialSynchronizeRequest; - - } - - public interface Callback { - - <R extends ReferentialDto> Map<String, String> askUserToReplaceRemovedReferentials(CallbackRequest<R> request); - - <R extends ReferentialDto> Map<String, String> askUserToReplaceDisabledReferentials(CallbackRequest<R> request); - - } - - public static class CallbackRequest<R extends ReferentialDto> { - - public static <R extends ReferentialDto> CallbackRequest<R> of(String referentialName, - Collection<ReferentialReference<R>> referentialsToReplace, - Collection<ReferentialReference<R>> availableReferentials) { - return new CallbackRequest<>(referentialName, referentialsToReplace, availableReferentials); - } - - private final String referentialName; - private final Collection<ReferentialReference<R>> referentialsToReplace; - private final Collection<ReferentialReference<R>> availableReferentials; - - public String getReferentialName() { - return referentialName; - } - - public Collection<ReferentialReference<R>> getReferentialsToReplace() { - return referentialsToReplace; - } - - public Collection<ReferentialReference<R>> getAvailableReferentials() { - return availableReferentials; - } - - private CallbackRequest(String referentialName, - Collection<ReferentialReference<R>> referentialsToReplace, - Collection<ReferentialReference<R>> availableReferentials) { - this.referentialName = referentialName; - this.referentialsToReplace = referentialsToReplace; - this.availableReferentials = availableReferentials; - } + return builder; } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java index d049d04..fd01d8a 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java @@ -50,12 +50,15 @@ public class UnidirectionalReferentialSynchronizeRequest<R extends ReferentialDt public boolean withReferentialToAdd() { return !referentialToAdd.isEmpty(); } + public boolean withReferentialToUpdate() { return !referentialToUpdate.isEmpty(); } + public boolean withReferentialToRemove() { return !referentialToRemove.isEmpty(); } + public boolean withReferentialToReplace() { return !referentialToReplace.isEmpty(); } @@ -111,6 +114,10 @@ public class UnidirectionalReferentialSynchronizeRequest<R extends ReferentialDt return this; } + public String getReferentialName() { + return referentialName; + } + public UnidirectionalReferentialSynchronizeRequest<R> build() { return new UnidirectionalReferentialSynchronizeRequest<>( diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalSynchronizeReferentialTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalSynchronizeReferentialTest.java index 8ce1b83..a293ebe 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalSynchronizeReferentialTest.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalSynchronizeReferentialTest.java @@ -5,7 +5,6 @@ import fr.ird.observe.ObserveEntityEnum; import fr.ird.observe.entities.Entities; import fr.ird.observe.services.ApplicationContextResource; import fr.ird.observe.services.DataSourceResource; -import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.service.AbstractServiceTopiaTest; import fr.ird.observe.test.DatabaseName; import fr.ird.observe.test.ObserveFixtures; @@ -21,7 +20,6 @@ import org.junit.Rule; import org.junit.Test; import java.util.Collection; -import java.util.Map; import java.util.Set; /** @@ -53,18 +51,8 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop @Test public void testSynchronizeFromEmptyDatabase() { - UnidirectionalReferentialSynchronizeEngine.Callback callback = new UnidirectionalReferentialSynchronizeEngine.Callback() { - - @Override - public Map<String, String> askUserToReplaceRemovedReferentials(UnidirectionalReferentialSynchronizeEngine.CallbackRequest request) { - throw new IllegalStateException(); - } - - @Override - public Map<String, String> askUserToReplaceDisabledReferentials(UnidirectionalReferentialSynchronizeEngine.CallbackRequest request) { - throw new IllegalStateException(); - } - + UnidirectionalReferentialSynchronizeCallback callback = request -> { + throw new IllegalStateException(); }; UnidirectionalReferentialSynchronizeEngine referentialSynchronizeEngine = new UnidirectionalReferentialSynchronizeEngine(localService, remoteService, callback); UnidirectionalReferentialSynchronizeResult result = referentialSynchronizeEngine.call(); @@ -95,18 +83,8 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop @Test public void testSynchronizeWithNochange() { - UnidirectionalReferentialSynchronizeEngine.Callback callback = new UnidirectionalReferentialSynchronizeEngine.Callback() { - - @Override - public Map<String, String> askUserToReplaceRemovedReferentials(UnidirectionalReferentialSynchronizeEngine.CallbackRequest request) { - throw new IllegalStateException(); - } - - @Override - public Map<String, String> askUserToReplaceDisabledReferentials(UnidirectionalReferentialSynchronizeEngine.CallbackRequest request) { - throw new IllegalStateException(); - } - + UnidirectionalReferentialSynchronizeCallback callback = request -> { + throw new IllegalStateException(); }; UnidirectionalReferentialSynchronizeEngine referentialSynchronizeEngine = new UnidirectionalReferentialSynchronizeEngine(localService, remoteService, callback); UnidirectionalReferentialSynchronizeResult result = referentialSynchronizeEngine.call(); @@ -135,27 +113,11 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop @Test public void testSynchronizeWithAllChanges() { - UnidirectionalReferentialSynchronizeEngine.Callback callback = new UnidirectionalReferentialSynchronizeEngine.Callback() { + UnidirectionalReferentialSynchronizeCallback callback = request -> { - @Override - public <R extends ReferentialDto> Map<String, String> askUserToReplaceRemovedReferentials(UnidirectionalReferentialSynchronizeEngine.CallbackRequest<R> request) { - String referentialName = request.getReferentialName(); - switch (referentialName) { - case "Person": - return ImmutableMap.<String, String>builder().put("fr.ird.observe.entities.referentiel.Person#1355399844272#0.32586441962131485", "fr.ird.observe.entities.referentiel.Person#1429515754659#0.322074382333085").build(); - } - throw new IllegalStateException(); - } - - @Override - public <R extends ReferentialDto> Map<String, String> askUserToReplaceDisabledReferentials(UnidirectionalReferentialSynchronizeEngine.CallbackRequest<R> request) { - String referentialName = request.getReferentialName(); - switch (referentialName) { - case "Vessel": - return ImmutableMap.<String, String>builder().put("fr.ird.observe.entities.referentiel.Vessel#1306847717532#0.7435948873477364", "fr.ird.observe.entities.referentiel.Vessel#1429515781110#0.833177504362538").build(); - } - throw new IllegalStateException(); - } + UnidirectionalReferentialSynchronizeCallbackResults results = new UnidirectionalReferentialSynchronizeCallbackResults(); + results.addCallbackResult(ObserveEntityEnum.Person.name(), ImmutableMap.<String, String>builder().put("fr.ird.observe.entities.referentiel.Person#1355399844272#0.32586441962131485", "fr.ird.observe.entities.referentiel.Person#1429515754659#0.322074382333085").build()); + return results; }; @@ -201,7 +163,7 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop Collection<Pair<String, String>> referentialReplaced = result.getReferentialReplaced(ObserveEntityEnum.Person.name()); Assert.assertFalse(referentialReplaced.isEmpty()); Assert.assertEquals(1, referentialReplaced.size()); - Assert.assertTrue(referentialReplaced.contains(Pair.of("fr.ird.observe.entities.referentiel.Person#1355399844272#0.32586441962131485","fr.ird.observe.entities.referentiel.Person#1429515754659#0.322074382333085"))); + Assert.assertTrue(referentialReplaced.contains(Pair.of("fr.ird.observe.entities.referentiel.Person#1355399844272#0.32586441962131485", "fr.ird.observe.entities.referentiel.Person#1429515754659#0.322074382333085"))); } { Assert.assertTrue(referentialNames.contains(ObserveEntityEnum.Vessel.name())); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.