Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 07bb1e0c by Tony Chemit at 2024-04-23T10:00:21+02:00 Amélioration de la gestion des services non connectés (See ultreiaio/http#65) - - - - - f4c3d2fe by Tony Chemit at 2024-04-23T12:31:36+02:00 Improve ObserveSwingDataSource.doOpenSource method and remove AdminTabUIActionSupport.openSource one - - - - - c9be7d77 by Tony Chemit at 2024-04-23T12:32:12+02:00 On OneSideSqlResult, improve generated sql code (always trim any statement and add a new line) - - - - - 091c11eb by Tony Chemit at 2024-04-23T12:32:33+02:00 Immrove BothSidesSqlRequestBuilder code - - - - - 7a81eb84 by Tony Chemit at 2024-04-23T12:33:31+02:00 Improve SynchronizeEngine and UnidirectionalSynchronizeEngine code - - - - - 61d55ad5 by Tony Chemit at 2024-04-23T12:34:06+02:00 Clean Synchronize referential admin actions - - - - - 25 changed files: - client/core/src/main/java/fr/ird/observe/client/datasource/api/ObserveSwingDataSource.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminActionModel.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/actions/AdminTabUIActionSupport.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/consolidate/actions/Start.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/export/actions/Start.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/pairing/actions/Prepare.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/pairing/actions/Start.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/actions/Apply.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/legacy/SynchronizeModel.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/legacy/actions/Apply.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/legacy/actions/Start.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/legacy/actions/SynchroUIActionSupport.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchroModel.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/actions/Apply.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/actions/Start.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/task/SwingReferentialSynchronizeTask.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/validate/actions/Start.java - core/services/local/src/test/java/fr/ird/observe/services/local/service/referential/UnidirectionalResultIssue2208Test.java - core/services/local/src/test/java/fr/ird/observe/services/local/service/referential/UnidirectionalResultTest.java - server/core/src/main/java/fr/ird/observe/server/request/ObserveWebRequestContext.java - toolkit/api-services/src/main/java/fr/ird/observe/services/service/referential/SynchronizeEngine.java - toolkit/api-services/src/main/java/fr/ird/observe/services/service/referential/UnidirectionalSynchronizeEngine.java - toolkit/api-services/src/main/java/fr/ird/observe/services/service/referential/synchro/BothSidesSqlRequestBuilder.java - toolkit/api-services/src/main/java/fr/ird/observe/services/service/referential/synchro/OneSideSqlResult.java - toolkit/api-services/src/main/java/fr/ird/observe/services/service/referential/synchro/SynchronizeTaskType.java Changes: ===================================== client/core/src/main/java/fr/ird/observe/client/datasource/api/ObserveSwingDataSource.java ===================================== @@ -141,16 +141,18 @@ public class ObserveSwingDataSource extends AbstractJavaBean implements ObserveS } } - public static void doOpenSource(ObserveSwingDataSource source) { + public static ObserveSwingDataSource doOpenSource(ObserveSwingDataSource source) { if (source != null && !source.isOpen()) { try { source.open(); + return source; } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new IllegalStateException(e); } } + return source; } public ObserveSwingDataSource(ClientConfig config, ObserveServiceMainFactory serviceFactory, DecoratorService decoratorService, ObserveDataSourceConfiguration configuration) { ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminActionModel.java ===================================== @@ -108,12 +108,11 @@ public abstract class AdminActionModel extends WizardExtStepModel<AdminStep> imp } - public DifferentialModelBuilder newDifferentialModelBuilder(LeftOrRightContext<ObserveSwingDataSource> sources) { + protected DifferentialModelBuilder newDifferentialModelBuilder(LeftOrRightContext<ObserveSwingDataSource> sources) { return ReferentialService.createDifferentialModelBuilder(getClientConfig().getReferentialLocale().getLocale(), ObserveDifferentialMetaModel::get, sources.apply(ObserveServicesProvider::getReferentialService)); } - public SynchronizeEngine newReferentialSynchronizeEngine(LeftOrRightContext<ObserveSwingDataSource> sources) { + protected SynchronizeEngine newReferentialSynchronizeEngine(LeftOrRightContext<ObserveSwingDataSource> sources) { return new SynchronizeEngine(getClientConfig().getTemporaryDirectory().toPath(), sources.apply(ObserveSwingDataSource::getSynchronizeService)); } - } ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/actions/AdminTabUIActionSupport.java ===================================== @@ -26,12 +26,6 @@ import fr.ird.observe.client.WithClientUIContextApi; import fr.ird.observe.client.datasource.actions.AdminActionWorker; import fr.ird.observe.client.datasource.actions.AdminTabUI; import fr.ird.observe.client.datasource.actions.AdminUI; -import fr.ird.observe.client.datasource.api.ObserveSwingDataSource; -import fr.ird.observe.datasource.security.BabModelVersionException; -import fr.ird.observe.datasource.security.DataSourceCreateWithNoReferentialImportException; -import fr.ird.observe.datasource.security.DatabaseConnexionNotAuthorizedException; -import fr.ird.observe.datasource.security.DatabaseNotFoundException; -import fr.ird.observe.datasource.security.IncompatibleDataSourceCreateConfigurationException; import fr.ird.observe.dto.ProgressionModel; import io.ultreia.java4all.lang.Strings; import io.ultreia.java4all.util.TimeLog; @@ -107,13 +101,6 @@ public abstract class AdminTabUIActionSupport<U extends AdminTabUI> extends JCom return ui.getContextValue(AdminUI.class, "parent"); } - protected ObserveSwingDataSource openSource(ObserveSwingDataSource service) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, BabModelVersionException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { - if (!service.isOpen()) { - service.open(); - } - return service; - } - public void addMessage(String text) { JTextArea progression = ui.getProgression(); progression.append(text + "\n"); ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/consolidate/actions/Start.java ===================================== @@ -31,11 +31,6 @@ import fr.ird.observe.consolidation.AtomicConsolidateAction; import fr.ird.observe.consolidation.data.ps.common.TripConsolidateRequest; import fr.ird.observe.consolidation.data.ps.common.TripConsolidateResult; import fr.ird.observe.consolidation.data.ps.dcp.SimplifiedObjectTypeSpecializedRules; -import fr.ird.observe.datasource.security.BabModelVersionException; -import fr.ird.observe.datasource.security.DataSourceCreateWithNoReferentialImportException; -import fr.ird.observe.datasource.security.DatabaseConnexionNotAuthorizedException; -import fr.ird.observe.datasource.security.DatabaseNotFoundException; -import fr.ird.observe.datasource.security.IncompatibleDataSourceCreateConfigurationException; import fr.ird.observe.dto.BusinessDto; import fr.ird.observe.dto.ObserveUtil; import fr.ird.observe.dto.ProgressionModel; @@ -86,7 +81,7 @@ public class Start extends AdminTabUIActionSupport<ConsolidateUI> { addAdminWorker(ui.getStart().getToolTipText(), this::doAction); } - private WizardState doAction() throws BabModelVersionException, DataSourceCreateWithNoReferentialImportException, DatabaseNotFoundException, IncompatibleDataSourceCreateConfigurationException, DatabaseConnexionNotAuthorizedException { + private WizardState doAction() { log.debug(this); @@ -102,7 +97,7 @@ public class Start extends AdminTabUIActionSupport<ConsolidateUI> { int stepCount = tripIds.size() + 3; long t000 = TimeLog.getTime(); ProgressionModel progressModel = stepModel.initProgressModel(stepCount); - try (ObserveSwingDataSource dataSource = openSource(stepModel.getSource())) { + try (ObserveSwingDataSource dataSource = ObserveSwingDataSource.doOpenSource(stepModel.getSource())) { progressModel.increments(); ConsolidateDataService consolidateDataService = dataSource.getPsConsolidateDataService(); ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/export/actions/Start.java ===================================== @@ -59,7 +59,7 @@ public class Start extends ExportUIActionSupport { addAdminWorker(ui.getStart().getToolTipText(), this::doStartAction); } - private WizardState doStartAction() throws Exception { + private WizardState doStartAction() { AdminUIModel model = ui.getModel(); ExportModel stepModel = model.getExportModel(); @@ -71,9 +71,9 @@ public class Start extends ExportUIActionSupport { long t00 = TimeLog.getTime(); int stepCount = 4 + tasks.stream().mapToInt(CopyDataTask::stepCount).sum(); ProgressionModel progressModel = stepModel.initProgressModel(stepCount); - try (ObserveSwingDataSource localDataSource = openSource(stepModel.getSource())) { + try (ObserveSwingDataSource localDataSource = ObserveSwingDataSource.doOpenSource(stepModel.getSource())) { progressModel.increments(); - try (ObserveSwingDataSource centralDataSource = openSource(stepModel.getCentralSource())) { + try (ObserveSwingDataSource centralDataSource = ObserveSwingDataSource.doOpenSource(stepModel.getCentralSource())) { progressModel.increments(); DataManager dataManager = new DataManager(progressModel, localDataSource, centralDataSource); dataManager.consume(tasks); ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/pairing/actions/Prepare.java ===================================== @@ -27,11 +27,6 @@ import fr.ird.observe.client.datasource.actions.config.SelectDataModel; import fr.ird.observe.client.datasource.actions.pairing.ActivityPairingModel; import fr.ird.observe.client.datasource.actions.pairing.ActivityPairingUI; import fr.ird.observe.client.datasource.api.ObserveSwingDataSource; -import fr.ird.observe.datasource.security.BabModelVersionException; -import fr.ird.observe.datasource.security.DataSourceCreateWithNoReferentialImportException; -import fr.ird.observe.datasource.security.DatabaseConnexionNotAuthorizedException; -import fr.ird.observe.datasource.security.DatabaseNotFoundException; -import fr.ird.observe.datasource.security.IncompatibleDataSourceCreateConfigurationException; import fr.ird.observe.dto.ProgressionModel; import fr.ird.observe.dto.ToolkitIdLabel; import io.ultreia.java4all.util.TimeLog; @@ -67,7 +62,7 @@ public class Prepare extends ActivityPairingUIActionSupport { addAdminWorker(ui.getPrepare().getToolTipText(), this::doPrepareAction0); } - private WizardState doPrepareAction0() throws BabModelVersionException, DataSourceCreateWithNoReferentialImportException, DatabaseNotFoundException, IncompatibleDataSourceCreateConfigurationException, DatabaseConnexionNotAuthorizedException { + private WizardState doPrepareAction0() { log.debug(this); long t00 = TimeLog.getTime(); ActivityPairingModel stepModel = ui.getStepModel(); @@ -79,7 +74,7 @@ public class Prepare extends ActivityPairingUIActionSupport { int stepCount = 3 + selectedDataByProgram.values().stream().mapToInt(Collection::size).sum(); ProgressionModel progressModel = stepModel.initProgressModel(stepCount); - try (ObserveSwingDataSource source = openSource(stepModel.getSource())) { + try (ObserveSwingDataSource source = ObserveSwingDataSource.doOpenSource(stepModel.getSource())) { progressModel.increments(); String modelType = selectDataModel.getTreeConfig().getModuleName(); switch (modelType) { ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/pairing/actions/Start.java ===================================== @@ -26,11 +26,6 @@ import fr.ird.observe.client.datasource.actions.pairing.ActivityPairingModel; import fr.ird.observe.client.datasource.actions.pairing.ActivityPairingUI; import fr.ird.observe.client.datasource.actions.pairing.tree.PairingTreeTableModelSupport; import fr.ird.observe.client.datasource.api.ObserveSwingDataSource; -import fr.ird.observe.datasource.security.BabModelVersionException; -import fr.ird.observe.datasource.security.DataSourceCreateWithNoReferentialImportException; -import fr.ird.observe.datasource.security.DatabaseConnexionNotAuthorizedException; -import fr.ird.observe.datasource.security.DatabaseNotFoundException; -import fr.ird.observe.datasource.security.IncompatibleDataSourceCreateConfigurationException; import fr.ird.observe.dto.ProgressionModel; import fr.ird.observe.dto.data.pairing.ApplyPairingRequest; import fr.ird.observe.services.service.data.ActivityPairingService; @@ -66,7 +61,7 @@ public class Start extends ActivityPairingUIActionSupport { addAdminWorker(ui.getStart().getToolTipText(), this::doStartAction0); } - private WizardState doStartAction0() throws BabModelVersionException, DataSourceCreateWithNoReferentialImportException, DatabaseNotFoundException, IncompatibleDataSourceCreateConfigurationException, DatabaseConnexionNotAuthorizedException { + private WizardState doStartAction0() { log.debug(this); long t00 = TimeLog.getTime(); int stepCount = 3; @@ -76,7 +71,7 @@ public class Start extends ActivityPairingUIActionSupport { ProgressionModel progressModel = stepModel.initProgressModel(stepCount); - try (ObserveSwingDataSource dataSource = openSource(stepModel.getSource())) { + try (ObserveSwingDataSource dataSource = ObserveSwingDataSource.doOpenSource(stepModel.getSource())) { progressModel.increments(); ActivityPairingService<?, ?, ?> service = treeTableModel.getService(dataSource); service.applyPairing(request); ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/actions/Apply.java ===================================== @@ -32,20 +32,13 @@ import fr.ird.observe.client.datasource.api.data.DataTaskSupport; import fr.ird.observe.client.datasource.api.data.InsertMissingReferentialTask; import fr.ird.observe.client.datasource.api.data.TaskSide; import fr.ird.observe.client.datasource.api.data.UserCancelException; -import fr.ird.observe.datasource.security.BabModelVersionException; -import fr.ird.observe.datasource.security.DataSourceCreateWithNoReferentialImportException; -import fr.ird.observe.datasource.security.DatabaseConnexionNotAuthorizedException; -import fr.ird.observe.datasource.security.DatabaseNotFoundException; -import fr.ird.observe.datasource.security.IncompatibleDataSourceCreateConfigurationException; import fr.ird.observe.dto.ProgressionModel; import fr.ird.observe.dto.data.RootOpenableDto; -import io.ultreia.java4all.lang.Strings; import io.ultreia.java4all.util.TimeLog; import org.nuiton.jaxx.runtime.swing.wizard.ext.WizardState; import javax.swing.DefaultListModel; import java.awt.event.ActionEvent; -import java.util.Date; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.LinkedList; @@ -71,7 +64,7 @@ public class Apply extends DataSynchroUIActionSupport { addAdminWorker(getUi().getStart().getToolTipText(), this::doApply); } - private WizardState doApply() throws BabModelVersionException, DataSourceCreateWithNoReferentialImportException, DatabaseNotFoundException, IncompatibleDataSourceCreateConfigurationException, DatabaseConnexionNotAuthorizedException { + private WizardState doApply() { DataSynchroModel stepModel = ui.getStepModel(); DataSelectionTreePaneModel leftModel = stepModel.onSameSide(TaskSide.FROM_LEFT); @@ -108,15 +101,13 @@ public class Apply extends DataSynchroUIActionSupport { ProgressionModel progressModel = stepModel.initProgressModel(stepCount); WizardState state; - try (ObserveSwingDataSource leftSource = openSource(leftModel.getSource())) { + try (ObserveSwingDataSource leftSource = ObserveSwingDataSource.doOpenSource(leftModel.getSource())) { progressModel.increments(); - try (ObserveSwingDataSource rightSource = openSource(stepModel.onOppositeSide(TaskSide.FROM_LEFT).getSource())) { - long t00 = TimeLog.getTime(); + try (ObserveSwingDataSource rightSource = ObserveSwingDataSource.doOpenSource(stepModel.onOppositeSide(TaskSide.FROM_LEFT).getSource())) { progressModel.increments(); try { DataManager dataManager = new DataManager(progressModel, leftSource, rightSource); dataManager.consume(finalTasksToConsume); - sendMessage(t("observe.ui.datasource.editor.actions.operation.message.done", new Date(), Strings.convertTime(TimeLog.getTime() - t00))); state = WizardState.SUCCESSED; } catch (Exception e) { if (e instanceof UserCancelException) { ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/legacy/SynchronizeModel.java ===================================== @@ -68,7 +68,6 @@ public class SynchronizeModel extends AdminActionModel { * Result of synchronization. */ private UnidirectionalResult referentialSynchronizeResult; - private UnidirectionalSynchronizeEngine engine; private UnidirectionalSynchronizeContext referentialSynchronizeContext; private UnidirectionalCallbackResults referentialSynchronizeCallbackResults; @@ -109,9 +108,9 @@ public class SynchronizeModel extends AdminActionModel { obsoleteReferences.clear(); referentialSynchronizeCallbackResults = null; referentialSynchronizeResult = null; + sources.accept(ObserveSwingDataSource::doCloseSource); centralSource = null; source = null; - engine = null; referentialSynchronizeContext = null; } @@ -140,12 +139,12 @@ public class SynchronizeModel extends AdminActionModel { } public UnidirectionalSynchronizeEngine newEngine() { - if (engine == null) { - DifferentialModelBuilder diffsEngine = newDifferentialModelBuilder(sources); - SynchronizeEngine synchronizeEngine = newReferentialSynchronizeEngine(sources); - engine = new UnidirectionalSynchronizeEngine(diffsEngine, synchronizeEngine); - } - return engine; + SynchronizeEngine synchronizeEngine = newReferentialSynchronizeEngine(sources); + return new UnidirectionalSynchronizeEngine(synchronizeEngine); + } + + public DifferentialModelBuilder newDifferentialModelBuilder() { + return newDifferentialModelBuilder(sources); } public UnidirectionalSynchronizeContext getReferentialSynchronizeContext() { ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/legacy/actions/Apply.java ===================================== @@ -22,23 +22,26 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.legacy. * #L% */ +import fr.ird.observe.client.datasource.actions.AdminStep; import fr.ird.observe.client.datasource.actions.synchronize.referential.legacy.ObsoleteReferentialReference; import fr.ird.observe.client.datasource.actions.synchronize.referential.legacy.SynchronizeModel; import fr.ird.observe.client.datasource.actions.synchronize.referential.legacy.SynchronizeUI; import fr.ird.observe.client.datasource.api.ObserveSwingDataSource; -import fr.ird.observe.datasource.security.BabModelVersionException; -import fr.ird.observe.datasource.security.DataSourceCreateWithNoReferentialImportException; -import fr.ird.observe.datasource.security.DatabaseConnexionNotAuthorizedException; -import fr.ird.observe.datasource.security.DatabaseNotFoundException; -import fr.ird.observe.datasource.security.IncompatibleDataSourceCreateConfigurationException; +import fr.ird.observe.dto.I18nDecoratorHelper; import fr.ird.observe.dto.ToolkitIdLabel; import fr.ird.observe.dto.referential.ReferentialDto; +import fr.ird.observe.services.service.referential.UnidirectionalSynchronizeContext; import fr.ird.observe.services.service.referential.UnidirectionalSynchronizeEngine; import fr.ird.observe.services.service.referential.synchro.UnidirectionalCallbackResults; +import fr.ird.observe.services.service.referential.synchro.UnidirectionalResult; import io.ultreia.java4all.jaxx.widgets.combobox.FilterableComboBox; +import io.ultreia.java4all.util.LeftOrRightContext; +import io.ultreia.java4all.util.TimeLog; import org.nuiton.jaxx.runtime.swing.wizard.ext.WizardState; import java.awt.event.ActionEvent; +import java.util.Collection; +import java.util.List; import static io.ultreia.java4all.i18n.I18n.t; @@ -53,9 +56,9 @@ public class Apply extends SynchroUIActionSupport { resolveObsoleteReference(); } - public <D extends ReferentialDto> void resolveObsoleteReference() { + private <D extends ReferentialDto> void resolveObsoleteReference() { - @SuppressWarnings({"unchecked", "rawtypes"}) ObsoleteReferentialReference<D> obsoleteRef = (ObsoleteReferentialReference) ui.getObsoleteReferencesList().getSelectedValue(); + @SuppressWarnings("unchecked") ObsoleteReferentialReference<D> obsoleteRef = (ObsoleteReferentialReference<D>) ui.getObsoleteReferencesList().getSelectedValue(); FilterableComboBox<ToolkitIdLabel> safeComboBox = ui.getHandler().getSafeComboBox(); ToolkitIdLabel safeRef = safeComboBox.getModel().getSelectedItem(); @@ -73,18 +76,75 @@ public class Apply extends SynchroUIActionSupport { // S'il ne reste plus de référentiel à corriger, on peut terminer le traitement if (stepModel.getObsoleteReferences().isEmpty()) { - try (ObserveSwingDataSource source = openSource(stepModel.getSource())) { - try (ObserveSwingDataSource centralSource = openSource(stepModel.getCentralSource())) { + try (ObserveSwingDataSource source = ObserveSwingDataSource.doOpenSource(stepModel.getSource())) { + + try (ObserveSwingDataSource centralSource = ObserveSwingDataSource.doOpenSource(stepModel.getCentralSource())) { UnidirectionalSynchronizeEngine engine = stepModel.newEngine(); beforeSuccess(engine); ui.getModel().setStepState(WizardState.SUCCESSED); } - } catch (BabModelVersionException | DatabaseConnexionNotAuthorizedException | - IncompatibleDataSourceCreateConfigurationException | DatabaseNotFoundException | - DataSourceCreateWithNoReferentialImportException e) { - throw new RuntimeException(e); } } } + + + private void beforeSuccess(UnidirectionalSynchronizeEngine engine) { + SynchronizeModel stepModel = ui.getStepModel(); + + UnidirectionalSynchronizeContext referentialSynchronizeContext = stepModel.getReferentialSynchronizeContext(); + UnidirectionalCallbackResults referentialSynchronizeCallbackResults = stepModel.getReferentialSynchronizeCallbackResults(); + + UnidirectionalResult referentialSynchronizeResult = engine.prepareResult(referentialSynchronizeContext, referentialSynchronizeCallbackResults); + stepModel.setReferentialSynchronizeResult(referentialSynchronizeResult); + long t00 = TimeLog.getTime(); + if (referentialSynchronizeResult.isEmpty()) { + //Update lastUpdateDate anyway (See https://gitlab.com/ultreiaio/ird-observe/-/issues/2231) + sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.ref.is.updtodate")); + ui.getModel().getSaveLocalModel().addStepForSave(AdminStep.SYNCHRONIZE); + } else { + for (Class<? extends ReferentialDto> referentialName : referentialSynchronizeResult.getReferentialNames()) { + String referentialStr = t(I18nDecoratorHelper.getType(referentialName)); + Collection<String> referentialAdded = referentialSynchronizeResult.getReferentialAdded(referentialName); + if (referentialAdded != null && !referentialAdded.isEmpty()) { + sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.referentiel.was.added", referentialStr, referentialAdded.size())); + for (String id : referentialAdded) { + sendMessage(" - " + id); + } + } + Collection<String> referentialUpdated = referentialSynchronizeResult.getReferentialUpdated(referentialName); + if (referentialUpdated != null && !referentialUpdated.isEmpty()) { + sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.referentiel.was.modified", referentialStr, referentialUpdated.size())); + for (String id : referentialUpdated) { + sendMessage(" - " + id); + } + } + Collection<String> referentialReverted = referentialSynchronizeResult.getReferentialReverted(referentialName); + if (referentialReverted != null && !referentialReverted.isEmpty()) { + sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.referentiel.was.reverted", referentialStr, referentialReverted.size())); + for (String id : referentialReverted) { + sendMessage(" - " + id); + } + } + Collection<String> referentialRemoved = referentialSynchronizeResult.getReferentialRemoved(referentialName); + if (referentialRemoved != null && !referentialRemoved.isEmpty()) { + sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.referentiel.was.removed", referentialStr, referentialRemoved.size())); + for (String id : referentialRemoved) { + sendMessage(" - " + id); + } + } + List<LeftOrRightContext<String>> referentialReplaced = referentialSynchronizeResult.getReferentialReplaced(referentialName); + if (referentialReplaced != null && !referentialReplaced.isEmpty()) { + sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.referentiel.was.replaced", referentialStr, referentialReplaced.size())); + for (LeftOrRightContext<String> ids : referentialReplaced) { + sendMessage(" - " + ids.left() + " → " + ids.right()); + } + } + } + sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.script.path", referentialSynchronizeContext.getSqlScriptPath())); + + ui.getModel().getSaveLocalModel().addStepForSave(AdminStep.SYNCHRONIZE); + } + onEndAction(t00, -1, null); + } } ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/legacy/actions/Start.java ===================================== @@ -22,6 +22,7 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.legacy. * #L% */ +import fr.ird.observe.client.datasource.actions.AdminStep; import fr.ird.observe.client.datasource.actions.synchronize.referential.legacy.ObsoleteReferentialReference; import fr.ird.observe.client.datasource.actions.synchronize.referential.legacy.SynchronizeModel; import fr.ird.observe.client.datasource.actions.synchronize.referential.legacy.SynchronizeUI; @@ -67,7 +68,7 @@ public class Start extends SynchroUIActionSupport { addAdminWorker(getUi().getStart().getToolTipText(), this::doStartAction0); } - private WizardState doStartAction0() throws Exception { + private WizardState doStartAction0() { log.debug(this); @@ -88,7 +89,7 @@ public class Start extends SynchroUIActionSupport { UnidirectionalSynchronizeEngine engine = stepModel.newEngine(); - UnidirectionalSynchronizeContext context = engine.prepareContext(progressionModel); + UnidirectionalSynchronizeContext context = engine.prepareContext(stepModel.newDifferentialModelBuilder(), progressionModel); stepModel.setReferentialSynchronizeContext(context); boolean needCallback = context.isNeedCallback(); if (needCallback) { @@ -112,11 +113,14 @@ public class Start extends SynchroUIActionSupport { // need user fix on obsolete references return WizardState.NEED_FIX; } - // pas de reference obsolete à traiter - // on termine le traitement - beforeSuccess(engine); } } + // pas de reference obsolete à traiter + // on termine le traitement + //Update lastUpdateDate anyway (See https://gitlab.com/ultreiaio/ird-observe/-/issues/2231) + sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.ref.is.updtodate")); + + ui.getModel().getSaveLocalModel().addStepForSave(AdminStep.SYNCHRONIZE); return WizardState.SUCCESSED; } ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/legacy/actions/SynchroUIActionSupport.java ===================================== @@ -22,23 +22,8 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.legacy. * #L% */ -import fr.ird.observe.client.datasource.actions.AdminStep; import fr.ird.observe.client.datasource.actions.actions.AdminTabUIActionSupport; -import fr.ird.observe.client.datasource.actions.synchronize.referential.legacy.SynchronizeModel; import fr.ird.observe.client.datasource.actions.synchronize.referential.legacy.SynchronizeUI; -import fr.ird.observe.dto.I18nDecoratorHelper; -import fr.ird.observe.dto.referential.ReferentialDto; -import fr.ird.observe.services.service.referential.UnidirectionalSynchronizeContext; -import fr.ird.observe.services.service.referential.UnidirectionalSynchronizeEngine; -import fr.ird.observe.services.service.referential.synchro.UnidirectionalCallbackResults; -import fr.ird.observe.services.service.referential.synchro.UnidirectionalResult; -import io.ultreia.java4all.util.LeftOrRightContext; -import io.ultreia.java4all.util.TimeLog; - -import java.util.Collection; -import java.util.List; - -import static io.ultreia.java4all.i18n.I18n.t; public abstract class SynchroUIActionSupport extends AdminTabUIActionSupport<SynchronizeUI> { @@ -46,62 +31,4 @@ public abstract class SynchroUIActionSupport extends AdminTabUIActionSupport<Syn super(label, shortDescription, actionIcon, acceleratorKey); } - public void beforeSuccess(UnidirectionalSynchronizeEngine engine) { - SynchronizeModel stepModel = ui.getStepModel(); - - UnidirectionalSynchronizeContext referentialSynchronizeContext = stepModel.getReferentialSynchronizeContext(); - UnidirectionalCallbackResults referentialSynchronizeCallbackResults = stepModel.getReferentialSynchronizeCallbackResults(); - - UnidirectionalResult referentialSynchronizeResult = engine.prepareResult(referentialSynchronizeContext, referentialSynchronizeCallbackResults); - stepModel.setReferentialSynchronizeResult(referentialSynchronizeResult); - long t00 = TimeLog.getTime(); - if (referentialSynchronizeResult.isEmpty()) { - //Update lastUpdateDate anyway (See https://gitlab.com/ultreiaio/ird-observe/-/issues/2231) - sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.ref.is.updtodate")); - ui.getModel().getSaveLocalModel().addStepForSave(AdminStep.SYNCHRONIZE); - } else { - for (Class<? extends ReferentialDto> referentialName : referentialSynchronizeResult.getReferentialNames()) { - String referentialStr = t(I18nDecoratorHelper.getType(referentialName)); - Collection<String> referentialAdded = referentialSynchronizeResult.getReferentialAdded(referentialName); - if (referentialAdded != null && !referentialAdded.isEmpty()) { - sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.referentiel.was.added", referentialStr, referentialAdded.size())); - for (String id : referentialAdded) { - sendMessage(" - " + id); - } - } - Collection<String> referentialUpdated = referentialSynchronizeResult.getReferentialUpdated(referentialName); - if (referentialUpdated != null && !referentialUpdated.isEmpty()) { - sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.referentiel.was.modified", referentialStr, referentialUpdated.size())); - for (String id : referentialUpdated) { - sendMessage(" - " + id); - } - } - Collection<String> referentialReverted = referentialSynchronizeResult.getReferentialReverted(referentialName); - if (referentialReverted != null && !referentialReverted.isEmpty()) { - sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.referentiel.was.reverted", referentialStr, referentialReverted.size())); - for (String id : referentialReverted) { - sendMessage(" - " + id); - } - } - Collection<String> referentialRemoved = referentialSynchronizeResult.getReferentialRemoved(referentialName); - if (referentialRemoved != null && !referentialRemoved.isEmpty()) { - sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.referentiel.was.removed", referentialStr, referentialRemoved.size())); - for (String id : referentialRemoved) { - sendMessage(" - " + id); - } - } - List<LeftOrRightContext<String>> referentialReplaced = referentialSynchronizeResult.getReferentialReplaced(referentialName); - if (referentialReplaced != null && !referentialReplaced.isEmpty()) { - sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.referentiel.was.replaced", referentialStr, referentialReplaced.size())); - for (LeftOrRightContext<String> ids : referentialReplaced) { - sendMessage(" - " + ids.left() + " → " + ids.right()); - } - } - } - sendMessage(t("observe.ui.datasource.editor.actions.synchro.referential.message.script.path", referentialSynchronizeContext.getSqlScriptPath())); - - ui.getModel().getSaveLocalModel().addStepForSave(AdminStep.SYNCHRONIZE); - } - onEndAction(t00, -1, null); - } } ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchroModel.java ===================================== @@ -39,6 +39,7 @@ import fr.ird.observe.dto.ToolkitIdLabel; import fr.ird.observe.dto.ToolkitIdTechnicalLabel; import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ReferentialDto; +import fr.ird.observe.services.service.referential.SynchronizeEngine; import fr.ird.observe.services.service.referential.differential.DifferentialModelBuilder; import fr.ird.observe.services.service.referential.differential.DifferentialType; import fr.ird.observe.services.service.referential.synchro.SynchronizeTaskType; @@ -94,7 +95,6 @@ public class ReferentialSynchroModel extends AdminActionModel { private boolean showProperties; private ReferentialSynchronizeTreeModel leftTreeModel; private ReferentialSynchronizeTreeModel rightTreeModel; - private DifferentialModelBuilder engine; private boolean copyLeft; private boolean revertLeft; private boolean skipLeft; @@ -205,13 +205,11 @@ public class ReferentialSynchroModel extends AdminActionModel { public void destroy() { super.destroy(); tasks.clear(); - ObserveSwingDataSource.doCloseSource(leftSource); - ObserveSwingDataSource.doCloseSource(rightSource); + sources.accept(ObserveSwingDataSource::doCloseSource); leftSource = null; rightSource = null; leftTreeModel = null; rightTreeModel = null; - engine = null; } public ReferentialSynchronizeMode getSynchronizeMode() { @@ -292,10 +290,6 @@ public class ReferentialSynchroModel extends AdminActionModel { firePropertyChange(TASKS_EMPTY_PROPERTY_NAME, isTasksEmpty()); } - public void setEngine(DifferentialModelBuilder engine) { - this.engine = engine; - } - public boolean isCopyRight() { return copyRight; } @@ -453,9 +447,16 @@ public class ReferentialSynchroModel extends AdminActionModel { return getSource(side).getSynchronizeService().getEnabledReferentialLabelSet(dtoType); } + public DifferentialModelBuilder newDifferentialModelBuilder() { + return newDifferentialModelBuilder(sources); + } + + public SynchronizeEngine newReferentialSynchronizeEngine() { + return newReferentialSynchronizeEngine(sources); + } + private ObserveSwingDataSource getSource(LeftOrRight side) { - ObserveSwingDataSource source = sources.onSameSide(side); - ObserveSwingDataSource.doOpenSource(source); - return source; + return ObserveSwingDataSource.doOpenSource(sources.onSameSide(side)); } + } ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/actions/Apply.java ===================================== @@ -29,11 +29,6 @@ import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.task. import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.task.SwingWithIncludedPropertyNamesTask; import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.ReferentialSynchronizeTreeModel; import fr.ird.observe.client.datasource.api.ObserveSwingDataSource; -import fr.ird.observe.datasource.security.BabModelVersionException; -import fr.ird.observe.datasource.security.DataSourceCreateWithNoReferentialImportException; -import fr.ird.observe.datasource.security.DatabaseConnexionNotAuthorizedException; -import fr.ird.observe.datasource.security.DatabaseNotFoundException; -import fr.ird.observe.datasource.security.IncompatibleDataSourceCreateConfigurationException; import fr.ird.observe.dto.ToolkitIdTechnicalLabel; import fr.ird.observe.services.service.referential.SynchronizeEngine; import fr.ird.observe.services.service.referential.differential.Differential; @@ -71,7 +66,7 @@ public class Apply extends ReferentialSynchroUIActionSupport { addAdminWorker("Application des modifications.", this::apply); } - private WizardState apply() throws BabModelVersionException, DataSourceCreateWithNoReferentialImportException, DatabaseNotFoundException, IncompatibleDataSourceCreateConfigurationException, DatabaseConnexionNotAuthorizedException { + private WizardState apply() { ReferentialSynchroModel stepModel = ui.getStepModel(); @@ -181,9 +176,9 @@ public class Apply extends ReferentialSynchroUIActionSupport { } LeftOrRightContext<OneSideSqlRequest> sqlRequest = builder.build(); - try (ObserveSwingDataSource leftSource = openSource(stepModel.getLeftSource())) { - try (ObserveSwingDataSource rightSource = openSource(stepModel.getRightSource())) { - SynchronizeEngine synchronizeEngine = stepModel.newReferentialSynchronizeEngine(stepModel.getSources()); + try (ObserveSwingDataSource leftSource = ObserveSwingDataSource.doOpenSource(stepModel.getLeftSource())) { + try (ObserveSwingDataSource rightSource = ObserveSwingDataSource.doOpenSource(stepModel.getRightSource())) { + SynchronizeEngine synchronizeEngine = stepModel.newReferentialSynchronizeEngine(); LeftOrRightContext<OneSideSqlResult> sqlResult = synchronizeEngine.produceSql(sqlRequest); synchronizeEngine.executeSql(sqlResult); if (leftModified && leftSource.isLocal()) { ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/actions/Start.java ===================================== @@ -65,8 +65,7 @@ public class Start extends ReferentialSynchroUIActionSupport { try (ObserveSwingDataSource rightSource = ui.getModel().getConfigModel().getRightSourceModel().getSafeSource(true)) { stepModel.setRightSource(rightSource); - DifferentialModelBuilder engine = stepModel.newDifferentialModelBuilder(stepModel.getSources()); - stepModel.setEngine(engine); + DifferentialModelBuilder engine = stepModel.newDifferentialModelBuilder(); ReferentialSynchronizeMode synchronizeMode = stepModel.getSynchronizeMode(); ProgressionModel progressionModel = stepModel.getProgressModel(); ReferentialSynchronizeTreeModelsBuilder treeModelsBuilder = new ReferentialSynchronizeTreeModelsBuilder(synchronizeMode, stepModel.isShowProperties(), engine, progressionModel); ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/task/SwingReferentialSynchronizeTask.java ===================================== @@ -22,7 +22,6 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.task * #L% */ -import fr.ird.observe.client.WithClientUIContextApi; import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeResources; import fr.ird.observe.dto.I18nDecoratorHelper; import fr.ird.observe.dto.ToolkitIdTechnicalLabel; @@ -44,7 +43,7 @@ import static io.ultreia.java4all.i18n.I18n.t; * @author Tony Chemit - dev@tchemit.fr * @since 5.0 */ -public class SwingReferentialSynchronizeTask implements WithClientUIContextApi { +public class SwingReferentialSynchronizeTask { private final String dataStr; private final String typeStr; ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/validate/actions/Start.java ===================================== @@ -108,13 +108,13 @@ public class Start extends ValidateUIActionSupport { return WizardState.NEED_FIX; } - private WizardState initDB() throws Exception { + private WizardState initDB() { // on récupère la source de données AdminUIModel model = ui.getModel(); ObserveSwingDataSource source = model.getConfigModel().getLeftSourceModel().getSafeSource(false); - openSource(source); + ObserveSwingDataSource.doOpenSource(source); // recuperation des validateurs du modèle ===================================== core/services/local/src/test/java/fr/ird/observe/services/local/service/referential/UnidirectionalResultIssue2208Test.java ===================================== @@ -131,8 +131,8 @@ public class UnidirectionalResultIssue2208Test extends ServiceLocalTestSupportWr // do synchro ProgressionModel progressionModel = new ProgressionModel(); - UnidirectionalSynchronizeEngine referentialSynchronizeEngine = new UnidirectionalSynchronizeEngine(diffsEngine, synchronizeEngine); - UnidirectionalSynchronizeContext unidirectionalSynchronizeContext = referentialSynchronizeEngine.prepareContext(progressionModel); + UnidirectionalSynchronizeEngine referentialSynchronizeEngine = new UnidirectionalSynchronizeEngine(synchronizeEngine); + UnidirectionalSynchronizeContext unidirectionalSynchronizeContext = referentialSynchronizeEngine.prepareContext(diffsEngine, progressionModel); UnidirectionalResult result = referentialSynchronizeEngine.prepareResult(unidirectionalSynchronizeContext, null); unidirectionalSynchronizeContext.finish(service); ===================================== core/services/local/src/test/java/fr/ird/observe/services/local/service/referential/UnidirectionalResultTest.java ===================================== @@ -102,8 +102,8 @@ public class UnidirectionalResultTest extends ServiceLocalTestSupportWrite<Synch ProgressionModel progressionModel = new ProgressionModel(); progressionModel.addPropertyChangeListener(ProgressionModel.PROPERTY_MESSAGE, evt -> log.debug(evt.getNewValue())); - UnidirectionalSynchronizeEngine referentialSynchronizeEngine = new UnidirectionalSynchronizeEngine(diffsEngine, synchronizeEngine); - UnidirectionalSynchronizeContext unidirectionalSynchronizeContext = referentialSynchronizeEngine.prepareContext(progressionModel); + UnidirectionalSynchronizeEngine referentialSynchronizeEngine = new UnidirectionalSynchronizeEngine(synchronizeEngine); + UnidirectionalSynchronizeContext unidirectionalSynchronizeContext = referentialSynchronizeEngine.prepareContext(diffsEngine, progressionModel); UnidirectionalResult result = referentialSynchronizeEngine.prepareResult(unidirectionalSynchronizeContext, null); unidirectionalSynchronizeContext.finish(service); @@ -138,8 +138,8 @@ public class UnidirectionalResultTest extends ServiceLocalTestSupportWrite<Synch ProgressionModel progressionModel = new ProgressionModel(); progressionModel.addPropertyChangeListener(ProgressionModel.PROPERTY_MESSAGE, evt -> log.debug(evt.getNewValue())); - UnidirectionalSynchronizeEngine referentialSynchronizeEngine = new UnidirectionalSynchronizeEngine(diffsEngine, synchronizeEngine); - UnidirectionalSynchronizeContext unidirectionalSynchronizeContext = referentialSynchronizeEngine.prepareContext(progressionModel); + UnidirectionalSynchronizeEngine referentialSynchronizeEngine = new UnidirectionalSynchronizeEngine(synchronizeEngine); + UnidirectionalSynchronizeContext unidirectionalSynchronizeContext = referentialSynchronizeEngine.prepareContext(diffsEngine, progressionModel); UnidirectionalResult result = referentialSynchronizeEngine.prepareResult(unidirectionalSynchronizeContext, null); unidirectionalSynchronizeContext.finish(service); ===================================== server/core/src/main/java/fr/ird/observe/server/request/ObserveWebRequestContext.java ===================================== @@ -137,16 +137,16 @@ public class ObserveWebRequestContext { } public void checkAuthentication(ObserveWebUserSession session, Class<? extends ObserveService> serviceType) { - boolean requiredAuthentication = SpiHelper.anonymous(serviceType); + boolean anonymous = SpiHelper.anonymous(serviceType); boolean withConnection = session.withConnection(); - if (requiredAuthentication) { - if (!withConnection) { - throw new IllegalStateException("Vous avez demandé un service connecté, mais aucune connection n'est enregistrée."); - } - } else { + if (anonymous) { if (withConnection) { throw new IllegalStateException("Vous avez demandé un service anonyme, mais une connection est enregistrée."); } + } else { + if (!withConnection) { + throw new IllegalStateException("Vous avez demandé un service connecté, mais aucune connection n'est enregistrée."); + } } } } ===================================== toolkit/api-services/src/main/java/fr/ird/observe/services/service/referential/SynchronizeEngine.java ===================================== @@ -22,8 +22,6 @@ package fr.ird.observe.services.service.referential; * #L% */ -import fr.ird.observe.dto.ToolkitIdLabel; -import fr.ird.observe.dto.referential.ReferentialDto; import fr.ird.observe.services.service.referential.synchro.OneSideSqlRequest; import fr.ird.observe.services.service.referential.synchro.OneSideSqlResult; import io.ultreia.java4all.util.LeftOrRight; @@ -35,7 +33,6 @@ import org.apache.logging.log4j.Logger; import java.nio.file.Path; import java.util.Objects; import java.util.Optional; -import java.util.Set; /** * Created on 15/07/2021. @@ -65,42 +62,34 @@ public class SynchronizeEngine { } public void executeSql(LeftOrRightContext<OneSideSqlResult> sqlResult) { - String filePrefix = String.format("SynchronizeEngine-%d-", System.nanoTime()); - Path leftScriptPath = temporaryPath.resolve(filePrefix + "left.sql"); - log.info(String.format("Generate left side script at: %s", leftScriptPath)); - Optional<SqlScript> leftScript = toSqlScript(leftScriptPath, LeftOrRight.LEFT, sqlResult); - leftScript.ifPresent(s -> executeSql(s, LeftOrRight.LEFT)); - - Path rightScriptPath = temporaryPath.resolve(filePrefix + "right.sql"); - log.info(String.format("Generate right side script at: %s", rightScriptPath)); - Optional<SqlScript> rightScript = toSqlScript(leftScriptPath, LeftOrRight.RIGHT, sqlResult); - rightScript.ifPresent(s -> executeSql(s, LeftOrRight.RIGHT)); + executeSqlSide(LeftOrRight.LEFT, filePrefix, sqlResult); + executeSqlSide(LeftOrRight.RIGHT, filePrefix, sqlResult); } public Optional<SqlScript> toSqlScript(Path scriptPath, LeftOrRight side, LeftOrRightContext<OneSideSqlResult> result) { return result.onSameSide(side).toSqlScript(Objects.requireNonNull(scriptPath), result.onOppositeSide(side)); } - public void executeSql(SqlScript sqlResult, LeftOrRight side) { - log.info("Execute {} side script...", side); - services.onSameSide(side).applySql(sqlResult, SynchronizeService.ADVANCED_REFERENTIAL_SYNCHRONISATION); - } - public Path getTemporaryPath() { return temporaryPath; } - public <D extends ReferentialDto> Set<ToolkitIdLabel> getLocalSourceReferentialToDelete(Class<D> dtoType, Set<String> blockingIdsToRemove) { - return services.left().getReferentialToDelete(dtoType, blockingIdsToRemove); + + public LeftOrRightContext<SynchronizeService> getServices() { + return services; } - public <D extends ReferentialDto> Set<String> filterIdsUsedInLocalSource(Class<D> dtoType, Set<String> idsToRemove) { - return services.left().filterIdsUsed(dtoType, idsToRemove); + protected void executeSqlSide(LeftOrRight side, String filePrefix, LeftOrRightContext<OneSideSqlResult> sqlResult) { + Path scriptPath = getTemporaryPath().resolve(filePrefix + side+".sql"); + log.info("Generate {} side script at: {}", side, scriptPath); + Optional<SqlScript> optionalScript = toSqlScript(scriptPath, side, sqlResult); + optionalScript.ifPresent(s -> executeSql(s, side)); } - public <D extends ReferentialDto> Set<ToolkitIdLabel> getRightEnabledReferentialLabelSet(Class<D> referentialName) { - return services.right().getEnabledReferentialLabelSet(referentialName); + protected void executeSql(SqlScript sqlResult, LeftOrRight side) { + log.info("Execute {} side script...", side); + services.onSameSide(side).applySql(sqlResult, SynchronizeService.ADVANCED_REFERENTIAL_SYNCHRONISATION); } } ===================================== toolkit/api-services/src/main/java/fr/ird/observe/services/service/referential/UnidirectionalSynchronizeEngine.java ===================================== @@ -64,15 +64,13 @@ import java.util.stream.Collectors; public class UnidirectionalSynchronizeEngine { private static final Logger log = LogManager.getLogger(UnidirectionalSynchronizeEngine.class); - private final DifferentialModelBuilder diffsEngine; private final SynchronizeEngine synchronizeEngine; - public UnidirectionalSynchronizeEngine(DifferentialModelBuilder diffsEngine, SynchronizeEngine synchronizeEngine) { - this.diffsEngine = Objects.requireNonNull(diffsEngine); + public UnidirectionalSynchronizeEngine(SynchronizeEngine synchronizeEngine) { this.synchronizeEngine = Objects.requireNonNull(synchronizeEngine); } - public UnidirectionalSynchronizeContext prepareContext(ProgressionModel progressionModel) { + public UnidirectionalSynchronizeContext prepareContext(DifferentialModelBuilder diffsEngine, ProgressionModel progressionModel) { if (progressionModel == null) { progressionModel = new ProgressionModel(); progressionModel.addPropertyChangeListener(ProgressionModel.PROPERTY_MESSAGE, evt -> log.info(evt.getNewValue())); @@ -189,7 +187,7 @@ public class UnidirectionalSynchronizeEngine { Set<String> idsToRemove = leftAddDifferentials.stream().map(Differential::getId).collect(Collectors.toCollection(LinkedHashSet::new)); Set<String> blockingIdsToRemove = null; if (!idsToRemove.isEmpty()) { - Set<String> blockingIdsToRemoveFromLocal = synchronizeEngine.filterIdsUsedInLocalSource(dtoType, idsToRemove); + Set<String> blockingIdsToRemoveFromLocal = filterIdsUsedInLeftSource(dtoType, idsToRemove); blockingIdsToRemove = idsToRemove .stream() .filter(blockingIdsToRemoveFromLocal::contains) @@ -199,14 +197,26 @@ public class UnidirectionalSynchronizeEngine { } boolean needCallback = blockingIdsToRemove != null && !blockingIdsToRemove.isEmpty(); if (needCallback) { - Set<ToolkitIdLabel> availableReferenceSet = synchronizeEngine.getRightEnabledReferentialLabelSet(dtoType); - Set<ToolkitIdLabel> blockingReferentialSetToRemove = synchronizeEngine.getLocalSourceReferentialToDelete(dtoType, blockingIdsToRemove); + Set<ToolkitIdLabel> availableReferenceSet = getRightEnabledReferentialLabelSet(dtoType); + Set<ToolkitIdLabel> blockingReferentialSetToRemove = getLeftReferentialToDelete(dtoType, blockingIdsToRemove); callbackRequests.addCallbackRequest(dtoType, blockingReferentialSetToRemove, availableReferenceSet); } } return used; } + private <D extends ReferentialDto> Set<ToolkitIdLabel> getLeftReferentialToDelete(Class<D> dtoType, Set<String> blockingIdsToRemove) { + return synchronizeEngine.getServices().left().getReferentialToDelete(dtoType, blockingIdsToRemove); + } + + private <D extends ReferentialDto> Set<String> filterIdsUsedInLeftSource(Class<D> dtoType, Set<String> idsToRemove) { + return synchronizeEngine.getServices().left().filterIdsUsed(dtoType, idsToRemove); + } + + private <D extends ReferentialDto> Set<ToolkitIdLabel> getRightEnabledReferentialLabelSet(Class<D> referentialName) { + return synchronizeEngine.getServices().right().getEnabledReferentialLabelSet(referentialName); + } + private <D extends ReferentialDto> SynchronizeTask createTask(Class<D> dtoType, Differential differential) { return SynchronizeTask.create(dtoType, differential.getId(), differential.getThisSideDto().getLastUpdateDate()); } ===================================== toolkit/api-services/src/main/java/fr/ird/observe/services/service/referential/synchro/BothSidesSqlRequestBuilder.java ===================================== @@ -52,7 +52,7 @@ public class BothSidesSqlRequestBuilder { } public void addTask(LeftOrRight side, SynchronizeTaskType taskType, SynchronizeTask task) { - OneSideSqlRequest.Builder requestBuilder = getRequestBuilder(side, taskType); + OneSideSqlRequest.Builder requestBuilder = taskType.chooseSqlBuilder(builders).apply(side); requestBuilder.addTask(taskType, task); if (SynchronizeTaskType.ADD == taskType) { @@ -67,11 +67,4 @@ public class BothSidesSqlRequestBuilder { requestBuilder.removeIdOnlyExistOnThisSide(task.getReferentialType(), task.getReferentialId()); } } - - private OneSideSqlRequest.Builder getRequestBuilder(LeftOrRight side, SynchronizeTaskType taskType) { - if (taskType == SynchronizeTaskType.REVERT) { - return builders.onOppositeSide(side); - } - return builders.onSameSide(side); - } } ===================================== toolkit/api-services/src/main/java/fr/ird/observe/services/service/referential/synchro/OneSideSqlResult.java ===================================== @@ -200,7 +200,8 @@ public class OneSideSqlResult implements JsonAware { } try (BufferedWriter writer = Files.newBufferedWriter(scriptPath)) { for (String statement : statements) { - writer.write(statement); + writer.write(statement.trim()); + writer.newLine(); } } catch (IOException e) { throw new IllegalStateException("Can't write to " + scriptPath, e); ===================================== toolkit/api-services/src/main/java/fr/ird/observe/services/service/referential/synchro/SynchronizeTaskType.java ===================================== @@ -22,6 +22,11 @@ package fr.ird.observe.services.service.referential.synchro; * #L% */ +import io.ultreia.java4all.util.LeftOrRight; +import io.ultreia.java4all.util.LeftOrRightContext; + +import java.util.function.Function; + /** * Created on 14/08/16. * @@ -30,19 +35,21 @@ package fr.ird.observe.services.service.referential.synchro; */ public enum SynchronizeTaskType { - ADD(false, true), - UPDATE(true, true), - REVERT(true, false), - DELETE(false, false), - DEACTIVATE(false, false), - DEACTIVATE_WITH_REPLACEMENT(false, false); + ADD(false, true, false), + UPDATE(true, true, false), + REVERT(true, false, true), + DELETE(false, false, false), + DEACTIVATE(false, false, false), + DEACTIVATE_WITH_REPLACEMENT(false, false, false); private final boolean withProperties; private final boolean toOtherSide; + private final boolean useOtherSideSqlBuilder; - SynchronizeTaskType(boolean withProperties, boolean toOtherSide) { + SynchronizeTaskType(boolean withProperties, boolean toOtherSide, boolean useOtherSideSqlBuilder) { this.withProperties = withProperties; this.toOtherSide = toOtherSide; + this.useOtherSideSqlBuilder = useOtherSideSqlBuilder; } public boolean withProperties() { @@ -52,4 +59,8 @@ public enum SynchronizeTaskType { public boolean toOtherSide() { return toOtherSide; } + + public <O> Function<LeftOrRight, O> chooseSqlBuilder(LeftOrRightContext<O> sides) { + return useOtherSideSqlBuilder ? sides::onOppositeSide : sides::onSameSide; + } } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/8f797cf764fb40b669ec93dc7... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/8f797cf764fb40b669ec93dc7... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT (@tchemit)