Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: f8d211b9 by Tony Chemit at 2024-06-25T17:28:55+02:00 En synchro avancée de données, la modification de la configuration des arbres de navigation ne fonctionne plus - Closes #2887 - - - - - cfa3abfb by Tony Chemit at 2024-06-25T17:28:55+02:00 Amélioration du code de mise à jour sql pour les associations lors de remplacement de référentiel - Closes #2899 - - - - - 39784e11 by Tony Chemit at 2024-06-25T17:29:32+02:00 Fix persistence tests (by skipping them), when some files are missing to execute them - - - - - 9 changed files: - client/datasource/actions/src/main/i18n/getters/java.getter - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/tree/DataSelectionTreePaneHandler.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/tree/DataSelectionTreePaneModel.java - core/persistence/java/src/main/resources/META-INF/persistence/Observe/TopiaEntitySqlScriptModel.json - core/persistence/test/src/test/java/fr/ird/observe/persistence/avdth/data/AvdthDataBuilderTestSupport.java - core/persistence/test/src/test/java/fr/ird/observe/persistence/avdth/referential/AvdthReferentialBuilderTest.java - core/persistence/test/src/test/java/fr/ird/observe/persistence/avdth/referential/AvdthWeightCategoryBuilderTest.java - toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/entity/ReplaceReferentialScriptGenerator.java - toolkit/test-api/src/main/java/fr/ird/observe/test/ObserveTestConfiguration.java Changes: ===================================== client/datasource/actions/src/main/i18n/getters/java.getter ===================================== @@ -206,3 +206,4 @@ observe.ui.tree.action.collapseAll.tip observe.ui.tree.action.expandAll.tip observe.ui.tree.action.selectAll.tip observe.ui.tree.action.unselectAll.tip +observe.ui.tree.reload ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/tree/DataSelectionTreePaneHandler.java ===================================== @@ -39,6 +39,7 @@ import fr.ird.observe.navigation.tree.selection.IdState; import fr.ird.observe.navigation.tree.selection.SelectionTree; import fr.ird.observe.navigation.tree.selection.SelectionTreeModel; import fr.ird.observe.navigation.tree.selection.SelectionTreeNode; +import io.ultreia.java4all.i18n.I18n; import io.ultreia.java4all.util.TwoSideContext; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -158,9 +159,11 @@ public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTree } public static void rebuildTree(DataSynchroModel stepModel, DataSelectionTreePane ui, boolean rebuildFlatModel) { - ui.getTree().getTree().clearSelection(); - stepModel.rebuildSelectionModel(ui.getSide(), rebuildFlatModel); - finalizeTree(ui); + stepModel.getActionExecutor().addAction(I18n.t("observe.ui.tree.reload"), ()-> { + ui.getTree().getTree().clearSelection(); + stepModel.rebuildSelectionModel(ui.getSide(), rebuildFlatModel); + finalizeTree(ui); + }); } public static void afterTreeBuild(DataSelectionTreePane ui) { ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/tree/DataSelectionTreePaneModel.java ===================================== @@ -98,6 +98,7 @@ public class DataSelectionTreePaneModel extends AbstractJavaBean { * Can we delete from this side? */ private boolean canDelete; + public void dispose() { source = null; treeFlatModel = null; @@ -178,7 +179,9 @@ public class DataSelectionTreePaneModel extends AbstractJavaBean { public void rebuildSelectionModel(boolean rebuildFlatModel, List<IdAndLastUpdateDate> otherSideIds) { if (rebuildFlatModel) { - treeFlatModel = selectionDataModel.buildFlatModel(source.getNavigationService()::loadSelectionRoot); + try (ObserveSwingDataSource dataSource = ObserveSwingDataSource.doOpenSource(source)) { + treeFlatModel = selectionDataModel.buildFlatModel(dataSource.getNavigationService()::loadSelectionRoot); + } } selectionDataModel.populate(treeFlatModel, r -> { computeDataIds(r); ===================================== core/persistence/java/src/main/resources/META-INF/persistence/Observe/TopiaEntitySqlScriptModel.json ===================================== @@ -1116,7 +1116,8 @@ "UPDATE ps_common.trip SET captain = '%3$s', topiaVersion = topiaVersion + 1, lastUpdateDate = '%1$s'::timestamp WHERE captain = '%2$s';", "UPDATE ps_common.trip SET observationsDataEntryOperator = '%3$s', topiaVersion = topiaVersion + 1, lastUpdateDate = '%1$s'::timestamp WHERE observationsDataEntryOperator = '%2$s';", "UPDATE ps_common.trip SET logbookDataEntryOperator = '%3$s', topiaVersion = topiaVersion + 1, lastUpdateDate = '%1$s'::timestamp WHERE logbookDataEntryOperator = '%2$s';", - "UPDATE ps_logbook.sample_person SET person = '%3$s' WHERE person = '%2$s';" + "UPDATE ps_logbook.sample_person SET person = '%3$s' WHERE person = '%2$s' AND (SELECT COUNT(s.person) FROM ps_logbook.sample_person s WHERE s.person = '%3$s') = 0;", + "DELETE FROM ps_logbook.sample_person WHERE person = '%2$s';" ], "org.nuiton.topia.service.sql.script.DeleteReferentialScript": [ "DELETE FROM common.person WHERE topiaId = '%1$s';" @@ -1239,10 +1240,14 @@ "UPDATE ps_localmarket.batch SET species = '%3$s', topiaVersion = topiaVersion + 1, lastUpdateDate = '%1$s'::timestamp WHERE species = '%2$s';", "UPDATE ps_localmarket.surveyPart SET species = '%3$s', topiaVersion = topiaVersion + 1, lastUpdateDate = '%1$s'::timestamp WHERE species = '%2$s';", "UPDATE ps_localmarket.sampleSpecies SET species = '%3$s', topiaVersion = topiaVersion + 1, lastUpdateDate = '%1$s'::timestamp WHERE species = '%2$s';", - "UPDATE ll_common.trip_species SET species = '%3$s' WHERE species = '%2$s';", - "UPDATE ll_observation.catch_predator SET species = '%3$s' WHERE species = '%2$s';", - "UPDATE ll_observation.tdr_species SET species = '%3$s' WHERE species = '%2$s';", - "UPDATE ll_logbook.catch_predator SET species = '%3$s' WHERE species = '%2$s';" + "UPDATE ll_common.trip_species SET species = '%3$s' WHERE species = '%2$s' AND (SELECT COUNT(s.species) FROM ll_common.trip_species s WHERE s.species = '%3$s') = 0;", + "DELETE FROM ll_common.trip_species WHERE species = '%2$s';", + "UPDATE ll_observation.catch_predator SET species = '%3$s' WHERE species = '%2$s' AND (SELECT COUNT(s.species) FROM ll_observation.catch_predator s WHERE s.species = '%3$s') = 0;", + "DELETE FROM ll_observation.catch_predator WHERE species = '%2$s';", + "UPDATE ll_observation.tdr_species SET species = '%3$s' WHERE species = '%2$s' AND (SELECT COUNT(s.species) FROM ll_observation.tdr_species s WHERE s.species = '%3$s') = 0;", + "DELETE FROM ll_observation.tdr_species WHERE species = '%2$s';", + "UPDATE ll_logbook.catch_predator SET species = '%3$s' WHERE species = '%2$s' AND (SELECT COUNT(s.species) FROM ll_logbook.catch_predator s WHERE s.species = '%3$s') = 0;", + "DELETE FROM ll_logbook.catch_predator WHERE species = '%2$s';" ], "org.nuiton.topia.service.sql.script.ReplaceReferentialInReferentialScript": [ "UPDATE ps_common.weightCategory SET species = '%3$s', topiaVersion = topiaVersion + 1, lastUpdateDate = '%1$s'::timestamp WHERE species = '%2$s';", @@ -1615,8 +1620,10 @@ "UPDATE common.lastUpdateDate SET lastUpdateDate = '%1$s'::timestamp WHERE type ='fr.ird.observe.entities.referential.ll.common.MitigationType';" ], "org.nuiton.topia.service.sql.script.ReplaceReferentialInDataScript": [ - "UPDATE ll_observation.set_mitigationType SET mitigationType = '%3$s' WHERE mitigationType = '%2$s';", - "UPDATE ll_logbook.set_mitigationType SET mitigationType = '%3$s' WHERE mitigationType = '%2$s';" + "UPDATE ll_observation.set_mitigationType SET mitigationType = '%3$s' WHERE mitigationType = '%2$s' AND (SELECT COUNT(s.mitigationType) FROM ll_observation.set_mitigationType s WHERE s.mitigationType = '%3$s') = 0;", + "DELETE FROM ll_observation.set_mitigationType WHERE mitigationType = '%2$s';", + "UPDATE ll_logbook.set_mitigationType SET mitigationType = '%3$s' WHERE mitigationType = '%2$s' AND (SELECT COUNT(s.mitigationType) FROM ll_logbook.set_mitigationType s WHERE s.mitigationType = '%3$s') = 0;", + "DELETE FROM ll_logbook.set_mitigationType WHERE mitigationType = '%2$s';" ], "org.nuiton.topia.service.sql.script.DeleteReferentialScript": [ "DELETE FROM ll_common.mitigationType WHERE topiaId = '%1$s';" @@ -2043,8 +2050,10 @@ "UPDATE common.lastUpdateDate SET lastUpdateDate = '%1$s'::timestamp WHERE type ='fr.ird.observe.entities.referential.ps.common.ObservedSystem';" ], "org.nuiton.topia.service.sql.script.ReplaceReferentialInDataScript": [ - "UPDATE ps_observation.activity_observedSystem SET observedSystem = '%3$s' WHERE observedSystem = '%2$s';", - "UPDATE ps_logbook.activity_observedSystem SET observedSystem = '%3$s' WHERE observedSystem = '%2$s';" + "UPDATE ps_observation.activity_observedSystem SET observedSystem = '%3$s' WHERE observedSystem = '%2$s' AND (SELECT COUNT(s.observedSystem) FROM ps_observation.activity_observedSystem s WHERE s.observedSystem = '%3$s') = 0;", + "DELETE FROM ps_observation.activity_observedSystem WHERE observedSystem = '%2$s';", + "UPDATE ps_logbook.activity_observedSystem SET observedSystem = '%3$s' WHERE observedSystem = '%2$s' AND (SELECT COUNT(s.observedSystem) FROM ps_logbook.activity_observedSystem s WHERE s.observedSystem = '%3$s') = 0;", + "DELETE FROM ps_logbook.activity_observedSystem WHERE observedSystem = '%2$s';" ], "org.nuiton.topia.service.sql.script.DeleteReferentialScript": [ "DELETE FROM ps_common.observedSystem WHERE topiaId = '%1$s';" ===================================== core/persistence/test/src/test/java/fr/ird/observe/persistence/avdth/data/AvdthDataBuilderTestSupport.java ===================================== @@ -127,6 +127,7 @@ public abstract class AvdthDataBuilderTestSupport extends PersistenceTestSupport public void build() throws SQLException, IOException, MissingReferentialException { log.info(String.format("Start for database: %s", dbName)); Path avdthFile = getRootPath().resolve(dbName); + Assume.assumeTrue("Skip, avdth file " + avdthFile + " not found", Files.exists(avdthFile)); Path scriptPath = TOPIA_TEST_CLASS_RESOURCE.getTestDirectory().toPath().resolve("export-" + dbName.replace(".mdb", ".sql")); Path scriptTemporaryDirectory = scriptPath.getParent().resolve(scriptPath.toFile().getName().replace(".sql", "-tmp")); ===================================== core/persistence/test/src/test/java/fr/ird/observe/persistence/avdth/referential/AvdthReferentialBuilderTest.java ===================================== @@ -39,10 +39,12 @@ import fr.ird.observe.test.spi.DatabaseNameConfiguration; import fr.ird.observe.test.spi.DatabasePasswordConfiguration; import fr.ird.observe.test.spi.DatabaseVersionConfiguration; import org.junit.Assert; +import org.junit.Assume; import org.junit.ClassRule; import org.junit.Test; import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; import java.sql.Connection; import java.sql.SQLException; @@ -74,6 +76,7 @@ public class AvdthReferentialBuilderTest extends TestSupportWithConfig { Path avdthFile = AvdthFixtures.getAvdthCachePath() .resolve("OA") .resolve("OA_2020_V35.mdb"); + Assume.assumeTrue("Skip, avdth file " + avdthFile + " not found", Files.exists(avdthFile)); Path scriptPath = localTestMethodResource.getTestDirectory().toPath().resolve("export-" + avdthFile.toFile().getName().replace(".mdb", ".sql")); Path scriptTemporaryDirectory = scriptPath.getParent().resolve(scriptPath.toFile().getName().replace(".sql", "-tmp")); ===================================== core/persistence/test/src/test/java/fr/ird/observe/persistence/avdth/referential/AvdthWeightCategoryBuilderTest.java ===================================== @@ -38,10 +38,12 @@ import fr.ird.observe.test.spi.DatabaseNameConfiguration; import fr.ird.observe.test.spi.DatabasePasswordConfiguration; import fr.ird.observe.test.spi.DatabaseVersionConfiguration; import org.junit.Assert; +import org.junit.Assume; import org.junit.ClassRule; import org.junit.Test; import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; import java.sql.Connection; import java.sql.SQLException; @@ -70,6 +72,7 @@ public class AvdthWeightCategoryBuilderTest extends TestSupportWithConfig { public void build() throws SQLException, IOException { Path avdthFile = AvdthFixtures.getAvdthCachePath() .resolve("avdth-gen-35_74.mdb"); + Assume.assumeTrue("Skip, avdth file " + avdthFile + " not found", Files.exists(avdthFile)); Path scriptPath = localTestMethodResource.getTestDirectory().toPath().resolve("export-" + avdthFile.toFile().getName().replace(".mdb", ".sql")); Path scriptTemporaryDirectory = scriptPath.getParent().resolve(scriptPath.toFile().getName().replace(".sql", "-tmp")); ===================================== toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/entity/ReplaceReferentialScriptGenerator.java ===================================== @@ -22,6 +22,7 @@ package fr.ird.observe.toolkit.templates.entity; * #L% */ +import fr.ird.observe.spi.referential.SqlStatements; import org.nuiton.topia.service.sql.metadata.TopiaMetadataAssociation; import org.nuiton.topia.service.sql.metadata.TopiaMetadataComposition; import org.nuiton.topia.service.sql.metadata.TopiaMetadataEntity; @@ -55,11 +56,11 @@ public class ReplaceReferentialScriptGenerator { /** * To update a reference of a composition relation. */ - public static final String COMPOSITION_UPDATE_STATEMENT = "UPDATE %s.%s SET %s = '%s', topiaVersion = topiaVersion + 1, lastUpdateDate = '%s'::timestamp WHERE %s = '%s';"; + public static final String COMPOSITION_UPDATE_STATEMENT = "UPDATE %1$s.%2$s SET %3$s = '%4$s', topiaVersion = topiaVersion + 1, lastUpdateDate = '%5$s'::timestamp WHERE %3$s = '%6$s';"; /** * To update a reference of an association relation. */ - private static final String ASSOCIATION_UPDATE_STATEMENT = "UPDATE %s.%s SET %s = '%s' WHERE %s = '%s';"; + private static final String ASSOCIATION_UPDATE_STATEMENT = "UPDATE %1$s.%2$s SET %3$s = '%4$s' WHERE %3$s = '%5$s' AND (SELECT COUNT(s.%3$s) FROM %1$s.%2$s s WHERE s.%3$s = '%4$s') = 0;"; /** * All reverse relation many-to-one. */ @@ -96,6 +97,8 @@ public class ReplaceReferentialScriptGenerator { } String sql = generateAssociationUpdateStatement(replacementStruct, sourceId, replacementId); builder.add(sql); + sql = generateAssociationDeleteStatement(replacementStruct, sourceId); + builder.add(sql); } return builder; } @@ -107,7 +110,6 @@ public class ReplaceReferentialScriptGenerator { composition.getTargetDbName(), replacementId, lastUpdateDate, - composition.getTargetDbName(), sourceId); } @@ -117,7 +119,14 @@ public class ReplaceReferentialScriptGenerator { association.getTableName(), association.getTargetDbName(), replacementId, - association.getTargetDbName(), sourceId); } + + private String generateAssociationDeleteStatement(TopiaMetadataAssociation association, String sourceId) { + return String.format(SqlStatements.ASSOCIATION_DELETE_STATEMENT, + association.getOwner().getDbSchemaName(), + association.getTableName(), + association.getTargetDbName(), + sourceId).trim(); + } } ===================================== toolkit/test-api/src/main/java/fr/ird/observe/test/ObserveTestConfiguration.java ===================================== @@ -33,10 +33,12 @@ import fr.ird.observe.test.spi.DatabaseVersionConfiguration; import io.ultreia.java4all.util.Version; import io.ultreia.java4all.util.sql.conf.JdbcConfiguration; import io.ultreia.java4all.util.sql.conf.JdbcConfigurationBuilder; +import org.junit.Assume; import java.lang.reflect.AnnotatedElement; import java.net.MalformedURLException; import java.net.URL; +import java.nio.file.Files; import java.nio.file.Path; /** @@ -155,6 +157,7 @@ public class ObserveTestConfiguration { public static void injectCredentials() { Path credentialPath = Path.of(ObserveTestConfiguration.getTestPropertyAsString(ToolkitFixtures.TEST_CREDENTIALS_KEY)); + Assume.assumeTrue("Skip, no credential file found", Files.exists(credentialPath)); ToolkitFixtures.injectCredentials(credentialPath, ObserveTestConfiguration.PG_URL, ObserveTestConfiguration.PG_LOGIN, View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/24056b129bbe3bbb0b4e916d3... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/24056b129bbe3bbb0b4e916d3... You're receiving this email because of your account on gitlab.com.