branch feature/7739 updated (d0e513e -> 0ba6c8b)
This is an automated email from the git hooks/post-receive script. New change to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git discards d0e513e On n gère pas lors de la synchronisation de la désactivation d'un référentiel (See #7739) discards 574764d Test de syncrhonisation mise en place + correction nom de base de test discards 9b69ce7 Introduction d'un objet de résultat de la synchronisation + rendre le moteur de synchronisation Callable (See #7739) discards 84382d6 Correction des bases de test discards e02c759 Test du moteur de synchronisation discards 7e3478a Quelques corrections suite au test du moteur de synchronisation (See #7739) discards 4ea4007 start a test for unidirectional referential synchronization (see #7739) discards f92e02b Do not treat LastUpdateDate entity as an referential one discards 38120a9 Do not treat LastUpdateDate entity as an referential one + add code for replacement sql discards 22443b9 In sql generator we must to keep same order of parameters values + use default primitive values discards 6d8430e Make service inheritates ObserveService discards f15e480 Make possible to use multiple database in tests discards 08c1cd6 Make repeatable test spi annotations discards 4ad8851 Meilleur nommage dans le méta-modèle + correction de l'algorithme de remplacement discards 223dc6e Meilleur nommage dans le méta-modèle discards 3c43b2a Ajout du générateur de reqètes sql de remplacement (See #7739) discards d257593 Ajout du contrat Iterable sur le méta-modèle discards 394b8fc Mise en place de la génération des requètes sql et de leur application (See #7739) discards b65e1ad Introduction des générateurs de requètes sql (RAF celui de remplacement) (See #7739) discards 7b9b5c2 Ajout du nom des tables pour les associations many-to-many discards 79f8009 Introduction du moteur de synchronisation (reste plus qu'à générer le code sql à partir de la requète produite (See #7739) discards 8336832 Mettre à plat la notion d'héritage pour tout avoir de disponible dans le méta-modèle allégé discards f40b800 Ajout des informations sur les propriétés simples dans le méta-modèle simplifié + les informations sur les noms en base discards d4ecdfc Ajout de la configuration pour le plugin processor discards 83695e3 Introduction des deux services à utiliser pour effectuer la synchronisation unidirectionnelle de référentiel (See #7739) adds cc4dbf4 Documente la configuration de l'application web adds 099d492 Corrige les blocs de citations de la documentation sur la configuration de l'appli web et ajoute une entrée dans la page d'index adds 607ae50 Use last version of codelutinpom + fix nexus urls adds 31af17e Updates some libraries (See #7803) adds 2052103 Use nuiton-maven-report-plugin 3.0.1 new 08ac53e Introduction des deux services à utiliser pour effectuer la synchronisation unidirectionnelle de référentiel (See #7739) new 703305b Ajout de la configuration pour le plugin processor new e7b3087 Ajout des informations sur les propriétés simples dans le méta-modèle simplifié + les informations sur les noms en base new e294831 Mettre à plat la notion d'héritage pour tout avoir de disponible dans le méta-modèle allégé new f894928 Introduction du moteur de synchronisation (reste plus qu'à générer le code sql à partir de la requète produite (See #7739) new acbf463 Ajout du nom des tables pour les associations many-to-many new 7083ee6 Introduction des générateurs de requètes sql (RAF celui de remplacement) (See #7739) new 472c898 Mise en place de la génération des requètes sql et de leur application (See #7739) new 9a4c7aa Ajout du contrat Iterable sur le méta-modèle new e5f6f5f Ajout du générateur de reqètes sql de remplacement (See #7739) new 87ce557 Meilleur nommage dans le méta-modèle new df3e909 Meilleur nommage dans le méta-modèle + correction de l'algorithme de remplacement new fddd5a0 Make repeatable test spi annotations new 3802269 Make possible to use multiple database in tests new 6c6da46 Make service inheritates ObserveService new 3c8af4b In sql generator we must to keep same order of parameters values + use default primitive values new f9f092e Do not treat LastUpdateDate entity as an referential one + add code for replacement sql new 22900a8 Do not treat LastUpdateDate entity as an referential one new b1444eb start a test for unidirectional referential synchronization (see #7739) new 6f0d6a0 Quelques corrections suite au test du moteur de synchronisation (See #7739) new decdb30 Test du moteur de synchronisation new 6107eeb Correction des bases de test new 1ab676f Introduction d'un objet de résultat de la synchronisation + rendre le moteur de synchronisation Callable (See #7739) new 07f81e0 Test de syncrhonisation mise en place + correction nom de base de test new 68aa5c7 On n gère pas lors de la synchronisation de la désactivation d'un référentiel (See #7739) new 0ba6c8b Revue du moteur de synchronisation pour n'effectuer qu'un seule appel au call back utilisateur (See #7739) This update added new revisions after undoing existing revisions. That is to say, some revisions that were in the old version of the branch are not in the new version. This situation occurs when a user --force pushes a change and generates a repository containing something like this: * -- * -- B -- O -- O -- O (d0e513e) \ N -- N -- N refs/heads/feature/7739 (0ba6c8b) You should already have received notification emails for all of the O revisions, and so the following emails describe only the N revisions from the common base, B. Any revisions marked "omits" are not gone; other references still refer to them. Any revisions marked "discards" are gone forever. The 26 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: 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) commit 68aa5c73a10e52deb700f760f487381c19a8d508 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jul 5 17:39:02 2016 +0200 On n gère pas lors de la synchronisation de la désactivation d'un référentiel (See #7739) commit 07f81e08f92b57457f539866370d255c1380c656 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jul 5 16:15:24 2016 +0200 Test de syncrhonisation mise en place + correction nom de base de test commit 1ab676f3d7736e84cfeca55934dfe4d3c06507d3 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jul 5 16:14:44 2016 +0200 Introduction d'un objet de résultat de la synchronisation + rendre le moteur de synchronisation Callable (See #7739) commit 6107eeb28b9dd0988481a6655bec253e8392e2e6 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jul 5 13:00:11 2016 +0200 Correction des bases de test commit decdb305f09c6075aaac1cfdeb1c79bf1186ba15 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jul 5 12:46:04 2016 +0200 Test du moteur de synchronisation commit 6f0d6a0f332dd091c2d0dc6ec60ec7c287322aa4 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jul 5 12:45:49 2016 +0200 Quelques corrections suite au test du moteur de synchronisation (See #7739) commit b1444eb81f7d6b48aca442e7a1d8d12f21de5669 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 18:04:09 2016 +0200 start a test for unidirectional referential synchronization (see #7739) commit 22900a8fdd0e7391fd701baaf1b3b287dca2ecd0 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 17:52:27 2016 +0200 Do not treat LastUpdateDate entity as an referential one commit f9f092e34049e8a28386792a1afabb15cd120f3e Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 17:52:19 2016 +0200 Do not treat LastUpdateDate entity as an referential one + add code for replacement sql commit 3c8af4b9318c55dbe45efad3a4718a6fc542c3f3 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 17:51:00 2016 +0200 In sql generator we must to keep same order of parameters values + use default primitive values commit 6c6da4693c7939605e9b0444848fc2d730309191 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 17:50:16 2016 +0200 Make service inheritates ObserveService commit 38022697f1e54f797b5c5767331c0e3a0902125d Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 17:49:04 2016 +0200 Make possible to use multiple database in tests commit fddd5a0775a1339db58dee03982f3035bfbb75df Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 17:48:35 2016 +0200 Make repeatable test spi annotations commit df3e90931dae509f5b2639a175f0a1cac27973d2 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 12:14:47 2016 +0200 Meilleur nommage dans le méta-modèle + correction de l'algorithme de remplacement commit 87ce55786b4dc97d6adf45b171125eca687bac73 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 12:12:50 2016 +0200 Meilleur nommage dans le méta-modèle commit e5f6f5f1138baf05dfa88a71f31153e427eb9ea6 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 11:20:50 2016 +0200 Ajout du générateur de reqètes sql de remplacement (See #7739) commit 9a4c7aa6130535a1ea860b52721b5fda40db7d0c Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 11:20:22 2016 +0200 Ajout du contrat Iterable sur le méta-modèle commit 472c89862574799bede31d4a61d39c6168873aa8 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Jun 29 12:39:49 2016 +0200 Mise en place de la génération des requètes sql et de leur application (See #7739) commit 7083ee69efa7cd597c309c4acca622ef327445a7 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Jun 29 12:37:35 2016 +0200 Introduction des générateurs de requètes sql (RAF celui de remplacement) (See #7739) commit acbf463dfae4b2fa6aba567fbf36c80393af71e2 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Jun 29 11:58:49 2016 +0200 Ajout du nom des tables pour les associations many-to-many commit f89492829439b9a5a6d1e6d79ebaf1c8a2096f53 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jun 28 18:31:08 2016 +0200 Introduction du moteur de synchronisation (reste plus qu'à générer le code sql à partir de la requète produite (See #7739) commit e29483113f2a6fca5cbbead039996db280dbf451 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jun 28 18:29:32 2016 +0200 Mettre à plat la notion d'héritage pour tout avoir de disponible dans le méta-modèle allégé commit e7b308702550ef9f22f2f4df3d0b6485044dc344 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jun 28 12:28:08 2016 +0200 Ajout des informations sur les propriétés simples dans le méta-modèle simplifié + les informations sur les noms en base commit 703305bef1ac09a2bf7550fe090d903992c0e274 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jun 28 12:27:24 2016 +0200 Ajout de la configuration pour le plugin processor commit 08ac53efda9e3fad717ff53f4a1d984a8effee2f Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jun 28 10:47:44 2016 +0200 Introduction des deux services à utiliser pour effectuer la synchronisation unidirectionnelle de référentiel (See #7739) Summary of changes: .../src/license/THIRD-PARTY.properties | 63 +++++------ ...idirectionalReferentialSynchronizeCallback.java | 17 +++ ...ionalReferentialSynchronizeCallbackRequest.java | 43 ++++++++ ...onalReferentialSynchronizeCallbackRequests.java | 42 ++++++++ ...tionalReferentialSynchronizeCallbackResult.java | 33 ++++++ ...ionalReferentialSynchronizeCallbackResults.java | 36 +++++++ ...UnidirectionalReferentialSynchronizeEngine.java | 115 ++++++++++----------- ...nidirectionalReferentialSynchronizeRequest.java | 7 ++ .../UnidirectionalSynchronizeReferentialTest.java | 56 ++-------- pom.xml | 42 +++----- src/site/rst/administration-web.rst.vm | 87 ++++++++++++++++ src/site/rst/index.rst | 1 + src/site/site_fr.xml | 1 + 13 files changed, 379 insertions(+), 164 deletions(-) create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallback.java create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackRequest.java create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackRequests.java create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackResult.java create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeCallbackResults.java create mode 100644 src/site/rst/administration-web.rst.vm -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 38022697f1e54f797b5c5767331c0e3a0902125d Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 17:49:04 2016 +0200 Make possible to use multiple database in tests --- .../services/ApplicationContextResource.java | 68 ++++++++++++++++++++-- .../ird/observe/services/DataSourceResource.java | 50 ++++++++++++++-- .../main/java/fr/ird/observe/test/TestHelper.java | 11 ---- 3 files changed, 108 insertions(+), 21 deletions(-) diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java b/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java index 7732a72..cdd3833 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java @@ -37,6 +37,8 @@ import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; import fr.ird.observe.test.ObserveFixtures; import fr.ird.observe.test.TestHelper; +import fr.ird.observe.test.spi.CopyDatabaseConfiguration; +import fr.ird.observe.test.spi.DatabaseClassifier; import fr.ird.observe.test.spi.DatabaseNameConfiguration; import fr.ird.observe.test.spi.DatabaseVersionConfiguration; import org.apache.commons.logging.Log; @@ -51,6 +53,7 @@ import org.nuiton.version.Versions; import java.io.File; import java.io.IOException; +import java.lang.annotation.Annotation; import java.nio.file.Files; import java.nio.file.Path; import java.util.Locale; @@ -77,7 +80,10 @@ public class ApplicationContextResource implements TestRule { protected String dbVersion; - public ApplicationContextResource() { + protected final DatabaseClassifier classifier; + + public ApplicationContextResource(DatabaseClassifier classifier) { + this.classifier = classifier; this.speciesListConfiguration = ObserveSpeciesListConfiguration.newDefaultConfiguration(); this.serviceFactory = new ObserveServiceFactoryTopia() { @@ -90,7 +96,10 @@ public class ApplicationContextResource implements TestRule { serviceFactory.setMainServiceFactory(serviceFactory); dataSourcesForTestManager = new DataSourcesForTestManager(); + } + public ApplicationContextResource() { + this(DatabaseClassifier.DEFAULT); } public ObserveDataSourceConfigurationTopiaH2 createDataSource(Version dbVersion, String dbName, File targetPath) throws DataSourceCreateWithNoReferentialImportException, IOException, IncompatibleDataSourceCreateConfigurationException, DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException, BabModelVersionException { @@ -202,12 +211,12 @@ public class ApplicationContextResource implements TestRule { TestHelper.initTest(testClass); - DatabaseNameConfiguration databaseNameConfiguration = TestHelper.getAnnotation(testClass, DatabaseNameConfiguration.class); + DatabaseNameConfiguration databaseNameConfiguration = getDatabaseNameConfigurationAnnotation(testClass, classifier); if (databaseNameConfiguration != null) { dbName = databaseNameConfiguration.value().name(); } - DatabaseVersionConfiguration databaseVersionConfiguration = TestHelper.getAnnotation(testClass, DatabaseVersionConfiguration.class); + DatabaseVersionConfiguration databaseVersionConfiguration = getDatabaseVersionConfigurationAnnotation(testClass, classifier); if (databaseVersionConfiguration != null) { dbVersion = databaseVersionConfiguration.value(); } @@ -260,7 +269,11 @@ public class ApplicationContextResource implements TestRule { } public File createTemporaryFile(String suffix) { - return temporaryDirectoryRoot.resolve(System.nanoTime()+suffix).toFile(); + return temporaryDirectoryRoot.resolve(System.nanoTime() + suffix).toFile(); + } + + public DatabaseClassifier getClassifier() { + return classifier; } /** @@ -322,4 +335,51 @@ public class ApplicationContextResource implements TestRule { } + private DatabaseNameConfiguration getDatabaseNameConfigurationAnnotation(Class<?> testClass, DatabaseClassifier classifier) { + + DatabaseNameConfiguration[] annotations = getAnnotations(testClass, DatabaseNameConfiguration.class); + + for (DatabaseNameConfiguration annotation : annotations) { + if (classifier.equals(annotation.classifier())) { + return annotation; + } + } + return null; + } + + private DatabaseVersionConfiguration getDatabaseVersionConfigurationAnnotation(Class<?> testClass, DatabaseClassifier classifier) { + + DatabaseVersionConfiguration[] annotations = getAnnotations(testClass, DatabaseVersionConfiguration.class); + + for (DatabaseVersionConfiguration annotation : annotations) { + if (classifier.equals(annotation.classifier())) { + return annotation; + } + } + return null; + } + + private CopyDatabaseConfiguration getCopyDatabaseConfigurationAnnotation(Class<?> testClass, DatabaseClassifier classifier) { + + CopyDatabaseConfiguration[] annotations = getAnnotations(testClass, CopyDatabaseConfiguration.class); + + for (CopyDatabaseConfiguration annotation : annotations) { + if (classifier.equals(annotation.classifier())) { + return annotation; + } + } + return null; + } + + private <E extends Annotation> E[] getAnnotations(Class<?> clazz, Class<E> annotationType) { + + E[] annotations = clazz.getAnnotationsByType(annotationType); + + if (annotations.length == 0 && clazz.getSuperclass() != null) { + annotations = getAnnotations(clazz.getSuperclass(), annotationType); + } + return annotations; + } + + } diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/DataSourceResource.java b/observe-services-topia/src/test/java/fr/ird/observe/services/DataSourceResource.java index 32ec9f1..d6302e1 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/DataSourceResource.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/DataSourceResource.java @@ -39,6 +39,7 @@ import fr.ird.observe.services.service.DatabaseNotFoundException; import fr.ird.observe.services.service.ObserveReferentialCache; import fr.ird.observe.test.TestHelper; import fr.ird.observe.test.spi.CopyDatabaseConfiguration; +import fr.ird.observe.test.spi.DatabaseClassifier; import fr.ird.observe.test.spi.DatabaseNameConfiguration; import fr.ird.observe.test.spi.DatabaseVersionConfiguration; import org.apache.commons.logging.Log; @@ -249,7 +250,7 @@ public class DataSourceResource implements TestRule { String dbVersionStr; - DatabaseNameConfiguration databaseNameConfiguration = testClassMethod.getAnnotation(DatabaseNameConfiguration.class); + DatabaseNameConfiguration databaseNameConfiguration = getDatabaseNameConfigurationAnnotation(testClassMethod, applicationContextResource.getClassifier()); if (databaseNameConfiguration != null) { dbName = databaseNameConfiguration.value().name(); } else { @@ -257,7 +258,7 @@ public class DataSourceResource implements TestRule { } Preconditions.checkState(!Strings.isNullOrEmpty(dbName), "Pas de nom de base spécifié"); - DatabaseVersionConfiguration databaseVersionConfiguration = testClassMethod.getAnnotation(DatabaseVersionConfiguration.class); + DatabaseVersionConfiguration databaseVersionConfiguration = getDatabaseVersionConfigurationAnnotation(testClassMethod, applicationContextResource.getClassifier()); if (databaseVersionConfiguration != null) { dbVersionStr = databaseVersionConfiguration.value(); } else { @@ -266,14 +267,14 @@ public class DataSourceResource implements TestRule { Preconditions.checkState(!Strings.isNullOrEmpty(dbVersionStr), "Pas de version de base spécifié"); dbVersion = Versions.valueOf(dbVersionStr); - CopyDatabaseConfiguration copyDatabaseConfiguration = testClassMethod.getAnnotation(CopyDatabaseConfiguration.class); + CopyDatabaseConfiguration copyDatabaseConfiguration = getCopyDatabaseConfigurationAnnotation(testClassMethod, applicationContextResource.getClassifier()); useSharedDatabase = copyDatabaseConfiguration == null; if (log.isDebugEnabled()) { log.debug("Starts " + testClass.getName() + "::" + methodName); } - testDirectory = TestHelper.newFile(methodName); + testDirectory = TestHelper.newFile(methodName + "-" + applicationContextResource.getClassifier()); Path temporaryDirectoryRoot = new File(testDirectory, "tmp").toPath(); @@ -282,8 +283,8 @@ public class DataSourceResource implements TestRule { applicationContextResource.setTemporaryDirectoryRoot(temporaryDirectoryRoot); File databasePath = useSharedDatabase - ? null - : getTestDirectory().toPath().resolve("localDb").toFile(); + ? null + : getTestDirectory().toPath().resolve("localDb").toFile(); dataSourceConfiguration = applicationContextResource.createDataSource(dbVersion, this.dbName, databasePath); @@ -306,4 +307,41 @@ public class DataSourceResource implements TestRule { applicationContextResource.setTemporaryDirectoryRoot(null); } + + private DatabaseNameConfiguration getDatabaseNameConfigurationAnnotation(Method testClassMethod, DatabaseClassifier classifier) { + + DatabaseNameConfiguration[] annotations = testClassMethod.getAnnotationsByType(DatabaseNameConfiguration.class); + + for (DatabaseNameConfiguration annotation : annotations) { + if (classifier.equals(annotation.classifier())) { + return annotation; + } + } + return null; + } + + private DatabaseVersionConfiguration getDatabaseVersionConfigurationAnnotation(Method testClassMethod, DatabaseClassifier classifier) { + + DatabaseVersionConfiguration[] annotations = testClassMethod.getAnnotationsByType(DatabaseVersionConfiguration.class); + + for (DatabaseVersionConfiguration annotation : annotations) { + if (classifier.equals(annotation.classifier())) { + return annotation; + } + } + return null; + } + + private CopyDatabaseConfiguration getCopyDatabaseConfigurationAnnotation(Method testClassMethod, DatabaseClassifier classifier) { + + CopyDatabaseConfiguration[] annotations = testClassMethod.getAnnotationsByType(CopyDatabaseConfiguration.class); + + for (CopyDatabaseConfiguration annotation : annotations) { + if (classifier.equals(annotation.classifier())) { + return annotation; + } + } + return null; + } + } diff --git a/observe-test-data/src/main/java/fr/ird/observe/test/TestHelper.java b/observe-test-data/src/main/java/fr/ird/observe/test/TestHelper.java index e5fd474..867a896 100644 --- a/observe-test-data/src/main/java/fr/ird/observe/test/TestHelper.java +++ b/observe-test-data/src/main/java/fr/ird/observe/test/TestHelper.java @@ -37,7 +37,6 @@ import org.nuiton.version.Versions; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.lang.annotation.Annotation; import java.lang.reflect.Modifier; import java.net.URL; import java.util.List; @@ -187,14 +186,4 @@ public abstract class TestHelper { } } - - public static <E extends Annotation> E getAnnotation(Class<?> clazz, Class<E> annotationType) { - - E dataSourceTestConfiguration = clazz.getAnnotation(annotationType); - - if (dataSourceTestConfiguration == null && clazz.getSuperclass() != null) { - dataSourceTestConfiguration = getAnnotation(clazz.getSuperclass(), annotationType); - } - return dataSourceTestConfiguration; - } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 6c6da4693c7939605e9b0444848fc2d730309191 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 17:50:16 2016 +0200 Make service inheritates ObserveService --- .../synchro/UnidirectionalReferentialSynchronizeLocalService.java | 3 ++- .../synchro/UnidirectionalReferentialSynchronizeRemoteService.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java index 0c2caa2..7a08962 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java @@ -1,5 +1,6 @@ package fr.ird.observe.services.service.actions.synchro; +import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.spi.NoDataAccess; import fr.ird.observe.services.spi.PostRequest; @@ -18,7 +19,7 @@ import java.util.Set; * @author Tony Chemit - chemit@codelutin.com * @since 5.0 */ -public interface UnidirectionalReferentialSynchronizeLocalService { +public interface UnidirectionalReferentialSynchronizeLocalService extends ObserveService { /** * Récupération sur la source à synchroniser des versions de ses référentiels. diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteService.java index 44d15a1..2168fad 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteService.java @@ -1,5 +1,6 @@ package fr.ird.observe.services.service.actions.synchro; +import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.dto.referential.ReferentialReferenceSet; import fr.ird.observe.services.spi.ReadReferentialPermission; @@ -12,7 +13,7 @@ import fr.ird.observe.services.spi.ReadReferentialPermission; * @author Tony Chemit - chemit@codelutin.com * @since 5.0 */ -public interface UnidirectionalReferentialSynchronizeRemoteService { +public interface UnidirectionalReferentialSynchronizeRemoteService extends ObserveService { /** * Récupération sur la source centrale du différentiel des référentiel. -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 3c8af4b9318c55dbe45efad3a4718a6fc542c3f3 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 17:51:00 2016 +0200 In sql generator we must to keep same order of parameters values + use default primitive values --- .../synchro/InsertSqlStatementGenerator.java | 34 +++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/InsertSqlStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/InsertSqlStatementGenerator.java index 312def0..9dcd36c 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/InsertSqlStatementGenerator.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/InsertSqlStatementGenerator.java @@ -13,6 +13,8 @@ import org.nuiton.util.beans.BinderFactory; import java.util.Collection; import java.util.Date; import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Set; @@ -71,7 +73,7 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> { Set<String> propertyNamesSet = metadataEntity.getProperties().keySet(); this.simplePropertyNames = propertyNamesSet.toArray(new String[propertyNamesSet.size()]); Set<String> manyToOneAssociationNamesSet = metadataEntity.getManyToOneAssociations().keySet(); - this.manyToOneAssociationNames = propertyNamesSet.toArray(new String[manyToOneAssociationNamesSet.size()]); + this.manyToOneAssociationNames = manyToOneAssociationNamesSet.toArray(new String[manyToOneAssociationNamesSet.size()]); Map<String, String> manyToManyAssociationsMap = metadataEntity.getManyToManyAssociations(); this.manyToManyAssociations = new LinkedHashSet<>(); @@ -88,15 +90,15 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> { public String generateSql(R referentialDto) { - Set<String> parameters = new LinkedHashSet<>(); + List<String> parameters = new LinkedList<>(); addStringParameter(referentialDto.getId(), parameters); addOtherTypeParameter(referentialDto.getVersion(), parameters); addDateParameter(referentialDto.getCreateDate(), parameters); - Map<String, Object> simpleParameters = binder.obtainProperties(referentialDto, true, simplePropertyNames); - for (Object parameterValue : simpleParameters.values()) { - + Map<String, Object> simpleParameters = binder.obtainProperties(referentialDto, true, true, simplePropertyNames); + for (String simplePropertyName : simplePropertyNames) { + Object parameterValue = simpleParameters.get(simplePropertyName); if (parameterValue == null) { addNullParameter(parameters); continue; @@ -114,12 +116,11 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> { continue; } addOtherTypeParameter(parameterValue, parameters); - } - Map<String, Object> compositionParameters = binder.obtainProperties(referentialDto, true, manyToOneAssociationNames); - for (Object parameterValue : compositionParameters.values()) { - + Map<String, Object> manyToOneParameters = binder.obtainProperties(referentialDto, true, true, manyToOneAssociationNames); + for (String manyToOneAssociationName : manyToOneAssociationNames) { + Object parameterValue = manyToOneParameters.get(manyToOneAssociationName); if (parameterValue == null) { addNullParameter(parameters); continue; @@ -131,7 +132,6 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> { if (parameterValue instanceof ReferentialReference) { addReferentialReferenceParameter((ReferentialReference) parameterValue, parameters); } - } String result = String.format(INSERT_STATEMENT, @@ -201,31 +201,31 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> { return columnNames; } - private void addNullParameter(Set<String> parameters) { + private void addNullParameter(List<String> parameters) { parameters.add("NULL"); } - private void addStringParameter(String parameter, Set<String> parameters) { + private void addStringParameter(String parameter, List<String> parameters) { parameters.add("'" + parameter.replaceAll("'", "''") + "'"); } - private void addDateParameter(Date parameter, Set<String> parameters) { + private void addDateParameter(Date parameter, List<String> parameters) { parameters.add("'" + parameter + "'"); } - private void addEnumParameter(Enum parameter, Set<String> parameters) { + private void addEnumParameter(Enum parameter, List<String> parameters) { parameters.add("" + parameter.ordinal()); } - private void addOtherTypeParameter(Object parameter, Set<String> parameters) { + private void addOtherTypeParameter(Object parameter, List<String> parameters) { parameters.add("" + parameter); } - private void addReferentialReferenceParameter(ReferentialReference parameter, Set<String> parameters) { + private void addReferentialReferenceParameter(ReferentialReference parameter, List<String> parameters) { addStringParameter(parameter.getId(), parameters); } - private void addReferentialDtoParameter(ReferentialDto parameter, Set<String> parameters) { + private void addReferentialDtoParameter(ReferentialDto parameter, List<String> parameters) { addStringParameter(parameter.getId(), parameters); } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit f9f092e34049e8a28386792a1afabb15cd120f3e Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 17:52:19 2016 +0200 Do not treat LastUpdateDate entity as an referential one + add code for replacement sql --- ...idirectionalReferentialSynchronizeLocalServiceTopia.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java index 79ab42f..7d8a7dc 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java @@ -11,6 +11,7 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaDao; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; +import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; import org.nuiton.topia.persistence.support.TopiaSqlWork; import java.sql.Connection; @@ -42,6 +43,9 @@ public class UnidirectionalReferentialSynchronizeLocalServiceTopia extends Obser LocalReferentialStates localReferentialStates = new LocalReferentialStates(); for (ObserveEntityEnum referenceEntity : Entities.REFERENCE_ENTITIES) { + if (ObserveEntityEnum.LastUpdateDate.equals(referenceEntity)) { + continue; + } Class entityType = referenceEntity.getContract(); getLocalSourceReferentialVersions0(referenceEntity.name(), entityType, localReferentialStates); } @@ -84,7 +88,8 @@ public class UnidirectionalReferentialSynchronizeLocalServiceTopia extends Obser Class entityType = entityEnum.getContract(); Class<R> dtoType = BinderEngine.get().getReferentialDtoType(entityType); - TopiaMetadataEntity metadataEntity = serviceContext.getTopiaApplicationContext().getMetadataModel().getEntity(referentialName); + TopiaMetadataModel metadataModel = serviceContext.getTopiaApplicationContext().getMetadataModel(); + TopiaMetadataEntity metadataEntity = metadataModel.getEntity(referentialName); if (request.withReferentialToAdd()) { InsertSqlStatementGenerator<R> sqlStatementGenerator = new InsertSqlStatementGenerator<>(metadataEntity, dtoType); @@ -106,7 +111,11 @@ public class UnidirectionalReferentialSynchronizeLocalServiceTopia extends Obser if (request.withReferentialToReplace()) { - //TODO + ReplaceSqlStatementGenerator sqlStatementGenerator = new ReplaceSqlStatementGenerator(metadataModel, referentialName); + for (Map.Entry<String, String> entry : request.getReferentialToReplace().entrySet()) { + String sql = sqlStatementGenerator.generateSql(entry.getKey(), entry.getValue()); + result.add(sql); + } } if (request.withReferentialToRemove()) { -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 22900a8fdd0e7391fd701baaf1b3b287dca2ecd0 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 17:52:27 2016 +0200 Do not treat LastUpdateDate entity as an referential one --- ...nidirectionalReferentialSynchronizeRemoteServiceTopia.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java index 9f65167..ce860fc 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java @@ -35,8 +35,15 @@ public class UnidirectionalReferentialSynchronizeRemoteServiceTopia extends Obse @Override public RemoteReferentialDiff getReferentialDifferential(LocalReferentialStates localReferentialStates) { + if (log.isTraceEnabled()) { + log.trace("getReferentialDifferential(" + localReferentialStates + ")"); + } + RemoteReferentialDiff result = new RemoteReferentialDiff(); for (ObserveEntityEnum referenceEntity : Entities.REFERENCE_ENTITIES) { + if (ObserveEntityEnum.LastUpdateDate.equals(referenceEntity)) { + continue; + } Class entityType = referenceEntity.getContract(); getReferentialDifferential0(referenceEntity.name(), entityType, localReferentialStates, result); } @@ -71,7 +78,7 @@ public class UnidirectionalReferentialSynchronizeRemoteServiceTopia extends Obse for (E centralReferentialEntity : dao) { String id = centralReferentialEntity.getTopiaId(); - Long localVersion = localReferentialVersions.get(id); + Long localVersion = localReferentialVersions == null ? null : localReferentialVersions.get(id); if (localVersion == null) { @@ -100,7 +107,7 @@ public class UnidirectionalReferentialSynchronizeRemoteServiceTopia extends Obse } // entités supprimées - Set<String> idsToDelete = new LinkedHashSet<>(localReferentialVersions.keySet()); + Set<String> idsToDelete = localReferentialVersions == null ? new LinkedHashSet<>() : new LinkedHashSet<>(localReferentialVersions.keySet()); List<String> centralIds = dao.findAllIds(); idsToDelete.removeAll(centralIds); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit b1444eb81f7d6b48aca442e7a1d8d12f21de5669 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jul 4 18:04:09 2016 +0200 start a test for unidirectional referential synchronization (see #7739) --- .../UnidirectionalSynchronizeReferentialTest.java | 84 ++++++++++++++++++++++ 1 file changed, 84 insertions(+) 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 new file mode 100644 index 0000000..b9b9e60 --- /dev/null +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalSynchronizeReferentialTest.java @@ -0,0 +1,84 @@ +package fr.ird.observe.services.service.actions.synchro; + +import fr.ird.observe.services.ApplicationContextResource; +import fr.ird.observe.services.DataSourceResource; +import fr.ird.observe.services.service.AbstractServiceTopiaTest; +import fr.ird.observe.test.DatabaseName; +import fr.ird.observe.test.ObserveFixtures; +import fr.ird.observe.test.spi.CopyDatabaseConfiguration; +import fr.ird.observe.test.spi.DatabaseClassifier; +import fr.ird.observe.test.spi.DatabaseNameConfiguration; +import fr.ird.observe.test.spi.DatabaseVersionConfiguration; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; + +import java.util.Map; + +/** + * Created on 04/07/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTopiaTest { + + @ClassRule + public static final ApplicationContextResource applicationContextResourceCentral = new ApplicationContextResource(DatabaseClassifier.CENTRAL); + + @Rule + public final DataSourceResource dataSourceResourceCentral = new DataSourceResource(applicationContextResourceCentral); + + private UnidirectionalReferentialSynchronizeEngine referentialSynchronizeEngine; + + @Before + public void setUp() throws Exception { + UnidirectionalReferentialSynchronizeLocalService localService = dataSourceResource.newService(UnidirectionalReferentialSynchronizeLocalService.class); + UnidirectionalReferentialSynchronizeRemoteService remoteService = dataSourceResourceCentral.newService(UnidirectionalReferentialSynchronizeRemoteService.class); + referentialSynchronizeEngine = new UnidirectionalReferentialSynchronizeEngine(localService, remoteService); + } + + @DatabaseNameConfiguration(DatabaseName.empty_h2) + @CopyDatabaseConfiguration + @DatabaseNameConfiguration(value = DatabaseName.dataForTestSeine, classifier = DatabaseClassifier.CENTRAL) + @DatabaseVersionConfiguration(value = ObserveFixtures.DEFAULT_VERSION, classifier = DatabaseClassifier.CENTRAL) + @Test + public void testSynchronizeFromEmptyDatabase() { + + referentialSynchronizeEngine.run(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(); + } + + }); + } + + @DatabaseNameConfiguration(DatabaseName.dataForTestSeine) + @CopyDatabaseConfiguration + @DatabaseNameConfiguration(value = DatabaseName.dataForTestSeine, classifier = DatabaseClassifier.CENTRAL) + @DatabaseVersionConfiguration(value = ObserveFixtures.DEFAULT_VERSION, classifier = DatabaseClassifier.CENTRAL) + @Test + public void testSynchronizeWithNochange() { + + referentialSynchronizeEngine.run(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(); + } + + }); + } +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 6f0d6a0f332dd091c2d0dc6ec60ec7c287322aa4 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jul 5 12:45:49 2016 +0200 Quelques corrections suite au test du moteur de synchronisation (See #7739) --- .../actions/synchro/RemoteReferentialDiff.java | 13 ++-- ...UnidirectionalReferentialSynchronizeEngine.java | 37 +++++---- ...ectionalReferentialSynchronizeLocalService.java | 19 ++++- .../synchro/ReplaceSqlStatementGenerator.java | 44 +++++------ ...nalReferentialSynchronizeLocalServiceTopia.java | 23 +++++- ...alReferentialSynchronizeRemoteServiceTopia.java | 6 +- .../synchro/UpdateSqlStatementGenerator.java | 89 ++++++++++++---------- 7 files changed, 133 insertions(+), 98 deletions(-) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/RemoteReferentialDiff.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/RemoteReferentialDiff.java index 83787d2..8900844 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/RemoteReferentialDiff.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/RemoteReferentialDiff.java @@ -7,6 +7,7 @@ import fr.ird.observe.services.dto.referential.ReferentialReference; import java.io.Serializable; import java.util.Collection; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; @@ -32,9 +33,9 @@ public class RemoteReferentialDiff implements Serializable { */ private final Multimap<String, ReferentialDto> referentialsToUpdate; /** - * Les références de référentiels à supprimer (indexé par nom de référentiel). + * Les identifiants de référentiels à supprimer (indexé par nom de référentiel). */ - private final Multimap<String, ReferentialReference> referentialsToRemove; + private final Multimap<String, String> referentialsToRemove; /** * Les références de référentiels à changer (ils sont devenus obsolètes) (indexé par nom de référentiel). */ @@ -63,8 +64,8 @@ public class RemoteReferentialDiff implements Serializable { return (Collection) referentialsToUpdate.get(referentialName); } - public <R extends ReferentialDto> Collection<ReferentialReference<R>> getReferentialsToRemove(String referentialName) { - return (Collection)referentialsToRemove.get(referentialName); + public Set<String> getReferentialsToRemove(String referentialName) { + return new HashSet<>(referentialsToRemove.get(referentialName)); } public <R extends ReferentialDto> Collection<ReferentialReference<R>> getReferentialsToFix(String referentialName) { @@ -85,9 +86,9 @@ public class RemoteReferentialDiff implements Serializable { referentialsToUpdate.put(referentialName, referentialDto); } - void addReferentialToDelete(String referentialName, ReferentialReference referentialReference) { + void addReferentialToDelete(String referentialName, String id) { referentialNames.add(referentialName); - referentialsToRemove.put(referentialName, referentialReference); + referentialsToRemove.put(referentialName, id); } void addReferentialToFix(String referentialName, ReferentialReference referentialReference) { 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 44f22f6..031241d 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 @@ -62,20 +62,16 @@ public class UnidirectionalReferentialSynchronizeEngine { referentialsToUpdate.forEach(builder::entityToUpdate); } - Collection<ReferentialReference<R>> referentialsToRemove = remoteReferentialDiff.getReferentialsToRemove(referentialName); - Collection<ReferentialReference<R>> blockingReferentialsToRemove = null; - if (CollectionUtils.isNotEmpty(referentialsToRemove)) { + Set<String> idsToRemove = remoteReferentialDiff.getReferentialsToRemove(referentialName); + Set<String> blockingIdsToRemove = null; - Set<String> idsToRemove = referentialsToRemove.stream() - .map(ReferentialReference::getId) - .collect(Collectors.toCollection(LinkedHashSet::new)); + if (CollectionUtils.isNotEmpty(idsToRemove)) { - Set<String> blockingIdsToRemove = localService.filterIdsUsedInLocalSource(referentialName, idsToRemove); + Set<String> blockingIdsToRemoveFromLocal = localService.filterIdsUsedInLocalSource(referentialName, idsToRemove); - - blockingReferentialsToRemove = referentialsToRemove + blockingIdsToRemove = idsToRemove .stream() - .filter(referentialReference -> blockingIdsToRemove.contains(referentialReference.getId())) + .filter(blockingIdsToRemoveFromLocal::contains) .collect(Collectors.toSet()); idsToRemove.removeAll(blockingIdsToRemove); @@ -94,16 +90,16 @@ public class UnidirectionalReferentialSynchronizeEngine { Set<String> blockingIdsToReplace = localService.filterIdsUsedInLocalSource(referentialName, idsToReplace); - blockingReferentialsToReplace = referentialsToRemove + blockingReferentialsToReplace = referentialsToReplace .stream() .filter(referentialReference -> blockingIdsToReplace.contains(referentialReference.getId())) .collect(Collectors.toSet()); } - boolean needCallbackForRemove = CollectionUtils.isNotEmpty(blockingReferentialsToRemove); - boolean needCallbackToReplace = CollectionUtils.isNotEmpty(blockingReferentialsToReplace); - boolean needCallback = needCallbackForRemove || needCallbackToReplace; + boolean needCallbackForRemove = CollectionUtils.isNotEmpty(blockingIdsToRemove); + boolean needCallbackForReplace = CollectionUtils.isNotEmpty(blockingReferentialsToReplace); + boolean needCallback = needCallbackForRemove || needCallbackForReplace; if (needCallback) { // calcul de l'univers de référentiels disponibles pour les remplacements @@ -113,8 +109,9 @@ public class UnidirectionalReferentialSynchronizeEngine { if (needCallbackForRemove) { - CallbackRequest callbackRequest = CallbackRequest.of(referentialName, blockingReferentialsToRemove, availableReferentials); - Map<String, String> referentialsToRemoveIds = callback.askUserToReplaceDisabledReferentials(callbackRequest); + 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()); @@ -122,9 +119,9 @@ public class UnidirectionalReferentialSynchronizeEngine { } - if (needCallbackToReplace) { + if (needCallbackForReplace) { - CallbackRequest callbackRequest = CallbackRequest.of(referentialName, referentialsToReplace, availableReferentials); + CallbackRequest<R> callbackRequest = CallbackRequest.of(referentialName, referentialsToReplace, availableReferentials); Map<String, String> referentialsToReplaceIds = callback.askUserToReplaceDisabledReferentials(callbackRequest); for (Map.Entry<String, String> entry : referentialsToReplaceIds.entrySet()) { builder.entityToReplace(entry.getKey(), entry.getValue()); @@ -141,9 +138,9 @@ public class UnidirectionalReferentialSynchronizeEngine { public interface Callback { - Map<String, String> askUserToReplaceRemovedReferentials(CallbackRequest request); + <R extends ReferentialDto> Map<String, String> askUserToReplaceRemovedReferentials(CallbackRequest<R> request); - Map<String, String> askUserToReplaceDisabledReferentials(CallbackRequest request); + <R extends ReferentialDto> Map<String, String> askUserToReplaceDisabledReferentials(CallbackRequest<R> request); } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java index 7a08962..bdc0026 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java @@ -2,13 +2,13 @@ package fr.ird.observe.services.service.actions.synchro; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; import fr.ird.observe.services.spi.NoDataAccess; import fr.ird.observe.services.spi.PostRequest; import fr.ird.observe.services.spi.ReadReferentialPermission; import fr.ird.observe.services.spi.Write; import fr.ird.observe.services.spi.WriteReferentialPermission; -import java.util.Collection; import java.util.Set; /** @@ -34,16 +34,29 @@ public interface UnidirectionalReferentialSynchronizeLocalService extends Observ * les identifiants sont passés en paramètres qui sont réellement utilisés dans la source locale. * * @param referentialName le nom du référentiel - * @param ids l'identifiant du référentiel dont on recherche le nombre d'utilisation + * @param ids les identifiants du référentiel dont on recherche le nombre d'utilisation * @return les identifiants des référentiels passés en paramètres qui sont réellement utilisés dans la source locale. */ @ReadReferentialPermission - Set<String> filterIdsUsedInLocalSource(String referentialName, Collection<String> ids); + Set<String> filterIdsUsedInLocalSource(String referentialName, Set<String> ids); + + /** + * Pour récupérer les références sur les référentiels d'un certain type à supprimer, + * cet ensemble servira à les afficher dans l'interface graphique pour effectuer le remplacement. + * + * @param ids les identifiants des référentiels à supprimer + * @param referentialName le nom du référentiel à récupérer + * @param <R> type des référentiels à récupérer + * @return l'ensemble des références de référentiel à supprimer. + */ + @ReadReferentialPermission + <R extends ReferentialDto> Set<ReferentialReference<R>> getLocalSourceReferentialToDelete(String referentialName, Set<String> ids); /** * Pour produire le code sql à partir de la demande pour un référentiel donné. * * @param request la demande des actions à produire pour un référentiel donné + * @param <R> type des référentiels à traiter * @return l'ensemble des requètes sql à appliquer. */ @NoDataAccess diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/ReplaceSqlStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/ReplaceSqlStatementGenerator.java index e0d6e9d..919959a 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/ReplaceSqlStatementGenerator.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/ReplaceSqlStatementGenerator.java @@ -21,7 +21,7 @@ public class ReplaceSqlStatementGenerator { /** Logger. */ private static final Log log = LogFactory.getLog(ReplaceSqlStatementGenerator.class); - private static final String MANY_TO_ONE_ASSOCIATION_UPDATE_STATEMENT = "UPDATE %s.%s SET %s = '%s', SET topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';\n"; + private static final String MANY_TO_ONE_ASSOCIATION_UPDATE_STATEMENT = "UPDATE %s.%s SET %s = '%s', topiaVersion = topiaVersion + 1 WHERE %s = '%s';\n"; private static final String MANY_TO_MANY_ASSOCIATION_UPDATE_STATEMENT = "UPDATE %s.%s SET %s = '%s' WHERE %s = '%s';\n"; /** @@ -58,33 +58,15 @@ public class ReplaceSqlStatementGenerator { for (ReplacementStruct replacementStruct : manyToOneAssociationReplacements) { - String sql = String.format(MANY_TO_ONE_ASSOCIATION_UPDATE_STATEMENT, - replacementStruct.schemaName, - replacementStruct.tableName, - replacementStruct.columnName, - replacementId, - sourceId); - if (log.isDebugEnabled()) { - log.debug("sql: " + sql); - } + String sql = generateSqlStatement(MANY_TO_ONE_ASSOCIATION_UPDATE_STATEMENT, sourceId, replacementId, replacementStruct); builder.append(sql); } for (ReplacementStruct replacementStruct : manyToManyAssociationReplacements) { - String sql = String.format(MANY_TO_MANY_ASSOCIATION_UPDATE_STATEMENT, - replacementStruct.schemaName, - replacementStruct.tableName, - replacementStruct.columnName, - replacementId, - replacementStruct.columnName, - sourceId); - if (log.isDebugEnabled()) { - log.debug("sql: " + sql); - } + String sql = generateSqlStatement(MANY_TO_MANY_ASSOCIATION_UPDATE_STATEMENT, sourceId, replacementId, replacementStruct); builder.append(sql); - } return builder.toString(); @@ -101,7 +83,7 @@ public class ReplaceSqlStatementGenerator { .filter(entry -> entry.getValue().equals(referentialName)) .map(entry -> new ReplacementStruct(metadataEntity.getDbSchemaName(), metadataEntity.getDbTableName(), - metadataEntity.getDbColumnName(entry.getValue()))) + metadataEntity.getDbColumnName(entry.getKey()))) .collect(Collectors.toList())); } @@ -120,7 +102,7 @@ public class ReplaceSqlStatementGenerator { .filter(entry -> entry.getValue().equals(referentialName)) .map(entry -> new ReplacementStruct(metadataEntity.getDbSchemaName(), metadataEntity.getBdManyToManyAssociationTableName(entry.getValue()), - metadataEntity.getDbColumnName(entry.getValue()))) + metadataEntity.getDbColumnName(entry.getKey()))) .collect(Collectors.toList())); } @@ -129,4 +111,20 @@ public class ReplaceSqlStatementGenerator { } + private String generateSqlStatement(String sqlPattern, String sourceId, String replacementId, ReplacementStruct replacementStruct) { + + String sql = String.format(sqlPattern, + replacementStruct.schemaName, + replacementStruct.tableName, + replacementStruct.columnName, + replacementId, + replacementStruct.columnName, + sourceId); + if (log.isDebugEnabled()) { + log.debug("sql: " + sql); + } + return sql; + + } + } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java index 7d8a7dc..36b8049 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java @@ -6,6 +6,7 @@ import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; import fr.ird.observe.services.ObserveServiceTopia; import fr.ird.observe.services.binder.BinderEngine; import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaDao; @@ -17,7 +18,7 @@ import org.nuiton.topia.persistence.support.TopiaSqlWork; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; -import java.util.Collection; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -54,7 +55,7 @@ public class UnidirectionalReferentialSynchronizeLocalServiceTopia extends Obser } @Override - public Set<String> filterIdsUsedInLocalSource(String referentialName, Collection<String> ids) { + public Set<String> filterIdsUsedInLocalSource(String referentialName, Set<String> ids) { if (log.isTraceEnabled()) { log.trace("filterIdsUsedInLocalSource(" + referentialName + ", " + ids + ")"); @@ -74,6 +75,15 @@ public class UnidirectionalReferentialSynchronizeLocalServiceTopia extends Obser } @Override + public <R extends ReferentialDto> Set<ReferentialReference<R>> getLocalSourceReferentialToDelete(String referentialName, Set<String> ids) { + + ObserveEntityEnum entityEnum = ObserveEntityEnum.valueOf(referentialName); + Class entityType = entityEnum.getContract(); + return getLocalSourceReferentialToDelete0(entityType, ids); + + } + + @Override public <R extends ReferentialDto> Set<String> generateSqlRequests(UnidirectionalReferentialSynchronizeRequest<R> request) { if (log.isTraceEnabled()) { @@ -111,7 +121,7 @@ public class UnidirectionalReferentialSynchronizeLocalServiceTopia extends Obser if (request.withReferentialToReplace()) { - ReplaceSqlStatementGenerator sqlStatementGenerator = new ReplaceSqlStatementGenerator(metadataModel, referentialName); + ReplaceSqlStatementGenerator sqlStatementGenerator = new ReplaceSqlStatementGenerator(metadataModel, referentialName); for (Map.Entry<String, String> entry : request.getReferentialToReplace().entrySet()) { String sql = sqlStatementGenerator.generateSql(entry.getKey(), entry.getValue()); result.add(sql); @@ -167,6 +177,13 @@ public class UnidirectionalReferentialSynchronizeLocalServiceTopia extends Obser } + private <E extends ObserveReferentialEntity> Set<E> getLocalSourceReferentialToDelete0(Class<E> entityType, Set<String> ids) { + + TopiaDao<E> dao = getTopiaPersistenceContext().getDao(entityType); + return new HashSet<>(dao.forTopiaIdIn(ids).findAll()); + + } + private static class ApplySqlRequestWork implements TopiaSqlWork { private static final int BATCH_SIZE = 100; diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java index ce860fc..fb2dcc6 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java @@ -113,9 +113,9 @@ public class UnidirectionalReferentialSynchronizeRemoteServiceTopia extends Obse idsToDelete.removeAll(centralIds); for (String id : idsToDelete) { - E e = dao.forTopiaIdEquals(id).findUnique(); - ReferentialReference<ReferentialDto> referentialReference = binderEngine.transformEntityToReferentialReferenceDto(referentialLocale, e); - result.addReferentialToDelete(entityName, referentialReference); + + // entité supprimée, il faudra que l'utilisateur la change + result.addReferentialToDelete(entityName, id); } } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UpdateSqlStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UpdateSqlStatementGenerator.java index 365e0f4..ff34ac9 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UpdateSqlStatementGenerator.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UpdateSqlStatementGenerator.java @@ -29,7 +29,7 @@ public class UpdateSqlStatementGenerator<R extends ReferentialDto> { /** Logger. */ private static final Log log = LogFactory.getLog(UpdateSqlStatementGenerator.class); - private static final String UPDATE_STATEMENT = "UPDATE %s.%s %s WHERE topiaId ='%s';\n"; + private static final String UPDATE_STATEMENT = "UPDATE %s.%s SET %s WHERE topiaId ='%s';\n"; private static final String MANY_TO_MANY_ASSOCIATION_DELETE_STATEMENT = "DELETE FROM %s.%s WHERE %s = '%s';\n"; private static final String MANY_TO_MANY_ASSOCIATION_INSERT_STATEMENT = "INSERT INTO %s.%s(%s, %s) VALUES ('%s', '%s');\n"; @@ -70,10 +70,12 @@ public class UpdateSqlStatementGenerator<R extends ReferentialDto> { public UpdateSqlStatementGenerator(TopiaMetadataEntity metadataEntity, Class<R> dtoType) { this.schemaName = metadataEntity.getDbSchemaName(); this.tableName = metadataEntity.getDbTableName(); + Set<String> simplePropertyNamesSet = metadataEntity.getProperties().keySet(); this.simplePropertyNames = simplePropertyNamesSet.toArray(new String[simplePropertyNamesSet.size()]); + Set<String> manyToOneAssociationNamesSet = metadataEntity.getManyToOneAssociations().keySet(); - this.manyToOneAssociationNames = simplePropertyNamesSet.toArray(new String[manyToOneAssociationNamesSet.size()]); + this.manyToOneAssociationNames = manyToOneAssociationNamesSet.toArray(new String[manyToOneAssociationNamesSet.size()]); Map<String, String> manyToManyAssociationsMap = metadataEntity.getManyToManyAssociations(); this.manyToManyAssociations = new LinkedHashSet<>(); @@ -92,54 +94,61 @@ public class UpdateSqlStatementGenerator<R extends ReferentialDto> { StringBuilder parameters = new StringBuilder(); - addStringParameter(TopiaEntity.PROPERTY_TOPIA_ID, referentialDto.getId(), parameters); addOtherTypeParameter(TopiaEntity.PROPERTY_TOPIA_VERSION, referentialDto.getVersion(), parameters); addDateParameter(TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, referentialDto.getCreateDate(), parameters); - Map<String, Object> simpleProperties = binder.obtainProperties(referentialDto, true, simplePropertyNames); - for (Map.Entry<String, Object> entry : simpleProperties.entrySet()) { + if (simplePropertyNames.length > 0) { - String simplePropertyName = entry.getKey(); - String columnName = columnNames.get(simplePropertyName); - Object simplePropertyValue = entry.getValue(); + Map<String, Object> simpleProperties = binder.obtainProperties(referentialDto, true, simplePropertyNames); + for (Map.Entry<String, Object> entry : simpleProperties.entrySet()) { + + String simplePropertyName = entry.getKey(); + String columnName = columnNames.get(simplePropertyName); + Object simplePropertyValue = entry.getValue(); + + if (simplePropertyValue == null) { + addNullParameter(columnName, parameters); + continue; + } + if (simplePropertyValue instanceof String) { + addStringParameter(columnName, (String) simplePropertyValue, parameters); + continue; + } + if (simplePropertyValue instanceof Date) { + addDateParameter(columnName, (Date) simplePropertyValue, parameters); + continue; + } + if (simplePropertyValue instanceof Enum) { + addEnumParameter(columnName, (Enum) simplePropertyValue, parameters); + continue; + } + addOtherTypeParameter(columnName, simplePropertyValue, parameters); - if (simplePropertyValue == null) { - addNullParameter(columnName, parameters); - continue; - } - if (simplePropertyValue instanceof String) { - addStringParameter(columnName, (String) simplePropertyValue, parameters); - continue; - } - if (simplePropertyValue instanceof Date) { - addDateParameter(columnName, (Date) simplePropertyValue, parameters); - continue; - } - if (simplePropertyValue instanceof Enum) { - addEnumParameter(columnName, (Enum) simplePropertyValue, parameters); - continue; } - addOtherTypeParameter(columnName, simplePropertyValue, parameters); } - Map<String, Object> manyToOneAssociations = binder.obtainProperties(referentialDto, true, manyToOneAssociationNames); - for (Map.Entry<String, Object> entry : manyToOneAssociations.entrySet()) { + if (manyToOneAssociationNames.length > 0) { - String manyToOneAssociationName = entry.getKey(); - String columnName = columnNames.get(manyToOneAssociationName); - Object manyToOneAssociationValue = entry.getValue(); + Map<String, Object> manyToOneAssociations = binder.obtainProperties(referentialDto, true, manyToOneAssociationNames); + for (Map.Entry<String, Object> entry : manyToOneAssociations.entrySet()) { + + String manyToOneAssociationName = entry.getKey(); + String columnName = columnNames.get(manyToOneAssociationName); + Object manyToOneAssociationValue = entry.getValue(); + + if (manyToOneAssociationValue == null) { + addNullParameter(columnName, parameters); + continue; + } + if (manyToOneAssociationValue instanceof ReferentialDto) { + addReferentialDtoParameter(columnName, (ReferentialDto) manyToOneAssociationValue, parameters); + continue; + } + if (manyToOneAssociationValue instanceof ReferentialReference) { + addReferentialReferenceParameter(columnName, (ReferentialReference) manyToOneAssociationValue, parameters); + } - if (manyToOneAssociationValue == null) { - addNullParameter(columnName, parameters); - continue; - } - if (manyToOneAssociationValue instanceof ReferentialDto) { - addReferentialDtoParameter(columnName, (ReferentialDto) manyToOneAssociationValue, parameters); - continue; - } - if (manyToOneAssociationValue instanceof ReferentialReference) { - addReferentialReferenceParameter(columnName, (ReferentialReference) manyToOneAssociationValue, parameters); } } @@ -254,6 +263,6 @@ public class UpdateSqlStatementGenerator<R extends ReferentialDto> { } private void addParameter0(String columnName, String value, StringBuilder parameters) { - parameters.append(", SET ").append(columnName).append(" = ").append(value); + parameters.append(", ").append(columnName).append(" = ").append(value); } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit decdb305f09c6075aaac1cfdeb1c79bf1186ba15 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jul 5 12:46:04 2016 +0200 Test du moteur de synchronisation --- .../UnidirectionalSynchronizeReferentialTest.java | 36 ++++++++++++++++++++- .../java/fr/ird/observe/test/DatabaseName.java | 3 +- ...taForTestUnidirectionalReferentialSyncho.sql.gz | Bin 0 -> 441281 bytes 3 files changed, 37 insertions(+), 2 deletions(-) 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 b9b9e60..d81e72c 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 @@ -1,7 +1,9 @@ package fr.ird.observe.services.service.actions.synchro; +import com.google.common.collect.ImmutableMap; 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; @@ -37,7 +39,7 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop UnidirectionalReferentialSynchronizeRemoteService remoteService = dataSourceResourceCentral.newService(UnidirectionalReferentialSynchronizeRemoteService.class); referentialSynchronizeEngine = new UnidirectionalReferentialSynchronizeEngine(localService, remoteService); } - + @DatabaseNameConfiguration(DatabaseName.empty_h2) @CopyDatabaseConfiguration @DatabaseNameConfiguration(value = DatabaseName.dataForTestSeine, classifier = DatabaseClassifier.CENTRAL) @@ -81,4 +83,36 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop }); } + + @DatabaseNameConfiguration(DatabaseName.dataForTestSeine) + @CopyDatabaseConfiguration + @DatabaseNameConfiguration(value = DatabaseName.dataForTestUnidirectionalReferentialSyncho, classifier = DatabaseClassifier.CENTRAL) + @DatabaseVersionConfiguration(value = ObserveFixtures.DEFAULT_VERSION, classifier = DatabaseClassifier.CENTRAL) + @Test + public void testSynchronizeWithAllChanges() { + + referentialSynchronizeEngine.run(new UnidirectionalReferentialSynchronizeEngine.Callback() { + + @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#1429515781110#0.833177504362538", "fr.ird.observe.entities.referentiel.Vessel#1429515780436#0.000696399947628379").build(); + } + throw new IllegalStateException(); + } + + }); + } } diff --git a/observe-test-data/src/main/java/fr/ird/observe/test/DatabaseName.java b/observe-test-data/src/main/java/fr/ird/observe/test/DatabaseName.java index 4e865a8..568d3a5 100644 --- a/observe-test-data/src/main/java/fr/ird/observe/test/DatabaseName.java +++ b/observe-test-data/src/main/java/fr/ird/observe/test/DatabaseName.java @@ -11,5 +11,6 @@ public enum DatabaseName { referentiel, dataForTestLongline, dataSourceTest, - dataForTestSeine + dataForTestSeine, + dataForTestUnidirectionalReferentialSyncho } diff --git a/observe-test-data/src/main/resources/db/4.903/dataForTestUnidirectionalReferentialSyncho.sql.gz b/observe-test-data/src/main/resources/db/4.903/dataForTestUnidirectionalReferentialSyncho.sql.gz new file mode 100644 index 0000000..1ab852d Binary files /dev/null and b/observe-test-data/src/main/resources/db/4.903/dataForTestUnidirectionalReferentialSyncho.sql.gz differ -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 6107eeb28b9dd0988481a6655bec253e8392e2e6 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jul 5 13:00:11 2016 +0200 Correction des bases de test --- .../resources/db/4.903/dataForTestLongline.sql.gz | Bin 1622037 -> 1627285 bytes .../resources/db/4.903/dataForTestSeine.sql.gz | Bin 441258 -> 440721 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/observe-test-data/src/main/resources/db/4.903/dataForTestLongline.sql.gz b/observe-test-data/src/main/resources/db/4.903/dataForTestLongline.sql.gz index 6eeedf7..47b295d 100644 Binary files a/observe-test-data/src/main/resources/db/4.903/dataForTestLongline.sql.gz and b/observe-test-data/src/main/resources/db/4.903/dataForTestLongline.sql.gz differ diff --git a/observe-test-data/src/main/resources/db/4.903/dataForTestSeine.sql.gz b/observe-test-data/src/main/resources/db/4.903/dataForTestSeine.sql.gz index 45c3c1b..c4a0979 100644 Binary files a/observe-test-data/src/main/resources/db/4.903/dataForTestSeine.sql.gz and b/observe-test-data/src/main/resources/db/4.903/dataForTestSeine.sql.gz differ -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 1ab676f3d7736e84cfeca55934dfe4d3c06507d3 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jul 5 16:14:44 2016 +0200 Introduction d'un objet de résultat de la synchronisation + rendre le moteur de synchronisation Callable (See #7739) --- ...UnidirectionalReferentialSynchronizeEngine.java | 19 +++- ...UnidirectionalReferentialSynchronizeResult.java | 114 +++++++++++++++++++++ 2 files changed, 130 insertions(+), 3 deletions(-) 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 031241d..83be8a9 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 @@ -9,6 +9,7 @@ import java.util.Collection; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; +import java.util.concurrent.Callable; import java.util.stream.Collectors; /** @@ -17,28 +18,36 @@ import java.util.stream.Collectors; * @author Tony Chemit - chemit@codelutin.com * @since 5.0 */ -public class UnidirectionalReferentialSynchronizeEngine { +public class UnidirectionalReferentialSynchronizeEngine implements Callable<UnidirectionalReferentialSynchronizeResult> { private final UnidirectionalReferentialSynchronizeLocalService localService; private final UnidirectionalReferentialSynchronizeRemoteService remoteService; + private final Callback callback; public UnidirectionalReferentialSynchronizeEngine(UnidirectionalReferentialSynchronizeLocalService localService, - UnidirectionalReferentialSynchronizeRemoteService remoteService) { + UnidirectionalReferentialSynchronizeRemoteService remoteService, + Callback callback) { this.localService = localService; this.remoteService = remoteService; + this.callback = callback; } - public void run(Callback callback) { + @Override + public UnidirectionalReferentialSynchronizeResult call() { LocalReferentialStates localReferentialStates = localService.getLocalSourceReferentialStates(); RemoteReferentialDiff remoteReferentialDiff = remoteService.getReferentialDifferential(localReferentialStates); + UnidirectionalReferentialSynchronizeResult result = new UnidirectionalReferentialSynchronizeResult(); + Set<String> sqlRequests = new LinkedHashSet<>(); for (String referentialName : remoteReferentialDiff.getReferentialNames()) { UnidirectionalReferentialSynchronizeRequest<?> referentialSynchronizeRequest = buildReferentialSynchronizeRequest(callback, referentialName, remoteReferentialDiff); + result.flushRequest(referentialSynchronizeRequest); + Set<String> sqlRequestsforReferential = localService.generateSqlRequests(referentialSynchronizeRequest); sqlRequests.addAll(sqlRequestsforReferential); @@ -46,6 +55,10 @@ public class UnidirectionalReferentialSynchronizeEngine { localService.applySqlRequests(sqlRequests); + //FIXME Mettre à jour la table LastUpdateDate pour les référentiels touchés et les données aussi... + + return result; + } private <R extends ReferentialDto> UnidirectionalReferentialSynchronizeRequest buildReferentialSynchronizeRequest(Callback callback, String referentialName, RemoteReferentialDiff remoteReferentialDiff) { diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeResult.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeResult.java new file mode 100644 index 0000000..568d2bf --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeResult.java @@ -0,0 +1,114 @@ +package fr.ird.observe.services.service.actions.synchro; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import fr.ird.observe.services.dto.referential.ReferentialDto; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +/** + * Contient toutes les opérations réalisées lors de la synchronisation des référentiels. + * + * Created on 05/07/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class UnidirectionalReferentialSynchronizeResult { + + private final Set<String> referentialNames; + private final Multimap<String, String> referentialAdded; + private final Multimap<String, String> referentialUpdated; + private final Multimap<String, Pair<String, String>> referentialReplaced; + private final Multimap<String, String> referentialRemoved; + + public UnidirectionalReferentialSynchronizeResult() { + this.referentialNames = new TreeSet<>(); + this.referentialAdded = ArrayListMultimap.create(); + this.referentialUpdated = ArrayListMultimap.create(); + this.referentialReplaced = ArrayListMultimap.create(); + this.referentialRemoved = ArrayListMultimap.create(); + } + + public Set<String> getReferentialNames() { + return referentialNames; + } + + public Collection<String> getReferentialAdded(String referentialName) { + return referentialAdded.get(referentialName); + } + + public Collection<String> getReferentialUpdated(String referentialName) { + return referentialUpdated.get(referentialName); + } + + public Collection<Pair<String, String>> getReferentialReplaced(String referentialName) { + return referentialReplaced.get(referentialName); + } + + public Collection<String> getReferentialRemoved(String referentialName) { + return referentialRemoved.get(referentialName); + } + + void flushRequest(UnidirectionalReferentialSynchronizeRequest<?> referentialSynchronizeRequest) { + + String referentialName = referentialSynchronizeRequest.getReferentialName(); + + if (referentialSynchronizeRequest.withReferentialToAdd()) { + + for (ReferentialDto referentialDto : referentialSynchronizeRequest.getReferentialToAdd()) { + addReferentialAdded(referentialName, referentialDto.getId()); + } + + } + + if (referentialSynchronizeRequest.withReferentialToUpdate()) { + + for (ReferentialDto referentialDto : referentialSynchronizeRequest.getReferentialToUpdate()) { + addReferentialUpdated(referentialName, referentialDto.getId()); + } + + } + + if (referentialSynchronizeRequest.withReferentialToRemove()) { + + for (String id : referentialSynchronizeRequest.getReferentialToRemove()) { + addReferentialRemoved(referentialName, id); + } + + } + + if (referentialSynchronizeRequest.withReferentialToReplace()) { + + for (Map.Entry<String, String> entry : referentialSynchronizeRequest.getReferentialToReplace().entrySet()) { + addReferentialReplaced(referentialName, entry.getKey(), entry.getValue()); + } + + } + + } + + private void addReferentialAdded(String referentialName, String id) { + referentialNames.add(referentialName); + referentialAdded.put(referentialName, id); + } + + private void addReferentialUpdated(String referentialName, String id) { + referentialNames.add(referentialName); + referentialUpdated.put(referentialName, id); + } + + private void addReferentialRemoved(String referentialName, String id) { + referentialNames.add(referentialName); + referentialRemoved.put(referentialName, id); + } + + private void addReferentialReplaced(String referentialName, String idToReplace, String replaceId) { + referentialNames.add(referentialName); + referentialReplaced.put(referentialName, Pair.of(idToReplace, replaceId)); + } +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 07f81e08f92b57457f539866370d255c1380c656 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jul 5 16:15:24 2016 +0200 Test de syncrhonisation mise en place + correction nom de base de test --- .../UnidirectionalSynchronizeReferentialTest.java | 129 +++++++++++++++++++-- .../java/fr/ird/observe/test/DatabaseName.java | 2 +- .../resources/db/4.903/dataForTestSeine.sql.gz | Bin 440721 -> 441224 bytes ...taForTestUnidirectionalReferentialSyncho.sql.gz | Bin 441281 -> 0 bytes ...aForTestUnidirectionalReferentialSynchro.sql.gz | Bin 0 -> 441247 bytes 5 files changed, 118 insertions(+), 13 deletions(-) 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 d81e72c..6a00f78 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 @@ -1,6 +1,8 @@ package fr.ird.observe.services.service.actions.synchro; import com.google.common.collect.ImmutableMap; +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; @@ -11,12 +13,16 @@ import fr.ird.observe.test.spi.CopyDatabaseConfiguration; import fr.ird.observe.test.spi.DatabaseClassifier; import fr.ird.observe.test.spi.DatabaseNameConfiguration; import fr.ird.observe.test.spi.DatabaseVersionConfiguration; +import org.apache.commons.lang3.tuple.Pair; +import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; +import java.util.Collection; import java.util.Map; +import java.util.Set; /** * Created on 04/07/16. @@ -31,13 +37,13 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop @Rule public final DataSourceResource dataSourceResourceCentral = new DataSourceResource(applicationContextResourceCentral); - private UnidirectionalReferentialSynchronizeEngine referentialSynchronizeEngine; + private UnidirectionalReferentialSynchronizeLocalService localService; + private UnidirectionalReferentialSynchronizeRemoteService remoteService; @Before public void setUp() throws Exception { - UnidirectionalReferentialSynchronizeLocalService localService = dataSourceResource.newService(UnidirectionalReferentialSynchronizeLocalService.class); - UnidirectionalReferentialSynchronizeRemoteService remoteService = dataSourceResourceCentral.newService(UnidirectionalReferentialSynchronizeRemoteService.class); - referentialSynchronizeEngine = new UnidirectionalReferentialSynchronizeEngine(localService, remoteService); + localService = dataSourceResource.newService(UnidirectionalReferentialSynchronizeLocalService.class); + remoteService = dataSourceResourceCentral.newService(UnidirectionalReferentialSynchronizeRemoteService.class); } @DatabaseNameConfiguration(DatabaseName.empty_h2) @@ -47,7 +53,7 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop @Test public void testSynchronizeFromEmptyDatabase() { - referentialSynchronizeEngine.run(new UnidirectionalReferentialSynchronizeEngine.Callback() { + UnidirectionalReferentialSynchronizeEngine.Callback callback = new UnidirectionalReferentialSynchronizeEngine.Callback() { @Override public Map<String, String> askUserToReplaceRemovedReferentials(UnidirectionalReferentialSynchronizeEngine.CallbackRequest request) { @@ -59,7 +65,27 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop throw new IllegalStateException(); } - }); + }; + UnidirectionalReferentialSynchronizeEngine referentialSynchronizeEngine = new UnidirectionalReferentialSynchronizeEngine(localService, remoteService, callback); + UnidirectionalReferentialSynchronizeResult result = referentialSynchronizeEngine.call(); + + Assert.assertNotNull(result); + Set<String> referentialNames = result.getReferentialNames(); + + Assert.assertNotNull(referentialNames); + Assert.assertFalse(referentialNames.isEmpty()); + + for (ObserveEntityEnum referenceEntity : Entities.REFERENCE_ENTITIES) { + if (ObserveEntityEnum.LastUpdateDate.equals(referenceEntity)) { + continue; + } + Assert.assertTrue(referentialNames.contains(referenceEntity.name())); + Assert.assertTrue(result.getReferentialUpdated(referenceEntity.name()).isEmpty()); + Assert.assertTrue(result.getReferentialRemoved(referenceEntity.name()).isEmpty()); + Assert.assertTrue(result.getReferentialReplaced(referenceEntity.name()).isEmpty()); + Assert.assertFalse(result.getReferentialAdded(referenceEntity.name()).isEmpty()); + } + } @DatabaseNameConfiguration(DatabaseName.dataForTestSeine) @@ -69,7 +95,7 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop @Test public void testSynchronizeWithNochange() { - referentialSynchronizeEngine.run(new UnidirectionalReferentialSynchronizeEngine.Callback() { + UnidirectionalReferentialSynchronizeEngine.Callback callback = new UnidirectionalReferentialSynchronizeEngine.Callback() { @Override public Map<String, String> askUserToReplaceRemovedReferentials(UnidirectionalReferentialSynchronizeEngine.CallbackRequest request) { @@ -81,17 +107,35 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop throw new IllegalStateException(); } - }); + }; + UnidirectionalReferentialSynchronizeEngine referentialSynchronizeEngine = new UnidirectionalReferentialSynchronizeEngine(localService, remoteService, callback); + UnidirectionalReferentialSynchronizeResult result = referentialSynchronizeEngine.call(); + + Assert.assertNotNull(result); + Set<String> referentialNames = result.getReferentialNames(); + Assert.assertNotNull(referentialNames); + Assert.assertTrue(referentialNames.isEmpty()); + + for (ObserveEntityEnum referenceEntity : Entities.REFERENCE_ENTITIES) { + if (ObserveEntityEnum.LastUpdateDate.equals(referenceEntity)) { + continue; + } + Assert.assertTrue(result.getReferentialUpdated(referenceEntity.name()).isEmpty()); + Assert.assertTrue(result.getReferentialRemoved(referenceEntity.name()).isEmpty()); + Assert.assertTrue(result.getReferentialReplaced(referenceEntity.name()).isEmpty()); + Assert.assertTrue(result.getReferentialAdded(referenceEntity.name()).isEmpty()); + } + } @DatabaseNameConfiguration(DatabaseName.dataForTestSeine) @CopyDatabaseConfiguration - @DatabaseNameConfiguration(value = DatabaseName.dataForTestUnidirectionalReferentialSyncho, classifier = DatabaseClassifier.CENTRAL) + @DatabaseNameConfiguration(value = DatabaseName.dataForTestUnidirectionalReferentialSynchro, classifier = DatabaseClassifier.CENTRAL) @DatabaseVersionConfiguration(value = ObserveFixtures.DEFAULT_VERSION, classifier = DatabaseClassifier.CENTRAL) @Test public void testSynchronizeWithAllChanges() { - referentialSynchronizeEngine.run(new UnidirectionalReferentialSynchronizeEngine.Callback() { + UnidirectionalReferentialSynchronizeEngine.Callback callback = new UnidirectionalReferentialSynchronizeEngine.Callback() { @Override public <R extends ReferentialDto> Map<String, String> askUserToReplaceRemovedReferentials(UnidirectionalReferentialSynchronizeEngine.CallbackRequest<R> request) { @@ -108,11 +152,72 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop String referentialName = request.getReferentialName(); switch (referentialName) { case "Vessel": - return ImmutableMap.<String, String>builder().put("fr.ird.observe.entities.referentiel.Vessel#1429515781110#0.833177504362538", "fr.ird.observe.entities.referentiel.Vessel#1429515780436#0.000696399947628379").build(); + 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(); } - }); + }; + + UnidirectionalReferentialSynchronizeEngine referentialSynchronizeEngine = new UnidirectionalReferentialSynchronizeEngine(localService, remoteService, callback); + UnidirectionalReferentialSynchronizeResult result = referentialSynchronizeEngine.call(); + + Assert.assertNotNull(result); + Set<String> referentialNames = result.getReferentialNames(); + Assert.assertNotNull(referentialNames); + Assert.assertFalse(referentialNames.isEmpty()); + { + Assert.assertTrue(referentialNames.contains(ObserveEntityEnum.VesselActivitySeine.name())); + Assert.assertTrue(result.getReferentialAdded(ObserveEntityEnum.VesselActivitySeine.name()).isEmpty()); + Collection<String> referentialUpdated = result.getReferentialUpdated(ObserveEntityEnum.VesselActivitySeine.name()); + Assert.assertFalse(referentialUpdated.isEmpty()); + Assert.assertEquals(1, referentialUpdated.size()); + Assert.assertTrue(referentialUpdated.contains("fr.ird.observe.entities.referentiel.seine.VesselActivitySeine#1239832675369#0.12552908048322586")); + + Assert.assertTrue(result.getReferentialRemoved(ObserveEntityEnum.VesselActivitySeine.name()).isEmpty()); + Assert.assertTrue(result.getReferentialReplaced(ObserveEntityEnum.VesselActivitySeine.name()).isEmpty()); + } + + { + Assert.assertTrue(referentialNames.contains(ObserveEntityEnum.Species.name())); + + Assert.assertTrue(result.getReferentialAdded(ObserveEntityEnum.Species.name()).isEmpty()); + Collection<String> referentialUpdated = result.getReferentialUpdated(ObserveEntityEnum.Species.name()); + Assert.assertFalse(referentialUpdated.isEmpty()); + Assert.assertEquals(1, referentialUpdated.size()); + Assert.assertTrue(referentialUpdated.contains("fr.ird.observe.entities.referentiel.Species#1239832685474#0.8943253454598569")); + + Assert.assertTrue(result.getReferentialRemoved(ObserveEntityEnum.Species.name()).isEmpty()); + Assert.assertTrue(result.getReferentialReplaced(ObserveEntityEnum.Species.name()).isEmpty()); + + } + { + Assert.assertTrue(referentialNames.contains(ObserveEntityEnum.Person.name())); + Assert.assertTrue(result.getReferentialAdded(ObserveEntityEnum.Person.name()).isEmpty()); + Assert.assertTrue(result.getReferentialUpdated(ObserveEntityEnum.Person.name()).isEmpty()); + Collection<String> referentialRemoved = result.getReferentialRemoved(ObserveEntityEnum.Person.name()); + Assert.assertFalse(referentialRemoved.isEmpty()); + Assert.assertEquals(1, referentialRemoved.size()); + Assert.assertTrue(referentialRemoved.contains("fr.ird.observe.entities.referentiel.Person#1355399844272#0.32586441962131485")); + 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(referentialNames.contains(ObserveEntityEnum.Vessel.name())); + Assert.assertTrue(result.getReferentialAdded(ObserveEntityEnum.Vessel.name()).isEmpty()); + Collection<String> referentialUpdated = result.getReferentialUpdated(ObserveEntityEnum.Vessel.name()); + Assert.assertFalse(referentialUpdated.isEmpty()); + Assert.assertEquals(1, referentialUpdated.size()); + Assert.assertTrue(referentialUpdated.contains("fr.ird.observe.entities.referentiel.Vessel#1306847717532#0.7435948873477364")); + Assert.assertTrue(result.getReferentialRemoved(ObserveEntityEnum.Vessel.name()).isEmpty()); + Collection<Pair<String, String>> referentialReplaced = result.getReferentialReplaced(ObserveEntityEnum.Vessel.name()); + Assert.assertFalse(referentialReplaced.isEmpty()); + Assert.assertEquals(1, referentialReplaced.size()); + Assert.assertTrue(referentialReplaced.contains(Pair.of("fr.ird.observe.entities.referentiel.Vessel#1306847717532#0.7435948873477364", "fr.ird.observe.entities.referentiel.Vessel#1429515781110#0.833177504362538"))); + } + } } diff --git a/observe-test-data/src/main/java/fr/ird/observe/test/DatabaseName.java b/observe-test-data/src/main/java/fr/ird/observe/test/DatabaseName.java index 568d3a5..b31bef4 100644 --- a/observe-test-data/src/main/java/fr/ird/observe/test/DatabaseName.java +++ b/observe-test-data/src/main/java/fr/ird/observe/test/DatabaseName.java @@ -12,5 +12,5 @@ public enum DatabaseName { dataForTestLongline, dataSourceTest, dataForTestSeine, - dataForTestUnidirectionalReferentialSyncho + dataForTestUnidirectionalReferentialSynchro } diff --git a/observe-test-data/src/main/resources/db/4.903/dataForTestSeine.sql.gz b/observe-test-data/src/main/resources/db/4.903/dataForTestSeine.sql.gz index c4a0979..d6749b7 100644 Binary files a/observe-test-data/src/main/resources/db/4.903/dataForTestSeine.sql.gz and b/observe-test-data/src/main/resources/db/4.903/dataForTestSeine.sql.gz differ diff --git a/observe-test-data/src/main/resources/db/4.903/dataForTestUnidirectionalReferentialSyncho.sql.gz b/observe-test-data/src/main/resources/db/4.903/dataForTestUnidirectionalReferentialSyncho.sql.gz deleted file mode 100644 index 1ab852d..0000000 Binary files a/observe-test-data/src/main/resources/db/4.903/dataForTestUnidirectionalReferentialSyncho.sql.gz and /dev/null differ diff --git a/observe-test-data/src/main/resources/db/4.903/dataForTestUnidirectionalReferentialSynchro.sql.gz b/observe-test-data/src/main/resources/db/4.903/dataForTestUnidirectionalReferentialSynchro.sql.gz new file mode 100644 index 0000000..3989582 Binary files /dev/null and b/observe-test-data/src/main/resources/db/4.903/dataForTestUnidirectionalReferentialSynchro.sql.gz differ -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 68aa5c73a10e52deb700f760f487381c19a8d508 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jul 5 17:39:02 2016 +0200 On n gère pas lors de la synchronisation de la désactivation d'un référentiel (See #7739) --- .../actions/synchro/RemoteReferentialDiff.java | 18 +-------- ...UnidirectionalReferentialSynchronizeEngine.java | 47 ++++------------------ ...alReferentialSynchronizeRemoteServiceTopia.java | 8 ---- .../UnidirectionalSynchronizeReferentialTest.java | 7 +--- 4 files changed, 10 insertions(+), 70 deletions(-) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/RemoteReferentialDiff.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/RemoteReferentialDiff.java index 8900844..b4409f7 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/RemoteReferentialDiff.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/RemoteReferentialDiff.java @@ -3,7 +3,6 @@ package fr.ird.observe.services.service.actions.synchro; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import fr.ird.observe.services.dto.referential.ReferentialDto; -import fr.ird.observe.services.dto.referential.ReferentialReference; import java.io.Serializable; import java.util.Collection; @@ -36,26 +35,21 @@ public class RemoteReferentialDiff implements Serializable { * Les identifiants de référentiels à supprimer (indexé par nom de référentiel). */ private final Multimap<String, String> referentialsToRemove; - /** - * Les références de référentiels à changer (ils sont devenus obsolètes) (indexé par nom de référentiel). - */ - private final Multimap<String, ReferentialReference> referentialsToFix; public RemoteReferentialDiff() { referentialNames = new LinkedHashSet<>(); referentialsToAdd = ArrayListMultimap.create(); referentialsToUpdate = ArrayListMultimap.create(); referentialsToRemove = ArrayListMultimap.create(); - referentialsToFix = ArrayListMultimap.create(); } public boolean isReferentialUsed(String referentialName) { return referentialsToAdd.containsKey(referentialName) || referentialsToUpdate.containsKey(referentialName) - || referentialsToRemove.containsKey(referentialName) - || referentialsToFix.containsKey(referentialName); + || referentialsToRemove.containsKey(referentialName); } + public <R extends ReferentialDto> Collection<R> getReferentialsToAdd(String referentialName) { return (Collection) referentialsToAdd.get(referentialName); } @@ -68,10 +62,6 @@ public class RemoteReferentialDiff implements Serializable { return new HashSet<>(referentialsToRemove.get(referentialName)); } - public <R extends ReferentialDto> Collection<ReferentialReference<R>> getReferentialsToFix(String referentialName) { - return (Collection)referentialsToFix.get(referentialName); - } - public Set<String> getReferentialNames() { return referentialNames; } @@ -91,8 +81,4 @@ public class RemoteReferentialDiff implements Serializable { referentialsToRemove.put(referentialName, id); } - void addReferentialToFix(String referentialName, ReferentialReference referentialReference) { - referentialNames.add(referentialName); - referentialsToFix.put(referentialName, referentialReference); - } } 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 83be8a9..5c3b8c5 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 @@ -92,27 +92,8 @@ public class UnidirectionalReferentialSynchronizeEngine implements Callable<Unid } - Collection<ReferentialReference<R>> referentialsToReplace = remoteReferentialDiff.getReferentialsToFix(referentialName); - Collection<ReferentialReference<R>> blockingReferentialsToReplace = null; - if (CollectionUtils.isNotEmpty(referentialsToReplace)) { - - Set<String> idsToReplace = referentialsToReplace.stream() - .map(ReferentialReference::getId) - .collect(Collectors.toCollection(LinkedHashSet::new)); - - Set<String> blockingIdsToReplace = localService.filterIdsUsedInLocalSource(referentialName, idsToReplace); - - blockingReferentialsToReplace = referentialsToReplace - .stream() - .filter(referentialReference -> blockingIdsToReplace.contains(referentialReference.getId())) - .collect(Collectors.toSet()); - - } - - boolean needCallbackForRemove = CollectionUtils.isNotEmpty(blockingIdsToRemove); - boolean needCallbackForReplace = CollectionUtils.isNotEmpty(blockingReferentialsToReplace); - boolean needCallback = needCallbackForRemove || needCallbackForReplace; + boolean needCallback = CollectionUtils.isNotEmpty(blockingIdsToRemove); if (needCallback) { // calcul de l'univers de référentiels disponibles pour les remplacements @@ -120,26 +101,12 @@ public class UnidirectionalReferentialSynchronizeEngine implements Callable<Unid ReferentialReferenceSet<R> availableReferenceSet = remoteService.getEnabledReferentialReferenceSet(referentialName); Set<ReferentialReference<R>> availableReferentials = availableReferenceSet.getReferences(); - if (needCallbackForRemove) { - - 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()); - } - - } - - if (needCallbackForReplace) { - - CallbackRequest<R> callbackRequest = CallbackRequest.of(referentialName, referentialsToReplace, availableReferentials); - Map<String, String> referentialsToReplaceIds = callback.askUserToReplaceDisabledReferentials(callbackRequest); - for (Map.Entry<String, String> entry : referentialsToReplaceIds.entrySet()) { - builder.entityToReplace(entry.getKey(), entry.getValue()); - } - + 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()); } } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java index fb2dcc6..f2e33ac 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java @@ -9,7 +9,6 @@ import fr.ird.observe.services.ObserveServiceTopia; import fr.ird.observe.services.binder.BinderEngine; import fr.ird.observe.services.dto.constants.ReferentialLocale; import fr.ird.observe.services.dto.referential.ReferentialDto; -import fr.ird.observe.services.dto.referential.ReferentialReference; import fr.ird.observe.services.dto.referential.ReferentialReferenceSet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -97,13 +96,6 @@ public class UnidirectionalReferentialSynchronizeRemoteServiceTopia extends Obse result.addReferentialToUpdate(entityName, dto); } - if (centralReferentialEntity.isDisabled() && !localReferentialDisabled.contains(id)) { - - // entité qui passe en mode désactivé, il faudra que l'utilisateur la change - ReferentialReference<ReferentialDto> referentialReference = binderEngine.transformEntityToReferentialReferenceDto(referentialLocale, centralReferentialEntity); - result.addReferentialToFix(entityName, referentialReference); - } - } // entités supprimées 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 6a00f78..8ce1b83 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 @@ -189,7 +189,6 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop Assert.assertTrue(result.getReferentialRemoved(ObserveEntityEnum.Species.name()).isEmpty()); Assert.assertTrue(result.getReferentialReplaced(ObserveEntityEnum.Species.name()).isEmpty()); - } { Assert.assertTrue(referentialNames.contains(ObserveEntityEnum.Person.name())); @@ -203,7 +202,6 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop 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(referentialNames.contains(ObserveEntityEnum.Vessel.name())); @@ -213,10 +211,7 @@ public class UnidirectionalSynchronizeReferentialTest extends AbstractServiceTop Assert.assertEquals(1, referentialUpdated.size()); Assert.assertTrue(referentialUpdated.contains("fr.ird.observe.entities.referentiel.Vessel#1306847717532#0.7435948873477364")); Assert.assertTrue(result.getReferentialRemoved(ObserveEntityEnum.Vessel.name()).isEmpty()); - Collection<Pair<String, String>> referentialReplaced = result.getReferentialReplaced(ObserveEntityEnum.Vessel.name()); - Assert.assertFalse(referentialReplaced.isEmpty()); - Assert.assertEquals(1, referentialReplaced.size()); - Assert.assertTrue(referentialReplaced.contains(Pair.of("fr.ird.observe.entities.referentiel.Vessel#1306847717532#0.7435948873477364", "fr.ird.observe.entities.referentiel.Vessel#1429515781110#0.833177504362538"))); + Assert.assertTrue(result.getReferentialReplaced(ObserveEntityEnum.Vessel.name()).isEmpty()); } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 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>.
participants (1)
-
codelutin.com scm