mailman.cloud.codelutin.com
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

Observe-commits

Thread Start a new thread
Download
Threads by month
  • ----- 2026 -----
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2025 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2021 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2020 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2019 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2018 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2017 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2016 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2015 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2014 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2013 -----
  • December
  • November
  • October
  • September
observe-commits@list.forge.codelutin.com

September 2018

  • 1 participants
  • 147 discussions
[Git][ultreiaio/ird-observe][develop] 18 commits: use last pom
by Tony CHEMIT 20 Sep '18

20 Sep '18
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 27cee384 by Tony CHEMIT at 2018-09-20T21:39:05Z use last pom - - - - - 8a5dc471 by Tony CHEMIT at 2018-09-20T21:39:06Z clean stream api - - - - - afa006b5 by Tony CHEMIT at 2018-09-20T21:39:06Z La suppression d'une espèce avec remplacement de code échoue - Closes #1060 La suppression d'océan avec remplacement de code pose problème - Closes #1061 La suppression d'un sexe avec remplacement de code échoue - Closes #1062 - - - - - a6c3f482 by Tony CHEMIT at 2018-09-20T21:39:38Z L'UI de synchro de référentiels ne présente plus les éléments à synchroniser qu'un par un - See #1058 - - - - - c4d4d144 by Tony CHEMIT at 2018-09-20T21:39:56Z L'UI de synchro de référentiels ne présente plus les éléments à synchroniser qu'un par un - Closes #1058 - - - - - c584d205 by Tony CHEMIT at 2018-09-20T21:42:54Z Only remove program node if it is enabled (otherwise it is not in navigation tree) - - - - - 97932c26 by Tony CHEMIT at 2018-09-20T21:43:12Z [SYNCHRO] Problème avec la synchro avancée d'un programme - Closes #1063 - - - - - 1c6911bf by Tony CHEMIT at 2018-09-20T21:51:47Z [SYNCHRO] La synchro avancée d'une marée nécessitant une référence absente dans la base cible provoque une exception - Closes #1064 - - - - - b1bdef9b by Tony CHEMIT at 2018-09-20T21:52:12Z L'UI de remplacement de code de référentiel dépasse parfois les limites de l'écran - Closes #1059 - - - - - d9519a0d by Tony CHEMIT at 2018-09-20T21:52:28Z remove EntityMap class - - - - - 3b2a79fe by Tony CHEMIT at 2018-09-20T21:55:17Z Use topia-extension usage support to compute usages (see #1066) - - - - - 56066f62 by Tony CHEMIT at 2018-09-20T21:56:19Z use new topia metadata model feature to generate clean sql statements (See #1065) - - - - - e51e349e by Tony CHEMIT at 2018-09-20T21:56:32Z improve logs (validators are now warns a lot too much :() - - - - - 52266f0e by Tony CHEMIT at 2018-09-20T21:58:16Z [LL] Après migration l'UI v7 n'affiche plus qu'une seule des captures de chaque opération de pêche - Closes #1068 - - - - - fa10436f by Tony CHEMIT at 2018-09-20T21:58:33Z Add more accelerator on referential nb synchro config ui - - - - - 59bfe7b2 by Tony CHEMIT at 2018-09-20T21:58:44Z fix parameter order to generate update sql statement - - - - - 866e60a5 by Tony CHEMIT at 2018-09-20T22:01:42Z fix a missing decorator - - - - - 0b8b734a by Tony CHEMIT at 2018-09-20T22:02:00Z Suppression de la configuration d'ajout de référentiels dans les deux actions de synchronisation de données + réusinage du code commun aux deux actions - - - - - 30 changed files: - client-configuration/src/main/resources/log4j2.xml - client-configuration/src/main/resources/observe-log4j2.xml - client/src/main/java/fr/ird/observe/client/db/ObserveSwingDataSource.java - client/src/main/java/fr/ird/observe/client/ui/ObserveKeyStrokes.java - client/src/main/java/fr/ird/observe/client/ui/admin/AdminTabUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportModel.java - client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportUI.jcss - client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroModel.java - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/referential/ng/ReferentialSynchroUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/content/ref/ContentReferenceUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDeleteUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDesactivateUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDisplayUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/util/UIHelper.java - client/src/main/resources/i18n/client_en_GB.properties - client/src/main/resources/i18n/client_es_ES.properties - client/src/main/resources/i18n/client_fr_FR.properties - dto/src/main/java/fr/ird/observe/dto/data/seine/RouteDto.java - dto/src/main/java/fr/ird/observe/dto/decoration/DecoratorService.java - persistence/pom.xml - persistence/src/main/java/fr/ird/observe/persistence/ObserveTopiaApplicationContext.java - persistence/src/main/java/fr/ird/observe/persistence/migration/DataSourceMigrationForVersion_6_0.java - persistence/src/main/java/fr/ird/observe/persistence/migration/DataSourceMigrationForVersion_7_0.java - pom.xml - server-configuration/src/main/resources/log4j2.xml - server-configuration/src/main/resources/observeweb-log4j2.xml - server/src/main/filtered-resources/mapping The diff was not included because it is too large. View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/68a1691bf5ce55bdc6c9127a20… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/68a1691bf5ce55bdc6c9127a20… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop-7.x] use last pom and topia-extension
by Tony CHEMIT 20 Sep '18

20 Sep '18
Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: db9f5e24 by Tony CHEMIT at 2018-09-20T21:19:29Z use last pom and topia-extension - - - - - 1 changed file: - pom.xml Changes: ===================================== pom.xml ===================================== @@ -26,7 +26,7 @@ <parent> <groupId>io.ultreia.maven</groupId> <artifactId>pom</artifactId> - <version>2018.57</version> + <version>2018.58</version> </parent> <groupId>fr.ird.observe</groupId> @@ -152,7 +152,7 @@ <maven.build.timestamp.format>dd/MM/yyyy HH:mm z</maven.build.timestamp.format> <buildDate>${maven.build.timestamp}</buildDate> - <observeToolkitVersion>3.7.8-SNAPSHOT</observeToolkitVersion> + <observeToolkitVersion>3.7.8</observeToolkitVersion> <!--<lib.version.java4all.http>1.0.13</lib.version.java4all.http>--> <lib.version.nuiton.validation>3.1</lib.version.nuiton.validation> <!--<lib.version.java4all.config>1.0.3</lib.version.java4all.config>--> @@ -162,7 +162,7 @@ <lib.version.h2>1.4.196</lib.version.h2> <!--<lib.version.nuiton.topia>3.6-SNAPSHOT</lib.version.nuiton.topia>--> <!--<lib.version.java4all.eugene>3.0-alpha-21</lib.version.java4all.eugene>--> - <lib.version.java4all.topia>1.1.8-SNAPSHOT</lib.version.java4all.topia> + <!--<lib.version.java4all.topia>1.1.9-SNAPSHOT</lib.version.java4all.topia>--> <!-- license header configuration --> <license.licenseName>gpl_v3</license.licenseName> <license.organizationName>IRD, Code Lutin, Ultreia.io</license.organizationName> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/db9f5e24d58519442e33c8ac410… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/db9f5e24d58519442e33c8ac410… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop-7.x] 2 commits: fix a missing decorator
by Tony CHEMIT 20 Sep '18

20 Sep '18
Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 7e6a822d by Tony CHEMIT at 2018-09-20T20:40:35Z fix a missing decorator - - - - - 4ff135c9 by Tony CHEMIT at 2018-09-20T20:41:25Z Suppression de la configuration d&#39;ajout de référentiels dans les deux actions de synchronisation de données + réusinage du code commun aux deux actions - - - - - 13 changed files: - client/src/main/java/fr/ird/observe/client/ui/admin/AdminTabUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportModel.java - client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportUI.jcss - client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroModel.java - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUI.jcss - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUIHandler.java - client/src/main/resources/i18n/client_en_GB.properties - client/src/main/resources/i18n/client_es_ES.properties - client/src/main/resources/i18n/client_fr_FR.properties - dto/src/main/java/fr/ird/observe/dto/decoration/DecoratorService.java Changes: ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/AdminTabUIHandler.java ===================================== @@ -25,10 +25,16 @@ import fr.ird.observe.client.ObserveRunner; import fr.ird.observe.client.ObserveSwingApplicationContext; import fr.ird.observe.client.db.ObserveSwingDataSource; import fr.ird.observe.client.ui.admin.resume.ShowResumeUI; +import fr.ird.observe.client.ui.content.ref.usage.UsageForDisplayUI; +import fr.ird.observe.client.ui.util.ProgressModel; +import fr.ird.observe.client.ui.util.UIHelper; import fr.ird.observe.dto.I18nEnumHelper; import fr.ird.observe.dto.decoration.DecoratorService; +import fr.ird.observe.dto.decoration.ObserveI18nDecoratorHelper; import fr.ird.observe.dto.decoration.decorators.ReferentialReferenceDecorator; import fr.ird.observe.dto.reference.DataDtoReference; +import fr.ird.observe.dto.reference.DtoReference; +import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ProgramReference; import fr.ird.observe.services.service.BabModelVersionException; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; @@ -36,14 +42,23 @@ import fr.ird.observe.services.service.DatabaseNotFoundException; import fr.ird.observe.services.service.data.DeleteTripResult; import fr.ird.observe.services.service.data.ExportTripResult; import fr.ird.observe.services.service.data.ImportTripResult; +import fr.ird.observe.services.service.referential.MissingReferentialRequest; +import fr.ird.observe.services.service.referential.MissingReferentialResult; +import fr.ird.observe.services.service.referential.ReferentialService; +import fr.ird.observe.spi.map.ImmutableSetDtoMap; +import fr.ird.observe.spi.map.ImmutableSetStringMap; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.runtime.swing.wizard.ext.WizardState; import org.nuiton.util.StringUtil; +import javax.swing.JOptionPane; import java.io.PrintWriter; import java.io.StringWriter; +import java.util.Collection; +import java.util.Set; import java.util.concurrent.Callable; import static org.nuiton.i18n.I18n.n; @@ -65,7 +80,7 @@ public class AdminTabUIHandler<U extends AdminTabUI> { protected AdminUI parentUI; /** Service de decoration. */ - private DecoratorService decoratorService; + protected DecoratorService decoratorService; public void beforeInit(U ui) { this.ui = ui; @@ -181,12 +196,13 @@ public class AdminTabUIHandler<U extends AdminTabUI> { } protected void logExportResult(String i18nKey, + String sourceLabel, ExportTripResult tripResult, ReferentialReferenceDecorator programDecorator, ProgramReference program, DataDtoReference trip) { - String message = sendLogResultMessage(i18nKey, programDecorator, program, trip, tripResult.getTime()); + String message = sendLogResultMessage(i18nKey, sourceLabel, programDecorator, program, trip, tripResult.getTime()); if (log.isInfoEnabled()) { log.info(message); } @@ -196,6 +212,7 @@ public class AdminTabUIHandler<U extends AdminTabUI> { protected void logImportResult(String importI18nKey, String deleteI18nKey, + String sourceLabel, ImportTripResult tripResult, ReferentialReferenceDecorator programDecorator, ProgramReference program, @@ -203,7 +220,7 @@ public class AdminTabUIHandler<U extends AdminTabUI> { if (tripResult.isDeleted()) { - String message = sendLogResultMessage(deleteI18nKey, programDecorator, program, trip, tripResult.getDeleteTime()); + String message = sendLogResultMessage(deleteI18nKey, sourceLabel, programDecorator, program, trip, tripResult.getDeleteTime()); if (log.isInfoEnabled()) { log.info(message); } @@ -212,7 +229,7 @@ public class AdminTabUIHandler<U extends AdminTabUI> { if (tripResult.isImported()) { - String message = sendLogResultMessage(importI18nKey, programDecorator, program, trip, tripResult.getImportTime()); + String message = sendLogResultMessage(importI18nKey, sourceLabel, programDecorator, program, trip, tripResult.getImportTime()); if (log.isInfoEnabled()) { log.info(message); } @@ -222,12 +239,13 @@ public class AdminTabUIHandler<U extends AdminTabUI> { } protected void logDeleteResult(String deleteI18nKey, + String sourceLabel, DeleteTripResult tripResult, ReferentialReferenceDecorator programDecorator, ProgramReference program, DataDtoReference trip) { - String message = sendLogResultMessage(deleteI18nKey, programDecorator, program, trip, tripResult.getTime()); + String message = sendLogResultMessage(deleteI18nKey, sourceLabel, programDecorator, program, trip, tripResult.getTime()); if (log.isInfoEnabled()) { log.info(message); } @@ -235,7 +253,7 @@ public class AdminTabUIHandler<U extends AdminTabUI> { } protected String sendLogResultMessage(String i18nKey, - ReferentialReferenceDecorator programDecorator, + String sourceLabel, ReferentialReferenceDecorator programDecorator, ProgramReference program, DataDtoReference trip, long time) { @@ -244,9 +262,60 @@ public class AdminTabUIHandler<U extends AdminTabUI> { String programStr = programDecorator.toString(program); String tripStr = decoratorService.getDataReferenceDecorator(trip.getReferenceType()).toString(trip); String timeStr = StringUtil.convertTime(time); - String message = StringUtils.leftPad(timeStr, 20) + " - " + t(i18nKey, programStr, tripStr); + String message = StringUtils.leftPad(timeStr, 20) + " - " + t(i18nKey, sourceLabel, programStr, tripStr); sendMessage(message); return message; } + protected WizardState prepareCopy(ProgressModel progressModel, ObserveSwingDataSource centralSource, String centralSourceLabel, ObserveSwingDataSource targetSource, String targetSourceLabel, Collection<String> idsToCopy) { + + progressModel.incrementsCurrentStep(); + + ReferentialService targetReferentialService = targetSource.getReferentialService(); + ImmutableSetStringMap targetSourceReferential = targetReferentialService.getReferentialIds(); + MissingReferentialRequest missingReferentialRequest = MissingReferentialRequest.of(targetSourceReferential, idsToCopy.toArray(new String[0])); + MissingReferentialResult missingReferentialResult = centralSource.getReferentialService().computeMissingReferential(missingReferentialRequest); + + progressModel.incrementsCurrentStep(); + + if (missingReferentialResult == null) { + progressModel.incrementsCurrentStep(); + return WizardState.SUCCESSED; + } + + // there is some referential to add to target source + + String message = t("observe.message.show.usage.for.missingReferentials2", centralSourceLabel, targetSourceLabel); + + ImmutableSetDtoMap<ReferentialDtoReference> usages = centralSource.getReferentialMap(missingReferentialResult.getMissingIds()); + UsageForDisplayUI usagesUI = UsageForDisplayUI.build(message, usages); + + int response = UIHelper.askUser(null, + t("observe.title.can.not.export.data2", targetSourceLabel), + usagesUI, + JOptionPane.WARNING_MESSAGE, + new Object[]{ + t("observe.choice.confirm.insert"), + t("observe.choice.cancel")}, + 0); + + if (response != 0) { + return WizardState.CANCELED; + } + + log.info(String.format("Base «%s» - Insertion des référentiels manquants.", targetSourceLabel)); + + for (Class<? extends ReferentialDtoReference> key : usages.referentialReferenceTypes()) { + Set<? extends ReferentialDtoReference> references = usages.get(key); + String type = t(ObserveI18nDecoratorHelper.getTypePluralI18nKey(key)); + sendMessage(t("observe.actions.exportData.message.add.missing.referentials2", targetSourceLabel, references.size(), type)); + Decorator decorator = decoratorService.getReferenceDecorator(key); + for (DtoReference reference : references) { + sendMessage(t("observe.actions.exportData.message.add.missing.referential", decorator.toString(reference))); + } + } + progressModel.incrementsCurrentStep(); + targetReferentialService.insertMissingReferential(missingReferentialResult.getSqlCode()); + return WizardState.SUCCESSED; + } } ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportModel.java ===================================== @@ -61,7 +61,6 @@ public class ExportModel extends AdminActionModel { protected ObserveSwingDataSource centralSource; - protected boolean insertMissingReferentials; private final ProgressModel progressModel = new ProgressModel(); public ExportModel() { @@ -129,15 +128,6 @@ public class ExportModel extends AdminActionModel { } - public boolean isInsertMissingReferentials() { - return insertMissingReferentials; - } - - public void setInsertMissingReferentials(boolean insertMissingReferentials) { - this.insertMissingReferentials = insertMissingReferentials; - firePropertyChange("insertMissingReferential", null, insertMissingReferentials); - } - public boolean validate(AdminUIModel uiModel) { return uiModel.validate(AdminStep.SELECT_DATA) && uiModel.getStepState(step) == WizardState.SUCCESSED; } ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportUI.jaxx ===================================== @@ -64,9 +64,6 @@ public void updateState(WizardState newState) { <JPanel id='NEED_FIX_content'> - <JCheckBox id="insertMissingReferentials" constraints='BorderLayout.NORTH' - onStateChanged='getStepModel().setInsertMissingReferentials(((JCheckBox)event.getSource()).isSelected())'/> - <!-- la liste des trips --> <JScrollPane id='tripPane' constraints='BorderLayout.CENTER'> <JTable id='trips'/> ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportUI.jcss ===================================== @@ -46,8 +46,3 @@ columnHeaderView:{trips.getTableHeader()}; verticalScrollBarPolicy:{JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED}; } - -#insertMissingReferentials { - text:"observe.action.export.requiredInsertMissingReferentials"; - selected:{stepModel.isInsertMissingReferentials()}; -} ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportUIHandler.java ===================================== @@ -6,15 +6,15 @@ * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the + * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public + * + * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% @@ -27,46 +27,35 @@ import fr.ird.observe.client.ui.ObserveKeyStrokes; import fr.ird.observe.client.ui.admin.AdminStep; import fr.ird.observe.client.ui.admin.AdminTabUIHandler; import fr.ird.observe.client.ui.admin.AdminUIModel; +import fr.ird.observe.client.ui.admin.config.ConfigModel; import fr.ird.observe.client.ui.admin.config.ConfigUI; -import fr.ird.observe.client.ui.content.ref.usage.UsageForDisplayUI; import fr.ird.observe.client.ui.tree.selection.SelectionTreeModel; import fr.ird.observe.client.ui.util.ProgressModel; import fr.ird.observe.client.ui.util.UIHelper; import fr.ird.observe.dto.data.longline.TripLonglineReference; import fr.ird.observe.dto.data.seine.TripSeineReference; import fr.ird.observe.dto.decoration.DecoratorService; -import fr.ird.observe.dto.decoration.ObserveI18nDecoratorHelper; import fr.ird.observe.dto.decoration.decorators.DataReferenceDecorator; import fr.ird.observe.dto.decoration.decorators.ReferentialReferenceDecorator; -import fr.ird.observe.dto.reference.DtoReference; -import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ProgramReference; import fr.ird.observe.services.service.data.ExportTripRequest; import fr.ird.observe.services.service.data.ExportTripResult; import fr.ird.observe.services.service.data.ImportTripRequest; import fr.ird.observe.services.service.data.ImportTripResult; import fr.ird.observe.services.service.data.TripManagementService; -import fr.ird.observe.services.service.referential.MissingReferentialRequest; -import fr.ird.observe.services.service.referential.MissingReferentialResult; -import fr.ird.observe.services.service.referential.ReferentialService; -import fr.ird.observe.spi.map.ImmutableSetDtoMap; -import fr.ird.observe.spi.map.ImmutableSetStringMap; import org.apache.commons.collections4.CollectionUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.runtime.spi.UIHandler; import org.nuiton.jaxx.runtime.swing.editor.MyDefaultCellEditor; import org.nuiton.jaxx.runtime.swing.wizard.ext.WizardState; -import javax.swing.JOptionPane; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Date; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; import static org.nuiton.i18n.I18n.n; @@ -157,18 +146,14 @@ public class ExportUIHandler extends AdminTabUIHandler<ExportUI> implements UIHa } } - public void doPrepareAction() { - + void doPrepareAction() { addAdminWorker(ui.getPrepareAction().getToolTipText(), this::doPrepareAction0); } public void doStartAction() { - int[] rows = ui.getTripsModel().getSelected(); ui.getModel().getExportModel().setExportDataSelectedIndex(rows); - addAdminWorker(ui.getStartAction().getToolTipText(), this::doStartAction0); - } private WizardState doPrepareAction0() throws Exception { @@ -232,8 +217,9 @@ public class ExportUIHandler extends AdminTabUIHandler<ExportUI> implements UIHa AdminUIModel model = ui.getModel(); ExportModel stepModel = model.getExportModel(); - - boolean insertMissingReferentials = stepModel.isInsertMissingReferentials(); + ConfigModel configModel = model.getConfigModel(); + String sourceSourceLabel = configModel.getLocalSourceModel().getLabelWithUrl().substring(configModel.getLocalSourceModel().getLabel().length()); + String centralSourceLabel = configModel.getCentralSourceModel().getLabelWithUrl().substring(configModel.getCentralSourceModel().getLabel().length()); // on filtre les marées sélectionnées pour export List<TripEntry> tripEntries = stepModel.getSelectedTrips(); @@ -243,10 +229,7 @@ public class ExportUIHandler extends AdminTabUIHandler<ExportUI> implements UIHa DecoratorService decoratorService = getDecoratorService(); ReferentialReferenceDecorator<ProgramReference> programDecorator = decoratorService.getReferentialReferenceDecorator(ProgramReference.class); - int stepCount = 2 + 2 * tripEntries.size(); - if (insertMissingReferentials) { - stepCount++; - } + int stepCount = 4 + 2 * tripEntries.size(); ProgressModel progressModel = stepModel.getProgressModel(); progressModel.setStepsCount(stepCount); @@ -261,71 +244,11 @@ public class ExportUIHandler extends AdminTabUIHandler<ExportUI> implements UIHa TripManagementService centralTripManagementService = centralDataSource.getTripManagementService(); - ReferentialService centralReferentialService = centralDataSource.getReferentialService(); - - // chargement du référentiel de la base centrale - if (log.isInfoEnabled()) { - log.info("Chargement du réferentiel de la base centrale."); - } - ImmutableSetStringMap centralSourceReferential = centralReferentialService.getReferentialIds(); - List<String> tripIds = tripEntries.stream().map(TripEntry::getTripId).collect(Collectors.toList()); - // génération du code sql pour les référentiels manquants - if (log.isInfoEnabled()) { - log.info("Chargement de l'enveloppe de référentiels pour les " + tripIds.size() + " marée(s)."); - } - MissingReferentialRequest missingReferentialRequest = MissingReferentialRequest.of(centralSourceReferential, tripIds.toArray(new String[0])); - MissingReferentialResult result = - localDataSource.getReferentialService().computeMissingReferential(missingReferentialRequest); - - if (!insertMissingReferentials && result != null) { - - // l'export n'est pas possible - UIHelper.displayWarning(t("observe.title.can.not.export.data"), t("observe.actions.exportData.error.missingReferentialsId")); - sendMessage(t("observe.actions.exportData.error.missingReferentialsId")); - return WizardState.CANCELED; - } - - if (insertMissingReferentials && result != null) { - - String message = t("observe.message.show.usage.for.missingReferentials"); - - ImmutableSetDtoMap<ReferentialDtoReference> usages = localDataSource.getReferentialMap(result.getMissingIds()); - UsageForDisplayUI usagesUI = UsageForDisplayUI.build(message, usages); - - int reponse = UIHelper.askUser(null, - t("observe.title.can.not.export.data"), - usagesUI, - JOptionPane.WARNING_MESSAGE, - new Object[]{ - t("observe.choice.confirm.insert"), - t("observe.choice.cancel")}, - 0); - - if (reponse != 0) { - - return WizardState.CANCELED; - } - - // insertion des référentiels manquants dans la base centrale - if (log.isInfoEnabled()) { - log.info("Insertion dans la base centrale des référentiels manquants."); - } - - for (Class<? extends ReferentialDtoReference> key : usages.referentialReferenceTypes()) { - Set<? extends ReferentialDtoReference> references = usages.get(key); - String type = t(ObserveI18nDecoratorHelper.getTypePluralI18nKey(key)); - sendMessage(t("observe.actions.exportData.message.add.missing.referentials", type, references.size())); - Decorator decorator = decoratorService.getReferenceDecorator(key); - for (DtoReference reference : references) { - sendMessage(t("observe.actions.exportData.message.add.missing.referential", decorator.toString(reference))); - } - } - - progressModel.incrementsCurrentStep(); - centralReferentialService.insertMissingReferential(result.getSqlCode()); - + WizardState result = prepareCopy(progressModel, localDataSource, sourceSourceLabel, centralDataSource, centralSourceLabel, tripIds); + if (WizardState.CANCELED.equals(result)) { + return result; } for (TripEntry tripEntry : tripEntries) { @@ -333,7 +256,8 @@ public class ExportUIHandler extends AdminTabUIHandler<ExportUI> implements UIHa progressModel.incrementsCurrentStep(); ExportTripRequest exportTripRequest = new ExportTripRequest(false, tripEntry.getProgramId(), tripEntry.getTripId()); ExportTripResult exportTripResult = localTripManagementService.exportTrip(exportTripRequest); - logExportResult(n("observe.actions.exportData.message.result.export.trip"), + logExportResult(n("observe.actions.synchro.data.result.export.trip"), + sourceSourceLabel, exportTripResult, programDecorator, tripEntry.getProgram(), @@ -342,8 +266,9 @@ public class ExportUIHandler extends AdminTabUIHandler<ExportUI> implements UIHa progressModel.incrementsCurrentStep(); ImportTripRequest importTripRequest = new ImportTripRequest(exportTripResult); ImportTripResult importTripResult = centralTripManagementService.importTrip(importTripRequest); - logImportResult(n("observe.actions.exportData.message.result.import.trip"), - n("observe.actions.exportData.message.result.delete.trip"), + logImportResult(n("observe.actions.synchro.data.result.import.trip"), + n("observe.actions.synchro.data.result.delete.trip"), + centralSourceLabel, importTripResult, programDecorator, tripEntry.getProgram(), ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroModel.java ===================================== @@ -64,7 +64,7 @@ public class DataSynchroModel extends AdminActionModel { /** les données sélectionnées sur le panneau de droite. */ protected SelectionTreeModel rightSelectionDataModel; - protected boolean insertMissingReferentials; + protected final DefaultListModel<DataSynchronizeTaskSupport> tasks; private final ProgressModel progressModel = new ProgressModel(); @@ -131,14 +131,6 @@ public class DataSynchroModel extends AdminActionModel { return rightSelectionDataModel; } - public boolean isInsertMissingReferentials() { - return insertMissingReferentials; - } - - public void setInsertMissingReferentials(boolean insertMissingReferentials) { - this.insertMissingReferentials = insertMissingReferentials; - } - public void populateLeftSelectionModel() { populateSelectionModel(leftSource, leftSelectionDataModel, LEFT_SELECTION_MODEL_CHANGED_PROPERTY_NAME); } ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUI.jaxx ===================================== @@ -49,9 +49,6 @@ </Table> </JPanel> <JPanel id='NEED_FIX_content'> - <JCheckBox id="insertMissingReferentials" constraints='BorderLayout.NORTH' - onStateChanged='getStepModel().setInsertMissingReferentials(((JCheckBox)event.getSource()).isSelected())'/> - <JSplitPane id="contentSplitPane" constraints='BorderLayout.CENTER'> <Table id='contentNorth' fill="both" weighty="1"> <row> ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUI.jcss ===================================== @@ -45,11 +45,6 @@ mnemonic:Q; } -#insertMissingReferentials { - text:"observe.action.export.requiredInsertMissingReferentials"; - selected:{stepModel.isInsertMissingReferentials()}; -} - #leftTree { minimumSize:{UIHelper.newMinDimension()}; font-size:11; ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUIHandler.java ===================================== @@ -33,17 +33,12 @@ import fr.ird.observe.client.ui.admin.synchronize.data.task.CopyToRightDataSynch import fr.ird.observe.client.ui.admin.synchronize.data.task.DataSynchronizeTaskSupport; import fr.ird.observe.client.ui.admin.synchronize.data.task.DeleteFromLeftDataSynchronizeTask; import fr.ird.observe.client.ui.admin.synchronize.data.task.DeleteFromRightDataSynchronizeTask; -import fr.ird.observe.client.ui.content.ref.usage.UsageForDisplayUI; import fr.ird.observe.client.ui.tree.selection.SelectionTree; import fr.ird.observe.client.ui.tree.selection.SelectionTreeModel; import fr.ird.observe.client.ui.util.ProgressModel; -import fr.ird.observe.client.ui.util.UIHelper; import fr.ird.observe.dto.decoration.DecoratorService; -import fr.ird.observe.dto.decoration.ObserveI18nDecoratorHelper; import fr.ird.observe.dto.decoration.decorators.ReferentialReferenceDecorator; import fr.ird.observe.dto.reference.DataDtoReference; -import fr.ird.observe.dto.reference.DtoReference; -import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ProgramReference; import fr.ird.observe.services.service.data.DeleteTripRequest; import fr.ird.observe.services.service.data.DeleteTripResult; @@ -52,19 +47,12 @@ import fr.ird.observe.services.service.data.ExportTripResult; import fr.ird.observe.services.service.data.ImportTripRequest; import fr.ird.observe.services.service.data.ImportTripResult; import fr.ird.observe.services.service.data.TripManagementService; -import fr.ird.observe.services.service.referential.MissingReferentialRequest; -import fr.ird.observe.services.service.referential.MissingReferentialResult; -import fr.ird.observe.services.service.referential.ReferentialService; -import fr.ird.observe.spi.map.ImmutableSetDtoMap; -import fr.ird.observe.spi.map.ImmutableSetStringMap; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.runtime.spi.UIHandler; import org.nuiton.jaxx.runtime.swing.wizard.ext.WizardState; import javax.swing.DefaultListModel; -import javax.swing.JOptionPane; import javax.swing.border.TitledBorder; import java.awt.Color; import java.util.LinkedHashSet; @@ -84,6 +72,8 @@ import static org.nuiton.i18n.I18n.t; public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> implements UIHandler<DataSynchroUI> { private static final Logger log = LogManager.getLogger(DataSynchroUIHandler.class); + private String leftSourceLabel; + private String rightSourceLabel; @Override public void afterInit(DataSynchroUI ui) { @@ -143,7 +133,7 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple addAdminWorker(getUi().getStartAction().getToolTipText(), this::doStartAction0); } - public void addCopyToLeftTasks() { + void addCopyToLeftTasks() { SelectionTreeModel rightSelectionDataModel = getStepModel().getRightSelectionDataModel(); SelectionTreeModel leftSelectionDataModel = getStepModel().getLeftSelectionDataModel(); Map<ProgramReference, List<DataDtoReference<?, ?>>> selectedDataByProgram = rightSelectionDataModel.getSelectedDataByProgram(); @@ -160,7 +150,7 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple } } - public void addCopyToRightTasks() { + void addCopyToRightTasks() { SelectionTreeModel leftSelectionDataModel = getStepModel().getLeftSelectionDataModel(); SelectionTreeModel rightSelectionDataModel = getStepModel().getRightSelectionDataModel(); Map<ProgramReference, List<DataDtoReference<?, ?>>> selectedDataByProgram = leftSelectionDataModel.getSelectedDataByProgram(); @@ -177,7 +167,7 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple } } - public void addDeleteFromLeftTasks() { + void addDeleteFromLeftTasks() { SelectionTreeModel selectionDataModel = getStepModel().getLeftSelectionDataModel(); Map<ProgramReference, List<DataDtoReference<?, ?>>> selectedDataByProgram = selectionDataModel.getSelectedDataByProgram(); selectionDataModel.removeAllSelectedData(); @@ -189,7 +179,7 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple } } - public void addDeleteFromRightTasks() { + void addDeleteFromRightTasks() { SelectionTreeModel selectionDataModel = getStepModel().getRightSelectionDataModel(); Map<ProgramReference, List<DataDtoReference<?, ?>>> selectedDataByProgram = selectionDataModel.getSelectedDataByProgram(); selectionDataModel.removeAllSelectedData(); @@ -201,7 +191,24 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple } } - public void doExecuteAction() { + public String getLeftSourceLabel() { + if (leftSourceLabel == null) { + ConfigModel configModel = getModel().getConfigModel(); + leftSourceLabel = configModel.getLocalSourceModel().getLabelWithUrl().substring(configModel.getLocalSourceModel().getLabel().length()); + } + return leftSourceLabel; + } + + public String getRightSourceLabel() { + if (rightSourceLabel == null) { + ConfigModel configModel = getModel().getConfigModel(); + rightSourceLabel = configModel.getCentralSourceModel().getLabelWithUrl().substring(configModel.getCentralSourceModel().getLabel().length()); + } + return rightSourceLabel; + } + + void doExecuteAction() { + leftSourceLabel = rightSourceLabel = null; addAdminWorker(getUi().getStartAction().getToolTipText(), this::doExecuteAction0); } @@ -211,6 +218,9 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple DataSynchroModel stepModel = getStepModel(); ConfigUI configUI = (ConfigUI) parentUI.getStepUI(AdminStep.CONFIG); + String leftSourceLabel = getLeftSourceLabel(); + String rightSourceLabel = getRightSourceLabel(); + ConfigModel configModel = getModel().getConfigModel(); ObserveSwingDataSource leftSource = configModel.getSafeLocalSource(true); @@ -220,10 +230,9 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple stepModel.setRightSource(rightSource); stepModel.populateLeftSelectionModel(); - String leftLabelWithUrl = configModel.getLocalSourceModel().getLabelWithUrl(); - sendMessage(t("observe.actions.synchro.data.message.data.loaded", leftLabelWithUrl)); + sendMessage(t("observe.actions.synchro.data.message.data.loaded", leftSourceLabel)); - TitledBorder leftBorder = new TitledBorder(leftLabelWithUrl); + TitledBorder leftBorder = new TitledBorder(leftSourceLabel); boolean leftCanWriteData = configModel.getLocalSourceModel().getDataSourceInformation().canWriteData(); leftBorder.setTitleColor(leftCanWriteData ? Color.GREEN : Color.RED); tabUI.getLeftTreePane().setBorder(leftBorder); @@ -234,10 +243,9 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple configUI.getLocalSourceConfig().setBorder(leftBorder); stepModel.populateRightSelectionModel(); - String rightLabelWithUrl = configModel.getCentralSourceModel().getLabelWithUrl(); - sendMessage(t("observe.actions.synchro.data.message.data.loaded", rightLabelWithUrl)); + sendMessage(t("observe.actions.synchro.data.message.data.loaded", rightSourceLabel)); - TitledBorder rightBorder = new TitledBorder(rightLabelWithUrl); + TitledBorder rightBorder = new TitledBorder(rightSourceLabel); boolean rightCanWriteData = configModel.getCentralSourceModel().getDataSourceInformation().canWriteData(); rightBorder.setTitleColor(rightCanWriteData ? Color.GREEN : Color.RED); tabUI.getRightTreePane().setBorder(rightBorder); @@ -254,9 +262,11 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple private WizardState doExecuteAction0() { ObserveSwingDataSource leftSource = getStepModel().getLeftSource(); - ObserveSwingDataSource rightSource = getStepModel().getRightSource(); + String leftSourceLabel = getLeftSourceLabel(); + String rightSourceLabel = getRightSourceLabel(); + DefaultListModel<DataSynchronizeTaskSupport> tasks = getStepModel().getTasks(); int size = tasks.size(); @@ -289,131 +299,19 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple progressModel.setStepsCount(stepsCount); DecoratorService decoratorService = getDecoratorService(); - boolean insertMissingReferentials = getStepModel().isInsertMissingReferentials(); if (copyToLeft) { - // generate add missing referential to left - - progressModel.incrementsCurrentStep(); - - ReferentialService leftReferentialService = leftSource.getReferentialService(); - ImmutableSetStringMap leftSourceReferential = leftReferentialService.getReferentialIds(); - MissingReferentialRequest leftMissingReferentialRequest = MissingReferentialRequest.of(leftSourceReferential, idsToCopyToLeft.toArray(new String[0])); - MissingReferentialResult leftMissingReferentialResult = - rightSource.getReferentialService().computeMissingReferential(leftMissingReferentialRequest); - - progressModel.incrementsCurrentStep(); - - if (!insertMissingReferentials && leftMissingReferentialResult != null) { - - // l'export n'est pas possible - UIHelper.displayWarning(t("observe.title.can.not.export.data.left"), t("observe.actions.exportData.error.missingReferentialsId.left")); - sendMessage(t("observe.actions.exportData.error.missingReferentialsId.left")); - return WizardState.CANCELED; - } - - if (leftMissingReferentialResult == null) { - progressModel.incrementsCurrentStep(); - } else { - - // there is some referential to add to left source - - String message = t("observe.message.show.usage.for.missingReferentials.left"); - - ImmutableSetDtoMap<ReferentialDtoReference> usages = rightSource.getReferentialMap(leftMissingReferentialResult.getMissingIds()); - UsageForDisplayUI usagesUI = UsageForDisplayUI.build(message, usages); - - int reponse = UIHelper.askUser(null, - t("observe.title.can.not.export.data.left"), - usagesUI, - JOptionPane.WARNING_MESSAGE, - new Object[]{ - t("observe.choice.confirm.insert"), - t("observe.choice.cancel")}, - 0); - - if (reponse != 0) { - - return WizardState.CANCELED; - } - - // insertion des référentiels manquants dans la base centrale - log.info("Insertion dans la base de gauche des référentiels manquants."); - - for (Class<? extends ReferentialDtoReference> key : usages.referentialReferenceTypes()) { - Set<? extends ReferentialDtoReference> references = usages.get(key); - String type = t(ObserveI18nDecoratorHelper.getTypePluralI18nKey(key)); - sendMessage(t("observe.actions.exportData.message.add.missing.referentials.left", references.size(), type)); - Decorator decorator = decoratorService.getReferenceDecorator(key); - for (DtoReference reference : references) { - sendMessage(t("observe.actions.exportData.message.add.missing.referential", decorator.toString(reference))); - } - } - progressModel.incrementsCurrentStep(); - leftReferentialService.insertMissingReferential(leftMissingReferentialResult.getSqlCode()); + WizardState result = prepareCopy(progressModel, rightSource, rightSourceLabel, leftSource, leftSourceLabel, idsToCopyToLeft); + if (WizardState.CANCELED.equals(result)) { + return result; } } if (copyToRight) { - // generate add missing referential to right - - progressModel.incrementsCurrentStep(); - - ReferentialService rightReferentialService = rightSource.getReferentialService(); - ImmutableSetStringMap rightSourceReferential = rightReferentialService.getReferentialIds(); - MissingReferentialRequest rightMissingReferentialRequest = MissingReferentialRequest.of(rightSourceReferential, idsToCopyToRight.toArray(new String[0])); - MissingReferentialResult rightMissingReferentialResult = - leftSource.getReferentialService().computeMissingReferential(rightMissingReferentialRequest); - - progressModel.incrementsCurrentStep(); - - if (!insertMissingReferentials && rightMissingReferentialResult != null) { - - // l'export n'est pas possible - UIHelper.displayWarning(t("observe.title.can.not.export.data.right"), t("observe.actions.exportData.error.missingReferentialsId.right")); - sendMessage(t("observe.actions.exportData.error.missingReferentialsId.right")); - return WizardState.CANCELED; - } - - if (rightMissingReferentialResult == null) { - progressModel.incrementsCurrentStep(); - } else { - - // there is some referential to add to left source - - String message = t("observe.message.show.usage.for.missingReferentials.right"); - - ImmutableSetDtoMap<ReferentialDtoReference> usages = leftSource.getReferentialMap(rightMissingReferentialResult.getMissingIds()); - UsageForDisplayUI usagesUI = UsageForDisplayUI.build(message, usages); - - int reponse = UIHelper.askUser(null, - t("observe.title.can.not.export.data.right"), - usagesUI, - JOptionPane.WARNING_MESSAGE, - new Object[]{ - t("observe.choice.confirm.insert"), - t("observe.choice.cancel")}, - 0); - - if (reponse != 0) { - - return WizardState.CANCELED; - } - - log.info("Insertion dans la base de droite des référentiels manquants."); - - for (Class<? extends ReferentialDtoReference> key : usages.referentialReferenceTypes()) { - Set<? extends ReferentialDtoReference> references = usages.get(key); - String type = t(ObserveI18nDecoratorHelper.getTypePluralI18nKey(key)); - sendMessage(t("observe.actions.exportData.message.add.missing.referentials.right", references.size(), type)); - Decorator decorator = decoratorService.getReferenceDecorator(key); - for (DtoReference reference : references) { - sendMessage(t("observe.actions.exportData.message.add.missing.referential", decorator.toString(reference))); - } - } - progressModel.incrementsCurrentStep(); - rightReferentialService.insertMissingReferential(rightMissingReferentialResult.getSqlCode()); + WizardState result = prepareCopy(progressModel, leftSource, leftSourceLabel, rightSource, rightSourceLabel, idsToCopyToRight); + if (WizardState.CANCELED.equals(result)) { + return result; } } @@ -427,105 +325,34 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple DataSynchronizeTaskSupport task = tasks.getElementAt(i); ProgramReference program = task.getProgram(); - String programId = program.getId(); - String programStr = programDecorator.toString(program); DataDtoReference trip = task.getTrip(); - String tripId = trip.getId(); - String tripStr = decoratorService.getDataReferenceDecorator(trip.getReferenceType()).toString(trip); progressModel.incrementsCurrentStep(); if (task instanceof DeleteFromLeftDataSynchronizeTask) { - - sendMessage(t("observe.actions.synchro.data.prepare.deleteFromLeftTask", programStr, tripStr)); - - DeleteTripRequest deleteTripRequest = new DeleteTripRequest(programId, tripId); - DeleteTripResult deleteTripResult = leftTripManagementService.deleteTrip(deleteTripRequest); - logDeleteResult(n("observe.actions.synchro.data.result.delete.left.trip"), - deleteTripResult, - programDecorator, - program, - trip); - if (leftSource.isLocal()) { - leftSource.setModified(true); - } + executeDeleteTask(programDecorator, program, trip, + leftSource, leftSourceLabel, leftTripManagementService); continue; - } if (task instanceof DeleteFromRightDataSynchronizeTask) { - - sendMessage(t("observe.actions.synchro.data.prepare.deleteFromRightTask", programStr, tripStr)); - - DeleteTripRequest deleteTripRequest = new DeleteTripRequest(programId, tripId); - DeleteTripResult deleteTripResult = rightTripManagementService.deleteTrip(deleteTripRequest); - logDeleteResult(n("observe.actions.synchro.data.result.delete.right.trip"), - deleteTripResult, - programDecorator, - program, - trip); - if (rightSource.isLocal()) { - rightSource.setModified(true); - } + executeDeleteTask(programDecorator, program, trip, + rightSource, rightSourceLabel, rightTripManagementService); continue; - } if (task instanceof CopyToLeftDataSynchronizeTask) { - - sendMessage(t("observe.actions.synchro.data.prepare.copyToLeftTask", programStr, tripStr)); - - ExportTripRequest exportTripRequest = new ExportTripRequest(!leftSource.isLocal(), programId, tripId); - ExportTripResult exportTripResult = rightTripManagementService.exportTrip(exportTripRequest); - logExportResult(n("observe.actions.synchro.data.result.export.right.trip"), - exportTripResult, - programDecorator, - program, - trip); - - progressModel.incrementsCurrentStep(); - ImportTripRequest importTripRequest = new ImportTripRequest(exportTripResult); - ImportTripResult importTripResult = leftTripManagementService.importTrip(importTripRequest); - logImportResult(n("observe.actions.synchro.data.result.import.left.trip"), - n("observe.actions.synchro.data.result.delete.left.trip"), - importTripResult, - programDecorator, - program, - trip); - - if (leftSource.isLocal()) { - leftSource.setModified(true); - } + executeCopyTask(progressModel, programDecorator, program, trip, + rightSource, rightSourceLabel, rightTripManagementService, + leftSource, leftSourceLabel, leftTripManagementService); continue; - } if (task instanceof CopyToRightDataSynchronizeTask) { - - sendMessage(t("observe.actions.synchro.data.prepare.copyToRightTask", programStr, tripStr)); - - ExportTripRequest exportTripRequest = new ExportTripRequest(!rightSource.isLocal(), programId, tripId); - ExportTripResult exportTripResult = leftTripManagementService.exportTrip(exportTripRequest); - logExportResult(n("observe.actions.synchro.data.result.export.left.trip"), - exportTripResult, - programDecorator, - program, - trip); - - progressModel.incrementsCurrentStep(); - ImportTripRequest importTripRequest = new ImportTripRequest(exportTripResult); - ImportTripResult importTripResult = rightTripManagementService.importTrip(importTripRequest); - logImportResult(n("observe.actions.synchro.data.result.import.right.trip"), - n("observe.actions.synchro.data.result.delete.right.trip"), - importTripResult, - programDecorator, - program, - trip); - if (rightSource.isLocal()) { - rightSource.setModified(true); - } - + executeCopyTask(progressModel, programDecorator, program, trip, + leftSource, leftSourceLabel, leftTripManagementService, + rightSource, rightSourceLabel, rightTripManagementService); } } @@ -534,4 +361,71 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple } + private void executeDeleteTask(ReferentialReferenceDecorator<ProgramReference> programDecorator, + ProgramReference program, DataDtoReference trip, + ObserveSwingDataSource targetSource, String targetSourceLabel, TripManagementService targetTripManagementService) { + + String programId = program.getId(); + String programStr = programDecorator.toString(program); + + String tripId = trip.getId(); + @SuppressWarnings("unchecked") + String tripStr = decoratorService.getDataReferenceDecorator(trip.getReferenceType()).toString(trip); + + + sendMessage(t("observe.actions.synchro.data.prepare.deleteTask", targetSourceLabel, programStr, tripStr)); + + DeleteTripRequest deleteTripRequest = new DeleteTripRequest(programId, tripId); + DeleteTripResult deleteTripResult = targetTripManagementService.deleteTrip(deleteTripRequest); + logDeleteResult(n("observe.actions.synchro.data.result.delete.trip"), + targetSourceLabel, + deleteTripResult, + programDecorator, + program, + trip); + if (targetSource.isLocal()) { + targetSource.setModified(true); + } + + } + + private void executeCopyTask(ProgressModel progressModel, + ReferentialReferenceDecorator<ProgramReference> programDecorator, + ProgramReference program, DataDtoReference trip, + ObserveSwingDataSource centralSource, String centralSourceLabel, TripManagementService centralTripManagementService, + ObserveSwingDataSource targetSource, String targetSourceLabel, TripManagementService targetTripManagementService) { + + String programId = program.getId(); + String programStr = programDecorator.toString(program); + String tripId = trip.getId(); + @SuppressWarnings("unchecked") + String tripStr = decoratorService.getDataReferenceDecorator(trip.getReferenceType()).toString(trip); + + sendMessage(t("observe.actions.synchro.data.prepare.copyToTask", targetSourceLabel, programStr, tripStr)); + + ExportTripRequest exportTripRequest = new ExportTripRequest(!targetSource.isLocal(), programId, tripId); + ExportTripResult exportTripResult = centralTripManagementService.exportTrip(exportTripRequest); + logExportResult(n("observe.actions.synchro.data.result.export.trip"), + centralSourceLabel, + exportTripResult, + programDecorator, + program, + trip); + + progressModel.incrementsCurrentStep(); + ImportTripRequest importTripRequest = new ImportTripRequest(exportTripResult); + ImportTripResult importTripResult = targetTripManagementService.importTrip(importTripRequest); + logImportResult(n("observe.actions.synchro.data.result.import.trip"), + n("observe.actions.synchro.data.result.delete.trip"), + targetSourceLabel, + importTripResult, + programDecorator, + program, + trip); + + if (targetSource.isLocal()) { + targetSource.setModified(true); + } + } + } ===================================== client/src/main/resources/i18n/client_en_GB.properties ===================================== @@ -155,8 +155,7 @@ observe.actions.exportData.error.missingReferentialsId.left=Can't export data, t observe.actions.exportData.error.missingReferentialsId.right=Can't export data, there is some missing referentials in right source and you did not select insert option. observe.actions.exportData.message.add.missing.referential=\t%s observe.actions.exportData.message.add.missing.referentials=Insert %s missing referentials of type «%s» -observe.actions.exportData.message.add.missing.referentials.left=Insert %s missing referentials of type «%s» in left source -observe.actions.exportData.message.add.missing.referentials.right=Insert %s missing referentials of type «%s» in right source +observe.actions.exportData.message.add.missing.referentials2=Database «%s» - Insert %s missing referentials of type «%s» observe.actions.exportData.message.not.possible=Export is not possible (see above messages) observe.actions.exportData.message.operation.needFix=Select data to export. observe.actions.exportData.message.prepare.data=Prepare data to export... @@ -206,17 +205,12 @@ observe.actions.synchro.data.deleteFromLeft.tip=Delete selected trip(s) from lef observe.actions.synchro.data.deleteFromRight.tip=Delete selected trip(s) from right database observe.actions.synchro.data.description=Advanced data management observe.actions.synchro.data.launch.operation=Get data fro databases -observe.actions.synchro.data.message.data.loaded=%s - Data loaded -observe.actions.synchro.data.prepare.copyToLeftTask=Register operation copy to left database\: %s - %s -observe.actions.synchro.data.prepare.copyToRightTask=Register operation copy to right database\: %s - %s -observe.actions.synchro.data.prepare.deleteFromLeftTask=Register operation delete from left database\: %s - %s -observe.actions.synchro.data.prepare.deleteFromRightTask=Register operation delete from right database\: %s - %s -observe.actions.synchro.data.result.delete.left.trip=Trip %s - %s was removed from left database. -observe.actions.synchro.data.result.delete.right.trip=Trip %s - %s was removed from right database. -observe.actions.synchro.data.result.export.left.trip=Trip %s - %s was exported from left database. -observe.actions.synchro.data.result.export.right.trip=Trip %s - %s was exported from right database. -observe.actions.synchro.data.result.import.left.trip=Trip %s - %s was imported into left database. -observe.actions.synchro.data.result.import.right.trip=Trip %s - %s was imported into right database. +observe.actions.synchro.data.message.data.loaded=Database «%s» - Data loaded +observe.actions.synchro.data.prepare.copyToTask=Database «%s» - Register operation copy to database\: %s - %s +observe.actions.synchro.data.prepare.deleteTask=Database «%s» - Register operation delete from database\: %s - %s +observe.actions.synchro.data.result.delete.trip=Database «%s» - Trip %s - %s was removed from database. +observe.actions.synchro.data.result.export.trip=Database «%s» - Trip %s - %s was exported from database. +observe.actions.synchro.data.result.import.trip=Database «%s» - Trip %s - %s was imported into database. observe.actions.synchro.data.task.copyToLeft=Copy to left database\: <i>%s</i> - «<b>%s</b>» observe.actions.synchro.data.task.copyToRight=Copy to right database\: <i>%s</i> - «<b>%s</b>» observe.actions.synchro.data.task.deleteFromLeft=Delete from left database\: <i>%s</i> - «<b>%s</b>» @@ -1316,8 +1310,7 @@ observe.message.show.usage.for.desactivated=Referential %1$s "%2$s" will be disa observe.message.show.usage.for.desactivated2=Some data are using this referential, see following reference observe.message.show.usage.for.desactivated3=Those data need to use another enabled referential to be saved. observe.message.show.usage.for.missingReferentials=There is some referentials present in local source but not in centrale one. -observe.message.show.usage.for.missingReferentials.left=There is some referentials present in right source but not in left one. -observe.message.show.usage.for.missingReferentials.right=There is some referentials present in left source but not in right one. +observe.message.show.usage.for.missingReferentials2=There is some referentials present in «%s» source but not in the «%s» one. observe.message.show.usages=List of usage of referential %1$s\: '%2$s' observe.message.table.editBean.modified=Current entry is modifed and valid. observe.message.table.editBean.modified.but.invalid=Current entry is modified but not valid. @@ -1473,8 +1466,7 @@ observe.storage.useServerStorage.description=Please configure connexion to remot observe.title.about=About observe.title.can.not.delete.referentiel=Impossible to delete a referentiel data... observe.title.can.not.export.data=Could not export data -observe.title.can.not.export.data.left=Could not export data to left source -observe.title.can.not.export.data.right=Could not export data to right source +observe.title.can.not.export.data2=Could not export data to «%s» source observe.title.can.not.export.obstuna=Could not export obstuna data... observe.title.choose.db.dump=Choose a database backup observe.title.choose.db.dump.directory=Chhose directory of backup ===================================== client/src/main/resources/i18n/client_es_ES.properties ===================================== @@ -155,14 +155,13 @@ observe.actions.exportData.error.missingReferentialsId.left=Il existe des réfé observe.actions.exportData.error.missingReferentialsId.right=Il existe des référentiels dans la base de droite non présente en base centrale, mais vous n'avez pas activé l'option d'insertion automatique. \#TODO observe.actions.exportData.message.add.missing.referential=\t%s observe.actions.exportData.message.add.missing.referentials=Insertion de %s référentiels de type «%s» \#TODO -observe.actions.exportData.message.add.missing.referentials.left=Insertion de %s référentiels de type «%s» dans la base de gauche\#TODO -observe.actions.exportData.message.add.missing.referentials.right=Insertion de %s référentiels de type «%s» dans la base de droite\#TODO +observe.actions.exportData.message.add.missing.referentials2=Base «%s» - Insertion de %s référentiels de type «%s»\#TODO observe.actions.exportData.message.not.possible=La exportación no es posible (vea el mensaje anterior). observe.actions.exportData.message.operation.needFix=Seleccione las mareas a exportar. observe.actions.exportData.message.prepare.data=Preparación de los datos a exportar... -observe.actions.exportData.message.result.delete.trip=La marea %s - %s fue eliminada de la base central -observe.actions.exportData.message.result.export.trip=La marea %s - %s fue exportada de la base locale -observe.actions.exportData.message.result.import.trip=La marea %s - %s fue importada en la base central +observe.actions.exportData.message.result.delete.trip=Base «%s» - La marea %s - %s fue eliminada. +observe.actions.exportData.message.result.export.trip=Base «%s» - La marea %s - %s fue exportada. +observe.actions.exportData.message.result.import.trip=Base «%s» - La marea %s - %s fue importada. observe.actions.exportData.table.exist.label=E observe.actions.exportData.table.exist.label.tip=Marea ya está presente en la base de datos remota observe.actions.exportData.table.program.label=Programa @@ -206,17 +205,12 @@ observe.actions.synchro.data.deleteFromLeft.tip=Eliminar la ou las mareas selecc observe.actions.synchro.data.deleteFromRight.tip=Eliminar la ou las mareas seleccionada(s) de la base de la derecha observe.actions.synchro.data.description=Gestión avanzada de los datos de los usuarios observe.actions.synchro.data.launch.operation=Recuperar los datos de las fuentes de datos -observe.actions.synchro.data.message.data.loaded=%s - Datos recuperadas. -observe.actions.synchro.data.prepare.copyToLeftTask=Preparación de la copia en la base de la izquierda \: %s - %s -observe.actions.synchro.data.prepare.copyToRightTask=Preparación de la copia en la base de la derecha \: %s - %s -observe.actions.synchro.data.prepare.deleteFromLeftTask=Preparación de la eliminación de la base de la izquierda \: %s - %s -observe.actions.synchro.data.prepare.deleteFromRightTask=Preparación de la eliminación de la base de la derecha \: %s - %s -observe.actions.synchro.data.result.delete.left.trip=Eliminación de la marea %s - %s en la base de la izquierda realizada. -observe.actions.synchro.data.result.delete.right.trip=Eliminación de la marea %s - %s en la base de la derecha realizada. -observe.actions.synchro.data.result.export.left.trip=Exportación de la marea %s - %s desde la base de la izquierda realizada. -observe.actions.synchro.data.result.export.right.trip=Exportación de la marea %s - %s desde la base de la derecha realizada. -observe.actions.synchro.data.result.import.left.trip=Inserción de la marea %s - %s en la base de la izquierda realizada. -observe.actions.synchro.data.result.import.right.trip=Inserción de la marea %s - %s en la base de la derecha realizada. +observe.actions.synchro.data.message.data.loaded=Base «%s» - Datos recuperadas. +observe.actions.synchro.data.prepare.copyToTask=Base «%s» - Preparación de la copia \: %s - %s +observe.actions.synchro.data.prepare.deleteTask=Base «%s» - Preparación de la eliminación de la base \: %s - %s +observe.actions.synchro.data.result.delete.trip=Base «%s» - Eliminación de la marea %s - %s en la base. +observe.actions.synchro.data.result.export.trip=Base «%s» - Exportación de la marea %s - %s desde la base. +observe.actions.synchro.data.result.import.trip=Base «%s» - Inserción de la marea %s - %s en la base. observe.actions.synchro.data.task.copyToLeft=Copiar en la base de la izquierda \: <i>%s</i> - «<b>%s</b>» observe.actions.synchro.data.task.copyToRight=Copiar en la base de la derecha \: <i>%s</i> - «<b>%s</b>» observe.actions.synchro.data.task.deleteFromLeft=Eliminar en la base de la izquierda \: <i>%s</i> - «<b>%s</b>» @@ -1316,8 +1310,7 @@ observe.message.show.usage.for.desactivated=El referencial %1$s "%2$s" se desact observe.message.show.usage.for.desactivated2=Los objetos están usando actualmente las referencias que se enumeran a continuación.. observe.message.show.usage.for.desactivated3=Estos objetos deben usar otro referencial (no desactivado) para poder actualizarse. observe.message.show.usage.for.missingReferentials=Il existe des référentiels présents dans la base locale mais non présents dans la base centrale. \#TODO -observe.message.show.usage.for.missingReferentials.left=Il existe des référentiels présents dans la base de droite mais non présents dans la base de gauche. -observe.message.show.usage.for.missingReferentials.right=Il existe des référentiels présents dans la base de gauche mais non présents dans la base droite. +observe.message.show.usage.for.missingReferentials2=There is some referentials present in «%s» source but not in the «%s» one. observe.message.show.usages=Listas de usos de referenciales %1$s \: '%2$s' observe.message.table.editBean.modified=El registro actual se ha modificado y es válido. observe.message.table.editBean.modified.but.invalid=El registro actual se ha modificado pero no es válido. @@ -1473,8 +1466,7 @@ observe.storage.useServerStorage.description=Configure su conexión al servidor observe.title.about=A proposito de ObServe... observe.title.can.not.delete.referentiel=Impossible eliminar un referencial en proceso de utilización... observe.title.can.not.export.data=Impossible d'exporter les données vers la base centrale... \#TODO -observe.title.can.not.export.data.left=Impossible d'exporter les données vers la base de gauche... \#TODO -observe.title.can.not.export.data.right=Impossible d'exporter les données vers la base de droite... \#TODO +observe.title.can.not.export.data2=Impossible d'exporter les données vers la base «%s»... \#TODO observe.title.can.not.export.obstuna=Impossible exportar los datos de obstuna... observe.title.choose.db.dump=Seleccionar una copia de seguridad de base local observe.title.choose.db.dump.directory=Seleccionar e directorio de destinación de la copia de seguridad ===================================== client/src/main/resources/i18n/client_fr_FR.properties ===================================== @@ -155,14 +155,13 @@ observe.actions.exportData.error.missingReferentialsId.left=Il existe des réfé observe.actions.exportData.error.missingReferentialsId.right=Il existe des référentiels dans la base de droite non présente en base centrale, mais vous n'avez pas activé l'option d'insertion automatique. observe.actions.exportData.message.add.missing.referential=\t%s observe.actions.exportData.message.add.missing.referentials=Insertion de %s référentiels de type «%s» -observe.actions.exportData.message.add.missing.referentials.left=Insertion de %s référentiels de type «%s» dans la base de gauche -observe.actions.exportData.message.add.missing.referentials.right=Insertion de %s référentiels de type «%s» dans la base de droite +observe.actions.exportData.message.add.missing.referentials2=Source «%s» - Insertion de %s référentiels de type «%s» observe.actions.exportData.message.not.possible=L'opération d'export n'est pas possible (voir les messages précédents). observe.actions.exportData.message.operation.needFix=Veuillez sélectionner les marées à exporter. observe.actions.exportData.message.prepare.data=Préparation des données à exporter... -observe.actions.exportData.message.result.delete.trip=La marée %s - %s a été supprimée de la base centrale -observe.actions.exportData.message.result.export.trip=La marée %s - %s a été exportée depuis la base locale -observe.actions.exportData.message.result.import.trip=La marée %s - %s a été importée dans la base centrale +observe.actions.exportData.message.result.delete.trip=Source «%s» - La marée %s - %s a été supprimée de la base centrale +observe.actions.exportData.message.result.export.trip=Source «%s» - La marée %s - %s a été exportée depuis la base locale +observe.actions.exportData.message.result.import.trip=Source «%s» - La marée %s - %s a été importée dans la base centrale observe.actions.exportData.table.exist.label=E observe.actions.exportData.table.exist.label.tip=Marée déjà présente sur la base distante observe.actions.exportData.table.program.label=Programme @@ -206,17 +205,12 @@ observe.actions.synchro.data.deleteFromLeft.tip=Supprimer la ou les marées sél observe.actions.synchro.data.deleteFromRight.tip=Supprimer la ou les marées sélectionnée(s) de la base de droite observe.actions.synchro.data.description=Gestion avancée des données utilisateurs observe.actions.synchro.data.launch.operation=Récupérer les données des sources de données -observe.actions.synchro.data.message.data.loaded=%s - Données récupérées. -observe.actions.synchro.data.prepare.copyToLeftTask=Préparation de la recopie vers la base de gauche \: %s - %s -observe.actions.synchro.data.prepare.copyToRightTask=Préparation de la recopie vers la base de droite \: %s - %s -observe.actions.synchro.data.prepare.deleteFromLeftTask=Préparation de la suppression de la base de gauche \: %s - %s -observe.actions.synchro.data.prepare.deleteFromRightTask=Préparation de la suppression de la base de droite \: %s - %s -observe.actions.synchro.data.result.delete.left.trip=Suppression de la marée %s - %s dans la base de gauche effectuée. -observe.actions.synchro.data.result.delete.right.trip=Suppression de la marée %s - %s dans la base de droite effectuée. -observe.actions.synchro.data.result.export.left.trip=Export de la marée %s - %s depuis la base de gauche effectuée. -observe.actions.synchro.data.result.export.right.trip=Export de la marée %s - %s depuis la base de droite effectuée. -observe.actions.synchro.data.result.import.left.trip=Insertion de la marée %s - %s dans la base de gauche effectuée. -observe.actions.synchro.data.result.import.right.trip=Insertion de la marée %s - %s dans la base de droite effectuée. +observe.actions.synchro.data.message.data.loaded=Source «%s» - Données récupérées. +observe.actions.synchro.data.prepare.copyToTask=Source «%s» - Préparation de la recopie \: %s - %s +observe.actions.synchro.data.prepare.deleteTask=Source «%s» - Préparation de la suppression \: %s - %s +observe.actions.synchro.data.result.delete.trip=Source «%s» - Suppression de la marée %s - %s effectuée. +observe.actions.synchro.data.result.export.trip=Source «%s» - Export de la marée %s - %s effectuée. +observe.actions.synchro.data.result.import.trip=Source «%s» - Insertion de la marée %s - %s effectuée. observe.actions.synchro.data.task.copyToLeft=Copier vers la base de gauche \: <i>%s</i> - «<b>%s</b>» observe.actions.synchro.data.task.copyToRight=Copier vers la base de droite \: <i>%s</i> - «<b>%s</b>» observe.actions.synchro.data.task.deleteFromLeft=Supprimer de la base de gauche \: <i>%s</i> - «<b>%s</b>» @@ -1316,8 +1310,7 @@ observe.message.show.usage.for.desactivated=Le référentiel %1$s "%2$s" va êtr observe.message.show.usage.for.desactivated2=Des objets utilisent actuellement cet entité dont les références sont citées plus bas. observe.message.show.usage.for.desactivated3=Ces objets devront utiliser un autre référentiel (non désactivé) pour pouvoir être mis à jour. observe.message.show.usage.for.missingReferentials=Il existe des référentiels présents dans la base locale mais non présents dans la base centrale. -observe.message.show.usage.for.missingReferentials.left=Il existe des référentiels présents dans la base de droite mais non présents dans la base de gauche. -observe.message.show.usage.for.missingReferentials.right=Il existe des référentiels présents dans la base de gauche mais non présents dans la base droite. +observe.message.show.usage.for.missingReferentials2=Il existe des référentiels présents dans la base «%s» mais non présents dans la base «%s». observe.message.show.usages=Listes des utilisations du référentiel %1$s \: '%2$s' observe.message.table.editBean.modified=L'entrée en cours d'édition a été modifiée et est valide. observe.message.table.editBean.modified.but.invalid=L'entrée en cours d'édition a été modifiée, mais n'est pas valide. @@ -1473,8 +1466,7 @@ observe.storage.useServerStorage.description=Veuillez configurer votre connexion observe.title.about=A propos d'ObServe... observe.title.can.not.delete.referentiel=Impossible de supprimer un référentiel en cours d'utilisation... observe.title.can.not.export.data=Impossible d'exporter les données vers la base centrale... -observe.title.can.not.export.data.left=Impossible d'exporter les données vers la base de gauche... -observe.title.can.not.export.data.right=Impossible d'exporter les données vers la base de droite... +observe.title.can.not.export.data2=Impossible d'exporter les données vers la base «%s»... observe.title.can.not.export.obstuna=Impossible d'exporter des données d'obstuna... observe.title.choose.db.dump=Choisir une sauvegarder de base locale observe.title.choose.db.dump.directory=Choisir le répertoire de destination de la sauvegarde ===================================== dto/src/main/java/fr/ird/observe/dto/decoration/DecoratorService.java ===================================== @@ -57,6 +57,7 @@ import fr.ird.observe.dto.data.longline.SizeMeasureDto; import fr.ird.observe.dto.data.longline.SizeMeasureReference; import fr.ird.observe.dto.data.longline.TdrDto; import fr.ird.observe.dto.data.longline.TdrReference; +import fr.ird.observe.dto.data.longline.TripLonglineActivityDto; import fr.ird.observe.dto.data.longline.TripLonglineReference; import fr.ird.observe.dto.data.longline.WeightMeasureDto; import fr.ird.observe.dto.data.longline.WeightMeasureReference; @@ -361,6 +362,8 @@ public class DecoratorService extends DecoratorProvider { "${timeStamp}$td/%1$tm/%1$tY %1$tH:%1$tM##${vesselActivityLongline/label}$s", "${timeStamp}$td/%1$tm/%1$tY %1$tH:%1$tM##${vesselActivityLonglineLabel}$s", " - "); + + registerObserveDecorator(TripLonglineActivityDto.class, "${timeStamp}$td/%1$tm/%1$tY %1$tH:%1$t", " - "); } @Override View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/4f6ea307b1f060d966b99ef88f… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/4f6ea307b1f060d966b99ef88f… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop-7.x] 2 commits: Add more accelerator on referential nb synchro config ui
by Tony CHEMIT 20 Sep '18

20 Sep '18
Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 1fd32665 by Tony CHEMIT at 2018-09-20T18:28:57Z Add more accelerator on referential nb synchro config ui - - - - - 4f6ea307 by Tony CHEMIT at 2018-09-20T18:29:16Z fix parameter order to generate update sql statement - - - - - 3 changed files: - client/src/main/java/fr/ird/observe/client/ui/ObserveKeyStrokes.java - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/referential/ng/ReferentialSynchroUIHandler.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java Changes: ===================================== client/src/main/java/fr/ird/observe/client/ui/ObserveKeyStrokes.java ===================================== @@ -68,6 +68,10 @@ public abstract class ObserveKeyStrokes { public static final KeyStroke KEY_STROKE_SHOW_EMPTY_PROGRAM = KeyStroke.getKeyStroke("ctrl pressed F5"); public static final KeyStroke KEY_STROKE_CONFIGURE_LOCAL_SOURCE = KeyStroke.getKeyStroke("ctrl pressed L"); public static final KeyStroke KEY_STROKE_CONFIGURE_REMOTE_SOURCE = KeyStroke.getKeyStroke("ctrl pressed R"); + public static final KeyStroke KEY_STROKE_CONFIGURE_SYNCHRO_FROM_LEFT = KeyStroke.getKeyStroke("ctrl pressed A"); + public static final KeyStroke KEY_STROKE_CONFIGURE_SYNCHRO_FROM_RIGHT = KeyStroke.getKeyStroke("ctrl pressed B"); + public static final KeyStroke KEY_STROKE_CONFIGURE_SYNCHRO_FROM_BOTH = KeyStroke.getKeyStroke("ctrl pressed C"); + public static final KeyStroke KEY_STROKE_SAVE_TABLE_ENTRY = KeyStroke.getKeyStroke("ctrl pressed S"); public static final KeyStroke KEY_STROKE_PRESSED_ENTER = KeyStroke.getKeyStroke("pressed ENTER"); public static final KeyStroke KEY_STROKE_RESET_DATA = KeyStroke.getKeyStroke("pressed F7"); ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/referential/ng/ReferentialSynchroUIHandler.java ===================================== @@ -36,17 +36,20 @@ import fr.ird.observe.services.configuration.ObserveDataSourceInformation; import fr.ird.observe.services.service.actions.synchro.referential.diff.ReferentialSynchronizeDiffService; import fr.ird.observe.services.service.actions.synchro.referential.diff.ReferentialSynchronizeDiffsEngine; import org.apache.commons.lang3.tuple.Pair; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.nuiton.jaxx.runtime.context.JAXXInitialContext; import org.nuiton.jaxx.runtime.spi.UIHandler; import org.nuiton.jaxx.runtime.swing.wizard.ext.WizardState; +import javax.swing.AbstractAction; +import javax.swing.JComponent; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.border.TitledBorder; import javax.swing.event.TreeSelectionListener; import java.awt.Color; +import java.awt.event.ActionEvent; import java.util.Optional; import static org.nuiton.i18n.I18n.t; @@ -75,7 +78,7 @@ public class ReferentialSynchroUIHandler extends AdminTabUIHandler<ReferentialSy @Override public void afterInit(ReferentialSynchroUI ui) { - super.afterInit(this.ui); + ConfigUI configUI = (ConfigUI) parentUI.getStepUI(AdminStep.CONFIG); JAXXInitialContext tx = new JAXXInitialContext().add(configUI).add(this); @@ -84,6 +87,33 @@ public class ReferentialSynchroUIHandler extends AdminTabUIHandler<ReferentialSy configUI.getExtraConfig().add(extraConfig); + configUI.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ObserveKeyStrokes.KEY_STROKE_CONFIGURE_SYNCHRO_FROM_LEFT, "fromLeft"); + configUI.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ObserveKeyStrokes.KEY_STROKE_CONFIGURE_SYNCHRO_FROM_RIGHT, "fromRight"); + configUI.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ObserveKeyStrokes.KEY_STROKE_CONFIGURE_SYNCHRO_FROM_BOTH, "fromBoth"); + configUI.getActionMap().put("fromLeft", new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + extraConfig.getLEFT_TO_RIGHT().doClick(); + } + }); + configUI.getActionMap().put("fromRight", new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + extraConfig.getRIGHT_TO_LEFT().doClick(); + } + }); + configUI.getActionMap().put("fromBoth", new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + extraConfig.getBOTH().doClick(); + } + }); + ObserveKeyStrokes.addKeyStroke(extraConfig.getLEFT_TO_RIGHT(), ObserveKeyStrokes.KEY_STROKE_CONFIGURE_SYNCHRO_FROM_LEFT); + ObserveKeyStrokes.addKeyStroke(extraConfig.getRIGHT_TO_LEFT(), ObserveKeyStrokes.KEY_STROKE_CONFIGURE_SYNCHRO_FROM_RIGHT); + ObserveKeyStrokes.addKeyStroke(extraConfig.getBOTH(), ObserveKeyStrokes.KEY_STROKE_CONFIGURE_SYNCHRO_FROM_BOTH); + + super.afterInit(this.ui); + ObserveKeyStrokes.addKeyStrokeFromMnemonic(ui.getStartAction()); ObserveKeyStrokes.addKeyStrokeFromMnemonic(ui.getApplyAction()); } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java ===================================== @@ -152,7 +152,7 @@ public class UpdateSqlStatementGenerator<D extends ReferentialDto> { } } - String updateSql = TopiaSqlStatements.generateUpdateStatement(metadataEntity, parameters.substring(2), referentialDto.getId()); + String updateSql = TopiaSqlStatements.generateUpdateStatement(metadataEntity, referentialDto.getId(), parameters.substring(2)); result.add(updateSql); String id = referentialDto.getId(); View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/ee5c5ef04a1ecb2e2ad68cc9ed… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/ee5c5ef04a1ecb2e2ad68cc9ed… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop-7.x] 2 commits: improve logs (validators are now warns a lot too much :()
by Tony CHEMIT 20 Sep '18

20 Sep '18
Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 699e9f79 by Tony CHEMIT at 2018-09-20T15:57:42Z improve logs (validators are now warns a lot too much :() - - - - - ee5c5ef0 by Tony CHEMIT at 2018-09-20T16:28:44Z [LL] Après migration l&#39;UI v7 n&#39;affiche plus qu&#39;une seule des captures de chaque opération de pêche - Closes #1068 - - - - - 6 changed files: - client-configuration/src/main/resources/log4j2.xml - client-configuration/src/main/resources/observe-log4j2.xml - persistence/src/main/java/fr/ird/observe/persistence/migration/DataSourceMigrationForVersion_6_0.java - persistence/src/main/java/fr/ird/observe/persistence/migration/DataSourceMigrationForVersion_7_0.java - server-configuration/src/main/resources/log4j2.xml - server-configuration/src/main/resources/observeweb-log4j2.xml Changes: ===================================== client-configuration/src/main/resources/log4j2.xml ===================================== @@ -53,6 +53,10 @@ <AppenderRef ref="console"/> <AppenderRef ref="File"/> </Logger> + <Logger name="org.nuiton.jaxx.validator.swing.SwingValidator" level="error" additivity="false"> + <AppenderRef ref="console"/> + <AppenderRef ref="File"/> + </Logger> <Logger name="fr.ird.observe.client.validators" level="warn" additivity="false"> <AppenderRef ref="console"/> <AppenderRef ref="File"/> ===================================== client-configuration/src/main/resources/observe-log4j2.xml ===================================== @@ -53,6 +53,10 @@ <AppenderRef ref="console"/> <AppenderRef ref="File"/> </Logger> + <Logger name="org.nuiton.jaxx.validator.swing.SwingValidator" level="error" additivity="false"> + <AppenderRef ref="console"/> + <AppenderRef ref="File"/> + </Logger> <Logger name="fr.ird.observe.client.validators" level="warn" additivity="false"> <AppenderRef ref="console"/> <AppenderRef ref="File"/> ===================================== persistence/src/main/java/fr/ird/observe/persistence/migration/DataSourceMigrationForVersion_6_0.java ===================================== @@ -62,6 +62,8 @@ public class DataSourceMigrationForVersion_6_0 extends MigrationVersionResource executor.addScript("01", "evol_8374_delete_sonarUsed"); executor.addScript("02", "evol_7886_catch_add_set_idx"); + migrateIdx(executor, "observe_longline", "catch", "set"); + executor.addScript("04", "evol_6832_branchlineComposition_add_tracelineLength"); executor.addScript("05", "evol_6999_nonTargetCatch_add_well"); executor.addScript("06", "evol_8375_setSeine_add_booleans"); ===================================== persistence/src/main/java/fr/ird/observe/persistence/migration/DataSourceMigrationForVersion_7_0.java ===================================== @@ -23,18 +23,10 @@ package fr.ird.observe.persistence.migration; */ import com.google.auto.service.AutoService; -import org.apache.commons.lang3.tuple.Pair; -import org.nuiton.topia.persistence.support.TopiaSqlQuery; -import org.nuiton.topia.service.migration.resources.MigrationVersionResourceExecutor; import org.nuiton.topia.service.migration.resources.MigrationVersionResource; +import org.nuiton.topia.service.migration.resources.MigrationVersionResourceExecutor; import org.nuiton.version.Versions; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - /** * Created on 27/10/16. * @@ -56,47 +48,11 @@ public class DataSourceMigrationForVersion_7_0 extends MigrationVersionResource executor.addScript("03", "add_order_on_seine_catches"); executor.addScript("04", "add_order_on_seine_samples"); - migrateIdx(executor, "nonTargetCatch", "set"); - migrateIdx(executor, "targetCatch", "set"); - migrateIdx(executor, "targetLength", "targetSample"); - migrateIdx(executor, "nonTargetLength", "nonTargetSample"); - - } - - private void migrateIdx(MigrationVersionResourceExecutor executor, String mainTable, String field) { - List<Pair<String, String>> result = executor.findMultipleResult(new MigrateIdxSqlQuery(mainTable, field)); - String currentId = null; - int position = 0; - for (Pair<String, String> pair : result) { - String parentId = pair.getLeft(); - if (!parentId.equals(currentId)) { - position = 0; - currentId = parentId; - } - String id = pair.getRight(); - executor.writeSql(String.format("UPDATE observe_seine.%s SET %s_idx = %d WHERE topiaId = '%s';", mainTable, field, position++, id)); - } + migrateIdx(executor, "observe_seine", "nonTargetCatch", "set"); + migrateIdx(executor, "observe_seine", "targetCatch", "set"); + migrateIdx(executor, "observe_seine", "targetLength", "targetSample"); + migrateIdx(executor, "observe_seine", "nonTargetLength", "nonTargetSample"); } - private static class MigrateIdxSqlQuery extends TopiaSqlQuery<Pair<String, String>> { - - private final String mainTable; - private final String field; - - private MigrateIdxSqlQuery(String mainTable, String field) { - this.mainTable = mainTable; - this.field = field; - } - - @Override - public PreparedStatement prepareQuery(Connection connection) throws SQLException { - return connection.prepareStatement(String.format("select %s, topiaId FROM observe_seine.%s order by %s, topiaCreateDate", field, mainTable, field)); - } - - @Override - public Pair<String, String> prepareResult(ResultSet resultSet) throws SQLException { - return Pair.of(resultSet.getString(1), resultSet.getString(2)); - } - } } ===================================== server-configuration/src/main/resources/log4j2.xml ===================================== @@ -37,6 +37,10 @@ <Logger name="org.nuiton.topia" level="info" additivity="false"> <AppenderRef ref="console"/> </Logger> + <Logger name="org.nuiton.jaxx.validator.swing.SwingValidator" level="error" additivity="false"> + <AppenderRef ref="console"/> + <AppenderRef ref="File"/> + </Logger> <Logger name="fr.ird.observe.client.validators" level="warn" additivity="false"> <AppenderRef ref="console"/> </Logger> ===================================== server-configuration/src/main/resources/observeweb-log4j2.xml ===================================== @@ -50,6 +50,10 @@ <AppenderRef ref="console"/> <AppenderRef ref="File"/> </Logger> + <Logger name="org.nuiton.jaxx.validator.swing.SwingValidator" level="error" additivity="false"> + <AppenderRef ref="console"/> + <AppenderRef ref="File"/> + </Logger> <Logger name="fr.ird.observe.client.validators" level="warn" additivity="false"> <AppenderRef ref="console"/> <AppenderRef ref="File"/> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/f193d8a5c69e4b51ec9fcfa0b3… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/f193d8a5c69e4b51ec9fcfa0b3… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop-7.x] 3 commits: remove EntityMap class
by Tony CHEMIT 20 Sep '18

20 Sep '18
Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 556f5d2a by Tony CHEMIT at 2018-09-19T14:46:06Z remove EntityMap class - - - - - 1b0f5e65 by Tony CHEMIT at 2018-09-20T15:33:43Z Use topia-extension usage support to compute usages (see #1066) - - - - - f193d8a5 by Tony CHEMIT at 2018-09-20T15:35:33Z use new topia metadata model feature to generate clean sql statements (See #1065) - - - - - 15 changed files: - − persistence/src/main/java/fr/ird/observe/entities/EntityMap.java - persistence/src/main/java/fr/ird/observe/persistence/ObserveTopiaApplicationContext.java - pom.xml - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/legacy/UnidirectionalReferentialSynchronizeLocalServiceLocal.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequestBuilder.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/DeleteSqlStatementGenerator.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/DesactivateSqlStatementGenerator.java → services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/DisableSqlStatementGenerator.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/InsertSqlStatementGenerator.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/InsertSqlWithCascadeStatementGenerator.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/ReplaceSqlStatementGenerator.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlWithCascadeStatementGenerator.java - services-local/src/main/java/fr/ird/observe/services/local/service/referential/ReferentialServiceLocal.java - services/pom.xml - services/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequest.java Changes: ===================================== persistence/src/main/java/fr/ird/observe/entities/EntityMap.java deleted ===================================== @@ -1,45 +0,0 @@ -/* - * #%L - * ObServe :: Persistence - * %% - * Copyright (C) 2008 - 2018 IRD, Code Lutin, Ultreia.io - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ -package fr.ird.observe.entities; - -import org.nuiton.topia.persistence.TopiaEntity; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * A Dictionary of entities - * - * @author Tony Chemit - dev(a)tchemit.fr - * @since 1.4 - */ -public class EntityMap extends HashMap<Class<? extends TopiaEntity>, List<? extends TopiaEntity>> { - private static final long serialVersionUID = 1L; - - public EntityMap() { - } - - public EntityMap(Map<? extends Class<? extends TopiaEntity>, ? extends List<? extends TopiaEntity>> m) { - super(m); - } -} ===================================== persistence/src/main/java/fr/ird/observe/persistence/ObserveTopiaApplicationContext.java ===================================== @@ -10,12 +10,12 @@ package fr.ird.observe.persistence; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. @@ -24,19 +24,22 @@ package fr.ird.observe.persistence; import com.google.common.collect.ImmutableSet; import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.hibernate.HibernateException; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.schema.TargetType; +import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaException; import org.nuiton.topia.persistence.internal.support.TopiaMetadataModelSupportImpl; +import org.nuiton.topia.persistence.internal.support.TopiaUsageSupportImpl; import org.nuiton.topia.persistence.jdbc.JdbcHelper; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; import org.nuiton.topia.persistence.script.SqlScriptReader; import org.nuiton.topia.persistence.script.TopiaSqlScript; import org.nuiton.topia.persistence.support.TopiaMetadataModelSupport; +import org.nuiton.topia.persistence.support.TopiaUsageSupport; import org.nuiton.topia.service.migration.TopiaMigrationService; import org.nuiton.topia.service.script.TopiaSqlScriptGeneratorService; import org.nuiton.topia.service.script.table.TopiaSqlTable; @@ -45,13 +48,16 @@ import org.nuiton.topia.service.script.table.TopiaSqlTablesFactory; import java.util.EnumSet; import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.UUID; +import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; -public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicationContext implements TopiaMetadataModelSupport { +public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicationContext { static final String MIGRATION_SERVICE_NAME = "migration"; static final String SQL_SCRIPT_GENERATOR_BATCH_SERVICE_NAME = "sqlScriptGenerator"; @@ -65,6 +71,7 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat protected final String authenticationToken; private final TopiaMetadataModelSupport topiaMetadataModelSupport; private final TopiaSqlTablesFactory topiaSqlTablesFactory; + private final TopiaUsageSupport topiaUsageSupport; /** * Mise à {@code true} quand au moins une connection a été effectuée. */ @@ -78,6 +85,7 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat this.authenticationToken = UUID.randomUUID().toString(); this.topiaMetadataModelSupport = new TopiaMetadataModelSupportImpl("fr.ird.observe.persistence", "Observe"); this.topiaSqlTablesFactory = new TopiaSqlTablesFactory(getMetadataModel(), this); + this.topiaUsageSupport = new TopiaUsageSupportImpl(topiaMetadataModelSupport, this); } @Override @@ -108,6 +116,22 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat return getServices(TopiaSqlScriptGeneratorService.class).get(SQL_SCRIPT_GENERATOR_BATCH_SERVICE_NAME); } + public Map<Class<? extends TopiaEntity>, List<? extends TopiaEntity>> findReverseCompositions(ObserveTopiaPersistenceContext topiaPersistenceContext, TopiaEntity entity, Predicate<Class<? extends TopiaEntity>> entityTypeFilter) { + return topiaUsageSupport.findReverseCompositions(topiaPersistenceContext, entity, entityTypeFilter); + } + + public Map<Class<? extends TopiaEntity>, List<? extends TopiaEntity>> findReverseAssociations(ObserveTopiaPersistenceContext topiaPersistenceContext, TopiaEntity entity, Predicate<Class<? extends TopiaEntity>> entityTypeFilter) { + return topiaUsageSupport.findReverseAssociations(topiaPersistenceContext, entity, entityTypeFilter); + } + + public Map<Class<? extends TopiaEntity>, Long> countReverseCompositions(ObserveTopiaPersistenceContext topiaPersistenceContext, TopiaEntity entity, Predicate<Class<? extends TopiaEntity>> entityTypeFilter) { + return topiaUsageSupport.countReverseCompositions(topiaPersistenceContext, entity, entityTypeFilter); + } + + public Map<Class<? extends TopiaEntity>, Long> countReverseAssociations(ObserveTopiaPersistenceContext topiaPersistenceContext, TopiaEntity entity, Predicate<Class<? extends TopiaEntity>> entityTypeFilter) { + return topiaUsageSupport.countReverseAssociations(topiaPersistenceContext, entity, entityTypeFilter); + } + @Override public void createSchema() { try { @@ -206,7 +230,6 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat return authenticationToken; } - @Override public TopiaMetadataModel getMetadataModel() { return topiaMetadataModelSupport.getMetadataModel(); } @@ -269,7 +292,7 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat basketTable.getFromClause(), basketTable.getWhereClauseAlias(), ImmutableSet.of(" INNER JOIN observe_longline.set set ON set.topiaId = activity.set", - " INNER JOIN observe_longline.basket basket ON basket.set = set.topiaId" + " INNER JOIN observe_longline.basket basket ON basket.set = set.topiaId" ), null); @@ -285,8 +308,8 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat branchlineTable.getFromClause(), branchlineTable.getWhereClauseAlias(), ImmutableSet.of(" INNER JOIN observe_longline.set set ON set.topiaId = activity.set", - " INNER JOIN observe_longline.basket basket ON basket.set = set.topiaId", - " INNER JOIN observe_longline.branchline branchline ON branchline.basket = basket.topiaId" + " INNER JOIN observe_longline.basket basket ON basket.set = set.topiaId", + " INNER JOIN observe_longline.branchline branchline ON branchline.basket = basket.topiaId" ), null); @@ -312,6 +335,7 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat return referentialTables = topiaSqlTablesFactory.newReplicateEntityTables(new TripReplicateTablesPredicate(), entityEnum); } + private static class TripReplicateTablesPredicate implements TopiaSqlTablesFactory.TopiaSqlTablesPredicate { protected final Set<String> sections = ImmutableSet.of( ===================================== pom.xml ===================================== @@ -162,7 +162,7 @@ <lib.version.h2>1.4.196</lib.version.h2> <!--<lib.version.nuiton.topia>3.6-SNAPSHOT</lib.version.nuiton.topia>--> <!--<lib.version.java4all.eugene>3.0-alpha-21</lib.version.java4all.eugene>--> - <!--<lib.version.java4all.topia>1.1.8-SNAPSHOT</lib.version.java4all.topia>--> + <lib.version.java4all.topia>1.1.8-SNAPSHOT</lib.version.java4all.topia> <!-- license header configuration --> <license.licenseName>gpl_v3</license.licenseName> <license.organizationName>IRD, Code Lutin, Ultreia.io</license.organizationName> ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/legacy/UnidirectionalReferentialSynchronizeLocalServiceLocal.java ===================================== @@ -10,12 +10,12 @@ package fr.ird.observe.services.local.service.actions.synchro.referential.legacy * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. @@ -44,8 +44,6 @@ import fr.ird.observe.services.service.actions.synchro.referential.legacy.Unidir import fr.ird.observe.spi.DbModelHelper; import fr.ird.observe.spi.context.ReferentialDtoEntityContext; import fr.ird.observe.spi.context.ReferentialReferenceEntityContext; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import org.nuiton.topia.persistence.TopiaDao; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; @@ -65,9 +63,6 @@ import java.util.Set; */ public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends ObserveServiceLocal implements UnidirectionalReferentialSynchronizeLocalService { - /** Logger. */ - private static final Logger log = LogManager.getLogger(UnidirectionalReferentialSynchronizeLocalServiceLocal.class); - private LastUpdateDateService lastUpdateDateService; @Override @@ -79,9 +74,6 @@ public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends Obser @Override public <D extends ReferentialDto> ImmutableSet<String> filterIdsUsedInLocalSource(Class<D> dtoType, ImmutableSet<String> ids) { - if (log.isTraceEnabled()) { - log.trace("filterIdsUsedInLocalSource(" + dtoType + ", " + ids + ")"); - } Class<? extends ObserveReferentialEntity> entityType = DbModelHelper.fromReferentialDto(dtoType).toEntityType(); Set<String> result = new LinkedHashSet<>(); for (String id : ids) { @@ -107,10 +99,6 @@ public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends Obser @Override public <D extends ReferentialDto> ImmutableSet<String> generateSqlRequests(UnidirectionalReferentialSynchronizeRequest<D> request) { - if (log.isTraceEnabled()) { - log.trace("generateSqlRequests(" + request + ")"); - } - Set<String> result = new LinkedHashSet<>(); Class<D> dtoType = request.getReferentialName(); @@ -122,7 +110,7 @@ public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends Obser TopiaMetadataEntity metadataEntity = metadataModel.getEntity(referentielName); if (request.withReferentialToAdd()) { - InsertSqlStatementGenerator<D> sqlStatementGenerator = new InsertSqlStatementGenerator<>(metadataEntity, dtoType); + InsertSqlStatementGenerator<D> sqlStatementGenerator = new InsertSqlStatementGenerator<>(metadataModel, metadataEntity, dtoType); ImmutableSet<D> referentialToAdd = request.getReferentialToAdd(); if (ObjectMaterialDto.class.equals(dtoType)) { @@ -139,55 +127,40 @@ public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends Obser if (request.withReferentialToUpdate()) { - UpdateSqlStatementGenerator<D> sqlStatementGenerator = new UpdateSqlStatementGenerator<>(metadataEntity, dtoType); + UpdateSqlStatementGenerator<D> sqlStatementGenerator = new UpdateSqlStatementGenerator<>(metadataModel, metadataEntity, dtoType); for (D referentialDto : request.getReferentialToUpdate()) { ImmutableList<String> sql = sqlStatementGenerator.generateSql(referentialDto); result.addAll(sql); } - } - if (request.withReferentialToReplace()) { - ReplaceSqlStatementGenerator sqlStatementGenerator = new ReplaceSqlStatementGenerator(metadataModel, referentielName); + ReplaceSqlStatementGenerator sqlStatementGenerator = new ReplaceSqlStatementGenerator(metadataModel, metadataEntity); for (Map.Entry<String, String> entry : request.getReferentialToReplace().entrySet()) { ImmutableList<String> sql = sqlStatementGenerator.generateSqls(entry.getKey(), entry.getValue()); result.addAll(sql); } - } if (request.withReferentialToRemove()) { - DeleteSqlStatementGenerator sqlStatementGenerator = new DeleteSqlStatementGenerator(metadataEntity); + DeleteSqlStatementGenerator sqlStatementGenerator = new DeleteSqlStatementGenerator(metadataModel, metadataEntity); for (String id : request.getReferentialToRemove()) { List<String> sql = sqlStatementGenerator.generateSql(id); result.addAll(sql); } - } - - return ImmutableSet.copyOf(result); - } @Override public void applySqlRequests(ImmutableSet<String> sqlRequests) { - - if (log.isTraceEnabled()) { - log.trace("applySqlRequests(" + sqlRequests + ")"); - } - TopiaSqlWork applySqlWork = new ApplySqlRequestWork(sqlRequests); getTopiaPersistenceContext().getSqlSupport().doSqlWork(applySqlWork); - } @Override public void updateLastUpdateDates() { - lastUpdateDateService.updateReferentialLastUpdateDates(); - } private <E extends ObserveReferentialEntity> int countUsage0(Class<E> entityType, String id) { ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequestBuilder.java ===================================== @@ -10,12 +10,12 @@ package fr.ird.observe.services.local.service.actions.synchro.referential.ng; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. @@ -31,7 +31,7 @@ import fr.ird.observe.dto.referential.ReferentialLocale; import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; import fr.ird.observe.persistence.ObserveEntityEnum; import fr.ird.observe.services.local.service.actions.synchro.referential.sql.DeleteSqlStatementGenerator; -import fr.ird.observe.services.local.service.actions.synchro.referential.sql.DesactivateSqlStatementGenerator; +import fr.ird.observe.services.local.service.actions.synchro.referential.sql.DisableSqlStatementGenerator; import fr.ird.observe.services.local.service.actions.synchro.referential.sql.InsertSqlStatementGenerator; import fr.ird.observe.services.local.service.actions.synchro.referential.sql.InsertSqlWithCascadeStatementGenerator; import fr.ird.observe.services.local.service.actions.synchro.referential.sql.ReplaceSqlStatementGenerator; @@ -153,7 +153,7 @@ public class ReferentialSynchronizeSqlsRequestBuilder { List<E> insertEntities = loadEntities(entityType, tasks); if (metadata.withEntities()) { - InsertSqlWithCascadeStatementGenerator<D> insertGenerator = new InsertSqlWithCascadeStatementGenerator<D>(metadata, dtoType, request.getIdsOnlyExistingOnThisSide()) { + InsertSqlWithCascadeStatementGenerator<D> insertGenerator = new InsertSqlWithCascadeStatementGenerator<D>(metadataModel, metadata, dtoType, request.getIdsOnlyExistingOnThisSide()) { @Override protected <DD extends ReferentialDto> ImmutableList<String> insertMissingReferential(Class<DD> referentialType, String id) { @@ -166,9 +166,7 @@ public class ReferentialSynchronizeSqlsRequestBuilder { D referential = binder.toDto(referentialLocale, entity); ImmutableList<String> sqls = insertGenerator.generateSql(referential); - if (log.isInfoEnabled()) { - log.info("Insert referential: " + referenceType.getName() + " / " + referential.getId() + " -- " + sqls); - } + log.info("Insert referential: " + referenceType.getName() + " / " + referential.getId() + " -- " + sqls); for (String sql : sqls) { resultBuilder.addInsertStatement(sql); } @@ -176,14 +174,12 @@ public class ReferentialSynchronizeSqlsRequestBuilder { } else { - InsertSqlStatementGenerator<D> insertGenerator = new InsertSqlStatementGenerator<>(metadata, dtoType); + InsertSqlStatementGenerator<D> insertGenerator = new InsertSqlStatementGenerator<>(metadataModel, metadata, dtoType); for (E entity : insertEntities) { D referential = binder.toDto(referentialLocale, entity); ImmutableList<String> sqls = insertGenerator.generateSql(referential); - if (log.isInfoEnabled()) { - log.info("Insert referential: " + referenceType.getName() + " / " + referential.getId() + " -- " + sqls); - } + log.info("Insert referential: " + referenceType.getName() + " / " + referential.getId() + " -- " + sqls); for (String sql : sqls) { resultBuilder.addInsertStatement(sql); } @@ -201,7 +197,7 @@ public class ReferentialSynchronizeSqlsRequestBuilder { if (metadata.withEntities()) { - UpdateSqlWithCascadeStatementGenerator<D> updateGenerator = new UpdateSqlWithCascadeStatementGenerator<D>(metadata, dtoType, request.getIdsOnlyExistingOnThisSide()) { + UpdateSqlWithCascadeStatementGenerator<D> updateGenerator = new UpdateSqlWithCascadeStatementGenerator<D>(metadataModel, metadata, dtoType, request.getIdsOnlyExistingOnThisSide()) { @Override protected <DD extends ReferentialDto> ImmutableList<String> insertMissingReferential(Class<DD> referentialType, String id) { @@ -212,9 +208,7 @@ public class ReferentialSynchronizeSqlsRequestBuilder { D referential = binder.toDto(referentialLocale, entity); ImmutableList<String> sqls = updateGenerator.generateSql(referential); - if (log.isInfoEnabled()) { - log.info("Update referential: " + referenceType.getName() + " / " + referential.getId() + " -- " + sqls); - } + log.info("Update referential: " + referenceType.getName() + " / " + referential.getId() + " -- " + sqls); for (String sql : sqls) { resultBuilder.addUpdateStatement(sql); } @@ -222,14 +216,12 @@ public class ReferentialSynchronizeSqlsRequestBuilder { } else { - UpdateSqlStatementGenerator<D> updateGenerator = new UpdateSqlStatementGenerator<>(metadata, dtoType); + UpdateSqlStatementGenerator<D> updateGenerator = new UpdateSqlStatementGenerator<>(metadataModel, metadata, dtoType); for (E entity : updateEntities) { D referential = binder.toDto(referentialLocale, entity); ImmutableList<String> sqls = updateGenerator.generateSql(referential); - if (log.isInfoEnabled()) { - log.info("Update referential: " + referenceType.getName() + " / " + referential.getId() + " -- " + sqls); - } + log.info("Update referential: " + referenceType.getName() + " / " + referential.getId() + " -- " + sqls); for (String sql : sqls) { resultBuilder.addUpdateStatement(sql); } @@ -244,15 +236,13 @@ public class ReferentialSynchronizeSqlsRequestBuilder { TopiaMetadataEntity metadata = metadataModel.getEntity(referentialName); Class<E> entityType = binder.getEntityType(); - UpdateSqlStatementGenerator<D> updateGenerator = new UpdateSqlStatementGenerator<>(metadata, binder.getDtoType()); + UpdateSqlStatementGenerator<D> updateGenerator = new UpdateSqlStatementGenerator<>(metadataModel, metadata, binder.getDtoType()); List<E> updateEntities = loadEntities(entityType, tasks); for (E entity : updateEntities) { D referential = binder.toDto(referentialLocale, entity); ImmutableList<String> sqls = updateGenerator.generateSql(referential); - if (log.isInfoEnabled()) { - log.info("Revert referential: " + referenceType.getName() + " / " + referential.getId() + " -- " + sqls); - } + log.info("Revert referential: " + referenceType.getName() + " / " + referential.getId() + " -- " + sqls); for (String sql : sqls) { resultBuilder.addUpdateStatement(sql); } @@ -264,8 +254,8 @@ public class ReferentialSynchronizeSqlsRequestBuilder { TopiaMetadataEntity metadata = metadataModel.getEntity(referentialName); - ReplaceSqlStatementGenerator replaceGenerator = new ReplaceSqlStatementGenerator(metadataModel, referentialName); - DeleteSqlStatementGenerator deleteGenerator = new DeleteSqlStatementGenerator(metadata); + ReplaceSqlStatementGenerator replaceGenerator = new ReplaceSqlStatementGenerator(metadataModel, metadata); + DeleteSqlStatementGenerator deleteGenerator = new DeleteSqlStatementGenerator(metadataModel, metadata); for (ReferentialSynchronizeTask<R> task : tasks) { @@ -291,8 +281,8 @@ public class ReferentialSynchronizeSqlsRequestBuilder { TopiaMetadataEntity metadata = metadataModel.getEntity(referentialName); - ReplaceSqlStatementGenerator replaceGenerator = new ReplaceSqlStatementGenerator(metadataModel, referentialName); - DesactivateSqlStatementGenerator desactivateGenerator = new DesactivateSqlStatementGenerator(metadata); + ReplaceSqlStatementGenerator replaceGenerator = new ReplaceSqlStatementGenerator(metadataModel, metadata); + DisableSqlStatementGenerator desactivateGenerator = new DisableSqlStatementGenerator(metadata); for (ReferentialSynchronizeTask<R> task : tasks) { String referentialId = task.getReferentialId(); @@ -305,9 +295,7 @@ public class ReferentialSynchronizeSqlsRequestBuilder { } String sql = desactivateGenerator.generateSql(referentialId); - if (log.isInfoEnabled()) { - log.info("Desactivate referential: " + type.getName() + " / " + referentialId + " -- " + sql); - } + log.info("Desactivate referential: " + type.getName() + " / " + referentialId + " -- " + sql); resultBuilder.addDesactivateStatement(sql); } @@ -320,7 +308,7 @@ public class ReferentialSynchronizeSqlsRequestBuilder { String referentialName = ObserveEntityEnum.valueOf(entityType).name(); TopiaMetadataEntity metadata = metadataModel.getEntity(referentialName); - InsertSqlStatementGenerator<D> insertGenerator = new InsertSqlStatementGenerator<>(metadata, dtoType); + InsertSqlStatementGenerator<D> insertGenerator = new InsertSqlStatementGenerator<>(metadataModel, metadata, dtoType); D referential = service.loadEntityToReferentialDto(binder, id); return insertGenerator.generateSql(referential); ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/DeleteSqlStatementGenerator.java ===================================== @@ -23,16 +23,14 @@ package fr.ird.observe.services.local.service.actions.synchro.referential.sql; */ import com.google.common.collect.ImmutableList; -import fr.ird.observe.services.local.service.actions.synchro.referential.sql.UpdateSqlStatementGenerator.ManyToManyAssociationStruct; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import org.nuiton.topia.persistence.metadata.TopiaMetadataAssociation; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; +import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; +import org.nuiton.topia.service.script.TopiaSqlStatements; -import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; - -import static fr.ird.observe.services.local.service.actions.synchro.referential.sql.UpdateSqlStatementGenerator.MANY_TO_MANY_ASSOCIATION_DELETE_STATEMENT; +import java.util.Objects; +import java.util.Set; /** * Pour générer une requète sql de suppression à partir d'un référentiel donné. @@ -43,56 +41,23 @@ import static fr.ird.observe.services.local.service.actions.synchro.referential. */ public class DeleteSqlStatementGenerator { - /** Logger. */ - private static final Logger log = LogManager.getLogger(DeleteSqlStatementGenerator.class); - - private static final String DELETE_STATEMENT = "DELETE FROM %s.%s WHERE topiaId = '%s';\n"; - private static final String DELETE_ASSOCIATION_STATEMENT = "DELETE FROM %s.%s WHERE %s = '%s';\n"; - - private final String schemaName; - private final String tableName; - private final LinkedHashSet<ManyToManyAssociationStruct> manyToManyAssociations; + private final Set<TopiaMetadataAssociation> associations; + private final TopiaMetadataEntity metadataEntity; - public DeleteSqlStatementGenerator(TopiaMetadataEntity metadataEntity) { - this.schemaName = metadataEntity.getDbSchemaName(); - this.tableName = metadataEntity.getDbTableName(); - Map<String, String> manyToManyAssociationsMap = metadataEntity.getManyToManyAssociations(); - this.manyToManyAssociations = new LinkedHashSet<>(); - for (Map.Entry<String, String> entry : manyToManyAssociationsMap.entrySet()) { - String propertyName = entry.getKey(); - String dbColumnName = metadataEntity.getDbColumnName(propertyName); - String tableName = metadataEntity.getBdManyToManyAssociationTableName(propertyName); - ManyToManyAssociationStruct manyToManyAssociation = new ManyToManyAssociationStruct(propertyName, dbColumnName, tableName); - manyToManyAssociations.add(manyToManyAssociation); - } + public DeleteSqlStatementGenerator(TopiaMetadataModel topiaMetadataModel, TopiaMetadataEntity metadataEntity) { + this.metadataEntity = Objects.requireNonNull(metadataEntity); + this.associations = topiaMetadataModel.getReverseAssociations(metadataEntity); } public List<String> generateSql(String id) { ImmutableList.Builder<String> result = ImmutableList.builder(); - String sql = String.format(DELETE_STATEMENT, schemaName, tableName, id); - if (log.isDebugEnabled()) { - log.debug("sql: " + sql); - } + String sql = TopiaSqlStatements.generateDeleteStatement(metadataEntity, id); result.add(sql); - for (ManyToManyAssociationStruct manyToManyAssociation : manyToManyAssociations) { - generateManyToManyAssociationSql(id, manyToManyAssociation, result); + for (TopiaMetadataAssociation association : associations) { + String sql2 = TopiaSqlStatements.generateAssociationDeleteStatement(association, id); + result.add(TopiaSqlStatements.boxAssociationStatement(sql2)); } return result.build(); } - private void generateManyToManyAssociationSql(String referentialDtoId, ManyToManyAssociationStruct manyToManyAssociation, ImmutableList.Builder<String> result) { - - String manyToManyAssociationTableName = manyToManyAssociation.tableName; - - // On commence toujours par supprimer toutes les anciennes associations, elles seront ré-ajoutées juste après - String deleteSql = String.format(MANY_TO_MANY_ASSOCIATION_DELETE_STATEMENT, - schemaName, - manyToManyAssociationTableName, - tableName, - referentialDtoId); - result.add(deleteSql); - if (log.isDebugEnabled()) { - log.debug("sql: " + deleteSql); - } - } } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/DesactivateSqlStatementGenerator.java → services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/DisableSqlStatementGenerator.java ===================================== @@ -10,21 +10,22 @@ package fr.ird.observe.services.local.service.actions.synchro.referential.sql; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.LogManager; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; +import org.nuiton.topia.service.script.TopiaSqlStatements; + +import java.util.Objects; /** * Pour générer une requète sql de désactivation d'un référentiel donné. @@ -33,35 +34,16 @@ import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; * @author Tony Chemit - dev(a)tchemit.fr * @since 5.0 */ -public class DesactivateSqlStatementGenerator { +public class DisableSqlStatementGenerator { - /** Logger. */ - private static final Logger log = LogManager.getLogger(DesactivateSqlStatementGenerator.class); + private final TopiaMetadataEntity metadataEntity; - private static final String UPDATE_STATEMENT = "UPDATE %s.%s SET enabled = false, topiaVersion = topiaVersion + 1 WHERE topiaId ='%s';\n"; - - private final String schemaName; - private final String tableName; - - public DesactivateSqlStatementGenerator(TopiaMetadataEntity metadataEntity) { - this.schemaName = metadataEntity.getDbSchemaName(); - this.tableName = metadataEntity.getDbTableName(); + public DisableSqlStatementGenerator(TopiaMetadataEntity metadataEntity) { + this.metadataEntity = Objects.requireNonNull(metadataEntity); } public String generateSql(String sourceId) { - - StringBuilder result = new StringBuilder(); - - String sql = String.format(UPDATE_STATEMENT, schemaName, tableName, sourceId); - result.append(sql); - - if (log.isDebugEnabled()) { - log.debug("sql: " + sql); - } - - return result.toString(); - + return TopiaSqlStatements.generateUpdateStatement(metadataEntity, sourceId, "enabled = false, topiaVersion = topiaVersion + 1"); } - } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/InsertSqlStatementGenerator.java ===================================== @@ -10,12 +10,12 @@ package fr.ird.observe.services.local.service.actions.synchro.referential.sql; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. @@ -25,13 +25,12 @@ package fr.ird.observe.services.local.service.actions.synchro.referential.sql; import com.google.common.collect.ImmutableList; import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ReferentialDto; -import fr.ird.observe.persistence.ObserveEntityEnum; -import fr.ird.observe.spi.DbModelHelper; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.metadata.TopiaMetadataAssociation; +import org.nuiton.topia.persistence.metadata.TopiaMetadataComposition; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; +import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; +import org.nuiton.topia.service.script.TopiaSqlStatements; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; @@ -42,6 +41,7 @@ import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; /** @@ -53,49 +53,31 @@ import java.util.Set; */ public class InsertSqlStatementGenerator<D extends ReferentialDto> { - /** Logger. */ - private static final Logger log = LogManager.getLogger(InsertSqlStatementGenerator.class); - - private static final String INSERT_STATEMENT = "INSERT INTO %s.%s(%s) VALUES (%s);\n"; - // We use a special prefix because those requests must be applied after all simple insert requests - public static final String MANY_TO_MANY_ASSOCIATION_INSERT_STATEMENT = "$$_INSERT INTO %s.%s(%s, %s) VALUES ('%s', '%s');\n"; - + private final TopiaMetadataEntity metadataEntity; + private final Set<TopiaMetadataComposition> compositions; + private final Set<TopiaMetadataAssociation> associations; private final Set<String> columnNames; - private final String schemaName; - private final String tableName; private final Binder<D, D> binder; private final String[] simplePropertyNames; - private final String[] manyToOneAssociationNames; - private final Set<ManyToManyAssociationStruct> manyToManyAssociations; + private final Set<String> primitiveBooleanPropertyNames; private final Set<String> primitiveIntegerPropertyNames; private final Set<String> primitiveLongPropertyNames; private final Set<String> primitiveFloatPropertyNames; - public InsertSqlStatementGenerator(TopiaMetadataEntity metadataEntity, Class<D> dtoType) { - this.schemaName = metadataEntity.getDbSchemaName(); - this.tableName = metadataEntity.getDbTableName(); + public InsertSqlStatementGenerator(TopiaMetadataModel topiaMetadataModel, TopiaMetadataEntity metadataEntity, Class<D> dtoType) { + this.metadataEntity = Objects.requireNonNull(metadataEntity); + this.compositions = topiaMetadataModel.getCompositions(this.metadataEntity); + this.associations = topiaMetadataModel.getAssociations(this.metadataEntity); + Set<String> propertyNamesSet = metadataEntity.getProperties().keySet(); this.simplePropertyNames = propertyNamesSet.toArray(new String[0]); this.primitiveBooleanPropertyNames = metadataEntity.getPrimitivePropertyNames("boolean"); this.primitiveIntegerPropertyNames = metadataEntity.getPrimitivePropertyNames("int"); this.primitiveLongPropertyNames = metadataEntity.getPrimitivePropertyNames("long"); this.primitiveFloatPropertyNames = metadataEntity.getPrimitivePropertyNames("float"); - Set<String> manyToOneAssociationNamesSet = metadataEntity.getManyToOneAssociations().keySet(); - this.manyToOneAssociationNames = manyToOneAssociationNamesSet.toArray(new String[0]); - - Map<String, String> manyToManyAssociationsMap = metadataEntity.getManyToManyAssociations(); - this.manyToManyAssociations = new LinkedHashSet<>(); - for (Map.Entry<String, String> entry : manyToManyAssociationsMap.entrySet()) { - String propertyName = entry.getKey(); - String dbColumnName = metadataEntity.getDbColumnName(propertyName); - String tableName = metadataEntity.getBdManyToManyAssociationTableName(propertyName); - String typeName = entry.getValue(); - ObserveEntityEnum entityEnum = ObserveEntityEnum.valueOf(typeName); - Class<? extends ReferentialDto> referentialype = DbModelHelper.fromReferentialEntity(entityEnum).toDtoType(); - ManyToManyAssociationStruct manyToManyAssociation = new ManyToManyAssociationStruct(propertyName, dbColumnName, tableName, referentialype); - manyToManyAssociations.add(manyToManyAssociation); - } + + String[] manyToOneAssociationNames = compositions.stream().map(TopiaMetadataComposition::getTargetDbName).toArray(String[]::new); this.columnNames = computeColumnNames(metadataEntity, simplePropertyNames, manyToOneAssociationNames); this.binder = BinderFactory.newBinder(dtoType); } @@ -151,76 +133,46 @@ public class InsertSqlStatementGenerator<D extends ReferentialDto> { addOtherTypeParameter(parameterValue, parameters); } - Map<String, Object> manyToOneParameters = binder.obtainProperties(referentialDto, true, true, manyToOneAssociationNames); - for (String manyToOneAssociationName : manyToOneAssociationNames) { - Object parameterValue = manyToOneParameters.get(manyToOneAssociationName); - if (parameterValue == null) { + for (TopiaMetadataComposition composition : compositions) { + Object compositionValue = binder.obtainSourceProperty(referentialDto, composition.getTargetPropertyName()); + if (compositionValue == null) { addNullParameter(parameters); continue; } - if (parameterValue instanceof ReferentialDto) { - addReferentialDtoParameter((ReferentialDto) parameterValue, parameters, result); + if (compositionValue instanceof ReferentialDto) { + addReferentialDtoParameter((ReferentialDto) compositionValue, parameters, result); continue; } - if (parameterValue instanceof ReferentialDtoReference) { - addReferentialReferenceParameter((ReferentialDtoReference) parameterValue, parameters, result); + if (compositionValue instanceof ReferentialDtoReference) { + addReferentialReferenceParameter((ReferentialDtoReference) compositionValue, parameters, result); } } + String insertSql = TopiaSqlStatements.generateInsertStatement(metadataEntity, + String.join(",", columnNames), + String.join(",", parameters)); + result.add(insertSql); - result.add(String.format(INSERT_STATEMENT, - schemaName, - tableName, - String.join(",", columnNames), - String.join(",", parameters))); + String id = referentialDto.getId(); + for (TopiaMetadataAssociation association : associations) { - if (log.isDebugEnabled()) { - log.debug("sql: " + result); - } - for (ManyToManyAssociationStruct manyToManyAssociation : manyToManyAssociations) { - generateNmAssociationSql(referentialDto, manyToManyAssociation, result); + Collection<ReferentialDtoReference<?, ?>> associationValues = binder.obtainSourceProperty(referentialDto, association.getTargetPropertyName()); + for (ReferentialDtoReference<?, ?> associationValue : associationValues) { + String insertAssocationSql = TopiaSqlStatements.generateAssociationInsertStatement(association, id, associationValue.getId()); + result.add(TopiaSqlStatements.boxAssociationStatement(insertAssocationSql)); + } } - return result.build(); } - private void generateNmAssociationSql(D referentialDto, ManyToManyAssociationStruct manyToManyAssociationStruct, ImmutableList.Builder<String> result) { - - Collection<ReferentialDtoReference<?, ?>> manyToManyAssociationValues = binder.obtainSourceProperty(referentialDto, manyToManyAssociationStruct.propertyName); - if (CollectionUtils.isNotEmpty(manyToManyAssociationValues)) { - - String nmAssociationTableName = manyToManyAssociationStruct.tableName; - String nmAssociationDbColumnName = manyToManyAssociationStruct.dbColumnName; - String referentialDtoId = referentialDto.getId(); - - for (ReferentialDtoReference<?, ?> nmAssociationValue : manyToManyAssociationValues) { - - addMnAssociation(nmAssociationTableName, nmAssociationDbColumnName, referentialDtoId, manyToManyAssociationStruct.type, nmAssociationValue.getId(), result); - - } - } - } - - <DD extends ReferentialDto> void addMnAssociation(String nmAssociationTableName, - String nmAssociationDbColumnName, - String referentialDtoId, - Class<DD> associationType, - String associationId, - ImmutableList.Builder<String> builder) { - - String sql = String.format(MANY_TO_MANY_ASSOCIATION_INSERT_STATEMENT, - schemaName, - nmAssociationTableName, - this.tableName, - nmAssociationDbColumnName, - referentialDtoId, - associationId); - if (log.isDebugEnabled()) { - log.debug("sql: " + sql); - } - builder.add(sql); + <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association, + String sourceId, + RR associationValue, + ImmutableList.Builder<String> builder) { + String insertAssocationSql = TopiaSqlStatements.generateAssociationInsertStatement(association, sourceId, associationValue.getId()); + builder.add(TopiaSqlStatements.boxAssociationStatement(insertAssocationSql)); } private Set<String> computeColumnNames(TopiaMetadataEntity metadataEntity, @@ -288,32 +240,4 @@ public class InsertSqlStatementGenerator<D extends ReferentialDto> { addStringParameter(parameter.getId(), parameters); } - /** - * Pour décrire une association nm. - */ - private static class ManyToManyAssociationStruct { - - /** - * Le nom de la propriété dans l'objet. - */ - private final String propertyName; - /** - * Le nom de la colonne de l'association dans la table d'association. - */ - private final String dbColumnName; - /** - * Le nom de la table d'association. - */ - private final String tableName; - - private final Class<? extends ReferentialDto> type; - - private ManyToManyAssociationStruct(String propertyName, String dbColumnName, String tableName, Class<? extends ReferentialDto> type) { - this.propertyName = propertyName; - this.dbColumnName = dbColumnName; - this.tableName = tableName; - this.type = type; - } - - } } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/InsertSqlWithCascadeStatementGenerator.java ===================================== @@ -10,12 +10,12 @@ package fr.ird.observe.services.local.service.actions.synchro.referential.sql; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. @@ -26,7 +26,9 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ReferentialDto; +import org.nuiton.topia.persistence.metadata.TopiaMetadataAssociation; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; +import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; import java.util.List; @@ -43,16 +45,19 @@ public abstract class InsertSqlWithCascadeStatementGenerator<D extends Referenti private final InsertSqlStatementGenerator<D> delegateGenerator; private final Multimap<Class<? extends ReferentialDtoReference>, String> idsOnlyExistingOnThisSide; - protected InsertSqlWithCascadeStatementGenerator(TopiaMetadataEntity metadataEntity, + protected InsertSqlWithCascadeStatementGenerator(TopiaMetadataModel topiaMetadataModel, TopiaMetadataEntity metadataEntity, Class<D> dtoType, Multimap<Class<? extends ReferentialDtoReference>, String> idsOnlyExistingOnThisSide) { this.idsOnlyExistingOnThisSide = idsOnlyExistingOnThisSide; - this.delegateGenerator = new InsertSqlStatementGenerator<D>(metadataEntity, dtoType) { + this.delegateGenerator = new InsertSqlStatementGenerator<D>(topiaMetadataModel, metadataEntity, dtoType) { @Override - protected <DD extends ReferentialDto> void addMnAssociation(String nmAssociationTableName, String nmAssociationDbColumnName, String referentialDtoId, Class<DD> associationType, String associationId, ImmutableList.Builder<String> builder) { - super.addMnAssociation(nmAssociationTableName, nmAssociationDbColumnName, referentialDtoId, associationType, associationId, builder); - addMissingReferentialIfNecessary(associationType, associationId, builder); + <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association, + String sourceId, + RR associationValue, + ImmutableList.Builder<String> builder) { + super.addAssociation(association, sourceId, associationValue, builder); + addMissingReferentialIfNecessary(associationValue.getDtoType(), associationValue.getId(), builder); } @Override ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/ReplaceSqlStatementGenerator.java ===================================== @@ -10,12 +10,12 @@ package fr.ird.observe.services.local.service.actions.synchro.referential.sql; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. @@ -23,17 +23,25 @@ package fr.ird.observe.services.local.service.actions.synchro.referential.sql; */ import com.google.common.collect.ImmutableList; +import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; +import fr.ird.observe.persistence.ObserveEntityEnum; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.metadata.TopiaMetadataAssociation; +import org.nuiton.topia.persistence.metadata.TopiaMetadataComposition; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; +import org.nuiton.topia.service.script.TopiaSqlStatements; -import java.util.LinkedHashSet; +import java.util.Objects; import java.util.Set; -import java.util.stream.Collectors; /** * Pour générer une requète sql de remplacement à partir d'un référentiel donné. + * <p> + * À noter que l'on ne traite pas ici les remplacements d'association sur des types référentiel. + * <p> * Created on 04/07/16. * * @author Tony Chemit - dev(a)tchemit.fr @@ -44,118 +52,36 @@ public class ReplaceSqlStatementGenerator { /** Logger. */ private static final Logger log = LogManager.getLogger(ReplaceSqlStatementGenerator.class); - 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"; - /** * Informations pour remplacer dans une relation many-to-one. */ - private final Set<ReplacementStruct> manyToOneAssociationReplacements; + private final Set<TopiaMetadataComposition> compositions; /** * Informations pour remplacer dans une relation many-to-many. */ - private final Set<ReplacementStruct> manyToManyAssociationReplacements; + private final Set<TopiaMetadataAssociation> associations; - public ReplaceSqlStatementGenerator(TopiaMetadataModel topiaMetadataModel, String referentialName) { - this.manyToOneAssociationReplacements = computeManyToOneAssociationReplacements(referentialName, topiaMetadataModel); - this.manyToManyAssociationReplacements = computeManyToManyAssociationReplacements(referentialName, topiaMetadataModel); + public ReplaceSqlStatementGenerator(TopiaMetadataModel topiaMetadataModel, TopiaMetadataEntity metadataEntity) { + this.compositions = Objects.requireNonNull(topiaMetadataModel).getReverseCompositions(Objects.requireNonNull(metadataEntity)); + this.associations = topiaMetadataModel.getReverseAssociations(metadataEntity); } public ImmutableList<String> generateSqls(String sourceId, String replacementId) { - ImmutableList.Builder<String> builder = ImmutableList.builder(); - - for (ReplacementStruct replacementStruct : manyToOneAssociationReplacements) { - - String sql = generateSqlStatement(MANY_TO_ONE_ASSOCIATION_UPDATE_STATEMENT, sourceId, replacementId, replacementStruct); + for (TopiaMetadataComposition replacementStruct : compositions) { + String sql = TopiaSqlStatements.generateCompositionUpdateStatement(replacementStruct, sourceId, replacementId); builder.add(sql); - } - - for (ReplacementStruct replacementStruct : manyToManyAssociationReplacements) { - - String sql = generateSqlStatement(MANY_TO_MANY_ASSOCIATION_UPDATE_STATEMENT, sourceId, replacementId, replacementStruct); + for (TopiaMetadataAssociation replacementStruct : associations) { + Class<? extends TopiaEntity> entityType = ObserveEntityEnum.valueOf(replacementStruct.getOwner().getType()).getContract(); + if (ObserveReferentialEntity.class.isAssignableFrom(entityType)) { + // do not update referentials associations (see https://gitlab.com/ultreiaio/ird-observe/issues/1065) + continue; + } + String sql = TopiaSqlStatements.generateAssociationUpdateStatement(replacementStruct, sourceId, replacementId); builder.add(sql); } - return builder.build(); - - } - - private Set<ReplacementStruct> computeManyToOneAssociationReplacements(String referentialName, TopiaMetadataModel topiaMetadataModel) { - - Set<ReplacementStruct> result = new LinkedHashSet<>(); - - for (TopiaMetadataEntity metadataEntity : topiaMetadataModel) { - - result.addAll(metadataEntity.getManyToOneAssociations().entrySet().stream() - .filter(entry -> entry.getValue().equals(referentialName)) - .map(entry -> new ReplacementStruct(metadataEntity.getDbSchemaName(), - metadataEntity.getDbTableName(), - metadataEntity.getDbColumnName(entry.getKey()))) - .collect(Collectors.toList())); - - } - - return result; - - } - - private Set<ReplacementStruct> computeManyToManyAssociationReplacements(String referentialName, TopiaMetadataModel topiaMetadataModel) { - - Set<ReplacementStruct> result = new LinkedHashSet<>(); - - for (TopiaMetadataEntity metadataEntity : topiaMetadataModel) { - - result.addAll(metadataEntity.getManyToManyAssociations().entrySet().stream() - .filter(entry -> entry.getValue().equals(referentialName)) - .map(entry -> new ReplacementStruct(metadataEntity.getDbSchemaName(), - metadataEntity.getBdManyToManyAssociationTableName(entry.getKey()), - metadataEntity.getDbColumnName(entry.getKey()))) - .collect(Collectors.toList())); - - } - - return result; - - } - - 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; - - } - - private static class ReplacementStruct { - - private final String schemaName; - private final String tableName; - private final String columnName; - - private ReplacementStruct(String schemaName, String tableName, String columnName) { - this.schemaName = schemaName; - this.tableName = tableName; - this.columnName = columnName; - } - - @Override - public String toString() { - return "ReplacementStruct{" + - "schemaName='" + schemaName + '\'' + - ", tableName='" + tableName + '\'' + - ", columnName='" + columnName + '\'' + - '}'; - } } } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java ===================================== @@ -10,12 +10,12 @@ package fr.ird.observe.services.local.service.actions.synchro.referential.sql; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. @@ -25,24 +25,23 @@ package fr.ird.observe.services.local.service.actions.synchro.referential.sql; import com.google.common.collect.ImmutableList; import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ReferentialDto; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.metadata.TopiaMetadataAssociation; +import org.nuiton.topia.persistence.metadata.TopiaMetadataComposition; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; +import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; +import org.nuiton.topia.service.script.TopiaSqlStatements; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; import java.sql.Timestamp; import java.util.Collection; import java.util.Date; -import java.util.LinkedHashSet; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.TreeMap; -import static fr.ird.observe.services.local.service.actions.synchro.referential.sql.InsertSqlStatementGenerator.MANY_TO_MANY_ASSOCIATION_INSERT_STATEMENT; - /** * Pour générer une requète sql de mise à jour à partir d'un référentiel donné. * <p> @@ -52,49 +51,32 @@ import static fr.ird.observe.services.local.service.actions.synchro.referential. */ public class UpdateSqlStatementGenerator<D extends ReferentialDto> { - /** Logger. */ - private static final Logger log = LogManager.getLogger(UpdateSqlStatementGenerator.class); - - private static final String UPDATE_STATEMENT = "UPDATE %s.%s SET %s WHERE topiaId ='%s';\n"; - // We use a special prefix because those requests must be applied before all simple insert requests - static final String MANY_TO_MANY_ASSOCIATION_DELETE_STATEMENT = "$$_DELETE FROM %s.%s WHERE %s = '%s';\n"; - private final Map<String, String> columnNames; - private final String schemaName; - private final String tableName; private final Binder<D, D> binder; private final String[] simplePropertyNames; - private final String[] manyToOneAssociationNames; - private final Set<ManyToManyAssociationStruct> manyToManyAssociations; + private final TopiaMetadataEntity metadataEntity; + private final Set<TopiaMetadataComposition> compositions; + private final Set<TopiaMetadataAssociation> associations; private final Set<String> primitiveBooleanPropertyNames; private final Set<String> primitiveIntegerPropertyNames; private final Set<String> primitiveLongPropertyNames; private final Set<String> primitiveFloatPropertyNames; - public UpdateSqlStatementGenerator(TopiaMetadataEntity metadataEntity, Class<D> dtoType) { - this.schemaName = metadataEntity.getDbSchemaName(); - this.tableName = metadataEntity.getDbTableName(); + public UpdateSqlStatementGenerator(TopiaMetadataModel topiaMetadataModel, TopiaMetadataEntity metadataEntity, Class<D> dtoType) { + this.metadataEntity = Objects.requireNonNull(metadataEntity); + this.compositions = topiaMetadataModel.getCompositions(metadataEntity); + this.associations = topiaMetadataModel.getAssociations(metadataEntity); - Set<String> simplePropertyNamesSet = metadataEntity.getProperties().keySet(); + Set<String> simplePropertyNamesSet = this.metadataEntity.getProperties().keySet(); this.simplePropertyNames = simplePropertyNamesSet.toArray(new String[0]); - this.primitiveBooleanPropertyNames = metadataEntity.getPrimitivePropertyNames("boolean"); - this.primitiveIntegerPropertyNames = metadataEntity.getPrimitivePropertyNames("int"); - this.primitiveLongPropertyNames = metadataEntity.getPrimitivePropertyNames("long"); - this.primitiveFloatPropertyNames = metadataEntity.getPrimitivePropertyNames("float"); - - Set<String> manyToOneAssociationNamesSet = metadataEntity.getManyToOneAssociations().keySet(); - this.manyToOneAssociationNames = manyToOneAssociationNamesSet.toArray(new String[0]); - - Map<String, String> manyToManyAssociationsMap = metadataEntity.getManyToManyAssociations(); - this.manyToManyAssociations = new LinkedHashSet<>(); - for (Map.Entry<String, String> entry : manyToManyAssociationsMap.entrySet()) { - String propertyName = entry.getKey(); - String dbColumnName = metadataEntity.getDbColumnName(propertyName); - String tableName = metadataEntity.getBdManyToManyAssociationTableName(propertyName); - ManyToManyAssociationStruct manyToManyAssociation = new ManyToManyAssociationStruct(propertyName, dbColumnName, tableName); - manyToManyAssociations.add(manyToManyAssociation); - } - this.columnNames = computeColumnNames(metadataEntity, simplePropertyNames, manyToOneAssociationNames); + this.primitiveBooleanPropertyNames = this.metadataEntity.getPrimitivePropertyNames("boolean"); + this.primitiveIntegerPropertyNames = this.metadataEntity.getPrimitivePropertyNames("int"); + this.primitiveLongPropertyNames = this.metadataEntity.getPrimitivePropertyNames("long"); + this.primitiveFloatPropertyNames = this.metadataEntity.getPrimitivePropertyNames("float"); + + String[] manyToOneAssociationNames = compositions.stream().map(TopiaMetadataComposition::getTargetDbName).toArray(String[]::new); + + this.columnNames = computeColumnNames(this.metadataEntity, simplePropertyNames, manyToOneAssociationNames); this.binder = BinderFactory.newBinder(dtoType); } @@ -148,121 +130,54 @@ public class UpdateSqlStatementGenerator<D extends ReferentialDto> { addEnumParameter(columnName, (Enum) simplePropertyValue, parameters); continue; } - addOtherTypeParameter(columnName, simplePropertyValue, parameters); - } - } ImmutableList.Builder<String> result = ImmutableList.builder(); - if (manyToOneAssociationNames.length > 0) { - - 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, result); - continue; - } - if (manyToOneAssociationValue instanceof ReferentialDtoReference) { - addReferentialReferenceParameter(columnName, (ReferentialDtoReference) manyToOneAssociationValue, parameters, result); - } - + for (TopiaMetadataComposition composition : compositions) { + Object compositionValue = binder.obtainSourceProperty(referentialDto, composition.getTargetPropertyName()); + String columnName = composition.getTargetDbName(); + if (compositionValue == null) { + addNullParameter(columnName, parameters); + continue; + } + if (compositionValue instanceof ReferentialDto) { + addReferentialDtoParameter(columnName, (ReferentialDto) compositionValue, parameters, result); + continue; + } + if (compositionValue instanceof ReferentialDtoReference) { + addReferentialReferenceParameter(columnName, (ReferentialDtoReference) compositionValue, parameters, result); } - - } - - - String sql = String.format(UPDATE_STATEMENT, - schemaName, - tableName, - parameters.substring(2), - referentialDto.getId()); - result.add(sql); - if (log.isDebugEnabled()) { - log.debug("sql: " + sql); - } - - for (ManyToManyAssociationStruct manyToManyAssociation : manyToManyAssociations) { - generateManyToManyAssociationSql(referentialDto, manyToManyAssociation, result); - } - - return result.build(); - - } - - private void generateManyToManyAssociationSql(D referentialDto, ManyToManyAssociationStruct manyToManyAssociation, ImmutableList.Builder<String> result) { - - String referentialDtoId = referentialDto.getId(); - String manyToManyAssociationTableName = manyToManyAssociation.tableName; - - // On commence toujours par supprimer toutes les anciennes associations, elles seront ré-ajoutées juste après - String deleteSql = String.format(MANY_TO_MANY_ASSOCIATION_DELETE_STATEMENT, - schemaName, - manyToManyAssociationTableName, - tableName, - referentialDtoId); - result.add(deleteSql); - if (log.isDebugEnabled()) { - log.debug("sql: " + deleteSql); } - Collection<ReferentialDtoReference<?, ?>> manyToManyAssociationValues = binder.obtainSourceProperty(referentialDto, manyToManyAssociation.propertyName); - if (CollectionUtils.isNotEmpty(manyToManyAssociationValues)) { - - - String manyToManyAssociationDbColumnName = manyToManyAssociation.dbColumnName; + String updateSql = TopiaSqlStatements.generateUpdateStatement(metadataEntity, parameters.substring(2), referentialDto.getId()); + result.add(updateSql); + String id = referentialDto.getId(); + for (TopiaMetadataAssociation association : associations) { + // On commence toujours par supprimer toutes les anciennes associations, elles seront ré-ajoutées juste après + String deleteSql = TopiaSqlStatements.generateAssociationDeleteStatement(association, id); + result.add(TopiaSqlStatements.boxAssociationStatement(deleteSql)); - for (ReferentialDtoReference<?, ?> manyToManyAssociationValue : manyToManyAssociationValues) { - - addMnAssociation( - manyToManyAssociationTableName, - manyToManyAssociationDbColumnName, - referentialDtoId, - manyToManyAssociationValue.getDtoType(), - manyToManyAssociationValue.getId(), - result - ); + Collection<ReferentialDtoReference<?, ?>> associationValues = binder.obtainSourceProperty(referentialDto, association.getTargetPropertyName()); + for (ReferentialDtoReference associationValue : associationValues) { + addAssociation(association, id, associationValue, result); } } - + return result.build(); } - protected <DD extends ReferentialDto> void addMnAssociation(String nmAssociationTableName, - String nmAssociationDbColumnName, - String referentialDtoId, - Class<DD> associationType, - String associationId, - ImmutableList.Builder<String> builder) { - - String sql = String.format(MANY_TO_MANY_ASSOCIATION_INSERT_STATEMENT, - schemaName, - nmAssociationTableName, - this.tableName, - nmAssociationDbColumnName, - referentialDtoId, - associationId); - if (log.isDebugEnabled()) { - log.debug("sql: " + sql); - } - builder.add(sql); - + <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association, + String sourceId, + RR associationValue, + ImmutableList.Builder<String> builder) { + String insertSql = TopiaSqlStatements.generateAssociationInsertStatement(association, sourceId, associationValue.getId()); + builder.add(TopiaSqlStatements.boxAssociationStatement(insertSql)); } - private Map<String, String> computeColumnNames(TopiaMetadataEntity metadataEntity, - String[] simplePropertyNames, - String[] compositionPropertyNames) { + private Map<String, String> computeColumnNames(TopiaMetadataEntity metadataEntity, String[] simplePropertyNames, String[] compositionPropertyNames) { Map<String, String> columnNames = new TreeMap<>(); for (String propertyName : simplePropertyNames) { @@ -326,29 +241,4 @@ public class UpdateSqlStatementGenerator<D extends ReferentialDto> { addParameter0(columnName, "" + (parameter == null ? 0f : parameter), parameters); } - /** - * Pour décrire une association nm. - */ - static class ManyToManyAssociationStruct { - - /** - * Le nom de la propriété dans l'objet. - */ - private final String propertyName; - /** - * Le nom de la colonne de l'association dans la table d'association. - */ - private final String dbColumnName; - /** - * Le nom de la table d'association. - */ - final String tableName; - - ManyToManyAssociationStruct(String propertyName, String dbColumnName, String tableName) { - this.propertyName = propertyName; - this.dbColumnName = dbColumnName; - this.tableName = tableName; - } - - } } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlWithCascadeStatementGenerator.java ===================================== @@ -10,12 +10,12 @@ package fr.ird.observe.services.local.service.actions.synchro.referential.sql; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. @@ -26,7 +26,9 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ReferentialDto; +import org.nuiton.topia.persistence.metadata.TopiaMetadataAssociation; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; +import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; /** * Pour générer une requète sql d'ajout à partir d'un référentiel donné et aussi tous les inserts manquants. @@ -41,17 +43,20 @@ public abstract class UpdateSqlWithCascadeStatementGenerator<D extends Referenti private final UpdateSqlStatementGenerator<D> delegateGenerator; private final Multimap<Class<? extends ReferentialDtoReference>, String> idsOnlyExistingOnThisSide; - protected UpdateSqlWithCascadeStatementGenerator(TopiaMetadataEntity metadataEntity, + protected UpdateSqlWithCascadeStatementGenerator(TopiaMetadataModel topiaMetadataModel, + TopiaMetadataEntity metadataEntity, Class<D> dtoType, Multimap<Class<? extends ReferentialDtoReference>, String> idsOnlyExistingOnThisSide) { this.idsOnlyExistingOnThisSide = idsOnlyExistingOnThisSide; - this.delegateGenerator = new UpdateSqlStatementGenerator<D>(metadataEntity, dtoType) { + this.delegateGenerator = new UpdateSqlStatementGenerator<D>(topiaMetadataModel, metadataEntity, dtoType) { - @Override - protected <DD extends ReferentialDto> void addMnAssociation(String nmAssociationTableName, String nmAssociationDbColumnName, String referentialDtoId, Class<DD> associationType, String associationId, ImmutableList.Builder<String> result) { - super.addMnAssociation(nmAssociationTableName, nmAssociationDbColumnName, referentialDtoId, associationType, associationId, result); - addMissingReferentialIfNecessary(associationType, associationId, result); + <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association, + String sourceId, + RR associationValue, + ImmutableList.Builder<String> builder) { + super.addAssociation(association, sourceId, associationValue, builder); + addMissingReferentialIfNecessary(associationValue.getDtoType(), associationValue.getId(), builder); } @Override ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/referential/ReferentialServiceLocal.java ===================================== @@ -28,6 +28,7 @@ import fr.ird.observe.binder.data.DataEntityReferenceBinderSupport; import fr.ird.observe.binder.referential.ReferentialEntityDtoBinderSupport; import fr.ird.observe.binder.referential.ReferentialEntityReferenceBinderSupport; import fr.ird.observe.dto.IdDto; +import fr.ird.observe.dto.IdHelper; import fr.ird.observe.dto.data.DataDto; import fr.ird.observe.dto.form.Form; import fr.ird.observe.dto.form.FormDefinition; @@ -42,7 +43,6 @@ import fr.ird.observe.dto.referential.SpeciesDto; import fr.ird.observe.dto.referential.SpeciesGroupDto; import fr.ird.observe.dto.referential.seine.ObservedSystemReference; import fr.ird.observe.dto.result.SaveResultDto; -import fr.ird.observe.entities.EntityMap; import fr.ird.observe.entities.ObserveDataEntity; import fr.ird.observe.entities.longline.TripLongline; import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; @@ -75,6 +75,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; 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.script.SqlScriptConsumer; import org.nuiton.topia.persistence.script.TopiaSqlScript; @@ -86,6 +87,7 @@ import java.util.Collections; import java.util.Date; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -205,8 +207,8 @@ public class ReferentialServiceLocal extends ObserveServiceLocal implements Refe ObserveEntityEnum entityEnum = ObserveEntityEnum.valueOf(entityType); TopiaMetadataModel metadataModel = serviceContext.getTopiaApplicationContext().getMetadataModel(); - - ReplaceSqlStatementGenerator generator = new ReplaceSqlStatementGenerator(metadataModel, entityEnum.name()); + TopiaMetadataEntity metadataEntity = Objects.requireNonNull(metadataModel.getEntity(entityEnum.name())); + ReplaceSqlStatementGenerator generator = new ReplaceSqlStatementGenerator(metadataModel, metadataEntity); ImmutableList<String> sql = generator.generateSqls(idToReplace, replaceId); @@ -218,16 +220,22 @@ public class ReferentialServiceLocal extends ObserveServiceLocal implements Refe public <D extends ReferentialDto> ImmutableSetDtoMap<DtoReference> findAllUsages(D bean) { ReferentialDtoEntityContext<D, ?, ?> spi = DbModelHelper.fromReferentialDto(bean); - Class<ObserveReferentialEntity> entityType = spi.toEntityType(); - ObserveReferentialEntity entity = loadEntity(spi.toDtoType(), bean.getId()); - TopiaDao<ObserveReferentialEntity> dao = getTopiaPersistenceContext().getDao(entityType); - EntityMap allUsages = new EntityMap(dao.findAllUsages(entity)); + Map<Class<? extends TopiaEntity>, List<? extends TopiaEntity>> compositions = serviceContext.getTopiaApplicationContext().findReverseCompositions(getTopiaPersistenceContext(), entity, e -> true); + Map<Class<? extends TopiaEntity>, List<? extends TopiaEntity>> associations = serviceContext.getTopiaApplicationContext().findReverseAssociations(getTopiaPersistenceContext(), entity, IdHelper::isData); ImmutableSetDtoMap.Builder<DtoReference> result = ImmutableSetDtoMap.builder(); - for (Class<? extends TopiaEntity> type : allUsages.keySet()) { - List<? extends TopiaEntity> entities = allUsages.get(type); + + buildUsageResult(compositions, result); + buildUsageResult(associations, result); + return result.build(); + } + + private void buildUsageResult(Map<Class<? extends TopiaEntity>, List<? extends TopiaEntity>> compositions, ImmutableSetDtoMap.Builder<DtoReference> result) { + for (Map.Entry<Class<? extends TopiaEntity>, List<? extends TopiaEntity>> entry : compositions.entrySet()) { + Class<? extends TopiaEntity> type = entry.getKey(); + List<? extends TopiaEntity> entities = entry.getValue(); if (ObserveReferentialEntity.class.isAssignableFrom(type)) { //noinspection unchecked addAllReferentialUsage(DbModelHelper.fromReferentialEntity((Class) type), (List) entities, result); @@ -236,7 +244,6 @@ public class ReferentialServiceLocal extends ObserveServiceLocal implements Refe adddAllDataUsage(DbModelHelper.fromDataEntity((Class) type), (List) entities, result); } } - return result.build(); } private <D extends ReferentialDto, R extends ReferentialDtoReference<D, R>, E extends ObserveReferentialEntity> ReferentialDtoReferenceSet<R> getReferenceSet0(ReferentialReferenceEntityContext<D, R, E> spi, Date lastUpdateDate) { ===================================== services/pom.xml ===================================== @@ -153,6 +153,10 @@ <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> + <dependency> + <groupId>io.ultreia.java4all.topia</groupId> + <artifactId>service-script</artifactId> + </dependency> </dependencies> ===================================== services/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequest.java ===================================== @@ -25,6 +25,7 @@ package fr.ird.observe.services.service.actions.synchro.referential.ng; import fr.ird.observe.dto.ObserveDto; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.nuiton.topia.service.script.TopiaSqlStatements; /** * Created on 08/08/16. @@ -34,7 +35,6 @@ import org.apache.logging.log4j.Logger; */ public class ReferentialSynchronizeSqlsRequest implements ObserveDto { - /** Logger. */ private static final Logger log = LogManager.getLogger(ReferentialSynchronizeSqlsRequest.class); private final byte[] insertAssociationSqlCode; @@ -105,11 +105,9 @@ public class ReferentialSynchronizeSqlsRequest implements ObserveDto { } public Builder addInsertStatement(String sql) { - if (log.isInfoEnabled()) { - log.info("Add add sql: " + sql); - } - if (sql.startsWith("$$_INSERT")) { - addAssociationTasksBuilder.append(sql.substring(3)); + log.info("Add add sql: " + sql); + if (sql.startsWith(TopiaSqlStatements.ASSOCIATION_STATEMENT_PREFIX)) { + addAssociationTasksBuilder.append(TopiaSqlStatements.unboxAssociationStatement(sql)); } else { addTasksBuilder.append(sql); } @@ -117,20 +115,15 @@ public class ReferentialSynchronizeSqlsRequest implements ObserveDto { } public Builder addUpdateStatement(String sql) { - if (log.isInfoEnabled()) { - log.info("Add update sql: " + sql); - } + log.info("Add update sql: " + sql); updateTasksBuilder.append(sql); return this; } public Builder addDeleteStatement(String sql) { - - if (log.isInfoEnabled()) { - log.info("Add delete sql: " + sql); - } - if (sql.startsWith("$$_DELETE")) { - deleteAssociationTasksBuilder.append(sql.substring(3)); + log.info("Add delete sql: " + sql); + if (sql.startsWith(TopiaSqlStatements.ASSOCIATION_STATEMENT_PREFIX)) { + deleteAssociationTasksBuilder.append(TopiaSqlStatements.unboxAssociationStatement(sql)); } else { deleteTasksBuilder.append(sql); } @@ -138,10 +131,7 @@ public class ReferentialSynchronizeSqlsRequest implements ObserveDto { } public Builder addDesactivateStatement(String sql) { - - if (log.isInfoEnabled()) { - log.info("Add desactivate sql: " + sql); - } + log.info("Add desactivate sql: " + sql); desactivateTasksBuilder.append(sql); return this; } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/bc64ef42537b8b9768425ba88b… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/bc64ef42537b8b9768425ba88b… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop-7.x] 2 commits: [SYNCHRO] La synchro avancée d'une marée nécessitant une référence absente dans…
by Tony CHEMIT 19 Sep '18

19 Sep '18
Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 8ef8691f by Tony CHEMIT at 2018-09-19T06:59:13Z [SYNCHRO] La synchro avancée d&#39;une marée nécessitant une référence absente dans la base cible provoque une exception - Closes #1064 - - - - - bc64ef42 by Tony CHEMIT at 2018-09-19T06:59:15Z L&#39;UI de remplacement de code de référentiel dépasse parfois les limites de l&#39;écran - Closes #1059 - - - - - 23 changed files: - client/src/main/java/fr/ird/observe/client/db/ObserveSwingDataSource.java - client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroModel.java - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUI.jcss - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/content/ref/ContentReferenceUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDeleteUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDesactivateUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDisplayUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/util/UIHelper.java - client/src/main/resources/i18n/client_en_GB.properties - client/src/main/resources/i18n/client_es_ES.properties - client/src/main/resources/i18n/client_fr_FR.properties - pom.xml - server/src/main/java/fr/ird/observe/server/ObserveWebApplicationListener.java - + server/src/main/java/fr/ird/observe/server/injector/TopiaSqlScriptInjector.java - services-client/src/main/java/fr/ird/observe/services/client/ObserveRequestBuilder.java - services-local/src/main/java/fr/ird/observe/services/local/service/referential/ReferentialServiceLocal.java - services-local/src/main/java/fr/ird/observe/services/local/service/referential/ReferentialShellBuilder.java - services/src/main/java/fr/ird/observe/services/service/referential/MissingReferentialRequest.java - services/src/main/java/fr/ird/observe/services/service/referential/MissingReferentialResult.java - services/src/main/java/fr/ird/observe/services/service/referential/ReferentialService.java Changes: ===================================== client/src/main/java/fr/ird/observe/client/db/ObserveSwingDataSource.java ===================================== @@ -99,8 +99,9 @@ import fr.ird.observe.services.service.referential.ReferentialService; import fr.ird.observe.services.service.sql.SqlScriptProducerService; import fr.ird.observe.spi.map.ImmutableDtoMap; import fr.ird.observe.spi.map.ImmutableSetDtoMap; -import org.apache.logging.log4j.Logger; +import fr.ird.observe.spi.map.ImmutableSetStringMap; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.jdesktop.beans.AbstractSerializableBean; import org.nuiton.version.Version; @@ -561,7 +562,7 @@ public class ObserveSwingDataSource extends AbstractSerializableBean implements return ObserveServiceMainFactory.get().newService(observeServiceInitializer, serviceType); } - public ImmutableSetDtoMap<ReferentialDtoReference> getReferentialMap(ImmutableSetDtoMap<String> referentialIds) { + public ImmutableSetDtoMap<ReferentialDtoReference> getReferentialMap(ImmutableSetStringMap referentialIds) { ImmutableSetDtoMap.Builder<ReferentialDtoReference> result = ImmutableSetDtoMap.builder(); for (Class<? extends ReferentialDtoReference> dtoType : referentialIds.referentialReferenceTypes()) { ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportUIHandler.java ===================================== @@ -50,9 +50,10 @@ import fr.ird.observe.services.service.referential.MissingReferentialRequest; import fr.ird.observe.services.service.referential.MissingReferentialResult; import fr.ird.observe.services.service.referential.ReferentialService; import fr.ird.observe.spi.map.ImmutableSetDtoMap; +import fr.ird.observe.spi.map.ImmutableSetStringMap; import org.apache.commons.collections4.CollectionUtils; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.runtime.spi.UIHandler; import org.nuiton.jaxx.runtime.swing.editor.MyDefaultCellEditor; @@ -266,7 +267,7 @@ public class ExportUIHandler extends AdminTabUIHandler<ExportUI> implements UIHa if (log.isInfoEnabled()) { log.info("Chargement du réferentiel de la base centrale."); } - ImmutableSetDtoMap<String> centralSourceReferential = centralReferentialService.getReferentialIds(); + ImmutableSetStringMap centralSourceReferential = centralReferentialService.getReferentialIds(); List<String> tripIds = tripEntries.stream().map(TripEntry::getTripId).collect(Collectors.toList()); ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroModel.java ===================================== @@ -30,8 +30,8 @@ import fr.ird.observe.client.ui.admin.config.ConfigUI; import fr.ird.observe.client.ui.admin.synchronize.data.task.DataSynchronizeTaskSupport; import fr.ird.observe.client.ui.tree.selection.SelectionTreeModel; import fr.ird.observe.client.ui.util.ProgressModel; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import javax.swing.DefaultListModel; import javax.swing.border.TitledBorder; @@ -64,7 +64,7 @@ public class DataSynchroModel extends AdminActionModel { /** les données sélectionnées sur le panneau de droite. */ protected SelectionTreeModel rightSelectionDataModel; - + protected boolean insertMissingReferentials; protected final DefaultListModel<DataSynchronizeTaskSupport> tasks; private final ProgressModel progressModel = new ProgressModel(); @@ -131,6 +131,14 @@ public class DataSynchroModel extends AdminActionModel { return rightSelectionDataModel; } + public boolean isInsertMissingReferentials() { + return insertMissingReferentials; + } + + public void setInsertMissingReferentials(boolean insertMissingReferentials) { + this.insertMissingReferentials = insertMissingReferentials; + } + public void populateLeftSelectionModel() { populateSelectionModel(leftSource, leftSelectionDataModel, LEFT_SELECTION_MODEL_CHANGED_PROPERTY_NAME); } ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUI.jaxx ===================================== @@ -49,6 +49,9 @@ </Table> </JPanel> <JPanel id='NEED_FIX_content'> + <JCheckBox id="insertMissingReferentials" constraints='BorderLayout.NORTH' + onStateChanged='getStepModel().setInsertMissingReferentials(((JCheckBox)event.getSource()).isSelected())'/> + <JSplitPane id="contentSplitPane" constraints='BorderLayout.CENTER'> <Table id='contentNorth' fill="both" weighty="1"> <row> ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUI.jcss ===================================== @@ -45,6 +45,11 @@ mnemonic:Q; } +#insertMissingReferentials { + text:"observe.action.export.requiredInsertMissingReferentials"; + selected:{stepModel.isInsertMissingReferentials()}; +} + #leftTree { minimumSize:{UIHelper.newMinDimension()}; font-size:11; ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUIHandler.java ===================================== @@ -10,12 +10,12 @@ package fr.ird.observe.client.ui.admin.synchronize.data; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. @@ -33,12 +33,17 @@ import fr.ird.observe.client.ui.admin.synchronize.data.task.CopyToRightDataSynch import fr.ird.observe.client.ui.admin.synchronize.data.task.DataSynchronizeTaskSupport; import fr.ird.observe.client.ui.admin.synchronize.data.task.DeleteFromLeftDataSynchronizeTask; import fr.ird.observe.client.ui.admin.synchronize.data.task.DeleteFromRightDataSynchronizeTask; +import fr.ird.observe.client.ui.content.ref.usage.UsageForDisplayUI; import fr.ird.observe.client.ui.tree.selection.SelectionTree; import fr.ird.observe.client.ui.tree.selection.SelectionTreeModel; import fr.ird.observe.client.ui.util.ProgressModel; +import fr.ird.observe.client.ui.util.UIHelper; import fr.ird.observe.dto.decoration.DecoratorService; +import fr.ird.observe.dto.decoration.ObserveI18nDecoratorHelper; import fr.ird.observe.dto.decoration.decorators.ReferentialReferenceDecorator; import fr.ird.observe.dto.reference.DataDtoReference; +import fr.ird.observe.dto.reference.DtoReference; +import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ProgramReference; import fr.ird.observe.services.service.data.DeleteTripRequest; import fr.ird.observe.services.service.data.DeleteTripResult; @@ -47,14 +52,25 @@ import fr.ird.observe.services.service.data.ExportTripResult; import fr.ird.observe.services.service.data.ImportTripRequest; import fr.ird.observe.services.service.data.ImportTripResult; import fr.ird.observe.services.service.data.TripManagementService; +import fr.ird.observe.services.service.referential.MissingReferentialRequest; +import fr.ird.observe.services.service.referential.MissingReferentialResult; +import fr.ird.observe.services.service.referential.ReferentialService; +import fr.ird.observe.spi.map.ImmutableSetDtoMap; +import fr.ird.observe.spi.map.ImmutableSetStringMap; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.runtime.spi.UIHandler; import org.nuiton.jaxx.runtime.swing.wizard.ext.WizardState; import javax.swing.DefaultListModel; +import javax.swing.JOptionPane; import javax.swing.border.TitledBorder; import java.awt.Color; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import static org.nuiton.i18n.I18n.n; import static org.nuiton.i18n.I18n.t; @@ -67,6 +83,8 @@ import static org.nuiton.i18n.I18n.t; */ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> implements UIHandler<DataSynchroUI> { + private static final Logger log = LogManager.getLogger(DataSynchroUIHandler.class); + @Override public void afterInit(DataSynchroUI ui) { super.afterInit(this.ui); @@ -122,13 +140,10 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple } public void doStartAction() { - addAdminWorker(getUi().getStartAction().getToolTipText(), this::doStartAction0); - } public void addCopyToLeftTasks() { - SelectionTreeModel rightSelectionDataModel = getStepModel().getRightSelectionDataModel(); SelectionTreeModel leftSelectionDataModel = getStepModel().getLeftSelectionDataModel(); Map<ProgramReference, List<DataDtoReference<?, ?>>> selectedDataByProgram = rightSelectionDataModel.getSelectedDataByProgram(); @@ -138,17 +153,14 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple for (DataDtoReference trip : entry.getValue()) { boolean tripExistOnLeft = leftSelectionDataModel.containsData(program, trip); getStepModel().addTask(new CopyToLeftDataSynchronizeTask(program, trip, tripExistOnLeft)); - if (tripExistOnLeft) { leftSelectionDataModel.removeTrip(program, trip); } } } - } public void addCopyToRightTasks() { - SelectionTreeModel leftSelectionDataModel = getStepModel().getLeftSelectionDataModel(); SelectionTreeModel rightSelectionDataModel = getStepModel().getRightSelectionDataModel(); Map<ProgramReference, List<DataDtoReference<?, ?>>> selectedDataByProgram = leftSelectionDataModel.getSelectedDataByProgram(); @@ -156,20 +168,16 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple for (Map.Entry<ProgramReference, List<DataDtoReference<?, ?>>> entry : selectedDataByProgram.entrySet()) { ProgramReference program = entry.getKey(); for (DataDtoReference trip : entry.getValue()) { - boolean tripExistOnRight = rightSelectionDataModel.containsData(program, trip); getStepModel().addTask(new CopyToRightDataSynchronizeTask(program, trip, tripExistOnRight)); - if (tripExistOnRight) { rightSelectionDataModel.removeTrip(program, trip); } } } - } public void addDeleteFromLeftTasks() { - SelectionTreeModel selectionDataModel = getStepModel().getLeftSelectionDataModel(); Map<ProgramReference, List<DataDtoReference<?, ?>>> selectedDataByProgram = selectionDataModel.getSelectedDataByProgram(); selectionDataModel.removeAllSelectedData(); @@ -182,7 +190,6 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple } public void addDeleteFromRightTasks() { - SelectionTreeModel selectionDataModel = getStepModel().getRightSelectionDataModel(); Map<ProgramReference, List<DataDtoReference<?, ?>>> selectedDataByProgram = selectionDataModel.getSelectedDataByProgram(); selectionDataModel.removeAllSelectedData(); @@ -195,9 +202,7 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple } public void doExecuteAction() { - addAdminWorker(getUi().getStartAction().getToolTipText(), this::doExecuteAction0); - } private WizardState doStartAction0() { @@ -214,11 +219,11 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple ObserveSwingDataSource rightSource = configModel.getSafeCentralSource(true); stepModel.setRightSource(rightSource); -// tabUI.getLeftTreePane().setBorder(new TitledBorder(configModel.getLocalSourceModel().getLabel())); stepModel.populateLeftSelectionModel(); - sendMessage(t("observe.actions.synchro.referential.message.data.leftData.loaded")); + String leftLabelWithUrl = configModel.getLocalSourceModel().getLabelWithUrl(); + sendMessage(t("observe.actions.synchro.data.message.data.loaded", leftLabelWithUrl)); - TitledBorder leftBorder = new TitledBorder(configModel.getLocalSourceModel().getLabelWithUrl()); + TitledBorder leftBorder = new TitledBorder(leftLabelWithUrl); boolean leftCanWriteData = configModel.getLocalSourceModel().getDataSourceInformation().canWriteData(); leftBorder.setTitleColor(leftCanWriteData ? Color.GREEN : Color.RED); tabUI.getLeftTreePane().setBorder(leftBorder); @@ -228,11 +233,11 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple } configUI.getLocalSourceConfig().setBorder(leftBorder); -// tabUI.getRightTreePane().setBorder(new TitledBorder(configModel.getCentralSourceModel().getLabel())); stepModel.populateRightSelectionModel(); - sendMessage(t("observe.actions.synchro.referential.message.data.rightData.loaded")); + String rightLabelWithUrl = configModel.getCentralSourceModel().getLabelWithUrl(); + sendMessage(t("observe.actions.synchro.data.message.data.loaded", rightLabelWithUrl)); - TitledBorder rightBorder = new TitledBorder(configModel.getCentralSourceModel().getLabelWithUrl()); + TitledBorder rightBorder = new TitledBorder(rightLabelWithUrl); boolean rightCanWriteData = configModel.getCentralSourceModel().getDataSourceInformation().canWriteData(); rightBorder.setTitleColor(rightCanWriteData ? Color.GREEN : Color.RED); tabUI.getRightTreePane().setBorder(rightBorder); @@ -256,17 +261,162 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple int size = tasks.size(); int stepsCount = 0; + Set<String> idsToCopyToLeft = new LinkedHashSet<>(); + Set<String> idsToCopyToRight = new LinkedHashSet<>(); for (int i = 0; i < size; i++) { + DataSynchronizeTaskSupport task = tasks.getElementAt(i); stepsCount++; - if (task instanceof CopyToLeftDataSynchronizeTask || task instanceof CopyToRightDataSynchronizeTask) { + if (task instanceof CopyToLeftDataSynchronizeTask) { stepsCount++; + idsToCopyToLeft.add(task.getTrip().getId()); } + if (task instanceof CopyToRightDataSynchronizeTask) { + stepsCount++; + idsToCopyToRight.add(task.getTrip().getId()); + } + } + boolean copyToLeft = !idsToCopyToLeft.isEmpty(); + if (copyToLeft) { + stepsCount += 3; } + boolean copyToRight = !idsToCopyToRight.isEmpty(); + if (copyToRight) { + stepsCount += 3; + } + ProgressModel progressModel = getStepModel().getProgressModel(); progressModel.setStepsCount(stepsCount); DecoratorService decoratorService = getDecoratorService(); + boolean insertMissingReferentials = getStepModel().isInsertMissingReferentials(); + if (copyToLeft) { + + // generate add missing referential to left + + progressModel.incrementsCurrentStep(); + + ReferentialService leftReferentialService = leftSource.getReferentialService(); + ImmutableSetStringMap leftSourceReferential = leftReferentialService.getReferentialIds(); + MissingReferentialRequest leftMissingReferentialRequest = MissingReferentialRequest.of(leftSourceReferential, idsToCopyToLeft.toArray(new String[0])); + MissingReferentialResult leftMissingReferentialResult = + rightSource.getReferentialService().computeMissingReferential(leftMissingReferentialRequest); + + progressModel.incrementsCurrentStep(); + + if (!insertMissingReferentials && leftMissingReferentialResult != null) { + + // l'export n'est pas possible + UIHelper.displayWarning(t("observe.title.can.not.export.data.left"), t("observe.actions.exportData.error.missingReferentialsId.left")); + sendMessage(t("observe.actions.exportData.error.missingReferentialsId.left")); + return WizardState.CANCELED; + } + + if (leftMissingReferentialResult == null) { + progressModel.incrementsCurrentStep(); + } else { + + // there is some referential to add to left source + + String message = t("observe.message.show.usage.for.missingReferentials.left"); + + ImmutableSetDtoMap<ReferentialDtoReference> usages = rightSource.getReferentialMap(leftMissingReferentialResult.getMissingIds()); + UsageForDisplayUI usagesUI = UsageForDisplayUI.build(message, usages); + + int reponse = UIHelper.askUser(null, + t("observe.title.can.not.export.data.left"), + usagesUI, + JOptionPane.WARNING_MESSAGE, + new Object[]{ + t("observe.choice.confirm.insert"), + t("observe.choice.cancel")}, + 0); + + if (reponse != 0) { + + return WizardState.CANCELED; + } + + // insertion des référentiels manquants dans la base centrale + log.info("Insertion dans la base de gauche des référentiels manquants."); + + for (Class<? extends ReferentialDtoReference> key : usages.referentialReferenceTypes()) { + Set<? extends ReferentialDtoReference> references = usages.get(key); + String type = t(ObserveI18nDecoratorHelper.getTypePluralI18nKey(key)); + sendMessage(t("observe.actions.exportData.message.add.missing.referentials.left", references.size(), type)); + Decorator decorator = decoratorService.getReferenceDecorator(key); + for (DtoReference reference : references) { + sendMessage(t("observe.actions.exportData.message.add.missing.referential", decorator.toString(reference))); + } + } + progressModel.incrementsCurrentStep(); + leftReferentialService.insertMissingReferential(leftMissingReferentialResult.getSqlCode()); + } + } + + if (copyToRight) { + + // generate add missing referential to right + + progressModel.incrementsCurrentStep(); + + ReferentialService rightReferentialService = rightSource.getReferentialService(); + ImmutableSetStringMap rightSourceReferential = rightReferentialService.getReferentialIds(); + MissingReferentialRequest rightMissingReferentialRequest = MissingReferentialRequest.of(rightSourceReferential, idsToCopyToRight.toArray(new String[0])); + MissingReferentialResult rightMissingReferentialResult = + leftSource.getReferentialService().computeMissingReferential(rightMissingReferentialRequest); + + progressModel.incrementsCurrentStep(); + + if (!insertMissingReferentials && rightMissingReferentialResult != null) { + + // l'export n'est pas possible + UIHelper.displayWarning(t("observe.title.can.not.export.data.right"), t("observe.actions.exportData.error.missingReferentialsId.right")); + sendMessage(t("observe.actions.exportData.error.missingReferentialsId.right")); + return WizardState.CANCELED; + } + + if (rightMissingReferentialResult == null) { + progressModel.incrementsCurrentStep(); + } else { + + // there is some referential to add to left source + + String message = t("observe.message.show.usage.for.missingReferentials.right"); + + ImmutableSetDtoMap<ReferentialDtoReference> usages = leftSource.getReferentialMap(rightMissingReferentialResult.getMissingIds()); + UsageForDisplayUI usagesUI = UsageForDisplayUI.build(message, usages); + + int reponse = UIHelper.askUser(null, + t("observe.title.can.not.export.data.right"), + usagesUI, + JOptionPane.WARNING_MESSAGE, + new Object[]{ + t("observe.choice.confirm.insert"), + t("observe.choice.cancel")}, + 0); + + if (reponse != 0) { + + return WizardState.CANCELED; + } + + log.info("Insertion dans la base de droite des référentiels manquants."); + + for (Class<? extends ReferentialDtoReference> key : usages.referentialReferenceTypes()) { + Set<? extends ReferentialDtoReference> references = usages.get(key); + String type = t(ObserveI18nDecoratorHelper.getTypePluralI18nKey(key)); + sendMessage(t("observe.actions.exportData.message.add.missing.referentials.right", references.size(), type)); + Decorator decorator = decoratorService.getReferenceDecorator(key); + for (DtoReference reference : references) { + sendMessage(t("observe.actions.exportData.message.add.missing.referential", decorator.toString(reference))); + } + } + progressModel.incrementsCurrentStep(); + rightReferentialService.insertMissingReferential(rightMissingReferentialResult.getSqlCode()); + } + } + ReferentialReferenceDecorator<ProgramReference> programDecorator = decoratorService.getReferentialReferenceDecorator(ProgramReference.class); TripManagementService leftTripManagementService = leftSource.getTripManagementService(); @@ -383,4 +533,5 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple return WizardState.SUCCESSED; } + } ===================================== client/src/main/java/fr/ird/observe/client/ui/content/ref/ContentReferenceUIHandler.java ===================================== @@ -407,12 +407,14 @@ public class ContentReferenceUIHandler<D extends ReferentialDto, R extends Refer UsageForDisplayUI<R> usagesUI = UsageForDisplayUI.build(message, usages); - UIHelper.askUser(ui, - t("observe.title.show.usage"), - usagesUI, - JOptionPane.INFORMATION_MESSAGE, - new Object[]{t("observe.choice.quit")}, - 0); + Object[] options = { + t("observe.choice.quit")}; + JOptionPane pane = new JOptionPane(usagesUI, JOptionPane.INFORMATION_MESSAGE, + JOptionPane.DEFAULT_OPTION, null, + options, options[0]); + + UIHelper.askUser(pane, t("observe.title.show.usage"), options); + } @Override ===================================== client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDeleteUI.jaxx ===================================== @@ -66,8 +66,16 @@ protected void finalize() throws Throwable { <JLabel text="observe.message.show.usage.for.delete3"/> </JPanel> - <JPanel id="usages" border='{new TitledBorder(t("observe.usage.usageTitle"))}' constraints="BorderLayout.CENTER" - layout="{new GridLayout(0, 1)}"/> + <Table fill="both" constraints="BorderLayout.CENTER"> + <row> + <cell weighty="1" weightx="1"> + <JScrollPane verticalScrollBarPolicy='{JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED}'> + <JPanel id="usages" border='{new TitledBorder(t("observe.usage.usageTitle"))}' + layout="{new GridLayout(0, 1)}"/> + </JScrollPane> + </cell> + </row> + </Table> <JPanel id="replacePanel" border='{new TitledBorder(t("observe.usage.replaceTitle"))}' constraints="BorderLayout.SOUTH" layout="{new GridLayout(0, 1)}"> ===================================== client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDesactivateUI.jaxx ===================================== @@ -66,8 +66,16 @@ protected void finalize() throws Throwable { <JLabel text="observe.message.show.usage.for.desactivated3"/> </JPanel> - <JPanel id="usages" border='{new TitledBorder(t("observe.usage.usageTitle"))}' constraints="BorderLayout.CENTER" - layout="{new GridLayout(0, 1)}"/> + <Table fill="both" constraints="BorderLayout.CENTER"> + <row> + <cell weighty="1" weightx="1"> + <JScrollPane verticalScrollBarPolicy='{JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED}'> + <JPanel id="usages" border='{new TitledBorder(t("observe.usage.usageTitle"))}' + layout="{new GridLayout(0, 1)}"/> + </JScrollPane> + </cell> + </row> + </Table> <JPanel id="replacePanel" constraints="BorderLayout.SOUTH" layout="{new BorderLayout()}"> ===================================== client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDisplayUI.jaxx ===================================== @@ -56,7 +56,15 @@ protected void finalize() throws Throwable { <JLabel id="message" constraints="BorderLayout.NORTH"/> - <JPanel id="usages" border='{new TitledBorder(t("observe.usage.usageTitle"))}' constraints="BorderLayout.CENTER" - layout="{new GridLayout(0, 1)}"/> + <Table fill="both" constraints="BorderLayout.CENTER"> + <row> + <cell weighty="1" weightx="1"> + <JScrollPane verticalScrollBarPolicy='{JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED}'> + <JPanel id="usages" border='{new TitledBorder(t("observe.usage.usageTitle"))}' + layout="{new GridLayout(0, 1)}"/> + </JScrollPane> + </cell> + </row> + </Table> </JPanel> ===================================== client/src/main/java/fr/ird/observe/client/ui/util/UIHelper.java ===================================== @@ -37,8 +37,8 @@ import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.services.security.InvalidAuthenticationTokenException; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.io.FileUtils; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.jdesktop.swingx.painter.Painter; import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.runtime.JAXXObject; @@ -185,10 +185,9 @@ public class UIHelper extends SwingUtil { contentPane.setLayout(new BorderLayout()); contentPane.add(pane, BorderLayout.CENTER); - dialog.setResizable(false); dialog.pack(); - dialog.setLocationRelativeTo(mainUI); + SwingUtil.center(mainUI, dialog); final PropertyChangeListener listener = event -> { // Let the defaultCloseOperation handle the closing ===================================== client/src/main/resources/i18n/client_en_GB.properties ===================================== @@ -151,8 +151,12 @@ observe.actions.consolidate.title.tip=Consolidate observed data observe.actions.exportData=Export data observe.actions.exportData.description=Export data observe.actions.exportData.error.missingReferentialsId=Can't export data, there is some missing referentials in central source and you did not select insert option. +observe.actions.exportData.error.missingReferentialsId.left=Can't export data, there is some missing referentials in left source and you did not select insert option. +observe.actions.exportData.error.missingReferentialsId.right=Can't export data, there is some missing referentials in right source and you did not select insert option. observe.actions.exportData.message.add.missing.referential=\t%s observe.actions.exportData.message.add.missing.referentials=Insert %s missing referentials of type «%s» +observe.actions.exportData.message.add.missing.referentials.left=Insert %s missing referentials of type «%s» in left source +observe.actions.exportData.message.add.missing.referentials.right=Insert %s missing referentials of type «%s» in right source observe.actions.exportData.message.not.possible=Export is not possible (see above messages) observe.actions.exportData.message.operation.needFix=Select data to export. observe.actions.exportData.message.prepare.data=Prepare data to export... @@ -202,6 +206,7 @@ observe.actions.synchro.data.deleteFromLeft.tip=Delete selected trip(s) from lef observe.actions.synchro.data.deleteFromRight.tip=Delete selected trip(s) from right database observe.actions.synchro.data.description=Advanced data management observe.actions.synchro.data.launch.operation=Get data fro databases +observe.actions.synchro.data.message.data.loaded=%s - Data loaded observe.actions.synchro.data.prepare.copyToLeftTask=Register operation copy to left database\: %s - %s observe.actions.synchro.data.prepare.copyToRightTask=Register operation copy to right database\: %s - %s observe.actions.synchro.data.prepare.deleteFromLeftTask=Register operation delete from left database\: %s - %s @@ -242,8 +247,6 @@ observe.actions.synchro.referential.legacy.launch.operation=Synchronize referent observe.actions.synchro.referential.legacy.tip=Synchronize objectOperation on local database observe.actions.synchro.referential.message.apply.done=Referential updated at 1$td/%1$tm/%1$tY à %1$tH\:%1$tM\:%1$tS observe.actions.synchro.referential.message.build.diff=Build differential of referential from %1$s -observe.actions.synchro.referential.message.data.leftData.loaded=Left referential panel loaded -observe.actions.synchro.referential.message.data.rightData.loaded=Right referential panel loaded observe.actions.synchro.referential.message.need.save.for.synchro.operation=Referential update has modified some local data. observe.actions.synchro.referential.message.need.save.for.validation.operation=Validation operation has modified some local data. observe.actions.synchro.referential.message.no.local.modification=No data modified, save is not required. @@ -1313,6 +1316,8 @@ observe.message.show.usage.for.desactivated=Referential %1$s "%2$s" will be disa observe.message.show.usage.for.desactivated2=Some data are using this referential, see following reference observe.message.show.usage.for.desactivated3=Those data need to use another enabled referential to be saved. observe.message.show.usage.for.missingReferentials=There is some referentials present in local source but not in centrale one. +observe.message.show.usage.for.missingReferentials.left=There is some referentials present in right source but not in left one. +observe.message.show.usage.for.missingReferentials.right=There is some referentials present in left source but not in right one. observe.message.show.usages=List of usage of referential %1$s\: '%2$s' observe.message.table.editBean.modified=Current entry is modifed and valid. observe.message.table.editBean.modified.but.invalid=Current entry is modified but not valid. @@ -1468,6 +1473,8 @@ observe.storage.useServerStorage.description=Please configure connexion to remot observe.title.about=About observe.title.can.not.delete.referentiel=Impossible to delete a referentiel data... observe.title.can.not.export.data=Could not export data +observe.title.can.not.export.data.left=Could not export data to left source +observe.title.can.not.export.data.right=Could not export data to right source observe.title.can.not.export.obstuna=Could not export obstuna data... observe.title.choose.db.dump=Choose a database backup observe.title.choose.db.dump.directory=Chhose directory of backup ===================================== client/src/main/resources/i18n/client_es_ES.properties ===================================== @@ -151,8 +151,12 @@ observe.actions.consolidate.title.tip=Consolidar los datos observados observe.actions.exportData=Exportar los datos observados observe.actions.exportData.description=Exportar los datos observados en la base central observe.actions.exportData.error.missingReferentialsId=Il existe des référentiels dans la base locale non présente en base centrale, mais vous n'avez pas activé l'option d'insertion automatique. \#TODO +observe.actions.exportData.error.missingReferentialsId.left=Il existe des référentiels dans la base de gauche non présente en base centrale, mais vous n'avez pas activé l'option d'insertion automatique. \#TODO +observe.actions.exportData.error.missingReferentialsId.right=Il existe des référentiels dans la base de droite non présente en base centrale, mais vous n'avez pas activé l'option d'insertion automatique. \#TODO observe.actions.exportData.message.add.missing.referential=\t%s observe.actions.exportData.message.add.missing.referentials=Insertion de %s référentiels de type «%s» \#TODO +observe.actions.exportData.message.add.missing.referentials.left=Insertion de %s référentiels de type «%s» dans la base de gauche\#TODO +observe.actions.exportData.message.add.missing.referentials.right=Insertion de %s référentiels de type «%s» dans la base de droite\#TODO observe.actions.exportData.message.not.possible=La exportación no es posible (vea el mensaje anterior). observe.actions.exportData.message.operation.needFix=Seleccione las mareas a exportar. observe.actions.exportData.message.prepare.data=Preparación de los datos a exportar... @@ -202,6 +206,7 @@ observe.actions.synchro.data.deleteFromLeft.tip=Eliminar la ou las mareas selecc observe.actions.synchro.data.deleteFromRight.tip=Eliminar la ou las mareas seleccionada(s) de la base de la derecha observe.actions.synchro.data.description=Gestión avanzada de los datos de los usuarios observe.actions.synchro.data.launch.operation=Recuperar los datos de las fuentes de datos +observe.actions.synchro.data.message.data.loaded=%s - Datos recuperadas. observe.actions.synchro.data.prepare.copyToLeftTask=Preparación de la copia en la base de la izquierda \: %s - %s observe.actions.synchro.data.prepare.copyToRightTask=Preparación de la copia en la base de la derecha \: %s - %s observe.actions.synchro.data.prepare.deleteFromLeftTask=Preparación de la eliminación de la base de la izquierda \: %s - %s @@ -242,8 +247,6 @@ observe.actions.synchro.referential.legacy.launch.operation=Calcular el diferenc observe.actions.synchro.referential.legacy.tip=Operación de actualización del referencial de la base local observe.actions.synchro.referential.message.apply.done=Referencial actualizado el %1$td/%1$tm/%1$tY a %1$tH\:%1$tM\:%1$tS observe.actions.synchro.referential.message.build.diff=Construcción del diferencial de referenciales desde\: %1$s -observe.actions.synchro.referential.message.data.leftData.loaded=Datos del pannel de la izquierda recuperadas. -observe.actions.synchro.referential.message.data.rightData.loaded=Datos del pannel de la derecha recuperadas. observe.actions.synchro.referential.message.need.save.for.synchro.operation=La operación de sincronización de referenciales ha generado cambios observe.actions.synchro.referential.message.need.save.for.validation.operation=la operación de validación de datos ha generado modificaciones. observe.actions.synchro.referential.message.no.local.modification=No se han modificado datos en la base local, no es necesario guardar. @@ -1313,6 +1316,8 @@ observe.message.show.usage.for.desactivated=El referencial %1$s "%2$s" se desact observe.message.show.usage.for.desactivated2=Los objetos están usando actualmente las referencias que se enumeran a continuación.. observe.message.show.usage.for.desactivated3=Estos objetos deben usar otro referencial (no desactivado) para poder actualizarse. observe.message.show.usage.for.missingReferentials=Il existe des référentiels présents dans la base locale mais non présents dans la base centrale. \#TODO +observe.message.show.usage.for.missingReferentials.left=Il existe des référentiels présents dans la base de droite mais non présents dans la base de gauche. +observe.message.show.usage.for.missingReferentials.right=Il existe des référentiels présents dans la base de gauche mais non présents dans la base droite. observe.message.show.usages=Listas de usos de referenciales %1$s \: '%2$s' observe.message.table.editBean.modified=El registro actual se ha modificado y es válido. observe.message.table.editBean.modified.but.invalid=El registro actual se ha modificado pero no es válido. @@ -1468,6 +1473,8 @@ observe.storage.useServerStorage.description=Configure su conexión al servidor observe.title.about=A proposito de ObServe... observe.title.can.not.delete.referentiel=Impossible eliminar un referencial en proceso de utilización... observe.title.can.not.export.data=Impossible d'exporter les données vers la base centrale... \#TODO +observe.title.can.not.export.data.left=Impossible d'exporter les données vers la base de gauche... \#TODO +observe.title.can.not.export.data.right=Impossible d'exporter les données vers la base de droite... \#TODO observe.title.can.not.export.obstuna=Impossible exportar los datos de obstuna... observe.title.choose.db.dump=Seleccionar una copia de seguridad de base local observe.title.choose.db.dump.directory=Seleccionar e directorio de destinación de la copia de seguridad ===================================== client/src/main/resources/i18n/client_fr_FR.properties ===================================== @@ -151,8 +151,12 @@ observe.actions.consolidate.title.tip=Consolider les données observateur observe.actions.exportData=Exporter les données observateurs observe.actions.exportData.description=Exporter les données observateurs vers la base centrale observe.actions.exportData.error.missingReferentialsId=Il existe des référentiels dans la base locale non présente en base centrale, mais vous n'avez pas activé l'option d'insertion automatique. +observe.actions.exportData.error.missingReferentialsId.left=Il existe des référentiels dans la base de gauche non présente en base centrale, mais vous n'avez pas activé l'option d'insertion automatique. +observe.actions.exportData.error.missingReferentialsId.right=Il existe des référentiels dans la base de droite non présente en base centrale, mais vous n'avez pas activé l'option d'insertion automatique. observe.actions.exportData.message.add.missing.referential=\t%s observe.actions.exportData.message.add.missing.referentials=Insertion de %s référentiels de type «%s» +observe.actions.exportData.message.add.missing.referentials.left=Insertion de %s référentiels de type «%s» dans la base de gauche +observe.actions.exportData.message.add.missing.referentials.right=Insertion de %s référentiels de type «%s» dans la base de droite observe.actions.exportData.message.not.possible=L'opération d'export n'est pas possible (voir les messages précédents). observe.actions.exportData.message.operation.needFix=Veuillez sélectionner les marées à exporter. observe.actions.exportData.message.prepare.data=Préparation des données à exporter... @@ -202,6 +206,7 @@ observe.actions.synchro.data.deleteFromLeft.tip=Supprimer la ou les marées sél observe.actions.synchro.data.deleteFromRight.tip=Supprimer la ou les marées sélectionnée(s) de la base de droite observe.actions.synchro.data.description=Gestion avancée des données utilisateurs observe.actions.synchro.data.launch.operation=Récupérer les données des sources de données +observe.actions.synchro.data.message.data.loaded=%s - Données récupérées. observe.actions.synchro.data.prepare.copyToLeftTask=Préparation de la recopie vers la base de gauche \: %s - %s observe.actions.synchro.data.prepare.copyToRightTask=Préparation de la recopie vers la base de droite \: %s - %s observe.actions.synchro.data.prepare.deleteFromLeftTask=Préparation de la suppression de la base de gauche \: %s - %s @@ -242,8 +247,6 @@ observe.actions.synchro.referential.legacy.launch.operation=Calculer le différe observe.actions.synchro.referential.legacy.tip=Opération de mise à jour du référentiel de la base locale observe.actions.synchro.referential.message.apply.done=Référentiel mis à jour le %1$td/%1$tm/%1$tY à %1$tH\:%1$tM\:%1$tS observe.actions.synchro.referential.message.build.diff=Construction du différentiel de référentiel depuis %1$s -observe.actions.synchro.referential.message.data.leftData.loaded=Données du panneau gauche récupérées. -observe.actions.synchro.referential.message.data.rightData.loaded=Données du panneau droit récupérées. observe.actions.synchro.referential.message.need.save.for.synchro.operation=L'opération de synchronisation du référentiel a engendrée des modifications. observe.actions.synchro.referential.message.need.save.for.validation.operation=L'opération de validation des données a engendrée des modifications. observe.actions.synchro.referential.message.no.local.modification=Aucune donnée de la base locale n'a été modifiée @@ -1313,6 +1316,8 @@ observe.message.show.usage.for.desactivated=Le référentiel %1$s "%2$s" va êtr observe.message.show.usage.for.desactivated2=Des objets utilisent actuellement cet entité dont les références sont citées plus bas. observe.message.show.usage.for.desactivated3=Ces objets devront utiliser un autre référentiel (non désactivé) pour pouvoir être mis à jour. observe.message.show.usage.for.missingReferentials=Il existe des référentiels présents dans la base locale mais non présents dans la base centrale. +observe.message.show.usage.for.missingReferentials.left=Il existe des référentiels présents dans la base de droite mais non présents dans la base de gauche. +observe.message.show.usage.for.missingReferentials.right=Il existe des référentiels présents dans la base de gauche mais non présents dans la base droite. observe.message.show.usages=Listes des utilisations du référentiel %1$s \: '%2$s' observe.message.table.editBean.modified=L'entrée en cours d'édition a été modifiée et est valide. observe.message.table.editBean.modified.but.invalid=L'entrée en cours d'édition a été modifiée, mais n'est pas valide. @@ -1468,6 +1473,8 @@ observe.storage.useServerStorage.description=Veuillez configurer votre connexion observe.title.about=A propos d'ObServe... observe.title.can.not.delete.referentiel=Impossible de supprimer un référentiel en cours d'utilisation... observe.title.can.not.export.data=Impossible d'exporter les données vers la base centrale... +observe.title.can.not.export.data.left=Impossible d'exporter les données vers la base de gauche... +observe.title.can.not.export.data.right=Impossible d'exporter les données vers la base de droite... observe.title.can.not.export.obstuna=Impossible d'exporter des données d'obstuna... observe.title.choose.db.dump=Choisir une sauvegarder de base locale observe.title.choose.db.dump.directory=Choisir le répertoire de destination de la sauvegarde ===================================== pom.xml ===================================== @@ -26,7 +26,7 @@ <parent> <groupId>io.ultreia.maven</groupId> <artifactId>pom</artifactId> - <version>2018.56</version> + <version>2018.57</version> </parent> <groupId>fr.ird.observe</groupId> @@ -162,7 +162,7 @@ <lib.version.h2>1.4.196</lib.version.h2> <!--<lib.version.nuiton.topia>3.6-SNAPSHOT</lib.version.nuiton.topia>--> <!--<lib.version.java4all.eugene>3.0-alpha-21</lib.version.java4all.eugene>--> - <lib.version.java4all.topia>1.1.7-SNAPSHOT</lib.version.java4all.topia> + <!--<lib.version.java4all.topia>1.1.8-SNAPSHOT</lib.version.java4all.topia>--> <!-- license header configuration --> <license.licenseName>gpl_v3</license.licenseName> <license.organizationName>IRD, Code Lutin, Ultreia.io</license.organizationName> ===================================== server/src/main/java/fr/ird/observe/server/ObserveWebApplicationListener.java ===================================== @@ -32,11 +32,11 @@ import fr.ird.observe.server.injector.ObserveDataSourceConfigurationInjector; import fr.ird.observe.server.injector.ObserveDtoInjector; import fr.ird.observe.server.injector.ObserveReferenceSetRequestInjector; import fr.ird.observe.server.injector.SqlScriptProducerRequestInjector; +import fr.ird.observe.server.injector.TopiaSqlScriptInjector; import io.ultreia.java4all.http.HRequestBuilder; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.debux.webmotion.server.WebMotionServerListener; import org.debux.webmotion.server.call.ServerContext; import org.debux.webmotion.server.mapping.Mapping; @@ -80,6 +80,7 @@ public class ObserveWebApplicationListener implements WebMotionServerListener { context.addInjector(new DateInjector(HRequestBuilder.DATE_PATTERN)); context.addInjector(new SqlScriptProducerRequestInjector(gson)); context.addInjector(new ImmutableSetInjector(gson)); + context.addInjector(new TopiaSqlScriptInjector(gson)); context.addConverter(new ObserveDtoConverter(gson), ObserveDbUserDto.class); context.getServletContext().setAttribute(ObserveWebApplicationContext.APPLICATION_CONTEXT_PARAMETER, applicationContext); ===================================== server/src/main/java/fr/ird/observe/server/injector/TopiaSqlScriptInjector.java ===================================== @@ -0,0 +1,63 @@ +package fr.ird.observe.server.injector; + +/*- + * #%L + * ObServe :: Server + * %% + * Copyright (C) 2008 - 2018 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.gson.Gson; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.debux.webmotion.server.call.Call; +import org.debux.webmotion.server.handler.ExecutorParametersInjectorHandler; +import org.debux.webmotion.server.mapping.Mapping; +import org.nuiton.topia.persistence.script.TopiaSqlScript; + +import java.lang.reflect.Type; +import java.util.Objects; + +/** + * @author Tony Chemit - dev(a)tchemit.fr + */ +public class TopiaSqlScriptInjector implements ExecutorParametersInjectorHandler.Injector { + + /** Logger. */ + private static final Logger log = LogManager.getLogger(TopiaSqlScriptInjector.class); + + protected final Gson gson; + + public TopiaSqlScriptInjector(Gson gson) { + this.gson = gson; + } + + @Override + public Object getValue(Mapping mapping, Call call, String name, Class<?> type, Type generic) { + TopiaSqlScript topiaSqlScript = null; + if (type.equals(TopiaSqlScript.class)) { + Call.ParameterTree parameterTree = call.getParameterTree().getObject().get(name); + Objects.requireNonNull(parameterTree, "Le paramètre " + name + " n'as pas été trouvé, recompiler (parameter)!"); + String gsonContent = ((String[]) parameterTree.getValue())[0]; + topiaSqlScript = gson.fromJson(gsonContent, TopiaSqlScript.class); + log.info("Inject topiaSqlScript: " + topiaSqlScript); + } + return topiaSqlScript; + } + +} ===================================== services-client/src/main/java/fr/ird/observe/services/client/ObserveRequestBuilder.java ===================================== @@ -24,6 +24,7 @@ package fr.ird.observe.services.client; import fr.ird.observe.services.configuration.rest.ObserveDataSourceConfigurationRestConstants; import io.ultreia.java4all.http.HRequestBuilder; +import org.nuiton.topia.persistence.script.TopiaSqlScript; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -72,4 +73,9 @@ public class ObserveRequestBuilder extends HRequestBuilder { addAuthTokenSupplier(serviceContext.getAuthTokenSupplier()); } } + + public ObserveRequestBuilder addParameter(String parameterName, TopiaSqlScript value) { + super.addParameter(parameterName, serviceContext.getResponseBuilder().getGson().get().toJson(value)); + return this; + } } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/referential/ReferentialServiceLocal.java ===================================== @@ -70,6 +70,7 @@ import fr.ird.observe.spi.context.ReferentialEntityContext; import fr.ird.observe.spi.context.ReferentialReferenceEntityContext; import fr.ird.observe.spi.map.ImmutableDtoMap; import fr.ird.observe.spi.map.ImmutableSetDtoMap; +import fr.ird.observe.spi.map.ImmutableSetStringMap; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.nuiton.topia.persistence.TopiaDao; @@ -276,9 +277,9 @@ public class ReferentialServiceLocal extends ObserveServiceLocal implements Refe } @Override - public ImmutableSetDtoMap<String> getReferentialIds() { + public ImmutableSetStringMap getReferentialIds() { - ImmutableSetDtoMap.Builder<String> result = ImmutableSetDtoMap.builder(); + ImmutableSetStringMap.Builder result = ImmutableSetStringMap.builder(); for (Class<? extends ReferentialDto> dtoType : DtoModelClasses.REFERENTIAL_TYPES) { getReferentialIds0(dtoType, result); @@ -286,7 +287,7 @@ public class ReferentialServiceLocal extends ObserveServiceLocal implements Refe return result.build(); } - private <D extends ReferentialDto, R extends ReferentialDtoReference<D, R>, E extends ObserveReferentialEntity> void getReferentialIds0(Class<D> dtoType, ImmutableSetDtoMap.Builder<String> result) { + private <D extends ReferentialDto, R extends ReferentialDtoReference<D, R>, E extends ObserveReferentialEntity> void getReferentialIds0(Class<D> dtoType, ImmutableSetStringMap.Builder result) { ReferentialDtoEntityContext<D, R, E> typeContext = DbModelHelper.fromReferentialDto(dtoType); ReferentialEntityReferenceBinderSupport<D, R, E> binder = typeContext.toEntityReferenceBinder(); TopiaDao<E> dao = getTopiaPersistenceContext().getDao(binder.getEntityType()); @@ -312,7 +313,7 @@ public class ReferentialServiceLocal extends ObserveServiceLocal implements Refe } } - ImmutableSetDtoMap<String> missingReferentialIds = referentialShellBuilder.build(); + ImmutableSetStringMap missingReferentialIds = referentialShellBuilder.build(); if (missingReferentialIds.isEmpty()) { return null; ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/referential/ReferentialShellBuilder.java ===================================== @@ -10,12 +10,12 @@ package fr.ird.observe.services.local.service.referential; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. @@ -24,7 +24,7 @@ package fr.ird.observe.services.local.service.referential; import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; import fr.ird.observe.spi.DbModelHelper; -import fr.ird.observe.spi.map.ImmutableSetDtoMap; +import fr.ird.observe.spi.map.ImmutableSetStringMap; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaEntityVisitor; @@ -39,35 +39,35 @@ import java.util.TreeSet; */ public class ReferentialShellBuilder { - public static ReferentialShellBuilder builder(ImmutableSetDtoMap<String> incomingReferentialIds) { - return new ReferentialShellBuilder(incomingReferentialIds); + private final GetEntityReferentialShellVisitor visitor; + + private ReferentialShellBuilder(ImmutableSetStringMap incomingReferentialIds) { + visitor = new GetEntityReferentialShellVisitor(incomingReferentialIds); } - private final GetEntityReferentialShellVisitor visitor; + public static ReferentialShellBuilder builder(ImmutableSetStringMap incomingReferentialIds) { + return new ReferentialShellBuilder(incomingReferentialIds); + } void scan(TopiaEntity entity) { entity.accept(visitor); } - public ImmutableSetDtoMap<String> build() { + public ImmutableSetStringMap build() { return visitor.missingReferentialIds.build(); } - private ReferentialShellBuilder(ImmutableSetDtoMap<String> incomingReferentialIds) { - visitor = new GetEntityReferentialShellVisitor(incomingReferentialIds); - } - private static class GetEntityReferentialShellVisitor implements TopiaEntityVisitor { private final Set<String> hitIds; - private final ImmutableSetDtoMap<String> incomingReferentialIds; - private final ImmutableSetDtoMap.Builder<String> missingReferentialIds; + private final ImmutableSetStringMap incomingReferentialIds; + private final ImmutableSetStringMap.Builder missingReferentialIds; - GetEntityReferentialShellVisitor(ImmutableSetDtoMap<String> incomingReferentialIds) { + GetEntityReferentialShellVisitor(ImmutableSetStringMap incomingReferentialIds) { this.incomingReferentialIds = incomingReferentialIds; this.hitIds = new TreeSet<>(); - this.missingReferentialIds = ImmutableSetDtoMap.builder(); + this.missingReferentialIds = ImmutableSetStringMap.builder(); } @Override ===================================== services/src/main/java/fr/ird/observe/services/service/referential/MissingReferentialRequest.java ===================================== @@ -23,7 +23,7 @@ package fr.ird.observe.services.service.referential; */ import fr.ird.observe.dto.ObserveDto; -import fr.ird.observe.spi.map.ImmutableSetDtoMap; +import fr.ird.observe.spi.map.ImmutableSetStringMap; /** * Created on 07/11/16. @@ -33,19 +33,19 @@ import fr.ird.observe.spi.map.ImmutableSetDtoMap; */ public class MissingReferentialRequest implements ObserveDto { - private final ImmutableSetDtoMap<String> centralSourceReferential; + private final ImmutableSetStringMap centralSourceReferential; private final String[] tripIds; - public static MissingReferentialRequest of(ImmutableSetDtoMap<String> centralSourceReferential, String... tripIds) { + public static MissingReferentialRequest of(ImmutableSetStringMap centralSourceReferential, String... tripIds) { return new MissingReferentialRequest(centralSourceReferential, tripIds); } - private MissingReferentialRequest(ImmutableSetDtoMap<String> centralSourceReferential, String... tripIds) { + private MissingReferentialRequest(ImmutableSetStringMap centralSourceReferential, String... tripIds) { this.centralSourceReferential = centralSourceReferential; this.tripIds = tripIds; } - public ImmutableSetDtoMap<String> getCentralSourceReferential() { + public ImmutableSetStringMap getCentralSourceReferential() { return centralSourceReferential; } ===================================== services/src/main/java/fr/ird/observe/services/service/referential/MissingReferentialResult.java ===================================== @@ -23,8 +23,8 @@ package fr.ird.observe.services.service.referential; */ import fr.ird.observe.dto.ObserveDto; +import fr.ird.observe.spi.map.ImmutableSetStringMap; import org.nuiton.topia.persistence.script.TopiaSqlScript; -import fr.ird.observe.spi.map.ImmutableSetDtoMap; /** * Created on 07/11/16. @@ -34,19 +34,19 @@ import fr.ird.observe.spi.map.ImmutableSetDtoMap; */ public class MissingReferentialResult implements ObserveDto { - private final ImmutableSetDtoMap<String> missingIds; + private final ImmutableSetStringMap missingIds; private final TopiaSqlScript sqlCode; - private MissingReferentialResult(ImmutableSetDtoMap<String> missingIds, TopiaSqlScript sqlCode) { + private MissingReferentialResult(ImmutableSetStringMap missingIds, TopiaSqlScript sqlCode) { this.missingIds = missingIds; this.sqlCode = sqlCode; } - public static MissingReferentialResult of(ImmutableSetDtoMap<String> missingReferentialIds, TopiaSqlScript sqlCode) { + public static MissingReferentialResult of(ImmutableSetStringMap missingReferentialIds, TopiaSqlScript sqlCode) { return new MissingReferentialResult(missingReferentialIds, sqlCode); } - public ImmutableSetDtoMap<String> getMissingIds() { + public ImmutableSetStringMap getMissingIds() { return missingIds; } ===================================== services/src/main/java/fr/ird/observe/services/service/referential/ReferentialService.java ===================================== @@ -40,6 +40,7 @@ import fr.ird.observe.services.spi.Write; import fr.ird.observe.services.spi.WriteDataPermission; import fr.ird.observe.services.spi.WriteReferentialPermission; import fr.ird.observe.spi.map.ImmutableSetDtoMap; +import fr.ird.observe.spi.map.ImmutableSetStringMap; import io.ultreia.java4all.http.spi.Delete; import io.ultreia.java4all.http.spi.Get; import io.ultreia.java4all.http.spi.Nullable; @@ -119,7 +120,7 @@ public interface ReferentialService extends ObserveService { @ReadReferentialPermission @Post - ImmutableSetDtoMap<String> getReferentialIds(); + ImmutableSetStringMap getReferentialIds(); @ReadReferentialPermission View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/6e5f9f038c1654a674819b3b62… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/6e5f9f038c1654a674819b3b62… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop-7.x] L'UI de remplacement de code de référentiel dépasse parfois les limites de l'écran - Closes #1059
by Tony CHEMIT 19 Sep '18

19 Sep '18
Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 6e5f9f03 by Tony CHEMIT at 2018-09-19T06:12:41Z L&#39;UI de remplacement de code de référentiel dépasse parfois les limites de l&#39;écran - Closes #1059 - - - - - 5 changed files: - client/src/main/java/fr/ird/observe/client/ui/content/ref/ContentReferenceUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDeleteUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDesactivateUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDisplayUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/util/UIHelper.java Changes: ===================================== client/src/main/java/fr/ird/observe/client/ui/content/ref/ContentReferenceUIHandler.java ===================================== @@ -407,12 +407,14 @@ public class ContentReferenceUIHandler<D extends ReferentialDto, R extends Refer UsageForDisplayUI<R> usagesUI = UsageForDisplayUI.build(message, usages); - UIHelper.askUser(ui, - t("observe.title.show.usage"), - usagesUI, - JOptionPane.INFORMATION_MESSAGE, - new Object[]{t("observe.choice.quit")}, - 0); + Object[] options = { + t("observe.choice.quit")}; + JOptionPane pane = new JOptionPane(usagesUI, JOptionPane.INFORMATION_MESSAGE, + JOptionPane.DEFAULT_OPTION, null, + options, options[0]); + + UIHelper.askUser(pane, t("observe.title.show.usage"), options); + } @Override ===================================== client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDeleteUI.jaxx ===================================== @@ -66,8 +66,16 @@ protected void finalize() throws Throwable { <JLabel text="observe.message.show.usage.for.delete3"/> </JPanel> - <JPanel id="usages" border='{new TitledBorder(t("observe.usage.usageTitle"))}' constraints="BorderLayout.CENTER" - layout="{new GridLayout(0, 1)}"/> + <Table fill="both" constraints="BorderLayout.CENTER"> + <row> + <cell weighty="1" weightx="1"> + <JScrollPane verticalScrollBarPolicy='{JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED}'> + <JPanel id="usages" border='{new TitledBorder(t("observe.usage.usageTitle"))}' + layout="{new GridLayout(0, 1)}"/> + </JScrollPane> + </cell> + </row> + </Table> <JPanel id="replacePanel" border='{new TitledBorder(t("observe.usage.replaceTitle"))}' constraints="BorderLayout.SOUTH" layout="{new GridLayout(0, 1)}"> ===================================== client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDesactivateUI.jaxx ===================================== @@ -66,8 +66,16 @@ protected void finalize() throws Throwable { <JLabel text="observe.message.show.usage.for.desactivated3"/> </JPanel> - <JPanel id="usages" border='{new TitledBorder(t("observe.usage.usageTitle"))}' constraints="BorderLayout.CENTER" - layout="{new GridLayout(0, 1)}"/> + <Table fill="both" constraints="BorderLayout.CENTER"> + <row> + <cell weighty="1" weightx="1"> + <JScrollPane verticalScrollBarPolicy='{JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED}'> + <JPanel id="usages" border='{new TitledBorder(t("observe.usage.usageTitle"))}' + layout="{new GridLayout(0, 1)}"/> + </JScrollPane> + </cell> + </row> + </Table> <JPanel id="replacePanel" constraints="BorderLayout.SOUTH" layout="{new BorderLayout()}"> ===================================== client/src/main/java/fr/ird/observe/client/ui/content/ref/usage/UsageForDisplayUI.jaxx ===================================== @@ -56,7 +56,15 @@ protected void finalize() throws Throwable { <JLabel id="message" constraints="BorderLayout.NORTH"/> - <JPanel id="usages" border='{new TitledBorder(t("observe.usage.usageTitle"))}' constraints="BorderLayout.CENTER" - layout="{new GridLayout(0, 1)}"/> + <Table fill="both" constraints="BorderLayout.CENTER"> + <row> + <cell weighty="1" weightx="1"> + <JScrollPane verticalScrollBarPolicy='{JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED}'> + <JPanel id="usages" border='{new TitledBorder(t("observe.usage.usageTitle"))}' + layout="{new GridLayout(0, 1)}"/> + </JScrollPane> + </cell> + </row> + </Table> </JPanel> ===================================== client/src/main/java/fr/ird/observe/client/ui/util/UIHelper.java ===================================== @@ -37,8 +37,8 @@ import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.services.security.InvalidAuthenticationTokenException; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.io.FileUtils; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.jdesktop.swingx.painter.Painter; import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.runtime.JAXXObject; @@ -185,10 +185,9 @@ public class UIHelper extends SwingUtil { contentPane.setLayout(new BorderLayout()); contentPane.add(pane, BorderLayout.CENTER); - dialog.setResizable(false); dialog.pack(); - dialog.setLocationRelativeTo(mainUI); + SwingUtil.center(mainUI, dialog); final PropertyChangeListener listener = event -> { // Let the defaultCloseOperation handle the closing View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/6e5f9f038c1654a674819b3b62b… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/6e5f9f038c1654a674819b3b62b… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop-7.x] L'UI de remplacement de code de référentiel dépasse parfois les limites de l'écran - Closes #1059
by Tony CHEMIT 19 Sep '18

19 Sep '18
Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 1b3d9f3a by Tony CHEMIT at 2018-09-19T05:51:41Z L&#39;UI de remplacement de code de référentiel dépasse parfois les limites de l&#39;écran - Closes #1059 - - - - - 2 changed files: - client/src/main/java/fr/ird/observe/client/ui/content/ref/ContentReferenceUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/util/UIHelper.java Changes: ===================================== client/src/main/java/fr/ird/observe/client/ui/content/ref/ContentReferenceUIHandler.java ===================================== @@ -407,12 +407,14 @@ public class ContentReferenceUIHandler<D extends ReferentialDto, R extends Refer UsageForDisplayUI<R> usagesUI = UsageForDisplayUI.build(message, usages); - UIHelper.askUser(ui, - t("observe.title.show.usage"), - usagesUI, - JOptionPane.INFORMATION_MESSAGE, - new Object[]{t("observe.choice.quit")}, - 0); + Object[] options = { + t("observe.choice.quit")}; + JOptionPane pane = new JOptionPane(usagesUI, JOptionPane.INFORMATION_MESSAGE, + JOptionPane.DEFAULT_OPTION, null, + options, options[0]); + + UIHelper.askUser(pane, t("observe.title.show.usage"), options); + } @Override ===================================== client/src/main/java/fr/ird/observe/client/ui/util/UIHelper.java ===================================== @@ -37,8 +37,8 @@ import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.services.security.InvalidAuthenticationTokenException; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.io.FileUtils; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.jdesktop.swingx.painter.Painter; import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.runtime.JAXXObject; @@ -185,10 +185,9 @@ public class UIHelper extends SwingUtil { contentPane.setLayout(new BorderLayout()); contentPane.add(pane, BorderLayout.CENTER); - dialog.setResizable(false); dialog.pack(); - dialog.setLocationRelativeTo(mainUI); + SwingUtil.center(mainUI, dialog); final PropertyChangeListener listener = event -> { // Let the defaultCloseOperation handle the closing View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/1b3d9f3a008b08118ab70da86c7… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/1b3d9f3a008b08118ab70da86c7… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop-7.x] 3 commits: Only remove program node if it is enabled (otherwise it is not in navigation tree)
by Tony CHEMIT 19 Sep '18

19 Sep '18
Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 9e6160fe by Tony CHEMIT at 2018-09-19T04:51:49Z Only remove program node if it is enabled (otherwise it is not in navigation tree) - - - - - 295ce509 by Tony CHEMIT at 2018-09-19T04:51:51Z [SYNCHRO] Problème avec la synchro avancée d&#39;un programme - Closes #1063 - - - - - a5fffee9 by Tony CHEMIT at 2018-09-19T04:51:51Z [SYNCHRO] La synchro avancée d&#39;une marée nécessitant une référence absente dans la base cible provoque une exception - Closes #1064 - - - - - 20 changed files: - client/src/main/java/fr/ird/observe/client/db/ObserveSwingDataSource.java - client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroModel.java - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUI.jcss - client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/content/ref/ContentReferenceUIHandler.java - client/src/main/resources/i18n/client_en_GB.properties - client/src/main/resources/i18n/client_es_ES.properties - client/src/main/resources/i18n/client_fr_FR.properties - pom.xml - server/src/main/java/fr/ird/observe/server/ObserveWebApplicationListener.java - + server/src/main/java/fr/ird/observe/server/injector/TopiaSqlScriptInjector.java - services-client/src/main/java/fr/ird/observe/services/client/ObserveRequestBuilder.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequestBuilder.java - services-local/src/main/java/fr/ird/observe/services/local/service/referential/ReferentialServiceLocal.java - services-local/src/main/java/fr/ird/observe/services/local/service/referential/ReferentialShellBuilder.java - services/src/main/java/fr/ird/observe/services/service/referential/MissingReferentialRequest.java - services/src/main/java/fr/ird/observe/services/service/referential/MissingReferentialResult.java - services/src/main/java/fr/ird/observe/services/service/referential/ReferentialService.java Changes: ===================================== client/src/main/java/fr/ird/observe/client/db/ObserveSwingDataSource.java ===================================== @@ -99,8 +99,9 @@ import fr.ird.observe.services.service.referential.ReferentialService; import fr.ird.observe.services.service.sql.SqlScriptProducerService; import fr.ird.observe.spi.map.ImmutableDtoMap; import fr.ird.observe.spi.map.ImmutableSetDtoMap; -import org.apache.logging.log4j.Logger; +import fr.ird.observe.spi.map.ImmutableSetStringMap; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.jdesktop.beans.AbstractSerializableBean; import org.nuiton.version.Version; @@ -561,7 +562,7 @@ public class ObserveSwingDataSource extends AbstractSerializableBean implements return ObserveServiceMainFactory.get().newService(observeServiceInitializer, serviceType); } - public ImmutableSetDtoMap<ReferentialDtoReference> getReferentialMap(ImmutableSetDtoMap<String> referentialIds) { + public ImmutableSetDtoMap<ReferentialDtoReference> getReferentialMap(ImmutableSetStringMap referentialIds) { ImmutableSetDtoMap.Builder<ReferentialDtoReference> result = ImmutableSetDtoMap.builder(); for (Class<? extends ReferentialDtoReference> dtoType : referentialIds.referentialReferenceTypes()) { ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/export/ExportUIHandler.java ===================================== @@ -50,9 +50,10 @@ import fr.ird.observe.services.service.referential.MissingReferentialRequest; import fr.ird.observe.services.service.referential.MissingReferentialResult; import fr.ird.observe.services.service.referential.ReferentialService; import fr.ird.observe.spi.map.ImmutableSetDtoMap; +import fr.ird.observe.spi.map.ImmutableSetStringMap; import org.apache.commons.collections4.CollectionUtils; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.runtime.spi.UIHandler; import org.nuiton.jaxx.runtime.swing.editor.MyDefaultCellEditor; @@ -266,7 +267,7 @@ public class ExportUIHandler extends AdminTabUIHandler<ExportUI> implements UIHa if (log.isInfoEnabled()) { log.info("Chargement du réferentiel de la base centrale."); } - ImmutableSetDtoMap<String> centralSourceReferential = centralReferentialService.getReferentialIds(); + ImmutableSetStringMap centralSourceReferential = centralReferentialService.getReferentialIds(); List<String> tripIds = tripEntries.stream().map(TripEntry::getTripId).collect(Collectors.toList()); ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroModel.java ===================================== @@ -30,8 +30,8 @@ import fr.ird.observe.client.ui.admin.config.ConfigUI; import fr.ird.observe.client.ui.admin.synchronize.data.task.DataSynchronizeTaskSupport; import fr.ird.observe.client.ui.tree.selection.SelectionTreeModel; import fr.ird.observe.client.ui.util.ProgressModel; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import javax.swing.DefaultListModel; import javax.swing.border.TitledBorder; @@ -64,7 +64,7 @@ public class DataSynchroModel extends AdminActionModel { /** les données sélectionnées sur le panneau de droite. */ protected SelectionTreeModel rightSelectionDataModel; - + protected boolean insertMissingReferentials; protected final DefaultListModel<DataSynchronizeTaskSupport> tasks; private final ProgressModel progressModel = new ProgressModel(); @@ -131,6 +131,14 @@ public class DataSynchroModel extends AdminActionModel { return rightSelectionDataModel; } + public boolean isInsertMissingReferentials() { + return insertMissingReferentials; + } + + public void setInsertMissingReferentials(boolean insertMissingReferentials) { + this.insertMissingReferentials = insertMissingReferentials; + } + public void populateLeftSelectionModel() { populateSelectionModel(leftSource, leftSelectionDataModel, LEFT_SELECTION_MODEL_CHANGED_PROPERTY_NAME); } ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUI.jaxx ===================================== @@ -49,6 +49,9 @@ </Table> </JPanel> <JPanel id='NEED_FIX_content'> + <JCheckBox id="insertMissingReferentials" constraints='BorderLayout.NORTH' + onStateChanged='getStepModel().setInsertMissingReferentials(((JCheckBox)event.getSource()).isSelected())'/> + <JSplitPane id="contentSplitPane" constraints='BorderLayout.CENTER'> <Table id='contentNorth' fill="both" weighty="1"> <row> ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUI.jcss ===================================== @@ -45,6 +45,11 @@ mnemonic:Q; } +#insertMissingReferentials { + text:"observe.action.export.requiredInsertMissingReferentials"; + selected:{stepModel.isInsertMissingReferentials()}; +} + #leftTree { minimumSize:{UIHelper.newMinDimension()}; font-size:11; ===================================== client/src/main/java/fr/ird/observe/client/ui/admin/synchronize/data/DataSynchroUIHandler.java ===================================== @@ -10,12 +10,12 @@ package fr.ird.observe.client.ui.admin.synchronize.data; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. @@ -33,12 +33,17 @@ import fr.ird.observe.client.ui.admin.synchronize.data.task.CopyToRightDataSynch import fr.ird.observe.client.ui.admin.synchronize.data.task.DataSynchronizeTaskSupport; import fr.ird.observe.client.ui.admin.synchronize.data.task.DeleteFromLeftDataSynchronizeTask; import fr.ird.observe.client.ui.admin.synchronize.data.task.DeleteFromRightDataSynchronizeTask; +import fr.ird.observe.client.ui.content.ref.usage.UsageForDisplayUI; import fr.ird.observe.client.ui.tree.selection.SelectionTree; import fr.ird.observe.client.ui.tree.selection.SelectionTreeModel; import fr.ird.observe.client.ui.util.ProgressModel; +import fr.ird.observe.client.ui.util.UIHelper; import fr.ird.observe.dto.decoration.DecoratorService; +import fr.ird.observe.dto.decoration.ObserveI18nDecoratorHelper; import fr.ird.observe.dto.decoration.decorators.ReferentialReferenceDecorator; import fr.ird.observe.dto.reference.DataDtoReference; +import fr.ird.observe.dto.reference.DtoReference; +import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ProgramReference; import fr.ird.observe.services.service.data.DeleteTripRequest; import fr.ird.observe.services.service.data.DeleteTripResult; @@ -47,14 +52,25 @@ import fr.ird.observe.services.service.data.ExportTripResult; import fr.ird.observe.services.service.data.ImportTripRequest; import fr.ird.observe.services.service.data.ImportTripResult; import fr.ird.observe.services.service.data.TripManagementService; +import fr.ird.observe.services.service.referential.MissingReferentialRequest; +import fr.ird.observe.services.service.referential.MissingReferentialResult; +import fr.ird.observe.services.service.referential.ReferentialService; +import fr.ird.observe.spi.map.ImmutableSetDtoMap; +import fr.ird.observe.spi.map.ImmutableSetStringMap; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.runtime.spi.UIHandler; import org.nuiton.jaxx.runtime.swing.wizard.ext.WizardState; import javax.swing.DefaultListModel; +import javax.swing.JOptionPane; import javax.swing.border.TitledBorder; import java.awt.Color; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import static org.nuiton.i18n.I18n.n; import static org.nuiton.i18n.I18n.t; @@ -67,6 +83,8 @@ import static org.nuiton.i18n.I18n.t; */ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> implements UIHandler<DataSynchroUI> { + private static final Logger log = LogManager.getLogger(DataSynchroUIHandler.class); + @Override public void afterInit(DataSynchroUI ui) { super.afterInit(this.ui); @@ -122,13 +140,10 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple } public void doStartAction() { - addAdminWorker(getUi().getStartAction().getToolTipText(), this::doStartAction0); - } public void addCopyToLeftTasks() { - SelectionTreeModel rightSelectionDataModel = getStepModel().getRightSelectionDataModel(); SelectionTreeModel leftSelectionDataModel = getStepModel().getLeftSelectionDataModel(); Map<ProgramReference, List<DataDtoReference<?, ?>>> selectedDataByProgram = rightSelectionDataModel.getSelectedDataByProgram(); @@ -138,17 +153,14 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple for (DataDtoReference trip : entry.getValue()) { boolean tripExistOnLeft = leftSelectionDataModel.containsData(program, trip); getStepModel().addTask(new CopyToLeftDataSynchronizeTask(program, trip, tripExistOnLeft)); - if (tripExistOnLeft) { leftSelectionDataModel.removeTrip(program, trip); } } } - } public void addCopyToRightTasks() { - SelectionTreeModel leftSelectionDataModel = getStepModel().getLeftSelectionDataModel(); SelectionTreeModel rightSelectionDataModel = getStepModel().getRightSelectionDataModel(); Map<ProgramReference, List<DataDtoReference<?, ?>>> selectedDataByProgram = leftSelectionDataModel.getSelectedDataByProgram(); @@ -156,20 +168,16 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple for (Map.Entry<ProgramReference, List<DataDtoReference<?, ?>>> entry : selectedDataByProgram.entrySet()) { ProgramReference program = entry.getKey(); for (DataDtoReference trip : entry.getValue()) { - boolean tripExistOnRight = rightSelectionDataModel.containsData(program, trip); getStepModel().addTask(new CopyToRightDataSynchronizeTask(program, trip, tripExistOnRight)); - if (tripExistOnRight) { rightSelectionDataModel.removeTrip(program, trip); } } } - } public void addDeleteFromLeftTasks() { - SelectionTreeModel selectionDataModel = getStepModel().getLeftSelectionDataModel(); Map<ProgramReference, List<DataDtoReference<?, ?>>> selectedDataByProgram = selectionDataModel.getSelectedDataByProgram(); selectionDataModel.removeAllSelectedData(); @@ -182,7 +190,6 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple } public void addDeleteFromRightTasks() { - SelectionTreeModel selectionDataModel = getStepModel().getRightSelectionDataModel(); Map<ProgramReference, List<DataDtoReference<?, ?>>> selectedDataByProgram = selectionDataModel.getSelectedDataByProgram(); selectionDataModel.removeAllSelectedData(); @@ -195,9 +202,7 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple } public void doExecuteAction() { - addAdminWorker(getUi().getStartAction().getToolTipText(), this::doExecuteAction0); - } private WizardState doStartAction0() { @@ -214,11 +219,11 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple ObserveSwingDataSource rightSource = configModel.getSafeCentralSource(true); stepModel.setRightSource(rightSource); -// tabUI.getLeftTreePane().setBorder(new TitledBorder(configModel.getLocalSourceModel().getLabel())); stepModel.populateLeftSelectionModel(); - sendMessage(t("observe.actions.synchro.referential.message.data.leftData.loaded")); + String leftLabelWithUrl = configModel.getLocalSourceModel().getLabelWithUrl(); + sendMessage(t("observe.actions.synchro.data.message.data.loaded", leftLabelWithUrl)); - TitledBorder leftBorder = new TitledBorder(configModel.getLocalSourceModel().getLabelWithUrl()); + TitledBorder leftBorder = new TitledBorder(leftLabelWithUrl); boolean leftCanWriteData = configModel.getLocalSourceModel().getDataSourceInformation().canWriteData(); leftBorder.setTitleColor(leftCanWriteData ? Color.GREEN : Color.RED); tabUI.getLeftTreePane().setBorder(leftBorder); @@ -228,11 +233,11 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple } configUI.getLocalSourceConfig().setBorder(leftBorder); -// tabUI.getRightTreePane().setBorder(new TitledBorder(configModel.getCentralSourceModel().getLabel())); stepModel.populateRightSelectionModel(); - sendMessage(t("observe.actions.synchro.referential.message.data.rightData.loaded")); + String rightLabelWithUrl = configModel.getCentralSourceModel().getLabelWithUrl(); + sendMessage(t("observe.actions.synchro.data.message.data.loaded", rightLabelWithUrl)); - TitledBorder rightBorder = new TitledBorder(configModel.getCentralSourceModel().getLabelWithUrl()); + TitledBorder rightBorder = new TitledBorder(rightLabelWithUrl); boolean rightCanWriteData = configModel.getCentralSourceModel().getDataSourceInformation().canWriteData(); rightBorder.setTitleColor(rightCanWriteData ? Color.GREEN : Color.RED); tabUI.getRightTreePane().setBorder(rightBorder); @@ -256,17 +261,161 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple int size = tasks.size(); int stepsCount = 0; + Set<String> idsToCopyToLeft = new LinkedHashSet<>(); + Set<String> idsToCopyToRight = new LinkedHashSet<>(); for (int i = 0; i < size; i++) { + DataSynchronizeTaskSupport task = tasks.getElementAt(i); stepsCount++; - if (task instanceof CopyToLeftDataSynchronizeTask || task instanceof CopyToRightDataSynchronizeTask) { + if (task instanceof CopyToLeftDataSynchronizeTask) { + stepsCount++; + idsToCopyToLeft.add(task.getTrip().getId()); + } + if (task instanceof CopyToRightDataSynchronizeTask) { stepsCount++; + idsToCopyToRight.add(task.getTrip().getId()); } } + boolean copyToLeft = !idsToCopyToLeft.isEmpty(); + if (copyToLeft) { + stepsCount += 3; + } + boolean copyToRight = !idsToCopyToRight.isEmpty(); + if (copyToRight) { + stepsCount += 3; + } + ProgressModel progressModel = getStepModel().getProgressModel(); progressModel.setStepsCount(stepsCount); DecoratorService decoratorService = getDecoratorService(); + boolean insertMissingReferentials = getStepModel().isInsertMissingReferentials(); + if (copyToLeft) { + + // generate add missing referential to left + + progressModel.incrementsCurrentStep(); + + ReferentialService leftReferentialService = leftSource.getReferentialService(); + ImmutableSetStringMap leftSourceReferential = leftReferentialService.getReferentialIds(); + MissingReferentialRequest leftMissingReferentialRequest = MissingReferentialRequest.of(leftSourceReferential, idsToCopyToLeft.toArray(new String[0])); + MissingReferentialResult leftMissingReferentialResult = + rightSource.getReferentialService().computeMissingReferential(leftMissingReferentialRequest); + + progressModel.incrementsCurrentStep(); + + if (!insertMissingReferentials && leftMissingReferentialResult != null) { + + // l'export n'est pas possible + UIHelper.displayWarning(t("observe.title.can.not.export.data.left"), t("observe.actions.exportData.error.missingReferentialsId.left")); + sendMessage(t("observe.actions.exportData.error.missingReferentialsId.left")); + return WizardState.CANCELED; + } + + if (leftMissingReferentialResult != null) { + + // there is some referential to add to left source + + String message = t("observe.message.show.usage.for.missingReferentials.left"); + + ImmutableSetDtoMap<ReferentialDtoReference> usages = rightSource.getReferentialMap(leftMissingReferentialResult.getMissingIds()); + UsageForDisplayUI usagesUI = UsageForDisplayUI.build(message, usages); + + int reponse = UIHelper.askUser(null, + t("observe.title.can.not.export.data.left"), + usagesUI, + JOptionPane.WARNING_MESSAGE, + new Object[]{ + t("observe.choice.confirm.insert"), + t("observe.choice.cancel")}, + 0); + + if (reponse != 0) { + + return WizardState.CANCELED; + } + + // insertion des référentiels manquants dans la base centrale + log.info("Insertion dans la base de gauche des référentiels manquants."); + + for (Class<? extends ReferentialDtoReference> key : usages.referentialReferenceTypes()) { + Set<? extends ReferentialDtoReference> references = usages.get(key); + String type = t(ObserveI18nDecoratorHelper.getTypePluralI18nKey(key)); + sendMessage(t("observe.actions.exportData.message.add.missing.referentials.left", references.size(), type)); + Decorator decorator = decoratorService.getReferenceDecorator(key); + for (DtoReference reference : references) { + sendMessage(t("observe.actions.exportData.message.add.missing.referential", decorator.toString(reference))); + } + } + + progressModel.incrementsCurrentStep(); + + leftReferentialService.insertMissingReferential(leftMissingReferentialResult.getSqlCode()); + + } + } + + if (copyToRight) { + + // generate add missing referential to right + + progressModel.incrementsCurrentStep(); + + ReferentialService rightReferentialService = rightSource.getReferentialService(); + ImmutableSetStringMap rightSourceReferential = rightReferentialService.getReferentialIds(); + MissingReferentialRequest rightMissingReferentialRequest = MissingReferentialRequest.of(rightSourceReferential, idsToCopyToRight.toArray(new String[0])); + MissingReferentialResult rightMissingReferentialResult = + leftSource.getReferentialService().computeMissingReferential(rightMissingReferentialRequest); + + progressModel.incrementsCurrentStep(); + + if (!insertMissingReferentials && rightMissingReferentialResult != null) { + + // l'export n'est pas possible + UIHelper.displayWarning(t("observe.title.can.not.export.data.right"), t("observe.actions.exportData.error.missingReferentialsId.right")); + sendMessage(t("observe.actions.exportData.error.missingReferentialsId.right")); + return WizardState.CANCELED; + } + + if (rightMissingReferentialResult != null) { + + // there is some referential to add to left source + + String message = t("observe.message.show.usage.for.missingReferentials.right"); + + ImmutableSetDtoMap<ReferentialDtoReference> usages = leftSource.getReferentialMap(rightMissingReferentialResult.getMissingIds()); + UsageForDisplayUI usagesUI = UsageForDisplayUI.build(message, usages); + + int reponse = UIHelper.askUser(null, + t("observe.title.can.not.export.data.right"), + usagesUI, + JOptionPane.WARNING_MESSAGE, + new Object[]{ + t("observe.choice.confirm.insert"), + t("observe.choice.cancel")}, + 0); + + if (reponse != 0) { + + return WizardState.CANCELED; + } + + log.info("Insertion dans la base de droite des référentiels manquants."); + + for (Class<? extends ReferentialDtoReference> key : usages.referentialReferenceTypes()) { + Set<? extends ReferentialDtoReference> references = usages.get(key); + String type = t(ObserveI18nDecoratorHelper.getTypePluralI18nKey(key)); + sendMessage(t("observe.actions.exportData.message.add.missing.referentials.right", references.size(), type)); + Decorator decorator = decoratorService.getReferenceDecorator(key); + for (DtoReference reference : references) { + sendMessage(t("observe.actions.exportData.message.add.missing.referential", decorator.toString(reference))); + } + } + progressModel.incrementsCurrentStep(); + rightReferentialService.insertMissingReferential(rightMissingReferentialResult.getSqlCode()); + } + } + ReferentialReferenceDecorator<ProgramReference> programDecorator = decoratorService.getReferentialReferenceDecorator(ProgramReference.class); TripManagementService leftTripManagementService = leftSource.getTripManagementService(); @@ -383,4 +532,5 @@ public class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> imple return WizardState.SUCCESSED; } + } ===================================== client/src/main/java/fr/ird/observe/client/ui/content/ref/ContentReferenceUIHandler.java ===================================== @@ -31,6 +31,7 @@ import fr.ird.observe.client.ui.content.ref.usage.UsageForDeleteUI; import fr.ird.observe.client.ui.content.ref.usage.UsageForDesactivateUI; import fr.ird.observe.client.ui.content.ref.usage.UsageForDisplayUI; import fr.ird.observe.client.ui.tree.navigation.NavigationTree; +import fr.ird.observe.client.ui.tree.navigation.nodes.NavigationTreeNodeSupport; import fr.ird.observe.client.ui.util.UIHelper; import fr.ird.observe.client.validation.ClientValidationContext; import fr.ird.observe.dto.decoration.DecoratorService; @@ -125,47 +126,6 @@ public class ContentReferenceUIHandler<D extends ReferentialDto, R extends Refer }; } - @Override - protected ObserveLayoutFocusTraversalPolicy<U> creatFocusTraversalPolicy() { - return new ObserveLayoutFocusTraversalPolicy<U>() { - - @Override - protected Component getFirstComponentForEdit(Container aContainer) { - return getUi().getUri(); - } - - @Override - protected Component getLastComponentForEdit(Container aContainer) { - return getUi().getBackToList(); - } - - }; - } - - @Override - public void beforeInit(U ui) { - super.beforeInit(ui); - uiInitializer = new ContentReferenceUIInitializer<>(ui); - } - - @Override - public void afterInit(U ui) { - - uiInitializer.initUI(); - - ui.getViewLayout().addPropertyChangeListener(CardLayout2Ext.SELECTED_PROPERTY_NAME, - evt -> SwingUtilities.invokeLater(revalidate)); - - installFocusTraversalPolicy(); - - ui.getModel().addPropertyChangeListener(ContentReferenceUIModel.PROPERTY_EDITING, e -> updateView((Boolean) e.getNewValue())); - } - - @Override - protected String updateTitle(String title) { - return ui.getTypeI18nKey(); - } - private static <E extends ReferentialDto, R extends ReferentialDtoReference<E, R>> Pair<Boolean, R> showUsagesForDelete(E entity, ImmutableSetDtoMap<DtoReference> usages, List<R> referenceList) { @@ -248,6 +208,47 @@ public class ContentReferenceUIHandler<D extends ReferentialDto, R extends Refer return Pair.of(false, null); } + @Override + protected ObserveLayoutFocusTraversalPolicy<U> creatFocusTraversalPolicy() { + return new ObserveLayoutFocusTraversalPolicy<U>() { + + @Override + protected Component getFirstComponentForEdit(Container aContainer) { + return getUi().getUri(); + } + + @Override + protected Component getLastComponentForEdit(Container aContainer) { + return getUi().getBackToList(); + } + + }; + } + + @Override + public void beforeInit(U ui) { + super.beforeInit(ui); + uiInitializer = new ContentReferenceUIInitializer<>(ui); + } + + @Override + public void afterInit(U ui) { + + uiInitializer.initUI(); + + ui.getViewLayout().addPropertyChangeListener(CardLayout2Ext.SELECTED_PROPERTY_NAME, + evt -> SwingUtilities.invokeLater(revalidate)); + + installFocusTraversalPolicy(); + + ui.getModel().addPropertyChangeListener(ContentReferenceUIModel.PROPERTY_EDITING, e -> updateView((Boolean) e.getNewValue())); + } + + @Override + protected String updateTitle(String title) { + return ui.getTypeI18nKey(); + } + public void selectBean(R selectedReference) { if (selectedReference == null) { @@ -832,7 +833,10 @@ public class ContentReferenceUIHandler<D extends ReferentialDto, R extends Refer // remove the program in tree NavigationTree treeHelper = getNavigationTree(); - treeHelper.removeProgram(bean.getId()); + NavigationTreeNodeSupport programNode = treeHelper.getProgramNode(bean.getId()); + if (programNode != null) { + treeHelper.removeProgram(bean.getId()); + } } // on met a jour le referentiel dans le cache et le model ===================================== client/src/main/resources/i18n/client_en_GB.properties ===================================== @@ -151,8 +151,12 @@ observe.actions.consolidate.title.tip=Consolidate observed data observe.actions.exportData=Export data observe.actions.exportData.description=Export data observe.actions.exportData.error.missingReferentialsId=Can't export data, there is some missing referentials in central source and you did not select insert option. +observe.actions.exportData.error.missingReferentialsId.left=Can't export data, there is some missing referentials in left source and you did not select insert option. +observe.actions.exportData.error.missingReferentialsId.right=Can't export data, there is some missing referentials in right source and you did not select insert option. observe.actions.exportData.message.add.missing.referential=\t%s observe.actions.exportData.message.add.missing.referentials=Insert %s missing referentials of type «%s» +observe.actions.exportData.message.add.missing.referentials.left=Insert %s missing referentials of type «%s» in left source +observe.actions.exportData.message.add.missing.referentials.right=Insert %s missing referentials of type «%s» in right source observe.actions.exportData.message.not.possible=Export is not possible (see above messages) observe.actions.exportData.message.operation.needFix=Select data to export. observe.actions.exportData.message.prepare.data=Prepare data to export... @@ -202,6 +206,7 @@ observe.actions.synchro.data.deleteFromLeft.tip=Delete selected trip(s) from lef observe.actions.synchro.data.deleteFromRight.tip=Delete selected trip(s) from right database observe.actions.synchro.data.description=Advanced data management observe.actions.synchro.data.launch.operation=Get data fro databases +observe.actions.synchro.data.message.data.loaded=%s - Data loaded observe.actions.synchro.data.prepare.copyToLeftTask=Register operation copy to left database\: %s - %s observe.actions.synchro.data.prepare.copyToRightTask=Register operation copy to right database\: %s - %s observe.actions.synchro.data.prepare.deleteFromLeftTask=Register operation delete from left database\: %s - %s @@ -242,8 +247,6 @@ observe.actions.synchro.referential.legacy.launch.operation=Synchronize referent observe.actions.synchro.referential.legacy.tip=Synchronize objectOperation on local database observe.actions.synchro.referential.message.apply.done=Referential updated at 1$td/%1$tm/%1$tY à %1$tH\:%1$tM\:%1$tS observe.actions.synchro.referential.message.build.diff=Build differential of referential from %1$s -observe.actions.synchro.referential.message.data.leftData.loaded=Left referential panel loaded -observe.actions.synchro.referential.message.data.rightData.loaded=Right referential panel loaded observe.actions.synchro.referential.message.need.save.for.synchro.operation=Referential update has modified some local data. observe.actions.synchro.referential.message.need.save.for.validation.operation=Validation operation has modified some local data. observe.actions.synchro.referential.message.no.local.modification=No data modified, save is not required. @@ -1313,6 +1316,8 @@ observe.message.show.usage.for.desactivated=Referential %1$s "%2$s" will be disa observe.message.show.usage.for.desactivated2=Some data are using this referential, see following reference observe.message.show.usage.for.desactivated3=Those data need to use another enabled referential to be saved. observe.message.show.usage.for.missingReferentials=There is some referentials present in local source but not in centrale one. +observe.message.show.usage.for.missingReferentials.left=There is some referentials present in right source but not in left one. +observe.message.show.usage.for.missingReferentials.right=There is some referentials present in left source but not in right one. observe.message.show.usages=List of usage of referential %1$s\: '%2$s' observe.message.table.editBean.modified=Current entry is modifed and valid. observe.message.table.editBean.modified.but.invalid=Current entry is modified but not valid. @@ -1468,6 +1473,8 @@ observe.storage.useServerStorage.description=Please configure connexion to remot observe.title.about=About observe.title.can.not.delete.referentiel=Impossible to delete a referentiel data... observe.title.can.not.export.data=Could not export data +observe.title.can.not.export.data.left=Could not export data to left source +observe.title.can.not.export.data.right=Could not export data to right source observe.title.can.not.export.obstuna=Could not export obstuna data... observe.title.choose.db.dump=Choose a database backup observe.title.choose.db.dump.directory=Chhose directory of backup ===================================== client/src/main/resources/i18n/client_es_ES.properties ===================================== @@ -151,8 +151,12 @@ observe.actions.consolidate.title.tip=Consolidar los datos observados observe.actions.exportData=Exportar los datos observados observe.actions.exportData.description=Exportar los datos observados en la base central observe.actions.exportData.error.missingReferentialsId=Il existe des référentiels dans la base locale non présente en base centrale, mais vous n'avez pas activé l'option d'insertion automatique. \#TODO +observe.actions.exportData.error.missingReferentialsId.left=Il existe des référentiels dans la base de gauche non présente en base centrale, mais vous n'avez pas activé l'option d'insertion automatique. \#TODO +observe.actions.exportData.error.missingReferentialsId.right=Il existe des référentiels dans la base de droite non présente en base centrale, mais vous n'avez pas activé l'option d'insertion automatique. \#TODO observe.actions.exportData.message.add.missing.referential=\t%s observe.actions.exportData.message.add.missing.referentials=Insertion de %s référentiels de type «%s» \#TODO +observe.actions.exportData.message.add.missing.referentials.left=Insertion de %s référentiels de type «%s» dans la base de gauche\#TODO +observe.actions.exportData.message.add.missing.referentials.right=Insertion de %s référentiels de type «%s» dans la base de droite\#TODO observe.actions.exportData.message.not.possible=La exportación no es posible (vea el mensaje anterior). observe.actions.exportData.message.operation.needFix=Seleccione las mareas a exportar. observe.actions.exportData.message.prepare.data=Preparación de los datos a exportar... @@ -202,6 +206,7 @@ observe.actions.synchro.data.deleteFromLeft.tip=Eliminar la ou las mareas selecc observe.actions.synchro.data.deleteFromRight.tip=Eliminar la ou las mareas seleccionada(s) de la base de la derecha observe.actions.synchro.data.description=Gestión avanzada de los datos de los usuarios observe.actions.synchro.data.launch.operation=Recuperar los datos de las fuentes de datos +observe.actions.synchro.data.message.data.loaded=%s - Datos recuperadas. observe.actions.synchro.data.prepare.copyToLeftTask=Preparación de la copia en la base de la izquierda \: %s - %s observe.actions.synchro.data.prepare.copyToRightTask=Preparación de la copia en la base de la derecha \: %s - %s observe.actions.synchro.data.prepare.deleteFromLeftTask=Preparación de la eliminación de la base de la izquierda \: %s - %s @@ -242,8 +247,6 @@ observe.actions.synchro.referential.legacy.launch.operation=Calcular el diferenc observe.actions.synchro.referential.legacy.tip=Operación de actualización del referencial de la base local observe.actions.synchro.referential.message.apply.done=Referencial actualizado el %1$td/%1$tm/%1$tY a %1$tH\:%1$tM\:%1$tS observe.actions.synchro.referential.message.build.diff=Construcción del diferencial de referenciales desde\: %1$s -observe.actions.synchro.referential.message.data.leftData.loaded=Datos del pannel de la izquierda recuperadas. -observe.actions.synchro.referential.message.data.rightData.loaded=Datos del pannel de la derecha recuperadas. observe.actions.synchro.referential.message.need.save.for.synchro.operation=La operación de sincronización de referenciales ha generado cambios observe.actions.synchro.referential.message.need.save.for.validation.operation=la operación de validación de datos ha generado modificaciones. observe.actions.synchro.referential.message.no.local.modification=No se han modificado datos en la base local, no es necesario guardar. @@ -1313,6 +1316,8 @@ observe.message.show.usage.for.desactivated=El referencial %1$s "%2$s" se desact observe.message.show.usage.for.desactivated2=Los objetos están usando actualmente las referencias que se enumeran a continuación.. observe.message.show.usage.for.desactivated3=Estos objetos deben usar otro referencial (no desactivado) para poder actualizarse. observe.message.show.usage.for.missingReferentials=Il existe des référentiels présents dans la base locale mais non présents dans la base centrale. \#TODO +observe.message.show.usage.for.missingReferentials.left=Il existe des référentiels présents dans la base de droite mais non présents dans la base de gauche. +observe.message.show.usage.for.missingReferentials.right=Il existe des référentiels présents dans la base de gauche mais non présents dans la base droite. observe.message.show.usages=Listas de usos de referenciales %1$s \: '%2$s' observe.message.table.editBean.modified=El registro actual se ha modificado y es válido. observe.message.table.editBean.modified.but.invalid=El registro actual se ha modificado pero no es válido. @@ -1468,6 +1473,8 @@ observe.storage.useServerStorage.description=Configure su conexión al servidor observe.title.about=A proposito de ObServe... observe.title.can.not.delete.referentiel=Impossible eliminar un referencial en proceso de utilización... observe.title.can.not.export.data=Impossible d'exporter les données vers la base centrale... \#TODO +observe.title.can.not.export.data.left=Impossible d'exporter les données vers la base de gauche... \#TODO +observe.title.can.not.export.data.right=Impossible d'exporter les données vers la base de droite... \#TODO observe.title.can.not.export.obstuna=Impossible exportar los datos de obstuna... observe.title.choose.db.dump=Seleccionar una copia de seguridad de base local observe.title.choose.db.dump.directory=Seleccionar e directorio de destinación de la copia de seguridad ===================================== client/src/main/resources/i18n/client_fr_FR.properties ===================================== @@ -151,8 +151,12 @@ observe.actions.consolidate.title.tip=Consolider les données observateur observe.actions.exportData=Exporter les données observateurs observe.actions.exportData.description=Exporter les données observateurs vers la base centrale observe.actions.exportData.error.missingReferentialsId=Il existe des référentiels dans la base locale non présente en base centrale, mais vous n'avez pas activé l'option d'insertion automatique. +observe.actions.exportData.error.missingReferentialsId.left=Il existe des référentiels dans la base de gauche non présente en base centrale, mais vous n'avez pas activé l'option d'insertion automatique. +observe.actions.exportData.error.missingReferentialsId.right=Il existe des référentiels dans la base de droite non présente en base centrale, mais vous n'avez pas activé l'option d'insertion automatique. observe.actions.exportData.message.add.missing.referential=\t%s observe.actions.exportData.message.add.missing.referentials=Insertion de %s référentiels de type «%s» +observe.actions.exportData.message.add.missing.referentials.left=Insertion de %s référentiels de type «%s» dans la base de gauche +observe.actions.exportData.message.add.missing.referentials.right=Insertion de %s référentiels de type «%s» dans la base de droite observe.actions.exportData.message.not.possible=L'opération d'export n'est pas possible (voir les messages précédents). observe.actions.exportData.message.operation.needFix=Veuillez sélectionner les marées à exporter. observe.actions.exportData.message.prepare.data=Préparation des données à exporter... @@ -202,6 +206,7 @@ observe.actions.synchro.data.deleteFromLeft.tip=Supprimer la ou les marées sél observe.actions.synchro.data.deleteFromRight.tip=Supprimer la ou les marées sélectionnée(s) de la base de droite observe.actions.synchro.data.description=Gestion avancée des données utilisateurs observe.actions.synchro.data.launch.operation=Récupérer les données des sources de données +observe.actions.synchro.data.message.data.loaded=%s - Données du panneau gauche récupérées. observe.actions.synchro.data.prepare.copyToLeftTask=Préparation de la recopie vers la base de gauche \: %s - %s observe.actions.synchro.data.prepare.copyToRightTask=Préparation de la recopie vers la base de droite \: %s - %s observe.actions.synchro.data.prepare.deleteFromLeftTask=Préparation de la suppression de la base de gauche \: %s - %s @@ -242,8 +247,6 @@ observe.actions.synchro.referential.legacy.launch.operation=Calculer le différe observe.actions.synchro.referential.legacy.tip=Opération de mise à jour du référentiel de la base locale observe.actions.synchro.referential.message.apply.done=Référentiel mis à jour le %1$td/%1$tm/%1$tY à %1$tH\:%1$tM\:%1$tS observe.actions.synchro.referential.message.build.diff=Construction du différentiel de référentiel depuis %1$s -observe.actions.synchro.referential.message.data.leftData.loaded=Données du panneau gauche récupérées. -observe.actions.synchro.referential.message.data.rightData.loaded=Données du panneau droit récupérées. observe.actions.synchro.referential.message.need.save.for.synchro.operation=L'opération de synchronisation du référentiel a engendrée des modifications. observe.actions.synchro.referential.message.need.save.for.validation.operation=L'opération de validation des données a engendrée des modifications. observe.actions.synchro.referential.message.no.local.modification=Aucune donnée de la base locale n'a été modifiée @@ -1313,6 +1316,8 @@ observe.message.show.usage.for.desactivated=Le référentiel %1$s "%2$s" va êtr observe.message.show.usage.for.desactivated2=Des objets utilisent actuellement cet entité dont les références sont citées plus bas. observe.message.show.usage.for.desactivated3=Ces objets devront utiliser un autre référentiel (non désactivé) pour pouvoir être mis à jour. observe.message.show.usage.for.missingReferentials=Il existe des référentiels présents dans la base locale mais non présents dans la base centrale. +observe.message.show.usage.for.missingReferentials.left=Il existe des référentiels présents dans la base de droite mais non présents dans la base de gauche. +observe.message.show.usage.for.missingReferentials.right=Il existe des référentiels présents dans la base de gauche mais non présents dans la base droite. observe.message.show.usages=Listes des utilisations du référentiel %1$s \: '%2$s' observe.message.table.editBean.modified=L'entrée en cours d'édition a été modifiée et est valide. observe.message.table.editBean.modified.but.invalid=L'entrée en cours d'édition a été modifiée, mais n'est pas valide. @@ -1468,6 +1473,8 @@ observe.storage.useServerStorage.description=Veuillez configurer votre connexion observe.title.about=A propos d'ObServe... observe.title.can.not.delete.referentiel=Impossible de supprimer un référentiel en cours d'utilisation... observe.title.can.not.export.data=Impossible d'exporter les données vers la base centrale... +observe.title.can.not.export.data.left=Impossible d'exporter les données vers la base de gauche... +observe.title.can.not.export.data.right=Impossible d'exporter les données vers la base de droite... observe.title.can.not.export.obstuna=Impossible d'exporter des données d'obstuna... observe.title.choose.db.dump=Choisir une sauvegarder de base locale observe.title.choose.db.dump.directory=Choisir le répertoire de destination de la sauvegarde ===================================== pom.xml ===================================== @@ -26,7 +26,7 @@ <parent> <groupId>io.ultreia.maven</groupId> <artifactId>pom</artifactId> - <version>2018.56</version> + <version>2018.57</version> </parent> <groupId>fr.ird.observe</groupId> @@ -162,7 +162,7 @@ <lib.version.h2>1.4.196</lib.version.h2> <!--<lib.version.nuiton.topia>3.6-SNAPSHOT</lib.version.nuiton.topia>--> <!--<lib.version.java4all.eugene>3.0-alpha-21</lib.version.java4all.eugene>--> - <lib.version.java4all.topia>1.1.7-SNAPSHOT</lib.version.java4all.topia> + <!--<lib.version.java4all.topia>1.1.8-SNAPSHOT</lib.version.java4all.topia>--> <!-- license header configuration --> <license.licenseName>gpl_v3</license.licenseName> <license.organizationName>IRD, Code Lutin, Ultreia.io</license.organizationName> ===================================== server/src/main/java/fr/ird/observe/server/ObserveWebApplicationListener.java ===================================== @@ -32,11 +32,11 @@ import fr.ird.observe.server.injector.ObserveDataSourceConfigurationInjector; import fr.ird.observe.server.injector.ObserveDtoInjector; import fr.ird.observe.server.injector.ObserveReferenceSetRequestInjector; import fr.ird.observe.server.injector.SqlScriptProducerRequestInjector; +import fr.ird.observe.server.injector.TopiaSqlScriptInjector; import io.ultreia.java4all.http.HRequestBuilder; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.debux.webmotion.server.WebMotionServerListener; import org.debux.webmotion.server.call.ServerContext; import org.debux.webmotion.server.mapping.Mapping; @@ -80,6 +80,7 @@ public class ObserveWebApplicationListener implements WebMotionServerListener { context.addInjector(new DateInjector(HRequestBuilder.DATE_PATTERN)); context.addInjector(new SqlScriptProducerRequestInjector(gson)); context.addInjector(new ImmutableSetInjector(gson)); + context.addInjector(new TopiaSqlScriptInjector(gson)); context.addConverter(new ObserveDtoConverter(gson), ObserveDbUserDto.class); context.getServletContext().setAttribute(ObserveWebApplicationContext.APPLICATION_CONTEXT_PARAMETER, applicationContext); ===================================== server/src/main/java/fr/ird/observe/server/injector/TopiaSqlScriptInjector.java ===================================== @@ -0,0 +1,63 @@ +package fr.ird.observe.server.injector; + +/*- + * #%L + * ObServe :: Server + * %% + * Copyright (C) 2008 - 2018 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.gson.Gson; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.debux.webmotion.server.call.Call; +import org.debux.webmotion.server.handler.ExecutorParametersInjectorHandler; +import org.debux.webmotion.server.mapping.Mapping; +import org.nuiton.topia.persistence.script.TopiaSqlScript; + +import java.lang.reflect.Type; +import java.util.Objects; + +/** + * @author Tony Chemit - dev(a)tchemit.fr + */ +public class TopiaSqlScriptInjector implements ExecutorParametersInjectorHandler.Injector { + + /** Logger. */ + private static final Logger log = LogManager.getLogger(TopiaSqlScriptInjector.class); + + protected final Gson gson; + + public TopiaSqlScriptInjector(Gson gson) { + this.gson = gson; + } + + @Override + public Object getValue(Mapping mapping, Call call, String name, Class<?> type, Type generic) { + TopiaSqlScript topiaSqlScript = null; + if (type.equals(TopiaSqlScript.class)) { + Call.ParameterTree parameterTree = call.getParameterTree().getObject().get(name); + Objects.requireNonNull(parameterTree, "Le paramètre " + name + " n'as pas été trouvé, recompiler (parameter)!"); + String gsonContent = ((String[]) parameterTree.getValue())[0]; + topiaSqlScript = gson.fromJson(gsonContent, TopiaSqlScript.class); + log.info("Inject topiaSqlScript: " + topiaSqlScript); + } + return topiaSqlScript; + } + +} ===================================== services-client/src/main/java/fr/ird/observe/services/client/ObserveRequestBuilder.java ===================================== @@ -24,6 +24,7 @@ package fr.ird.observe.services.client; import fr.ird.observe.services.configuration.rest.ObserveDataSourceConfigurationRestConstants; import io.ultreia.java4all.http.HRequestBuilder; +import org.nuiton.topia.persistence.script.TopiaSqlScript; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -72,4 +73,9 @@ public class ObserveRequestBuilder extends HRequestBuilder { addAuthTokenSupplier(serviceContext.getAuthTokenSupplier()); } } + + public ObserveRequestBuilder addParameter(String parameterName, TopiaSqlScript value) { + super.addParameter(parameterName, serviceContext.getResponseBuilder().getGson().get().toJson(value)); + return this; + } } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequestBuilder.java ===================================== @@ -157,7 +157,8 @@ public class ReferentialSynchronizeSqlsRequestBuilder { @Override protected <DD extends ReferentialDto> ImmutableList<String> insertMissingReferential(Class<DD> referentialType, String id) { - return addExtraInsertStatement(id, binder); + ReferentialDtoEntityContext<DD, ?, ?> modelContext = DbModelHelper.fromReferentialDto(referentialType); + return addExtraInsertStatement(id, modelContext.toEntityBinder()); } }; ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/referential/ReferentialServiceLocal.java ===================================== @@ -70,6 +70,7 @@ import fr.ird.observe.spi.context.ReferentialEntityContext; import fr.ird.observe.spi.context.ReferentialReferenceEntityContext; import fr.ird.observe.spi.map.ImmutableDtoMap; import fr.ird.observe.spi.map.ImmutableSetDtoMap; +import fr.ird.observe.spi.map.ImmutableSetStringMap; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.nuiton.topia.persistence.TopiaDao; @@ -276,9 +277,9 @@ public class ReferentialServiceLocal extends ObserveServiceLocal implements Refe } @Override - public ImmutableSetDtoMap<String> getReferentialIds() { + public ImmutableSetStringMap getReferentialIds() { - ImmutableSetDtoMap.Builder<String> result = ImmutableSetDtoMap.builder(); + ImmutableSetStringMap.Builder result = ImmutableSetStringMap.builder(); for (Class<? extends ReferentialDto> dtoType : DtoModelClasses.REFERENTIAL_TYPES) { getReferentialIds0(dtoType, result); @@ -286,7 +287,7 @@ public class ReferentialServiceLocal extends ObserveServiceLocal implements Refe return result.build(); } - private <D extends ReferentialDto, R extends ReferentialDtoReference<D, R>, E extends ObserveReferentialEntity> void getReferentialIds0(Class<D> dtoType, ImmutableSetDtoMap.Builder<String> result) { + private <D extends ReferentialDto, R extends ReferentialDtoReference<D, R>, E extends ObserveReferentialEntity> void getReferentialIds0(Class<D> dtoType, ImmutableSetStringMap.Builder result) { ReferentialDtoEntityContext<D, R, E> typeContext = DbModelHelper.fromReferentialDto(dtoType); ReferentialEntityReferenceBinderSupport<D, R, E> binder = typeContext.toEntityReferenceBinder(); TopiaDao<E> dao = getTopiaPersistenceContext().getDao(binder.getEntityType()); @@ -312,7 +313,7 @@ public class ReferentialServiceLocal extends ObserveServiceLocal implements Refe } } - ImmutableSetDtoMap<String> missingReferentialIds = referentialShellBuilder.build(); + ImmutableSetStringMap missingReferentialIds = referentialShellBuilder.build(); if (missingReferentialIds.isEmpty()) { return null; ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/referential/ReferentialShellBuilder.java ===================================== @@ -10,12 +10,12 @@ package fr.ird.observe.services.local.service.referential; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. @@ -24,7 +24,7 @@ package fr.ird.observe.services.local.service.referential; import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; import fr.ird.observe.spi.DbModelHelper; -import fr.ird.observe.spi.map.ImmutableSetDtoMap; +import fr.ird.observe.spi.map.ImmutableSetStringMap; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaEntityVisitor; @@ -39,35 +39,35 @@ import java.util.TreeSet; */ public class ReferentialShellBuilder { - public static ReferentialShellBuilder builder(ImmutableSetDtoMap<String> incomingReferentialIds) { - return new ReferentialShellBuilder(incomingReferentialIds); + private final GetEntityReferentialShellVisitor visitor; + + private ReferentialShellBuilder(ImmutableSetStringMap incomingReferentialIds) { + visitor = new GetEntityReferentialShellVisitor(incomingReferentialIds); } - private final GetEntityReferentialShellVisitor visitor; + public static ReferentialShellBuilder builder(ImmutableSetStringMap incomingReferentialIds) { + return new ReferentialShellBuilder(incomingReferentialIds); + } void scan(TopiaEntity entity) { entity.accept(visitor); } - public ImmutableSetDtoMap<String> build() { + public ImmutableSetStringMap build() { return visitor.missingReferentialIds.build(); } - private ReferentialShellBuilder(ImmutableSetDtoMap<String> incomingReferentialIds) { - visitor = new GetEntityReferentialShellVisitor(incomingReferentialIds); - } - private static class GetEntityReferentialShellVisitor implements TopiaEntityVisitor { private final Set<String> hitIds; - private final ImmutableSetDtoMap<String> incomingReferentialIds; - private final ImmutableSetDtoMap.Builder<String> missingReferentialIds; + private final ImmutableSetStringMap incomingReferentialIds; + private final ImmutableSetStringMap.Builder missingReferentialIds; - GetEntityReferentialShellVisitor(ImmutableSetDtoMap<String> incomingReferentialIds) { + GetEntityReferentialShellVisitor(ImmutableSetStringMap incomingReferentialIds) { this.incomingReferentialIds = incomingReferentialIds; this.hitIds = new TreeSet<>(); - this.missingReferentialIds = ImmutableSetDtoMap.builder(); + this.missingReferentialIds = ImmutableSetStringMap.builder(); } @Override ===================================== services/src/main/java/fr/ird/observe/services/service/referential/MissingReferentialRequest.java ===================================== @@ -23,7 +23,7 @@ package fr.ird.observe.services.service.referential; */ import fr.ird.observe.dto.ObserveDto; -import fr.ird.observe.spi.map.ImmutableSetDtoMap; +import fr.ird.observe.spi.map.ImmutableSetStringMap; /** * Created on 07/11/16. @@ -33,19 +33,19 @@ import fr.ird.observe.spi.map.ImmutableSetDtoMap; */ public class MissingReferentialRequest implements ObserveDto { - private final ImmutableSetDtoMap<String> centralSourceReferential; + private final ImmutableSetStringMap centralSourceReferential; private final String[] tripIds; - public static MissingReferentialRequest of(ImmutableSetDtoMap<String> centralSourceReferential, String... tripIds) { + public static MissingReferentialRequest of(ImmutableSetStringMap centralSourceReferential, String... tripIds) { return new MissingReferentialRequest(centralSourceReferential, tripIds); } - private MissingReferentialRequest(ImmutableSetDtoMap<String> centralSourceReferential, String... tripIds) { + private MissingReferentialRequest(ImmutableSetStringMap centralSourceReferential, String... tripIds) { this.centralSourceReferential = centralSourceReferential; this.tripIds = tripIds; } - public ImmutableSetDtoMap<String> getCentralSourceReferential() { + public ImmutableSetStringMap getCentralSourceReferential() { return centralSourceReferential; } ===================================== services/src/main/java/fr/ird/observe/services/service/referential/MissingReferentialResult.java ===================================== @@ -23,8 +23,8 @@ package fr.ird.observe.services.service.referential; */ import fr.ird.observe.dto.ObserveDto; +import fr.ird.observe.spi.map.ImmutableSetStringMap; import org.nuiton.topia.persistence.script.TopiaSqlScript; -import fr.ird.observe.spi.map.ImmutableSetDtoMap; /** * Created on 07/11/16. @@ -34,19 +34,19 @@ import fr.ird.observe.spi.map.ImmutableSetDtoMap; */ public class MissingReferentialResult implements ObserveDto { - private final ImmutableSetDtoMap<String> missingIds; + private final ImmutableSetStringMap missingIds; private final TopiaSqlScript sqlCode; - private MissingReferentialResult(ImmutableSetDtoMap<String> missingIds, TopiaSqlScript sqlCode) { + private MissingReferentialResult(ImmutableSetStringMap missingIds, TopiaSqlScript sqlCode) { this.missingIds = missingIds; this.sqlCode = sqlCode; } - public static MissingReferentialResult of(ImmutableSetDtoMap<String> missingReferentialIds, TopiaSqlScript sqlCode) { + public static MissingReferentialResult of(ImmutableSetStringMap missingReferentialIds, TopiaSqlScript sqlCode) { return new MissingReferentialResult(missingReferentialIds, sqlCode); } - public ImmutableSetDtoMap<String> getMissingIds() { + public ImmutableSetStringMap getMissingIds() { return missingIds; } ===================================== services/src/main/java/fr/ird/observe/services/service/referential/ReferentialService.java ===================================== @@ -40,6 +40,7 @@ import fr.ird.observe.services.spi.Write; import fr.ird.observe.services.spi.WriteDataPermission; import fr.ird.observe.services.spi.WriteReferentialPermission; import fr.ird.observe.spi.map.ImmutableSetDtoMap; +import fr.ird.observe.spi.map.ImmutableSetStringMap; import io.ultreia.java4all.http.spi.Delete; import io.ultreia.java4all.http.spi.Get; import io.ultreia.java4all.http.spi.Nullable; @@ -119,7 +120,7 @@ public interface ReferentialService extends ObserveService { @ReadReferentialPermission @Post - ImmutableSetDtoMap<String> getReferentialIds(); + ImmutableSetStringMap getReferentialIds(); @ReadReferentialPermission View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/0fbe5ba18d9798f4825c6448c1… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/0fbe5ba18d9798f4825c6448c1… You're receiving this email because of your account on gitlab.com.
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • ...
  • 15
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.