This is an automated email from the git hooks/post-receive script. New commit to branch feature/deal_with_blobs in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit 09863e615b56e98bed16b9b818e577ccf1f8c4ae Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Aug 27 12:06:08 2016 +0200 Use a unique management trip service for export data and bi-synchro data --- .../fr/ird/observe/db/ObserveSwingDataSource.java | 18 +- .../fr/ird/observe/ui/admin/AdminTabUIHandler.java | 86 ++++++++- .../observe/ui/admin/export/ExportUIHandler.java | 112 ++++------- .../fr/ird/observe/ui/admin/export/TripEntry.java | 7 + .../synchronize/data/DataSynchroUIHandler.java | 178 +++++++++++------- .../observe-application-swing_en_GB.properties | 9 + .../observe-application-swing_es_ES.properties | 9 + .../observe-application-swing_fr_FR.properties | 9 + .../data/DataSynchronizeServiceController.java | 32 ---- .../v1/trip/ExportTripServiceController.java | 47 ----- .../v1/trip/ImportTripServiceController.java | 47 ----- .../v1/trip/TripManagementServiceController.java | 61 ++++++ .../observe/services/ObserveServicesProvider.java | 10 +- .../service/DeleteSqlScriptProducerRequest.java | 21 +-- .../synchro/data/DataSynchronizeRequest.java | 103 ---------- .../synchro/data/DataSynchronizeService.java | 52 ------ .../synchro/data/task/DataSynchronizeCopyTask.java | 14 -- .../data/task/DataSynchronizeDeleteTask.java | 14 -- .../DeleteTripRequest.java} | 14 +- .../services/service/trip/DeleteTripResult.java | 26 +++ .../ExportTripRequest.java} | 14 +- .../services/service/trip/ExportTripResult.java | 51 +++++ .../services/service/trip/ExportTripsRequest.java | 98 ---------- .../services/service/trip/ExportTripsResult.java | 121 ------------ .../services/service/trip/ImportTripRequest.java | 42 +++++ .../services/service/trip/ImportTripResult.java | 51 +++++ .../services/service/trip/ImportTripService.java | 43 ----- .../services/service/trip/ImportTripsRequest.java | 105 ----------- .../services/service/trip/ImportTripsResult.java | 93 --------- ...TripService.java => TripManagementService.java} | 16 +- .../synchro/data/DataSynchronizeServiceTopia.java | 108 ----------- .../service/trip/ExportTripServiceTopia.java | 77 -------- .../service/trip/ImportTripServiceTopia.java | 121 ------------ .../service/trip/TripManagementServiceTopia.java | 207 +++++++++++++++++++++ 34 files changed, 738 insertions(+), 1278 deletions(-) diff --git a/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java b/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java index 4d6932e..9ef93ef 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/db/ObserveSwingDataSource.java @@ -60,10 +60,8 @@ import fr.ird.observe.services.service.PingService; import fr.ird.observe.services.service.ReferentialService; import fr.ird.observe.services.service.SqlScriptProducerService; import fr.ird.observe.services.service.actions.consolidate.ConsolidateDataService; -import fr.ird.observe.services.service.trip.ExportTripService; -import fr.ird.observe.services.service.trip.ImportTripService; +import fr.ird.observe.services.service.trip.TripManagementService; import fr.ird.observe.services.service.actions.report.ReportService; -import fr.ird.observe.services.service.actions.synchro.data.DataSynchronizeService; import fr.ird.observe.services.service.actions.synchro.referential.diff.ReferentialSynchronizeDiffService; import fr.ird.observe.services.service.actions.synchro.referential.legacy.UnidirectionalReferentialSynchronizeLocalService; import fr.ird.observe.services.service.actions.synchro.referential.ng.ReferentialSynchronizeService; @@ -558,13 +556,8 @@ public class ObserveSwingDataSource extends AbstractSerializableBean implements } @Override - public ExportTripService newExportTripService() { - return newService(ExportTripService.class); - } - - @Override - public ImportTripService newImportTripService() { - return newService(ImportTripService.class); + public TripManagementService newTripManagementService() { + return newService(TripManagementService.class); } @Override @@ -578,11 +571,6 @@ public class ObserveSwingDataSource extends AbstractSerializableBean implements } @Override - public DataSynchronizeService newDataSynchronizeService() { - return newService(DataSynchronizeService.class); - } - - @Override public ReferentialSynchronizeService newReferentialSynchronizeService() { return newService(ReferentialSynchronizeService.class); } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminTabUIHandler.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminTabUIHandler.java index c551c61..2cc0728 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminTabUIHandler.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminTabUIHandler.java @@ -24,18 +24,27 @@ package fr.ird.observe.ui.admin; import fr.ird.observe.ObserveRunner; import fr.ird.observe.ObserveSwingApplicationContext; import fr.ird.observe.application.swing.decoration.DecoratorService; +import fr.ird.observe.application.swing.decoration.decorators.ReferentialReferenceDecorator; import fr.ird.observe.db.ObserveSwingDataSource; +import fr.ird.observe.services.dto.DataReference; +import fr.ird.observe.services.dto.referential.ProgramDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; import fr.ird.observe.services.service.BabModelVersionException; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; +import fr.ird.observe.services.service.trip.DeleteTripResult; +import fr.ird.observe.services.service.trip.ExportTripResult; +import fr.ird.observe.services.service.trip.ImportTripResult; import fr.ird.observe.ui.admin.config.SelectDataUI; import fr.ird.observe.ui.admin.resume.ShowResumeUI; import fr.ird.observe.ui.storage.tabs.DataSelectionModel; import fr.ird.observe.ui.tree.DataSelectionTreeSelectionModel; import fr.ird.observe.ui.tree.ObserveTreeHelper; import jaxx.runtime.swing.wizard.ext.WizardState; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.util.StringUtil; import javax.swing.JTree; import javax.swing.tree.TreeModel; @@ -44,7 +53,6 @@ import java.io.StringWriter; import java.util.concurrent.Callable; import static org.nuiton.i18n.I18n.n; -import static org.nuiton.i18n.I18n.reload; import static org.nuiton.i18n.I18n.t; /** @@ -241,4 +249,80 @@ public class AdminTabUIHandler { public void addMessage(AdminStep step, String text) { ui.getProgression().append(text + "\n"); } + + protected void logExportResult(String i18nKey, + ExportTripResult tripResult, + ReferentialReferenceDecorator<ProgramDto> programDecorator, + ReferentialReference<ProgramDto> program, + DataReference trip) { + + String message = sendLogResultMessage(i18nKey, programDecorator, program, trip, tripResult.getTime()); + if (log.isInfoEnabled()) { + log.info(message); + } + + } + + + protected void logImportResult(String importI18nKey, + String deleteI18nKey, + ImportTripResult tripResult, + ReferentialReferenceDecorator<ProgramDto> programDecorator, + ReferentialReference<ProgramDto> program, + DataReference trip) { + + DecoratorService decoratorService = getDecoratorService(); + + String programStr = programDecorator.toString(program); + + String tripStr = decoratorService.getTripReferenceDecorator(trip).toString(trip); + + if (tripResult.isDeleted()) { + + String message = sendLogResultMessage(deleteI18nKey, programDecorator, program, trip, tripResult.getDeleteTime()); + if (log.isInfoEnabled()) { + log.info(message); + } + + } + + if (tripResult.isImported()) { + + String message = sendLogResultMessage(importI18nKey, programDecorator, program, trip, tripResult.getImportTime()); + if (log.isInfoEnabled()) { + log.info(message); + } + + } + + } + + protected void logDeleteResult(String deleteI18nKey, + DeleteTripResult tripResult, + ReferentialReferenceDecorator<ProgramDto> programDecorator, + ReferentialReference<ProgramDto> program, + DataReference trip) { + + String message = sendLogResultMessage(deleteI18nKey, programDecorator, program, trip, tripResult.getTime()); + if (log.isInfoEnabled()) { + log.info(message); + } + + } + + protected String sendLogResultMessage(String i18nKey, + ReferentialReferenceDecorator<ProgramDto> programDecorator, + ReferentialReference<ProgramDto> program, + DataReference trip, + long time) { + + DecoratorService decoratorService = getDecoratorService(); + String programStr = programDecorator.toString(program); + String tripStr = decoratorService.getTripReferenceDecorator(trip).toString(trip); + String timeStr = StringUtil.convertTime(time); + String message = StringUtils.leftPad(timeStr, 20) + " - " + t(i18nKey, programStr, tripStr); + sendMessage(message); + return message; + } + } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/export/ExportUIHandler.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/export/ExportUIHandler.java index 3b04eab..fcceba1 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/export/ExportUIHandler.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/export/ExportUIHandler.java @@ -23,7 +23,6 @@ package fr.ird.observe.ui.admin.export; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; import fr.ird.observe.application.swing.decoration.DecoratorService; import fr.ird.observe.application.swing.decoration.decorators.DataReferenceDecorator; import fr.ird.observe.application.swing.decoration.decorators.ReferentialReferenceDecorator; @@ -31,16 +30,13 @@ import fr.ird.observe.db.ObserveSwingDataSource; import fr.ird.observe.services.dto.DataReference; import fr.ird.observe.services.dto.longline.TripLonglineDto; import fr.ird.observe.services.dto.referential.ProgramDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; import fr.ird.observe.services.dto.seine.TripSeineDto; -import fr.ird.observe.services.service.BabModelVersionException; -import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; -import fr.ird.observe.services.service.DatabaseNotFoundException; -import fr.ird.observe.services.service.trip.ExportTripService; -import fr.ird.observe.services.service.trip.ExportTripsRequest; -import fr.ird.observe.services.service.trip.ExportTripsResult; -import fr.ird.observe.services.service.trip.ImportTripService; -import fr.ird.observe.services.service.trip.ImportTripsRequest; -import fr.ird.observe.services.service.trip.ImportTripsResult; +import fr.ird.observe.services.service.trip.ExportTripRequest; +import fr.ird.observe.services.service.trip.ExportTripResult; +import fr.ird.observe.services.service.trip.ImportTripRequest; +import fr.ird.observe.services.service.trip.ImportTripResult; +import fr.ird.observe.services.service.trip.TripManagementService; import fr.ird.observe.ui.UIHelper; import fr.ird.observe.ui.admin.AdminStep; import fr.ird.observe.ui.admin.AdminTabUI; @@ -251,92 +247,58 @@ public class ExportUIHandler extends AdminTabUIHandler { ExportModel stepModel = model.getExportModel(); // on filtre les marées sélectionnées pour export - List<TripEntry> selectedTripEntries = stepModel.getSelectedTrips(); - - ImportTripsResult results = replicateData(stepModel.getSource(), stepModel.getCentralSource(), selectedTripEntries); - - ImmutableMap<String, TripEntry> tripEntriesById = Maps.uniqueIndex(selectedTripEntries, TripEntry::getTripId); - - for (ImportTripsResult.ImportTripResult result : results) { - - String tripId = result.getTripId(); - - TripEntry tripEntry = tripEntriesById.get(tripId); - - String tripDecorated = stepModel.decorate(tripEntry.getTrip()); - String programDecorated = stepModel.decorate(tripEntry.getProgram()); - - if (result.isDeleted()) { - - if (log.isInfoEnabled()) { - log.info(tripId + " → " + t("observe.actions.exportData.message.delete.remote.maree", tripDecorated, programDecorated)); - } - sendMessage(t("observe.actions.exportData.message.delete.remote.maree", tripDecorated, programDecorated)); - } - - if (log.isInfoEnabled()) { - log.info(tripId + " → " + t("observe.actions.exportData.message.replicate.maree", tripDecorated, programDecorated)); - } - sendMessage(t("observe.actions.exportData.message.replicate.maree", tripDecorated, programDecorated)); - - } - - sendMessage(t("observe.actions.operation.message.done", new Date())); - - return WizardState.SUCCESSED; - } - - private ImportTripsResult replicateData(ObserveSwingDataSource source, - ObserveSwingDataSource target, - List<TripEntry> tripEntries) throws DatabaseNotFoundException, BabModelVersionException, DatabaseConnexionNotAuthorizedException { + List<TripEntry> tripEntries = stepModel.getSelectedTrips(); Preconditions.checkState(CollectionUtils.isNotEmpty(tripEntries)); - // Create export request - - ExportTripsRequest.Builder requestBuilder = ExportTripsRequest.builder(true); - + ImmutableMap.Builder<String, ReferentialReference<ProgramDto>> programsByIdBuilder = ImmutableMap.builder(); + ImmutableMap.Builder<String, DataReference> tripsByIdBuilder = ImmutableMap.builder(); for (TripEntry tripEntry : tripEntries) { - requestBuilder.addTripToExport(tripEntry.getTrip().getId()); + programsByIdBuilder.put(tripEntry.getProgram().getId(), tripEntry.getProgram()); + tripsByIdBuilder.put(tripEntry.getTrip().getId(), tripEntry.getTrip()); } + ImmutableMap<String, ReferentialReference<ProgramDto>> programsById = programsByIdBuilder.build(); + ImmutableMap<String, DataReference> tripsById = tripsByIdBuilder.build(); - ExportTripsRequest exportTripsRequest = requestBuilder.build(); + DecoratorService decoratorService = getDecoratorService(); + ReferentialReferenceDecorator<ProgramDto> programDecorator = decoratorService.getReferentialReferenceDecorator(ProgramDto.class); - // Do export + try (ObserveSwingDataSource localDataSource = openSource(stepModel.getSource())) { - ExportTripsResult exportTripsResult; + TripManagementService localTripManagementService = localDataSource.newTripManagementService(); - try (ObserveSwingDataSource observeSwingDataSource = openSource(source)) { + try (ObserveSwingDataSource centralDataSource = openSource(stepModel.getCentralSource())) { - ExportTripService exportTripService = observeSwingDataSource.newExportTripService(); - exportTripsResult = exportTripService.exportTrips(exportTripsRequest); + TripManagementService centralTripManagementService = centralDataSource.newTripManagementService(); - } + for (TripEntry tripEntry : tripEntries) { - //TODO Print export results + ExportTripResult exportTripResult = localTripManagementService.exportTrip(new ExportTripRequest(tripEntry.getProgramId(), tripEntry.getTripId())); + logExportResult(n("observe.actions.export.result.export.trip"), + exportTripResult, + programDecorator, + tripEntry.getProgram(), + tripEntry.getTrip()); - // Create import request + ImportTripResult importTripResult = centralTripManagementService.importTrip(new ImportTripRequest(exportTripResult)); - ImportTripsRequest.Builder importRequestBuilder = ImportTripsRequest.builder(); - for (ExportTripsResult.ExportTripResult tripExportResult : exportTripsResult) { - importRequestBuilder.addTripToImport(tripExportResult.toImportRequest()); - } + logImportResult(n("observe.actions.export.result.import.trip"), + n("observe.actions.export.result.delete.trip"), + importTripResult, + programDecorator, + tripEntry.getProgram(), + tripEntry.getTrip()); - ImportTripsRequest importTripRequests = importRequestBuilder.build(); + } - // Do import - ImportTripsResult importTripsResult; - try (ObserveSwingDataSource observeSwingDataSource = openSource(target)) { - ImportTripService importTripService = observeSwingDataSource.newImportTripService(); - importTripsResult = importTripService.importTrips(importTripRequests); + } } + sendMessage(t("observe.actions.operation.message.done", new Date())); - return importTripsResult; - + return WizardState.SUCCESSED; } - } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/export/TripEntry.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/export/TripEntry.java index 3054c38..18d7f57 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/export/TripEntry.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/export/TripEntry.java @@ -26,6 +26,7 @@ import fr.ird.observe.services.dto.referential.ProgramDto; import fr.ird.observe.services.dto.referential.ReferentialReference; import java.io.Serializable; +import java.util.Objects; /** Une classe qui représente une entrée dans le modèle (sans la sélection) */ public class TripEntry implements Serializable { @@ -39,6 +40,8 @@ public class TripEntry implements Serializable { protected final boolean exist; public TripEntry(ReferentialReference<ProgramDto> program, DataReference trip, boolean exist) { + Objects.requireNonNull(program); + Objects.requireNonNull(trip); this.program = program; this.trip = trip; this.exist = exist; @@ -48,6 +51,10 @@ public class TripEntry implements Serializable { return program; } + public String getProgramId() { + return program.getId(); + } + public DataReference getTrip() { return trip; } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/data/DataSynchroUIHandler.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/data/DataSynchroUIHandler.java index 7822ef3..b1bdd31 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/data/DataSynchroUIHandler.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/data/DataSynchroUIHandler.java @@ -7,10 +7,13 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopia import fr.ird.observe.services.dto.DataReference; import fr.ird.observe.services.dto.referential.ProgramDto; import fr.ird.observe.services.dto.referential.ReferentialReference; -import fr.ird.observe.services.service.actions.synchro.data.DataSynchronizeRequest; -import fr.ird.observe.services.service.actions.synchro.data.DataSynchronizeService; -import fr.ird.observe.services.service.actions.synchro.data.task.DataSynchronizeCopyTask; -import fr.ird.observe.services.service.actions.synchro.data.task.DataSynchronizeDeleteTask; +import fr.ird.observe.services.service.trip.DeleteTripRequest; +import fr.ird.observe.services.service.trip.DeleteTripResult; +import fr.ird.observe.services.service.trip.ExportTripRequest; +import fr.ird.observe.services.service.trip.ExportTripResult; +import fr.ird.observe.services.service.trip.ImportTripRequest; +import fr.ird.observe.services.service.trip.ImportTripResult; +import fr.ird.observe.services.service.trip.TripManagementService; import fr.ird.observe.ui.UIHelper; import fr.ird.observe.ui.admin.AdminStep; import fr.ird.observe.ui.admin.AdminTabUI; @@ -33,6 +36,7 @@ import javax.swing.border.TitledBorder; import java.util.List; import java.util.Map; +import static org.nuiton.i18n.I18n.n; import static org.nuiton.i18n.I18n.t; /** @@ -102,36 +106,6 @@ public class DataSynchroUIHandler extends AdminTabUIHandler { } - private WizardState doStartAction0() { - - DataSynchroUI tabUI = getUi(); - DataSynchroModel stepModel = getStepModel(); - ConfigUI configUI = (ConfigUI) parentUI.getStepUI(AdminStep.CONFIG); - - ObserveSwingDataSource leftSource = getModel().getSafeLocalSource(true); - stepModel.setLeftSource(leftSource); - - ObserveSwingDataSource rightSource = getModel().getSafeCentralSource(true); - stepModel.setRightSource(rightSource); - - tabUI.getLeftTreePane().setBorder(new TitledBorder(getModel().getLocalSourceModel().getLabel())); - stepModel.populateLeftSelectionModel(); - updateSelectionModel(tabUI, tabUI.getLeftTreeHelper(), tabUI.getLeftTree(), leftSource, stepModel.getLeftSelectionDataModel(), tabUI.getLeftSelectionModel()); - sendMessage(t("observe.actions.synchro.referential.message.data.leftData.loaded")); - - configUI.getLocalSourceConfig().setBorder(new TitledBorder(getModel().getLocalSourceLabel())); - - tabUI.getRightTreePane().setBorder(new TitledBorder(getModel().getCentralSourceModel().getLabel())); - stepModel.populateRightSelectionModel(); - updateSelectionModel(tabUI, tabUI.getRightTreeHelper(), tabUI.getRightTree(), rightSource, stepModel.getRightSelectionDataModel(), tabUI.getRightSelectionModel()); - sendMessage(t("observe.actions.synchro.referential.message.data.rightData.loaded")); - - configUI.getCentralSourceConfig().setBorder(new TitledBorder(getModel().getCentralSourceLabel())); - - return WizardState.NEED_FIX; - - } - public void addCopyToLeftTasks() { DataSelectionModel rightSelectionDataModel = getStepModel().getRightSelectionDataModel(); @@ -220,6 +194,42 @@ public class DataSynchroUIHandler extends AdminTabUIHandler { public void doExecuteAction() { + addAdminWorker(getUi().getStartAction().getToolTipText(), this::doExecuteAction0); + + } + + private WizardState doStartAction0() { + + DataSynchroUI tabUI = getUi(); + DataSynchroModel stepModel = getStepModel(); + ConfigUI configUI = (ConfigUI) parentUI.getStepUI(AdminStep.CONFIG); + + ObserveSwingDataSource leftSource = getModel().getSafeLocalSource(true); + stepModel.setLeftSource(leftSource); + + ObserveSwingDataSource rightSource = getModel().getSafeCentralSource(true); + stepModel.setRightSource(rightSource); + + tabUI.getLeftTreePane().setBorder(new TitledBorder(getModel().getLocalSourceModel().getLabel())); + stepModel.populateLeftSelectionModel(); + updateSelectionModel(tabUI, tabUI.getLeftTreeHelper(), tabUI.getLeftTree(), leftSource, stepModel.getLeftSelectionDataModel(), tabUI.getLeftSelectionModel()); + sendMessage(t("observe.actions.synchro.referential.message.data.leftData.loaded")); + + configUI.getLocalSourceConfig().setBorder(new TitledBorder(getModel().getLocalSourceLabel())); + + tabUI.getRightTreePane().setBorder(new TitledBorder(getModel().getCentralSourceModel().getLabel())); + stepModel.populateRightSelectionModel(); + updateSelectionModel(tabUI, tabUI.getRightTreeHelper(), tabUI.getRightTree(), rightSource, stepModel.getRightSelectionDataModel(), tabUI.getRightSelectionModel()); + sendMessage(t("observe.actions.synchro.referential.message.data.rightData.loaded")); + + configUI.getCentralSourceConfig().setBorder(new TitledBorder(getModel().getCentralSourceLabel())); + + return WizardState.NEED_FIX; + + } + + private WizardState doExecuteAction0() { + ObserveSwingDataSource leftSource = getStepModel().getLeftSource(); boolean leftSourceIsH2 = leftSource.getConfiguration() instanceof ObserveDataSourceConfigurationTopiaH2; @@ -232,69 +242,101 @@ public class DataSynchroUIHandler extends AdminTabUIHandler { DecoratorService decoratorService = getDecoratorService(); ReferentialReferenceDecorator<ProgramDto> programDecorator = decoratorService.getReferentialReferenceDecorator(ProgramDto.class); - DataSynchronizeRequest.Builder leftDataSynchronizeRequestBuilder = DataSynchronizeRequest.builder(leftSourceIsH2, rightSourceIsH2); - DataSynchronizeRequest.Builder rightDataSynchronizeRequestBuilder = DataSynchronizeRequest.builder(rightSourceIsH2, leftSourceIsH2); + TripManagementService leftTripManagementService = leftSource.newTripManagementService(); + TripManagementService rightTripManagementService = rightSource.newTripManagementService(); + for (int i = 0; i < size; i++) { DataSynchronizeTaskSupport task = tasks.getElementAt(i); - String programStr = programDecorator.toString(task.getProgram()); - String tripStr = decoratorService.getTripReferenceDecorator(task.getTrip()).toString(task.getTrip()); + ReferentialReference<ProgramDto> program = task.getProgram(); + String programId = program.getId(); + String programStr = programDecorator.toString(program); + + DataReference trip = task.getTrip(); + String tripId = trip.getId(); + String tripStr = decoratorService.getTripReferenceDecorator(trip).toString(trip); if (task instanceof DeleteFromLeftDataSynchronizeTask) { sendMessage(t("observe.actions.synchro.data.prepare.deleteFromLeftTask", programStr, tripStr)); - leftDataSynchronizeRequestBuilder.addDeleteTask(new DataSynchronizeDeleteTask(task.getProgram().getId(), task.getTrip().getId())); + + DeleteTripResult deleteTripResult = leftTripManagementService.deleteTrip(new DeleteTripRequest(programId, tripId)); + logDeleteResult(n("observe.actions.synchro.data.result.delete.left.trip"), + deleteTripResult, + programDecorator, + program, + trip); + continue; + } if (task instanceof DeleteFromRightDataSynchronizeTask) { + sendMessage(t("observe.actions.synchro.data.prepare.deleteFromRightTask", programStr, tripStr)); - rightDataSynchronizeRequestBuilder.addDeleteTask(new DataSynchronizeDeleteTask(task.getProgram().getId(), task.getTrip().getId())); + + DeleteTripResult deleteTripResult = rightTripManagementService.deleteTrip(new DeleteTripRequest(programId, tripId)); + logDeleteResult(n("observe.actions.synchro.data.result.delete.right.trip"), + deleteTripResult, + programDecorator, + program, + trip); continue; + } if (task instanceof CopyToLeftDataSynchronizeTask) { - CopyToLeftDataSynchronizeTask task1 = (CopyToLeftDataSynchronizeTask) task; - if (task1.isTripExistOnLeft()) { - sendMessage(t("observe.actions.synchro.data.prepare.deleteFromLeftTask", programStr, tripStr)); - leftDataSynchronizeRequestBuilder.addDeleteTask(new DataSynchronizeDeleteTask(task.getProgram().getId(), task.getTrip().getId())); - } + sendMessage(t("observe.actions.synchro.data.prepare.copyToLeftTask", programStr, tripStr)); - leftDataSynchronizeRequestBuilder.addCopyTask(new DataSynchronizeCopyTask(task.getProgram().getId(), task.getTrip().getId())); + + ExportTripResult exportTripResult = rightTripManagementService.exportTrip(new ExportTripRequest(programId, tripId)); + + logExportResult(n("observe.actions.synchro.data.result.export.right.trip"), + exportTripResult, + programDecorator, + program, + trip); + + ImportTripResult importTripResult = leftTripManagementService.importTrip(new ImportTripRequest(exportTripResult)); + + logImportResult(n("observe.actions.synchro.data.result.import.left.trip"), + n("observe.actions.synchro.data.result.delete.left.trip"), + importTripResult, + programDecorator, + program, + trip); + continue; + } if (task instanceof CopyToRightDataSynchronizeTask) { - CopyToRightDataSynchronizeTask task1 = (CopyToRightDataSynchronizeTask) task; - if (task1.isTripExistOnRight()) { - sendMessage(t("observe.actions.synchro.data.prepare.deleteFromRightTask", programStr, tripStr)); - rightDataSynchronizeRequestBuilder.addDeleteTask(new DataSynchronizeDeleteTask(task.getProgram().getId(), task.getTrip().getId())); - } + sendMessage(t("observe.actions.synchro.data.prepare.copyToRightTask", programStr, tripStr)); - rightDataSynchronizeRequestBuilder.addCopyTask(new DataSynchronizeCopyTask(task.getProgram().getId(), task.getTrip().getId())); - } - } + ExportTripResult exportTripResult = leftTripManagementService.exportTrip(new ExportTripRequest(programId, tripId)); - DataSynchronizeService leftDataSynchronizeService = leftSource.newDataSynchronizeService(); - DataSynchronizeService rightDataSynchronizeService = rightSource.newDataSynchronizeService(); + logExportResult(n("observe.actions.synchro.data.result.export.left.trip"), + exportTripResult, + programDecorator, + program, + trip); - DataSynchronizeRequest leftDataSynchronizeRequest = leftDataSynchronizeRequestBuilder.build(); - if (leftDataSynchronizeRequest.isNotEmpty()) { - byte[][] copySqlCodes = rightDataSynchronizeService.getCopySqlCodes(leftDataSynchronizeRequest); - byte[][] deleteSqlCodes = leftDataSynchronizeService.getDeleteSqlCodes(leftDataSynchronizeRequest); - leftDataSynchronizeService.executeRequest(copySqlCodes, deleteSqlCodes); - } + ImportTripResult importTripResult = rightTripManagementService.importTrip(new ImportTripRequest(exportTripResult)); + + logImportResult(n("observe.actions.synchro.data.result.import.right.trip"), + n("observe.actions.synchro.data.result.delete.right.trip"), + importTripResult, + programDecorator, + program, + trip); + + } - DataSynchronizeRequest rightDataSynchronizeRequest = rightDataSynchronizeRequestBuilder.build(); - if (rightDataSynchronizeRequest.isNotEmpty()) { - byte[][] copySqlCodes = leftDataSynchronizeService.getCopySqlCodes(rightDataSynchronizeRequest); - byte[][] deleteSqlCodes = rightDataSynchronizeService.getDeleteSqlCodes(rightDataSynchronizeRequest); - rightDataSynchronizeService.executeRequest(copySqlCodes, deleteSqlCodes); } - getModel().setStepState(WizardState.SUCCESSED); + return WizardState.SUCCESSED; } diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties index e49fb1c..ddda428 100644 --- a/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties +++ b/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties @@ -159,6 +159,9 @@ observe.actions.consolidate.step= observe.actions.consolidate.step.description= observe.actions.consolidate.title= observe.actions.consolidate.title.tip= +observe.actions.export.result.delete.trip= +observe.actions.export.result.export.trip= +observe.actions.export.result.import.trip= observe.actions.exportData= observe.actions.exportData.description= observe.actions.exportData.message.delete.remote.maree= @@ -226,6 +229,12 @@ observe.actions.synchro.data.prepare.copyToLeftTask= observe.actions.synchro.data.prepare.copyToRightTask= observe.actions.synchro.data.prepare.deleteFromLeftTask= observe.actions.synchro.data.prepare.deleteFromRightTask= +observe.actions.synchro.data.result.delete.left.trip= +observe.actions.synchro.data.result.delete.right.trip= +observe.actions.synchro.data.result.export.left.trip= +observe.actions.synchro.data.result.export.right.trip= +observe.actions.synchro.data.result.import.left.trip= +observe.actions.synchro.data.result.import.right.trip= observe.actions.synchro.data.step= observe.actions.synchro.data.step.description= observe.actions.synchro.data.title= diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties index 75b8703..d5c9503 100644 --- a/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties +++ b/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties @@ -159,6 +159,9 @@ observe.actions.consolidate.step= observe.actions.consolidate.step.description= observe.actions.consolidate.title= observe.actions.consolidate.title.tip= +observe.actions.export.result.delete.trip= +observe.actions.export.result.export.trip= +observe.actions.export.result.import.trip= observe.actions.exportData= observe.actions.exportData.description= observe.actions.exportData.message.delete.remote.maree=Eliminación de la marea (%1$s) del programa (%2$s) de la base remota. @@ -226,6 +229,12 @@ observe.actions.synchro.data.prepare.copyToLeftTask= observe.actions.synchro.data.prepare.copyToRightTask= observe.actions.synchro.data.prepare.deleteFromLeftTask= observe.actions.synchro.data.prepare.deleteFromRightTask= +observe.actions.synchro.data.result.delete.left.trip= +observe.actions.synchro.data.result.delete.right.trip= +observe.actions.synchro.data.result.export.left.trip= +observe.actions.synchro.data.result.export.right.trip= +observe.actions.synchro.data.result.import.left.trip= +observe.actions.synchro.data.result.import.right.trip= observe.actions.synchro.data.step= observe.actions.synchro.data.step.description= observe.actions.synchro.data.title= diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties index 550dd80..d010bf6 100644 --- a/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties +++ b/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties @@ -159,6 +159,9 @@ observe.actions.consolidate.step=Calculer les données observe.actions.consolidate.step.description=Calculer les données non observées observe.actions.consolidate.title=Consolider les données observateur observe.actions.consolidate.title.tip=Consolider les données observateur +observe.actions.export.result.delete.trip=La marée %s - %s a été supprimée de la base centrale +observe.actions.export.result.export.trip=La marée %s - %s a été exportée depuis la base locale +observe.actions.export.result.import.trip=La marée %s - %s a été importée dans la base centrale observe.actions.exportData=Exporter les données observateurs observe.actions.exportData.description=Exporter les données observateurs vers la base centrale observe.actions.exportData.message.delete.remote.maree=Suppression de la marée (%1$s) du programme (%2$s) de la base distante. @@ -226,6 +229,12 @@ observe.actions.synchro.data.prepare.copyToLeftTask=Préparation de la recopie v 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 depuisla 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.step=Synchronisation bi-directionnelle de données observe.actions.synchro.data.step.description=Synchronisation bi-directionnelle des données utilisateurs observe.actions.synchro.data.title=Synchronisation bi-directionnelle de données diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/actions/synchro/data/DataSynchronizeServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/actions/synchro/data/DataSynchronizeServiceController.java deleted file mode 100644 index 3b7f1a4..0000000 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/actions/synchro/data/DataSynchronizeServiceController.java +++ /dev/null @@ -1,32 +0,0 @@ -package fr.ird.observe.application.web.controller.v1.actions.synchro.data; - -import fr.ird.observe.application.web.controller.v1.ObserveAuthenticatedServiceControllerSupport; -import fr.ird.observe.services.service.actions.synchro.data.DataSynchronizeRequest; -import fr.ird.observe.services.service.actions.synchro.data.DataSynchronizeService; - -/** - * Created on 09/08/16. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class DataSynchronizeServiceController extends ObserveAuthenticatedServiceControllerSupport<DataSynchronizeService> implements DataSynchronizeService { - - public DataSynchronizeServiceController() { - super(DataSynchronizeService.class); - } - - @Override - public byte[][] getCopySqlCodes(DataSynchronizeRequest request) { - return service.getCopySqlCodes(request); - } - - @Override - public byte[][] getDeleteSqlCodes(DataSynchronizeRequest request) { - return service.getDeleteSqlCodes(request); - } - - @Override - public void executeRequest(byte[][] copySqlCodes, byte[][] deleteSqlCodes) { - service.executeRequest(copySqlCodes, deleteSqlCodes); - } -} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/trip/ExportTripServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/trip/ExportTripServiceController.java deleted file mode 100644 index 9f38e15..0000000 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/trip/ExportTripServiceController.java +++ /dev/null @@ -1,47 +0,0 @@ -package fr.ird.observe.application.web.controller.v1.trip; - -/*- - * #%L - * ObServe :: Application Web - * %% - * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit - * %% - * 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 fr.ird.observe.application.web.controller.v1.ObserveAuthenticatedServiceControllerSupport; -import fr.ird.observe.services.service.trip.ExportTripService; -import fr.ird.observe.services.service.trip.ExportTripsRequest; -import fr.ird.observe.services.service.trip.ExportTripsResult; - -/** - * Created on 20/07/16. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 5.0 - */ -public class ExportTripServiceController extends ObserveAuthenticatedServiceControllerSupport<ExportTripService> implements ExportTripService { - - public ExportTripServiceController() { - super(ExportTripService.class); - } - - @Override - public ExportTripsResult exportTrips(ExportTripsRequest exportRequest) { - return getAuthenticatedService().exportTrips(exportRequest); - } - -} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/trip/ImportTripServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/trip/ImportTripServiceController.java deleted file mode 100644 index d76c456..0000000 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/trip/ImportTripServiceController.java +++ /dev/null @@ -1,47 +0,0 @@ -package fr.ird.observe.application.web.controller.v1.trip; - -/*- - * #%L - * ObServe :: Application Web - * %% - * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit - * %% - * 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 fr.ird.observe.application.web.controller.v1.ObserveAuthenticatedServiceControllerSupport; -import fr.ird.observe.services.service.trip.ImportTripService; -import fr.ird.observe.services.service.trip.ImportTripsRequest; -import fr.ird.observe.services.service.trip.ImportTripsResult; - -/** - * Created on 20/07/16. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 5.0 - */ -public class ImportTripServiceController extends ObserveAuthenticatedServiceControllerSupport<ImportTripService> implements ImportTripService { - - public ImportTripServiceController() { - super(ImportTripService.class); - } - - @Override - public ImportTripsResult importTrips(ImportTripsRequest importRequest) { - return service.importTrips(importRequest); - } - -} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/trip/TripManagementServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/trip/TripManagementServiceController.java new file mode 100644 index 0000000..dbe603a --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/trip/TripManagementServiceController.java @@ -0,0 +1,61 @@ +package fr.ird.observe.application.web.controller.v1.trip; + +/*- + * #%L + * ObServe :: Application Web + * %% + * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit + * %% + * 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 fr.ird.observe.application.web.controller.v1.ObserveAuthenticatedServiceControllerSupport; +import fr.ird.observe.services.service.trip.DeleteTripRequest; +import fr.ird.observe.services.service.trip.DeleteTripResult; +import fr.ird.observe.services.service.trip.ExportTripRequest; +import fr.ird.observe.services.service.trip.ExportTripResult; +import fr.ird.observe.services.service.trip.ImportTripRequest; +import fr.ird.observe.services.service.trip.ImportTripResult; +import fr.ird.observe.services.service.trip.TripManagementService; + +/** + * Created on 20/07/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class TripManagementServiceController extends ObserveAuthenticatedServiceControllerSupport<TripManagementService> implements TripManagementService { + + public TripManagementServiceController() { + super(TripManagementService.class); + } + + @Override + public ExportTripResult exportTrip(ExportTripRequest exportRequest) { + return service.exportTrip(exportRequest); + } + + @Override + public DeleteTripResult deleteTrip(DeleteTripRequest request) { + return service.deleteTrip(request); + } + + @Override + public ImportTripResult importTrip(ImportTripRequest request) { + return service.importTrip(request); + } + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServicesProvider.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServicesProvider.java index 888252c..b691eef 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServicesProvider.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServicesProvider.java @@ -5,10 +5,7 @@ import fr.ird.observe.services.service.PingService; import fr.ird.observe.services.service.ReferentialService; import fr.ird.observe.services.service.SqlScriptProducerService; import fr.ird.observe.services.service.actions.consolidate.ConsolidateDataService; -import fr.ird.observe.services.service.trip.ExportTripService; -import fr.ird.observe.services.service.trip.ImportTripService; import fr.ird.observe.services.service.actions.report.ReportService; -import fr.ird.observe.services.service.actions.synchro.data.DataSynchronizeService; import fr.ird.observe.services.service.actions.synchro.referential.diff.ReferentialSynchronizeDiffService; import fr.ird.observe.services.service.actions.synchro.referential.legacy.UnidirectionalReferentialSynchronizeLocalService; import fr.ird.observe.services.service.actions.synchro.referential.ng.ReferentialSynchronizeService; @@ -39,6 +36,7 @@ import fr.ird.observe.services.service.seine.TargetSampleService; import fr.ird.observe.services.service.seine.TransmittingBuoyOperationService; import fr.ird.observe.services.service.seine.TripSeineGearUseService; import fr.ird.observe.services.service.seine.TripSeineService; +import fr.ird.observe.services.service.trip.TripManagementService; /** * Un provider de services typés. @@ -58,16 +56,12 @@ public interface ObserveServicesProvider { PingService newPingService(); - ImportTripService newImportTripService(); - - ExportTripService newExportTripService(); + TripManagementService newTripManagementService(); ConsolidateDataService newConsolidateDataService(); UnidirectionalReferentialSynchronizeLocalService newUnidirectionalReferentialSynchronizeLocalService(); - DataSynchronizeService newDataSynchronizeService(); - ReferentialSynchronizeService newReferentialSynchronizeService(); ReferentialSynchronizeDiffService newReferentialSynchronizeDiffService(); diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/DeleteSqlScriptProducerRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/DeleteSqlScriptProducerRequest.java index bbcc54a..4cff08a 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/DeleteSqlScriptProducerRequest.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/DeleteSqlScriptProducerRequest.java @@ -34,16 +34,19 @@ import java.util.stream.Collectors; */ public class DeleteSqlScriptProducerRequest { - protected final boolean postgres; protected boolean deleteData; protected ImmutableSet<String> dataIds; + public static DeleteSqlScriptProducerRequest builder() { + return new DeleteSqlScriptProducerRequest(); + } + public static DeleteSqlScriptProducerRequest forH2() { - return new DeleteSqlScriptProducerRequest(false); + return new DeleteSqlScriptProducerRequest(); } public static DeleteSqlScriptProducerRequest forPostgres() { - return new DeleteSqlScriptProducerRequest(true); + return new DeleteSqlScriptProducerRequest(); } public DeleteSqlScriptProducerRequest deleteAllData() { @@ -57,8 +60,7 @@ public class DeleteSqlScriptProducerRequest { return this; } - protected DeleteSqlScriptProducerRequest(boolean postgres) { - this.postgres = postgres; + protected DeleteSqlScriptProducerRequest() { } public boolean isDeleteData() { @@ -69,18 +71,9 @@ public class DeleteSqlScriptProducerRequest { return dataIds; } - public boolean isH2() { - return !postgres; - } - - public boolean isPostgres() { - return postgres; - } - @Override public String toString() { return MoreObjects.toStringHelper(this) - .add("postgres", postgres) .add("deleteData", deleteData) .add("dataIds", dataIds == null ? "" : "[" + dataIds.stream().collect(Collectors.joining(", ")) + "]") .toString(); diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/DataSynchronizeRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/DataSynchronizeRequest.java deleted file mode 100644 index 6218431..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/DataSynchronizeRequest.java +++ /dev/null @@ -1,103 +0,0 @@ -package fr.ird.observe.services.service.actions.synchro.data; - -import com.google.common.collect.ImmutableSet; -import fr.ird.observe.services.service.actions.synchro.data.task.DataSynchronizeCopyTask; -import fr.ird.observe.services.service.actions.synchro.data.task.DataSynchronizeDeleteTask; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * Created on 08/08/16. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 5.0 - */ -public class DataSynchronizeRequest { - - /** Logger. */ - private static final Log log = LogFactory.getLog(DataSynchronizeRequest.class); - - public static Builder builder(boolean h2, boolean oppositeH2) { - return new Builder(h2, oppositeH2); - } - - /** - * Is data source use h2 ? - */ - private final boolean h2; - /** - * Is opposite data source use h2 ? - */ - private final boolean oppositeH2; - /** - * Copy tasks. - */ - private final ImmutableSet<DataSynchronizeCopyTask> copyTasks; - - /** - * Delete tasks. - */ - private final ImmutableSet<DataSynchronizeDeleteTask> deleteTasks; - - public static class Builder { - - private final boolean h2; - private final boolean oppositeH2; - private final ImmutableSet.Builder<DataSynchronizeCopyTask> copyTasksBuilder = ImmutableSet.builder(); - private final ImmutableSet.Builder<DataSynchronizeDeleteTask> deleteTasksBuilder = ImmutableSet.builder(); - - public Builder(boolean h2, boolean oppositeH2) { - this.h2 = h2; - this.oppositeH2 = oppositeH2; - } - - public DataSynchronizeRequest build() { - return new DataSynchronizeRequest(h2, oppositeH2, copyTasksBuilder.build(), deleteTasksBuilder.build()); - } - - public Builder addDeleteTask(DataSynchronizeDeleteTask deleteTask) { - - if (log.isInfoEnabled()) { - log.info("Add delete task for trip: " + deleteTask.getProgramId() + " / " + deleteTask.getTripId()); - } - deleteTasksBuilder.add(deleteTask); - return this; - } - - public Builder addCopyTask(DataSynchronizeCopyTask copyTask) { - if (log.isInfoEnabled()) { - log.info("Add copy task for trip: " + copyTask.getProgramId() + " / " + copyTask.getTripId()); - } - copyTasksBuilder.add(copyTask); - return this; - } - - } - - public ImmutableSet<DataSynchronizeCopyTask> getCopyTasks() { - return copyTasks; - } - - public ImmutableSet<DataSynchronizeDeleteTask> getDeleteTasks() { - return deleteTasks; - } - - public boolean isNotEmpty() { - return !(copyTasks.isEmpty() && deleteTasks.isEmpty()); - } - - public boolean isOppositeH2() { - return oppositeH2; - } - - public boolean isH2() { - return h2; - } - - private DataSynchronizeRequest(boolean h2, boolean oppositeH2, ImmutableSet<DataSynchronizeCopyTask> copyTasks, ImmutableSet<DataSynchronizeDeleteTask> deleteTasks) { - this.h2 = h2; - this.oppositeH2 = oppositeH2; - this.copyTasks = copyTasks; - this.deleteTasks = deleteTasks; - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/DataSynchronizeService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/DataSynchronizeService.java deleted file mode 100644 index 5a9fc17..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/DataSynchronizeService.java +++ /dev/null @@ -1,52 +0,0 @@ -package fr.ird.observe.services.service.actions.synchro.data; - -import fr.ird.observe.services.ObserveService; -import fr.ird.observe.services.spi.PostRequest; -import fr.ird.observe.services.spi.ReadDataPermission; -import fr.ird.observe.services.spi.Write; -import fr.ird.observe.services.spi.WriteDataPermission; - -/** - * Created on 08/08/16. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 5.0 - */ -public interface DataSynchronizeService extends ObserveService { - - /** - * Récupération du code sql de recopie. - * - * Cette méthode doit être executée sur la base opposée. - * - * @param request la demande des tâches à préparer. - */ - @ReadDataPermission - @PostRequest - byte[][] getCopySqlCodes(DataSynchronizeRequest request); - - /** - * Récupération du code sql de suppression. - * - * Cette méthode doit être executée sur la base cible. - * - * @param request la demande des tâches à préparer. - */ - @ReadDataPermission - @PostRequest - byte[][] getDeleteSqlCodes(DataSynchronizeRequest request); - - /** - * Exécution de la demande donnée en paramètre. - * - * Cette méthode doit être exécutée sur la base cible. - * @param copySqlCodes les codes sql de recopie - * @param deleteSqlCodes les codes sql de suppression - */ - @ReadDataPermission - @WriteDataPermission - @Write - @PostRequest - void executeRequest(byte[][] copySqlCodes, byte[][] deleteSqlCodes); - -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/task/DataSynchronizeCopyTask.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/task/DataSynchronizeCopyTask.java deleted file mode 100644 index 3f18f6d..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/task/DataSynchronizeCopyTask.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.ird.observe.services.service.actions.synchro.data.task; - -/** - * Created on 08/08/16. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 5.0 - */ -public class DataSynchronizeCopyTask extends DataSynchronizeTaskSupport { - - public DataSynchronizeCopyTask(String programId, String tripId) { - super(programId, tripId); - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/task/DataSynchronizeDeleteTask.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/task/DataSynchronizeDeleteTask.java deleted file mode 100644 index 8701d52..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/task/DataSynchronizeDeleteTask.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.ird.observe.services.service.actions.synchro.data.task; - -/** - * Created on 08/08/16. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 5.0 - */ -public class DataSynchronizeDeleteTask extends DataSynchronizeTaskSupport { - - public DataSynchronizeDeleteTask(String programId, String tripId) { - super(programId, tripId); - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/task/DataSynchronizeTaskSupport.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/DeleteTripRequest.java similarity index 51% copy from observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/task/DataSynchronizeTaskSupport.java copy to observe-services-api/src/main/java/fr/ird/observe/services/service/trip/DeleteTripRequest.java index 7f5bb14..566e960 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/task/DataSynchronizeTaskSupport.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/DeleteTripRequest.java @@ -1,23 +1,17 @@ -package fr.ird.observe.services.service.actions.synchro.data.task; +package fr.ird.observe.services.service.trip; /** - * Created on 08/08/16. + * Created on 27/08/16. * * @author Tony Chemit - chemit@codelutin.com * @since 5.0 */ -public abstract class DataSynchronizeTaskSupport { +public class DeleteTripRequest { - /** - * Identifiant du programme de la marée. - */ private final String programId; - /** - * Identifiant de la marée. - */ private final String tripId; - protected DataSynchronizeTaskSupport(String programId, String tripId) { + public DeleteTripRequest(String programId, String tripId) { this.programId = programId; this.tripId = tripId; } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/DeleteTripResult.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/DeleteTripResult.java new file mode 100644 index 0000000..b15297d --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/DeleteTripResult.java @@ -0,0 +1,26 @@ +package fr.ird.observe.services.service.trip; + +/** + * Created on 27/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class DeleteTripResult { + + private final DeleteTripRequest request; + private final long time; + + public DeleteTripResult(DeleteTripRequest request, long time) { + this.request = request; + this.time = time; + } + + public DeleteTripRequest getRequest() { + return request; + } + + public long getTime() { + return time; + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/task/DataSynchronizeTaskSupport.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripRequest.java similarity index 51% rename from observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/task/DataSynchronizeTaskSupport.java rename to observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripRequest.java index 7f5bb14..af83579 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/data/task/DataSynchronizeTaskSupport.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripRequest.java @@ -1,23 +1,17 @@ -package fr.ird.observe.services.service.actions.synchro.data.task; +package fr.ird.observe.services.service.trip; /** - * Created on 08/08/16. + * Created on 27/08/16. * * @author Tony Chemit - chemit@codelutin.com * @since 5.0 */ -public abstract class DataSynchronizeTaskSupport { +public class ExportTripRequest { - /** - * Identifiant du programme de la marée. - */ private final String programId; - /** - * Identifiant de la marée. - */ private final String tripId; - protected DataSynchronizeTaskSupport(String programId, String tripId) { + public ExportTripRequest(String programId, String tripId) { this.programId = programId; this.tripId = tripId; } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripResult.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripResult.java new file mode 100644 index 0000000..23088b6 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripResult.java @@ -0,0 +1,51 @@ +package fr.ird.observe.services.service.trip; + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.service.ObserveBlobsContainer; + +/** + * Created on 27/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class ExportTripResult { + + private final String programId; + private final String tripId; + private final byte[] sqlContent; + private final ImmutableSet<ObserveBlobsContainer> blobsContainers; + private final long time; + + public ExportTripResult(ExportTripRequest request, + byte[] sqlContent, + ImmutableSet<ObserveBlobsContainer> blobsContainers, + long time) { + this.programId = request.getProgramId(); + this.tripId = request.getTripId(); + this.sqlContent = sqlContent; + this.blobsContainers = blobsContainers; + this.time = time; + } + + public String getProgramId() { + return programId; + } + + public String getTripId() { + return tripId; + } + + public byte[] getSqlContent() { + return sqlContent; + } + + public ImmutableSet<ObserveBlobsContainer> getBlobsContainers() { + return blobsContainers; + } + + public long getTime() { + return time; + } + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripsRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripsRequest.java deleted file mode 100644 index 6bfa26e..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripsRequest.java +++ /dev/null @@ -1,98 +0,0 @@ -package fr.ird.observe.services.service.trip; - -/*- - * #%L - * ObServe :: Services API - * %% - * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit - * %% - * 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.common.collect.ImmutableSet; - -import java.util.Iterator; -import java.util.Objects; - -/** - * Created on 20/07/16. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ExportTripsRequest implements Iterable<ExportTripsRequest.ExportTripRequest> { - - public static Builder builder(boolean forPg) { - return new Builder(forPg); - } - - public static class Builder { - - private final ImmutableSet.Builder<ExportTripRequest> trips = ImmutableSet.builder(); - - private final boolean forPg; - - public Builder(boolean forPg) { - this.forPg = forPg; - } - - public Builder addTripToExport(String tripId) { - trips.add(new ExportTripRequest(tripId)); - return this; - } - - public ExportTripsRequest build() { - return new ExportTripsRequest(trips.build()); - } - - } - - private final ImmutableSet<ExportTripRequest> tripsToExport; - - @Override - public Iterator<ExportTripRequest> iterator() { - return tripsToExport.iterator(); - } - - private ExportTripsRequest(ImmutableSet<ExportTripRequest> tripsToExport) { - this.tripsToExport = tripsToExport; - } - - public static class ExportTripRequest { - - private final String tripId; - - public ExportTripRequest(String tripId) { - this.tripId = tripId; - } - - public String getTripId() { - return tripId; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ExportTripRequest that = (ExportTripRequest) o; - return Objects.equals(getTripId(), that.getTripId()); - } - - @Override - public int hashCode() { - return Objects.hash(getTripId()); - } - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripsResult.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripsResult.java deleted file mode 100644 index b0995c3..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripsResult.java +++ /dev/null @@ -1,121 +0,0 @@ -package fr.ird.observe.services.service.trip; - -/*- - * #%L - * ObServe :: Services API - * %% - * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit - * %% - * 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.common.collect.ImmutableSet; -import fr.ird.observe.services.service.ObserveBlobsContainer; - -import java.util.Iterator; -import java.util.Objects; - -/** - * Created on 20/07/16. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ExportTripsResult implements Iterable<ExportTripsResult.ExportTripResult> { - - public static ExportTripsRequestBuilder builder() { - return new ExportTripsRequestBuilder(); - } - - public static class ExportTripsRequestBuilder { - - private final ImmutableSet.Builder<ExportTripResult> trips = ImmutableSet.builder(); - - public ExportTripsRequestBuilder addTripToReplicate(ExportTripsRequest.ExportTripRequest request, - byte[] sqlContent, - ImmutableSet<ObserveBlobsContainer> blobsContainers, - long time) { - trips.add(new ExportTripResult(request, sqlContent, blobsContainers, time)); - return this; - } - - public ExportTripsResult build() { - return new ExportTripsResult(trips.build()); - } - - } - - public static class ExportTripResult { - - private final ExportTripsRequest.ExportTripRequest request; - private final byte[] sqlContent; - private final ImmutableSet<ObserveBlobsContainer> blobsContainers; - private final long time; - - public ExportTripResult(ExportTripsRequest.ExportTripRequest request, - byte[] sqlContent, - ImmutableSet<ObserveBlobsContainer> blobsContainers, - long time) { - this.request = request; - this.sqlContent = sqlContent; - this.blobsContainers = blobsContainers; - this.time = time; - } - - public ExportTripsRequest.ExportTripRequest getRequest() { - return request; - } - - public byte[] getSqlContent() { - return sqlContent; - } - - public ImmutableSet<ObserveBlobsContainer> getBlobsContainers() { - return blobsContainers; - } - - public long getTime() { - return time; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ExportTripResult that = (ExportTripResult) o; - return Objects.equals(getRequest(), that.getRequest()); - } - - @Override - public int hashCode() { - return Objects.hash(getRequest()); - } - - public ImportTripsRequest.ImportTripRequest toImportRequest() { - return new ImportTripsRequest.ImportTripRequest(request.getTripId(), sqlContent, blobsContainers); - } - } - - private final ImmutableSet<ExportTripResult> exportedTrips; - - @Override - public Iterator<ExportTripResult> iterator() { - return exportedTrips.iterator(); - } - - private ExportTripsResult(ImmutableSet<ExportTripResult> exportedTrips) { - this.exportedTrips = exportedTrips; - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripRequest.java new file mode 100644 index 0000000..9b18c90 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripRequest.java @@ -0,0 +1,42 @@ +package fr.ird.observe.services.service.trip; + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.service.ObserveBlobsContainer; + +/** + * Created on 27/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class ImportTripRequest { + + private final String programId; + private final String tripId; + private final byte[] sqlContent; + private final ImmutableSet<ObserveBlobsContainer> blobsContainers; + + public ImportTripRequest(ExportTripResult exportTripResult) { + this.programId = exportTripResult.getProgramId(); + this.tripId = exportTripResult.getTripId(); + this.sqlContent = exportTripResult.getSqlContent(); + this.blobsContainers = exportTripResult.getBlobsContainers(); + } + + public String getProgramId() { + return programId; + } + + public String getTripId() { + return tripId; + } + + public byte[] getSqlContent() { + return sqlContent; + } + + public ImmutableSet<ObserveBlobsContainer> getBlobsContainers() { + return blobsContainers; + } + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripResult.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripResult.java new file mode 100644 index 0000000..4edf781 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripResult.java @@ -0,0 +1,51 @@ +package fr.ird.observe.services.service.trip; + +/** + * Created on 27/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ImportTripResult { + + private final String programId; + private final String tripId; + + private final boolean imported; + private final boolean deleted; + + private final long deleteTime; + private final long importTime; + + public ImportTripResult(ImportTripRequest request, boolean imported, long importTime, boolean deleted, long deleteTime) { + this.programId = request.getProgramId(); + this.tripId = request.getTripId(); + this.imported = imported; + this.deleted = deleted; + this.importTime = importTime; + this.deleteTime = deleteTime; + } + + public String getProgramId() { + return programId; + } + + public String getTripId() { + return tripId; + } + + public boolean isDeleted() { + return deleted; + } + + public boolean isImported() { + return imported; + } + + public long getImportTime() { + return importTime; + } + + public long getDeleteTime() { + return deleteTime; + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripService.java deleted file mode 100644 index 5e4594a..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripService.java +++ /dev/null @@ -1,43 +0,0 @@ -package fr.ird.observe.services.service.trip; - -/*- - * #%L - * ObServe :: Services API - * %% - * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit - * %% - * 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 fr.ird.observe.services.ObserveService; -import fr.ird.observe.services.spi.PostRequest; -import fr.ird.observe.services.spi.Write; -import fr.ird.observe.services.spi.WriteDataPermission; - -/** - * Created on 20/07/16. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 5.0 - */ -public interface ImportTripService extends ObserveService { - - @WriteDataPermission - @PostRequest - @Write - ImportTripsResult importTrips(ImportTripsRequest importRequest); - -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripsRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripsRequest.java deleted file mode 100644 index 8671bd2..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripsRequest.java +++ /dev/null @@ -1,105 +0,0 @@ -package fr.ird.observe.services.service.trip; - -/*- - * #%L - * ObServe :: Services API - * %% - * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit - * %% - * 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.common.collect.ImmutableSet; -import fr.ird.observe.services.service.ObserveBlobsContainer; - -import java.util.Iterator; -import java.util.Objects; - -/** - * Created on 20/07/16. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ImportTripsRequest implements Iterable<ImportTripsRequest.ImportTripRequest> { - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - - private final ImmutableSet.Builder<ImportTripRequest> tripIds = ImmutableSet.builder(); - - public Builder addTripToImport(ImportTripRequest importTripRequest) { - tripIds.add(importTripRequest); - return this; - } - - public ImportTripsRequest build() { - return new ImportTripsRequest(tripIds.build()); - } - - } - - public static class ImportTripRequest { - - private final String tripId; - private final byte[] sqlContent; - private final ImmutableSet<ObserveBlobsContainer> blobsContainers; - - protected ImportTripRequest(String tripId, byte[] sqlContent, ImmutableSet<ObserveBlobsContainer> blobsContainers) { - this.tripId = tripId; - this.sqlContent = sqlContent; - this.blobsContainers = blobsContainers; - } - - public String getTripId() { - return tripId; - } - - public byte[] getSqlContent() { - return sqlContent; - } - - public ImmutableSet<ObserveBlobsContainer> getBlobsContainers() { - return blobsContainers; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ImportTripRequest that = (ImportTripRequest) o; - return Objects.equals(getTripId(), that.getTripId()); - } - - @Override - public int hashCode() { - return Objects.hash(getTripId()); - } - } - - private final ImmutableSet<ImportTripRequest> tripIds; - - @Override - public Iterator<ImportTripRequest> iterator() { - return tripIds.iterator(); - } - - private ImportTripsRequest(ImmutableSet<ImportTripRequest> tripIds) { - this.tripIds = tripIds; - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripsResult.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripsResult.java deleted file mode 100644 index 4bbe01d..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ImportTripsResult.java +++ /dev/null @@ -1,93 +0,0 @@ -package fr.ird.observe.services.service.trip; - -/*- - * #%L - * ObServe :: Services API - * %% - * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit - * %% - * 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.common.collect.ImmutableSet; - -import java.util.Iterator; - -/** - * Le résultat de l'export de plusieurs marées. - * - * Created on 20/07/16. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 5.0 - */ -public class ImportTripsResult implements Iterable<ImportTripsResult.ImportTripResult> { - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - - private final ImmutableSet.Builder<ImportTripResult> trips = ImmutableSet.builder(); - - public Builder addTripResult(String tripId, boolean deleted, long time) { - trips.add(new ImportTripResult(tripId, deleted, time)); - return this; - } - - public ImportTripsResult build() { - - return new ImportTripsResult(trips.build()); - } - - } - - public static class ImportTripResult { - - private final String tripId; - - private final boolean deleted; - - private final long time; - - public ImportTripResult(String tripId, boolean deleted, long time) { - this.tripId = tripId; - this.deleted = deleted; - this.time = time; - } - - public String getTripId() { - return tripId; - } - - public boolean isDeleted() { - return deleted; - } - - } - - private final ImmutableSet<ImportTripResult> trips; - - @Override - public Iterator<ImportTripResult> iterator() { - return trips.iterator(); - } - - private ImportTripsResult(ImmutableSet<ImportTripResult> trips) { - this.trips = trips; - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/TripManagementService.java similarity index 72% rename from observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripService.java rename to observe-services-api/src/main/java/fr/ird/observe/services/service/trip/TripManagementService.java index 3236cca..09a3981 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/ExportTripService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/trip/TripManagementService.java @@ -26,6 +26,8 @@ import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.spi.PostRequest; import fr.ird.observe.services.spi.ReadDataPermission; import fr.ird.observe.services.spi.ReadReferentialPermission; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.spi.WriteDataPermission; /** * Created on 20/07/16. @@ -33,11 +35,21 @@ import fr.ird.observe.services.spi.ReadReferentialPermission; * @author Tony Chemit - chemit@codelutin.com * @since 5.0 */ -public interface ExportTripService extends ObserveService { +public interface TripManagementService extends ObserveService { @ReadDataPermission @ReadReferentialPermission @PostRequest - ExportTripsResult exportTrips(ExportTripsRequest exportRequest); + ExportTripResult exportTrip(ExportTripRequest exportRequest); + + @WriteDataPermission + @PostRequest + @Write + DeleteTripResult deleteTrip(DeleteTripRequest request); + + @WriteDataPermission + @PostRequest + @Write + ImportTripResult importTrip(ImportTripRequest request); } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/data/DataSynchronizeServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/data/DataSynchronizeServiceTopia.java deleted file mode 100644 index a18483a..0000000 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/data/DataSynchronizeServiceTopia.java +++ /dev/null @@ -1,108 +0,0 @@ -package fr.ird.observe.services.service.actions.synchro.data; - -import com.google.common.collect.ImmutableSet; -import fr.ird.observe.entities.Entities; -import fr.ird.observe.services.ObserveServiceContextTopia; -import fr.ird.observe.services.ObserveServiceTopia; -import fr.ird.observe.services.service.AddSqlScriptProducerRequest; -import fr.ird.observe.services.service.DeleteSqlScriptProducerRequest; -import fr.ird.observe.services.service.SqlScriptProducerService; -import fr.ird.observe.services.service.actions.synchro.data.task.DataSynchronizeCopyTask; -import fr.ird.observe.services.service.actions.synchro.data.task.DataSynchronizeDeleteTask; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import java.util.Collection; -import java.util.LinkedHashSet; - -/** - * Created on 08/08/16. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 5.0 - */ -public class DataSynchronizeServiceTopia extends ObserveServiceTopia implements DataSynchronizeService { - - /** Logger. */ - private static final Log log = LogFactory.getLog(DataSynchronizeServiceTopia.class); - - protected SqlScriptProducerService sqlScriptProducerService; - - @Override - public void setServiceContext(ObserveServiceContextTopia serviceContext) { - super.setServiceContext(serviceContext); - sqlScriptProducerService = serviceContext.newService(SqlScriptProducerService.class); - } - - @Override - public byte[][] getCopySqlCodes(DataSynchronizeRequest request) { - - Collection<byte[]> sqlCodeBuilder = new LinkedHashSet<>(); - - for (DataSynchronizeCopyTask task : request.getCopyTasks()) { - - if (log.isInfoEnabled()) { - log.info("Obtain trip sql copy content: " + task.getProgramId() + " / " + task.getTripId()); - } - - // get the data content - - AddSqlScriptProducerRequest sqlRequest; - if (request.isOppositeH2()) { - sqlRequest = AddSqlScriptProducerRequest.forH2(); - } else { - sqlRequest = AddSqlScriptProducerRequest.forPostgres(); - } - sqlRequest.dataIdsToAdd(ImmutableSet.of(task.getTripId())); - byte[] sqlScript = sqlScriptProducerService.produceAddSqlScript(sqlRequest).getSqlCode(); - - sqlCodeBuilder.add(sqlScript); - - } - - return sqlCodeBuilder.toArray(new byte[sqlCodeBuilder.size()][]); - - } - - @Override - public byte[][] getDeleteSqlCodes(DataSynchronizeRequest request) { - - Collection<byte[]> sqlCodeBuilder = new LinkedHashSet<>(); - for (DataSynchronizeDeleteTask task : request.getDeleteTasks()) { - - String tripId = task.getTripId(); - boolean longlineId = Entities.isLonglineId(tripId); - - if (log.isInfoEnabled()) { - log.info("Obtain trip sql delete content: " + task.getProgramId() + " / " + task.getTripId()); - } - - // get the data content - - DeleteSqlScriptProducerRequest sqlRequest; - if (request.isH2()) { - sqlRequest = DeleteSqlScriptProducerRequest.forH2(); - } else { - sqlRequest = DeleteSqlScriptProducerRequest.forPostgres(); - } - sqlRequest.dataIdsToDelete(ImmutableSet.of(task.getTripId())); - byte[] sqlScript = sqlScriptProducerService.produceDeleteSqlScript(sqlRequest); - - sqlCodeBuilder.add(sqlScript); - - } - - return sqlCodeBuilder.toArray(new byte[sqlCodeBuilder.size()][]); - } - - @Override - public void executeRequest(byte[][] copySqlCodes, byte[][] deleteSqlCodes) { - - byte[][] sqlCodes = new byte[copySqlCodes.length + deleteSqlCodes.length][]; - System.arraycopy(copySqlCodes, 0, sqlCodes, 0, copySqlCodes.length); - System.arraycopy(deleteSqlCodes, 0, sqlCodes, copySqlCodes.length, deleteSqlCodes.length); - - serviceContext.getTopiaPersistenceContext().executeSqlScripts(sqlCodes); - - } -} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/trip/ExportTripServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/trip/ExportTripServiceTopia.java deleted file mode 100644 index f631993..0000000 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/trip/ExportTripServiceTopia.java +++ /dev/null @@ -1,77 +0,0 @@ -package fr.ird.observe.services.service.trip; - -/*- - * #%L - * ObServe :: Services ToPIA Implementation - * %% - * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit - * %% - * 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.common.collect.ImmutableSet; -import fr.ird.observe.services.ObserveServiceTopia; -import fr.ird.observe.services.service.AddSqlScriptProducerRequest; -import fr.ird.observe.services.service.AddSqlScriptProducerResult; -import fr.ird.observe.services.service.ObserveBlobsContainer; -import fr.ird.observe.services.service.SqlScriptProducerService; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * Created on 20/07/16. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 5.0 - */ -public class ExportTripServiceTopia extends ObserveServiceTopia implements ExportTripService { - - /** Logger. */ - private static final Log log = LogFactory.getLog(ExportTripServiceTopia.class); - - @Override - public ExportTripsResult exportTrips(ExportTripsRequest exportRequest) { - - SqlScriptProducerService sqlScriptProducerService = serviceContext.newService(SqlScriptProducerService.class); - - ExportTripsResult.ExportTripsRequestBuilder resultBuilder = ExportTripsResult.builder(); - - for (ExportTripsRequest.ExportTripRequest exportTripRequest : exportRequest) { - - long t0 = System.nanoTime(); - - String tripId = exportTripRequest.getTripId(); - - if (log.isInfoEnabled()) { - log.info("Start export of trip: " + tripId); - } - - AddSqlScriptProducerRequest request = AddSqlScriptProducerRequest.forPostgres().dataIdsToAdd(ImmutableSet.of(tripId)); - - AddSqlScriptProducerResult producerResult = sqlScriptProducerService.produceAddSqlScript(request); - byte[] tripContent = producerResult.getSqlCode(); - ImmutableSet<ObserveBlobsContainer> blobsContainers = producerResult.getBlobsContainers(); - - long time = System.nanoTime() - t0; - resultBuilder.addTripToReplicate(exportTripRequest, tripContent, blobsContainers, time); - - } - - return resultBuilder.build(); - - } - -} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/trip/ImportTripServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/trip/ImportTripServiceTopia.java deleted file mode 100644 index fcb1172..0000000 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/trip/ImportTripServiceTopia.java +++ /dev/null @@ -1,121 +0,0 @@ -package fr.ird.observe.services.service.trip; - -/*- - * #%L - * ObServe :: Services ToPIA Implementation - * %% - * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit - * %% - * 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.common.collect.ImmutableSet; -import fr.ird.observe.ObserveTopiaPersistenceContext; -import fr.ird.observe.services.ObserveServiceTopia; -import fr.ird.observe.services.dto.IdDtos; -import fr.ird.observe.services.service.ObserveBlobsContainer; -import fr.ird.observe.services.service.longline.TripLonglineService; -import fr.ird.observe.services.service.seine.TripSeineService; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * Created on 20/07/16. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 5.0 - */ -public class ImportTripServiceTopia extends ObserveServiceTopia implements ImportTripService { - - /** Logger. */ - private static final Log log = LogFactory.getLog(ImportTripServiceTopia.class); - - @Override - public ImportTripsResult importTrips(ImportTripsRequest importTripsRequest) { - - TripSeineService tripSeineService = serviceContext.newService(TripSeineService.class); - TripLonglineService tripLonglineService = serviceContext.newService(TripLonglineService.class); - - ImportTripsResult.Builder resultBuilder = ImportTripsResult.builder(); - - try (ObserveTopiaPersistenceContext persistenceContext = serviceContext.getTopiaApplicationContext().newPersistenceContext()) { - - for (ImportTripsRequest.ImportTripRequest importTripRequest : importTripsRequest) { - - String tripId = importTripRequest.getTripId(); - - if (log.isInfoEnabled()) { - log.info("Start import of trip: " + tripId); - } - - long t0 = System.nanoTime(); - - // check if trip exist - - boolean deleteBeforeImport; - - if (IdDtos.isTripSeineId(tripId)) { - - deleteBeforeImport = tripSeineService.exists(tripId); - - if (deleteBeforeImport) { - - //FIXME Do not use this, prefer usage of topai SqlBatchService - tripSeineService.delete(tripId); - - } - - } else if (IdDtos.isTripLonglineId(tripId)) { - - deleteBeforeImport = tripLonglineService.exists(tripId); - - if (deleteBeforeImport) { - - //FIXME Do not use this, prefer usage of topai SqlBatchService - tripLonglineService.delete(tripId); - - } - - } else { - throw new IllegalStateException("Can't come here!"); - } - - ImmutableSet<ObserveBlobsContainer> blobsContainers = importTripRequest.getBlobsContainers(); - - if (blobsContainers.isEmpty()) { - - persistenceContext.executeSqlScript(importTripRequest.getSqlContent()); - - } else { - - persistenceContext.getSqlSupport().doSqlWork(new ImportTripScriptTopiaSqlWork(1000, importTripRequest.getSqlContent(), blobsContainers)); - - } - - long time = System.nanoTime() - t0; - resultBuilder.addTripResult(tripId, deleteBeforeImport, time); - - } - - persistenceContext.commit(); - - } - - return resultBuilder.build(); - - } - -} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/trip/TripManagementServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/trip/TripManagementServiceTopia.java new file mode 100644 index 0000000..6bc4d99 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/trip/TripManagementServiceTopia.java @@ -0,0 +1,207 @@ +package fr.ird.observe.services.service.trip; + +/*- + * #%L + * ObServe :: Services ToPIA Implementation + * %% + * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit + * %% + * 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.common.collect.ImmutableSet; +import fr.ird.observe.ObserveTopiaPersistenceContext; +import fr.ird.observe.services.ObserveServiceContextTopia; +import fr.ird.observe.services.ObserveServiceTopia; +import fr.ird.observe.services.dto.IdDtos; +import fr.ird.observe.services.service.AddSqlScriptProducerRequest; +import fr.ird.observe.services.service.AddSqlScriptProducerResult; +import fr.ird.observe.services.service.DeleteSqlScriptProducerRequest; +import fr.ird.observe.services.service.ObserveBlobsContainer; +import fr.ird.observe.services.service.SqlScriptProducerService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.StringUtil; + +import java.util.Set; +import java.util.TreeSet; + +/** + * Created on 20/07/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class TripManagementServiceTopia extends ObserveServiceTopia implements TripManagementService { + + /** Logger. */ + private static final Log log = LogFactory.getLog(TripManagementServiceTopia.class); + + private SqlScriptProducerService sqlScriptProducerService; + + @Override + public void setServiceContext(ObserveServiceContextTopia serviceContext) { + super.setServiceContext(serviceContext); + sqlScriptProducerService = serviceContext.newService(SqlScriptProducerService.class); + } + + @Override + public ExportTripResult exportTrip(ExportTripRequest exportRequest) { + + SqlScriptProducerService sqlScriptProducerService = serviceContext.newService(SqlScriptProducerService.class); + + long t0 = System.nanoTime(); + + String tripId = exportRequest.getTripId(); + + if (log.isInfoEnabled()) { + log.info("Start export of trip: " + tripId); + } + + //FIXME Get real database type + AddSqlScriptProducerRequest request = AddSqlScriptProducerRequest.forPostgres().dataIdsToAdd(ImmutableSet.of(tripId)); + + AddSqlScriptProducerResult producerResult = sqlScriptProducerService.produceAddSqlScript(request); + byte[] tripContent = producerResult.getSqlCode(); + ImmutableSet<ObserveBlobsContainer> blobsContainers = producerResult.getBlobsContainers(); + + long time = System.nanoTime() - t0; + + return new ExportTripResult(exportRequest, tripContent, blobsContainers, time); + + } + + @Override + public DeleteTripResult deleteTrip(DeleteTripRequest request) { + + try (ObserveTopiaPersistenceContext persistenceContext = serviceContext.getTopiaApplicationContext().newPersistenceContext()) { + + Set<String> tripSeineIds = new TreeSet<>(persistenceContext.getTripSeineDao().findAllIds()); + Set<String> tripLonglineIds = new TreeSet<>(persistenceContext.getTripLonglineDao().findAllIds()); + + String tripId = request.getTripId(); + + long t0 = System.nanoTime(); + + boolean deleted = deleteTrip(persistenceContext, tripId, tripSeineIds, tripLonglineIds); + + if (deleted) { + + long time = System.nanoTime() - t0; + if (log.isInfoEnabled()) { + log.info("Delete of trip: " + tripId + " done in " + StringUtil.convertTime(time)); + } + + return new DeleteTripResult(request, time); + + } + + } + + return null; + + } + + @Override + public ImportTripResult importTrip(ImportTripRequest request) { + + try (ObserveTopiaPersistenceContext persistenceContext = serviceContext.getTopiaApplicationContext().newPersistenceContext()) { + + Set<String> tripSeineIds = new TreeSet<>(persistenceContext.getTripSeineDao().findAllIds()); + Set<String> tripLonglineIds = new TreeSet<>(persistenceContext.getTripLonglineDao().findAllIds()); + + String tripId = request.getTripId(); + + long t0 = System.nanoTime(); + + boolean deleted = deleteTrip(persistenceContext, tripId, tripSeineIds, tripLonglineIds); + + long t1 = System.nanoTime(); + + long deleteTime = 0; + if (deleted) { + + deleteTime = System.nanoTime() - t0; + if (log.isInfoEnabled()) { + log.info("Delete of trip: " + tripId + " done in " + StringUtil.convertTime(deleteTime)); + } + + } + + if (log.isInfoEnabled()) { + log.info("Start import of trip: " + request.getTripId()); + } + + ImmutableSet<ObserveBlobsContainer> blobsContainers = request.getBlobsContainers(); + + if (blobsContainers.isEmpty()) { + + persistenceContext.executeSqlScript(request.getSqlContent()); + + } else { + + persistenceContext.getSqlSupport().doSqlWork(new ImportTripScriptTopiaSqlWork(1000, request.getSqlContent(), blobsContainers)); + + } + + long t2 = System.nanoTime(); + + if (log.isInfoEnabled()) { + log.info("Import of trip: " + tripId + " done in " + StringUtil.convertTime(t1, t2)); + } + + return new ImportTripResult(request, true, t1 - t0, deleted, deleteTime); + + } + + } + + private boolean deleteTrip(ObserveTopiaPersistenceContext persistenceContext, String tripId, Set<String> tripSeineIds, Set<String> tripLonglineIds) { + + long t0 = System.nanoTime(); + + boolean isTripSeineId = IdDtos.isTripSeineId(tripId); + boolean deleted = (isTripSeineId && tripSeineIds.contains(tripId)) || tripLonglineIds.contains(tripId); + + if (deleted) { + + if (log.isInfoEnabled()) { + log.info("Start delete of trip: " + tripId); + } + + DeleteSqlScriptProducerRequest sqlRequest = DeleteSqlScriptProducerRequest.builder() + .dataIdsToDelete(ImmutableSet.of(tripId)); + byte[] sqlScript = sqlScriptProducerService.produceDeleteSqlScript(sqlRequest); + + persistenceContext.executeSqlScript(sqlScript); + + if (log.isInfoEnabled()) { + log.info("Delete of trip: " + tripId + " done in " + StringUtil.convertTime(t0, System.nanoTime())); + } + + if (isTripSeineId) { + tripSeineIds.remove(tripId); + } else { + tripLonglineIds.remove(tripId); + } + + } + + return deleted; + + } + +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.