This is an automated email from the git hooks/post-receive script. New change to branch feature/4309_synchro_referential in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git from d78eefa Bien enlever la référence à remplacer de la liste des choix possibles new c839440 ajout méthode utile new bd7a64e Ajout méthode pour récupérer l'enveloppe des référentiels new bbfffcc On conserve les ids existant uniquement de chaque côté pour réaliser des insert en cascade si nécessaire The 3 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit bbfffcca6e67f41c857a884231219b4236e005ea Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Aug 16 16:30:14 2016 +0200 On conserve les ids existant uniquement de chaque côté pour réaliser des insert en cascade si nécessaire commit bd7a64ea4db4a027efc643b673141790655e8c47 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Aug 16 16:25:57 2016 +0200 Ajout méthode pour récupérer l'enveloppe des référentiels commit c839440ed5f0a28cc11e02fe09863e8dfe45f354 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Aug 16 16:25:21 2016 +0200 ajout méthode utile Summary of changes: .../referential/ng/ReferentialReplaceUI.jaxx | 2 +- .../ng/ReferentialReplaceUIHandler.java | 12 +-- .../referential/ng/action/ApplyAction.java | 9 +- .../ng/action/RegisterTasksActionSupport.java | 23 +++- .../ng/tree/ReferentialSynchronizeTreeModel.java | 12 ++- .../ReferentialSynchronizeTreeModelsBuilder.java | 18 +++- .../controller/v1/DataSourceServiceController.java | 6 ++ .../services/service/DataSourceService.java | 3 + .../diff/ReferentialSynchronizeDiff.java | 30 +++--- .../diff/ReferentialSynchronizeDiffs.java | 8 -- .../diff/ReferentialSynchronizeDiffsEngine.java | 4 +- .../ng/ReferentialSynchronizeRequest.java | 29 ++++- ...entialSynchronizeServiceProduceSqlsRequest.java | 54 ++++++++-- .../ird/observe/services/ObserveServiceTopia.java | 9 ++ .../services/service/DataSourceServiceTopia.java | 119 ++++++++++++++++++--- .../ReferentialSynchronizeSqlsRequestBuilder.java | 91 +++++++++++++--- .../sql/InsertSqlStatementGenerator.java | 50 ++++++--- .../InsertSqlWithCascadeStatementGenerator.java | 105 ++++++++++++++++++ .../sql/UpdateSqlStatementGenerator.java | 45 +++++--- .../UpdateSqlWithCascadeStatementGenerator.java | 103 ++++++++++++++++++ 20 files changed, 614 insertions(+), 118 deletions(-) create mode 100644 observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/InsertSqlWithCascadeStatementGenerator.java create mode 100644 observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/UpdateSqlWithCascadeStatementGenerator.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/4309_synchro_referential in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit c839440ed5f0a28cc11e02fe09863e8dfe45f354 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Aug 16 16:25:21 2016 +0200 ajout méthode utile --- .../main/java/fr/ird/observe/services/ObserveServiceTopia.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java index ccce727..4c3839b 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java @@ -381,6 +381,15 @@ public abstract class ObserveServiceTopia implements ObserveService { } + public <D extends ReferentialDto, E extends ObserveReferentialEntity> D loadEntityToReferentialDto(Class<D> dtoType, String id) { + + E entity = loadEntity(dtoType, id); + ReferentialBinderSupport<E, D> binder = getReferentialBinder(dtoType); + D dto = binder.toDto(getReferentialLocale(), entity); + return dto; + + } + protected <E extends ObserveEntity> boolean existsEntity(Class<E> entityType, String id) { ObserveTopiaPersistenceContext persistenceContext = serviceContext.getTopiaPersistenceContext(); TopiaDao<E> dao = persistenceContext.getDao(entityType); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/4309_synchro_referential in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit bd7a64ea4db4a027efc643b673141790655e8c47 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Aug 16 16:25:57 2016 +0200 Ajout méthode pour récupérer l'enveloppe des référentiels --- .../controller/v1/DataSourceServiceController.java | 6 ++ .../services/service/DataSourceService.java | 3 + .../services/service/DataSourceServiceTopia.java | 119 ++++++++++++++++++--- 3 files changed, 113 insertions(+), 15 deletions(-) diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java index a4d2513..9ee58b7 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java @@ -35,6 +35,7 @@ import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; import fr.ird.observe.services.dto.ObserveDbUserDto; +import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.service.BabModelVersionException; import fr.ird.observe.services.service.DataSourceService; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; @@ -136,6 +137,11 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport getAnonymousService(dataSourceConfigurationTopia).migrateData(dataSourceConfiguration); } + @Override + public Set<Class<? extends ReferentialDto>> getReferentialTypesInShell() { + return getAuthenticatedService().getReferentialTypesInShell(); + } + protected ObserveDataSourceConfiguration getTopiaDataSourceConfiguration(ObserveDataSourceConfiguration dataSourceConfigurationFromRequest) { Preconditions.checkArgument(dataSourceConfigurationFromRequest instanceof ObserveDataSourceConfigurationRest); diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java index bd951dd..ee00650 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java @@ -30,6 +30,7 @@ import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; import fr.ird.observe.services.dto.ObserveDbUserDto; +import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.spi.NoDataAccess; import java.io.Closeable; @@ -62,6 +63,8 @@ public interface DataSourceService extends ObserveService, Closeable { @NoDataAccess void migrateData(ObserveDataSourceConfiguration dataSourceConfiguration); + Set<Class<? extends ReferentialDto>> getReferentialTypesInShell(); + @Override void close(); diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java index 00095d2..1e2382a 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java @@ -27,14 +27,17 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; +import fr.ird.observe.ObserveEntityEnum; import fr.ird.observe.ObserveTopiaApplicationContext; import fr.ird.observe.ObserveTopiaConfiguration; import fr.ird.observe.ObserveTopiaConfigurationFactory; import fr.ird.observe.entities.migration.ObserveMigrationConfigurationProvider; +import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; import fr.ird.observe.services.ObserveJdbcHelper; import fr.ird.observe.services.ObserveSecurityHelper; import fr.ird.observe.services.ObserveServiceTopia; import fr.ird.observe.services.ObserveTopiaApplicationContextFactory; +import fr.ird.observe.services.binder.BinderEngine; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; @@ -47,9 +50,13 @@ import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportExcept import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; import fr.ird.observe.services.dto.ObserveDbUserDto; import fr.ird.observe.services.dto.ObserveDbUserDtos; +import fr.ird.observe.services.dto.referential.ReferentialDto; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.jdbc.JdbcHelper; +import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; +import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; +import org.nuiton.topia.persistence.metadata.TopiaMetadataModelVisitor; import org.nuiton.version.Version; import java.io.File; @@ -108,12 +115,12 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS // On tente une connection à la base ObserveTopiaConfiguration topiaConfiguration = ObserveTopiaConfigurationFactory.forH2Database(h2DataSourceConfiguration.getDirectory(), - h2DataSourceConfiguration.getDbName(), - h2DataSourceConfiguration.getUsername(), - new String(h2DataSourceConfiguration.getPassword()), - false, - false, - false); + h2DataSourceConfiguration.getDbName(), + h2DataSourceConfiguration.getUsername(), + new String(h2DataSourceConfiguration.getPassword()), + false, + false, + false); try { @@ -134,11 +141,11 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS ObserveDataSourceConfigurationTopiaPG pgDataSourceConfiguration = (ObserveDataSourceConfigurationTopiaPG) dataSourceConfigurationTopiaSupport; // On tente une connexion au serveur ObserveTopiaConfiguration topiaConfiguration = ObserveTopiaConfigurationFactory.forPostgresqlDatabase(pgDataSourceConfiguration.getJdbcUrl(), - pgDataSourceConfiguration.getUsername(), - new String(pgDataSourceConfiguration.getPassword()), - false, - false, - false); + pgDataSourceConfiguration.getUsername(), + new String(pgDataSourceConfiguration.getPassword()), + false, + false, + false); try { new JdbcHelper(topiaConfiguration).runSelectOnString("SELECT 1;"); @@ -412,7 +419,7 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); - if (! dataSourceConfiguration.isH2Database()) { + if (!dataSourceConfiguration.isH2Database()) { throw new DatabaseDestroyNotAuthorizedException(dataSourceConfiguration); @@ -503,6 +510,16 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } + @Override + public Set<Class<? extends ReferentialDto>> getReferentialTypesInShell() { + ObserveTopiaApplicationContext topiaApplicationContext = serviceContext.getTopiaApplicationContext(); + TopiaMetadataModel metadataModel = topiaApplicationContext.getMetadataModel(); + + DetectReferentialTypesInShellBuilder visitor = new DetectReferentialTypesInShellBuilder(); + metadataModel.accept(visitor); + return visitor.build(); + } + protected ObserveDataSourceConnectionTopia createDataSourceConnection(ObserveDataSourceInformation dataSourceInformation, String authenticationToken) { ObserveDataSourceConnectionTopia dataSourceConnection = new ObserveDataSourceConnectionTopia( @@ -576,9 +593,9 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS if (log.isDebugEnabled()) { log.debug("User can read refererential : " + readReferential + ", " + - "write referential : " + writeReferential + ", " + - "read data : " + readData + ", " + - "write data : " + writeData + "."); + "write referential : " + writeReferential + ", " + + "read data : " + readData + ", " + + "write data : " + writeData + "."); } ObserveMigrationConfigurationProvider observeMigrationConfigurationProvider = ObserveMigrationConfigurationProvider.get(); @@ -608,4 +625,76 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS return result; } + private static class DetectReferentialTypesInShellBuilder implements TopiaMetadataModelVisitor { + + private final ImmutableSet.Builder<Class<? extends ReferentialDto>> typesInShellBuilder = ImmutableSet.builder(); + + @Override + public void visitModelStart(TopiaMetadataModel metadataModel) { + + } + + @Override + public void visitModelEnd(TopiaMetadataModel metadataModel) { + + } + + @Override + public void visitEntiyStart(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity) { + + } + + @Override + public void visitEntiyEnd(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity) { + + } + + @Override + public void visitReversedAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + + } + + @Override + public void visitOneToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + addTypeInShell(metadataEntity, propertyType); + } + + @Override + public void visitManyToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + addTypeInShell(metadataEntity, propertyType); + } + + @Override + public void visitManyToOneAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + addTypeInShell(metadataEntity, propertyType); + } + + @Override + public void visitProperty(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, String propertyType) { + + } + + private void addTypeInShell(TopiaMetadataEntity containerType, TopiaMetadataEntity propertyType) { + + ObserveEntityEnum parentObserveEntityEnum = ObserveEntityEnum.valueOf(containerType.getType()); + Class parentEntityType = parentObserveEntityEnum.getContract(); + if (ObserveReferentialEntity.class.isAssignableFrom(parentEntityType)) { + + String type = propertyType.getType(); + + ObserveEntityEnum observeEntityEnum = ObserveEntityEnum.valueOf(type); + Class entityType = observeEntityEnum.getContract(); + Class<? extends ReferentialDto> dtoType = BinderEngine.get().getReferentialDtoType(entityType); + typesInShellBuilder.add(dtoType); + if (log.isInfoEnabled()) { + log.info("For container type:" + parentObserveEntityEnum + ", add to shell: " + observeEntityEnum); + } + } + + } + + public Set<Class<? extends ReferentialDto>> build() { + return typesInShellBuilder.build(); + } + } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/4309_synchro_referential in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit bbfffcca6e67f41c857a884231219b4236e005ea Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Aug 16 16:30:14 2016 +0200 On conserve les ids existant uniquement de chaque côté pour réaliser des insert en cascade si nécessaire --- .../referential/ng/ReferentialReplaceUI.jaxx | 2 +- .../ng/ReferentialReplaceUIHandler.java | 12 +-- .../referential/ng/action/ApplyAction.java | 9 +- .../ng/action/RegisterTasksActionSupport.java | 23 ++++- .../ng/tree/ReferentialSynchronizeTreeModel.java | 12 ++- .../ReferentialSynchronizeTreeModelsBuilder.java | 18 +++- .../diff/ReferentialSynchronizeDiff.java | 30 +++--- .../diff/ReferentialSynchronizeDiffs.java | 8 -- .../diff/ReferentialSynchronizeDiffsEngine.java | 4 +- .../ng/ReferentialSynchronizeRequest.java | 29 +++++- ...entialSynchronizeServiceProduceSqlsRequest.java | 54 ++++++++--- .../ReferentialSynchronizeSqlsRequestBuilder.java | 91 +++++++++++++++--- .../sql/InsertSqlStatementGenerator.java | 50 +++++++--- .../InsertSqlWithCascadeStatementGenerator.java | 105 +++++++++++++++++++++ .../sql/UpdateSqlStatementGenerator.java | 45 ++++++--- .../UpdateSqlWithCascadeStatementGenerator.java | 103 ++++++++++++++++++++ 16 files changed, 492 insertions(+), 103 deletions(-) diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/ReferentialReplaceUI.jaxx b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/ReferentialReplaceUI.jaxx index f371b86..705d681 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/ReferentialReplaceUI.jaxx +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/ReferentialReplaceUI.jaxx @@ -9,7 +9,7 @@ </import> <ReferentialReference id='referenceToReplace' genericType="E" - initializer="getContextValue(ReferentialReference.class)"/> + initializer="getContextValue(ReferentialReference.class, ReferentialReplaceUIHandler.CONTEXT_NAME)"/> <ReferentialReference id='replaceReference' genericType="E" javaBean="null"/> <ReferentialReplaceUIHandler id='handler' genericType="E" constructorParams="this"/> diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/ReferentialReplaceUIHandler.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/ReferentialReplaceUIHandler.java index 8930cd3..764143c 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/ReferentialReplaceUIHandler.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/ReferentialReplaceUIHandler.java @@ -1,11 +1,8 @@ package fr.ird.observe.ui.admin.synchronize.referential.ng; -import com.google.common.collect.Lists; -import fr.ird.observe.ObserveSwingApplicationContext; import fr.ird.observe.application.swing.decoration.decorators.ReferentialReferenceDecorator; import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.dto.referential.ReferentialReference; -import fr.ird.observe.services.dto.referential.ReferentialReferenceSet; import jaxx.runtime.swing.editor.bean.BeanComboBox; import java.awt.Dimension; @@ -19,6 +16,8 @@ import java.util.List; */ public class ReferentialReplaceUIHandler<R extends ReferentialDto> { + public static final String CONTEXT_NAME = "replaceUI"; + private final ReferentialReplaceUI<R> ui; protected PropertyChangeListener listenData; @@ -30,14 +29,11 @@ public class ReferentialReplaceUIHandler<R extends ReferentialDto> { public void init() { BeanComboBox<ReferentialReference<R>> beanComboBox = ui.getList(); - ReferentialReferenceSet<R> referenceSet = ui.getContextValue(ReferentialReferenceSet.class); beanComboBox.setI18nPrefix("observe.common."); beanComboBox.setMinimumSize(new Dimension(0, 24)); beanComboBox.setBeanType((Class) ReferentialReference.class); - List<ReferentialReference<R>> references = Lists.newArrayList(referenceSet.getReferences()); - ReferentialReference<R> reference = ui.getContextValue(ReferentialReference.class); - references.remove(reference); - ReferentialReferenceDecorator<R> decorator = ObserveSwingApplicationContext.get().getDecoratorService().getReferentialReferenceDecorator(referenceSet.getType()); + List<ReferentialReference<R>> references = ui.getContextValue(List.class,CONTEXT_NAME); + ReferentialReferenceDecorator<R> decorator = ui.getContextValue(ReferentialReferenceDecorator.class,CONTEXT_NAME); beanComboBox.init(decorator, references); } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/action/ApplyAction.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/action/ApplyAction.java index e612058..6521a3f 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/action/ApplyAction.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/action/ApplyAction.java @@ -1,5 +1,6 @@ package fr.ird.observe.ui.admin.synchronize.referential.ng.action; +import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.service.actions.synchro.referential.ReferentialSynchronizeMode; import fr.ird.observe.services.service.actions.synchro.referential.ng.ReferentialSynchronizeServiceEngine; import fr.ird.observe.services.service.actions.synchro.referential.ng.ReferentialSynchronizeServiceProduceSqlsRequest; @@ -14,6 +15,7 @@ import fr.ird.observe.ui.admin.synchronize.referential.ng.task.ReferentialSynchr import jaxx.runtime.swing.wizard.ext.WizardState; import java.awt.event.ActionEvent; +import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -51,7 +53,12 @@ public class ApplyAction extends AbstractObserveAction { boolean leftIsWrite = synchronizeMode.isLeftWrite(); boolean rightIsWrite = synchronizeMode.isRightWrite(); - ReferentialSynchronizeServiceProduceSqlsRequest.Builder builder = ReferentialSynchronizeServiceProduceSqlsRequest.builder(); + Set<Class<? extends ReferentialDto>> referentialTypesInShell = stepModel.getLeftSource().newDataSourceService().getReferentialTypesInShell(); + + ReferentialSynchronizeServiceProduceSqlsRequest.Builder builder = + ReferentialSynchronizeServiceProduceSqlsRequest.builder(stepModel.getLeftTreeModel().getIdsOnlyExistingInThisSide(), + stepModel.getRightTreeModel().getIdsOnlyExistingInThisSide(), + referentialTypesInShell); ReferentialSynchronizeTaskListModel tasks = stepModel.getTasks(); diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/action/RegisterTasksActionSupport.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/action/RegisterTasksActionSupport.java index 9ea8920..c425f97 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/action/RegisterTasksActionSupport.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/action/RegisterTasksActionSupport.java @@ -1,12 +1,16 @@ package fr.ird.observe.ui.admin.synchronize.referential.ng.action; +import com.google.common.collect.Lists; +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.services.dto.referential.ReferentialDto; import fr.ird.observe.services.dto.referential.ReferentialReference; import fr.ird.observe.services.dto.referential.ReferentialReferenceSet; import fr.ird.observe.ui.UIHelper; import fr.ird.observe.ui.actions.AbstractObserveAction; import fr.ird.observe.ui.admin.synchronize.referential.ng.ReferentialReplaceUI; +import fr.ird.observe.ui.admin.synchronize.referential.ng.ReferentialReplaceUIHandler; import fr.ird.observe.ui.admin.synchronize.referential.ng.ReferentialSynchroUI; import fr.ird.observe.ui.admin.synchronize.referential.ng.ReferentialSynchronizeResources; import fr.ird.observe.ui.admin.synchronize.referential.ng.task.ReferentialSynchronizeTaskSupport; @@ -24,6 +28,7 @@ import javax.swing.JOptionPane; import java.awt.event.ActionEvent; import java.util.Collection; import java.util.LinkedList; +import java.util.List; import java.util.function.Predicate; import static org.nuiton.i18n.I18n.t; @@ -107,17 +112,25 @@ public abstract class RegisterTasksActionSupport extends AbstractObserveAction { if (needReplace) { - ReferentialReferenceSet<R> references; + ReferentialReferenceSet<R> referencesSet; Class<R> type = reference.getType(); if (left) { - references = ui.getStepModel().getEngine().getLeftEnabledReferentialReferenceSet(type); + referencesSet = ui.getStepModel().getEngine().getLeftEnabledReferentialReferenceSet(type); } else { - references = ui.getStepModel().getEngine().getRightEnabledReferentialReferenceSet(type); + referencesSet = ui.getStepModel().getEngine().getRightEnabledReferentialReferenceSet(type); } + List<ReferentialReference<R>> references = Lists.newArrayList(referencesSet.getReferences()); + references.remove(reference); + + //FIXME Il faut aussi enlever tous les référentiels marqués comme supprimé + + ReferentialReferenceDecorator<R> decorator = ObserveSwingApplicationContext.get().getDecoratorService().getReferentialReferenceDecorator(type); + ReferentialReplaceUI<R> replaceUI = new ReferentialReplaceUI<>(new JAXXInitialContext() - .add(reference) - .add(references) + .add(ReferentialReplaceUIHandler.CONTEXT_NAME, reference) + .add(ReferentialReplaceUIHandler.CONTEXT_NAME, references) + .add(ReferentialReplaceUIHandler.CONTEXT_NAME, decorator) .add(this)); typeStr = t(DecoratorService.getEntityLabel(ObserveTreeHelper.TREE_NODE_PREFIX, type)); diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/tree/ReferentialSynchronizeTreeModel.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/tree/ReferentialSynchronizeTreeModel.java index c102002..2363892 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/tree/ReferentialSynchronizeTreeModel.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/tree/ReferentialSynchronizeTreeModel.java @@ -1,6 +1,8 @@ package fr.ird.observe.ui.admin.synchronize.referential.ng.tree; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSetMultimap; +import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.ui.admin.synchronize.referential.ng.tree.node.ReferenceReferentialSynchroNodeSupport; import fr.ird.observe.ui.admin.synchronize.referential.ng.tree.node.ReferentialSynchroNodeSupport; import fr.ird.observe.ui.admin.synchronize.referential.ng.tree.node.RootReferentialSynchroNode; @@ -37,6 +39,7 @@ public class ReferentialSynchronizeTreeModel implements TreeSelectionModel, Tree private final DefaultTreeSelectionModel treeSelectionModel; private final DefaultTreeModel treeModel; + private final ImmutableSetMultimap<Class<? extends ReferentialDto>, String> idsOnlyExistOnThisSide; private boolean canAdd; private boolean canUpdate; @@ -44,12 +47,19 @@ public class ReferentialSynchronizeTreeModel implements TreeSelectionModel, Tree private boolean canRevert; private boolean valueIsAdjusting; - public ReferentialSynchronizeTreeModel(RootReferentialSynchroNode root) { + public ReferentialSynchronizeTreeModel(RootReferentialSynchroNode root, + ImmutableSetMultimap<Class<? extends ReferentialDto>, String> idsOnlyExistOnThisSide) { this.treeModel = new DefaultTreeModel(root); + this.idsOnlyExistOnThisSide = idsOnlyExistOnThisSide; this.treeSelectionModel = new DefaultTreeSelectionModel(); setSelectionMode(DISCONTIGUOUS_TREE_SELECTION); } + public ImmutableSetMultimap<Class<? extends ReferentialDto>, String> getIdsOnlyExistingInThisSide() { + return idsOnlyExistOnThisSide; + } + + public synchronized void updateSelectedActions() { canAdd = canUpdate = canDelete = canRevert = false; diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/tree/ReferentialSynchronizeTreeModelsBuilder.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/tree/ReferentialSynchronizeTreeModelsBuilder.java index 3af7e05..8aec5bd 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/tree/ReferentialSynchronizeTreeModelsBuilder.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/synchronize/referential/ng/tree/ReferentialSynchronizeTreeModelsBuilder.java @@ -1,6 +1,7 @@ package fr.ird.observe.ui.admin.synchronize.referential.ng.tree; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSetMultimap; import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.dto.referential.ReferentialReference; import fr.ird.observe.services.dto.referential.ReferentialReferenceSet; @@ -29,6 +30,8 @@ public class ReferentialSynchronizeTreeModelsBuilder { private final ReferentialSynchronizeDiffsEngine engine; private final RootReferentialSynchroNode leftRootNode; private final RootReferentialSynchroNode rightRootNode; + private final ImmutableSetMultimap.Builder<Class<? extends ReferentialDto>, String> leftIdsBuilder = ImmutableSetMultimap.builder(); + private final ImmutableSetMultimap.Builder<Class<? extends ReferentialDto>, String> rightIdsBuilder = ImmutableSetMultimap.builder(); public ReferentialSynchronizeTreeModelsBuilder(ReferentialSynchronizeMode synchronizeMode, ReferentialSynchronizeDiffsEngine engine) { Objects.nonNull(synchronizeMode); @@ -50,8 +53,8 @@ public class ReferentialSynchronizeTreeModelsBuilder { boolean rightCanWrite = rightRootNode.isCanWrite(); boolean leftCanWrite = leftRootNode.isCanWrite(); - CreateNode leftAddNode = new CreateAddNode(rightCanWrite, leftCanWrite, false); - CreateNode rightAddNode = new CreateAddNode(leftCanWrite, rightCanWrite, false); + CreateAddNode leftAddNode = new CreateAddNode(rightCanWrite, leftCanWrite, false); + CreateAddNode rightAddNode = new CreateAddNode(leftCanWrite, rightCanWrite, false); CreateNode leftUpdateNode = new CreateUpdateNode(rightCanWrite, false, leftCanWrite); CreateNode rightUpdateNode = new CreateUpdateNode(leftCanWrite, false, rightCanWrite); @@ -88,8 +91,8 @@ public class ReferentialSynchronizeTreeModelsBuilder { } - ReferentialSynchronizeTreeModel leftTreeModel = new ReferentialSynchronizeTreeModel(leftRootNode); - ReferentialSynchronizeTreeModel rightTreeModel = new ReferentialSynchronizeTreeModel(rightRootNode); + ReferentialSynchronizeTreeModel leftTreeModel = new ReferentialSynchronizeTreeModel(leftRootNode, leftAddNode.getIds()); + ReferentialSynchronizeTreeModel rightTreeModel = new ReferentialSynchronizeTreeModel(rightRootNode, rightAddNode.getIds()); return Pair.of(leftTreeModel, rightTreeModel); } @@ -135,6 +138,8 @@ public class ReferentialSynchronizeTreeModelsBuilder { private static class CreateAddNode extends CreateNode { + private final ImmutableSetMultimap.Builder<Class<? extends ReferentialDto>, String> idsBuilder = ImmutableSetMultimap.builder(); + protected CreateAddNode(boolean canCopy, boolean canDelete, boolean canRevert) { super(canCopy, canDelete, canRevert); } @@ -143,6 +148,11 @@ public class ReferentialSynchronizeTreeModelsBuilder { public void createNode(TypeReferentialSynchroNode typeNode, ReferentialReference<?> reference) { ReferenceReferentialSynchroNodeSupport node = new AddedReferenceReferentialSynchroNode(reference, canCopy, false, canDelete, canRevert); typeNode.add(node); + idsBuilder.put(reference.getType(), reference.getId()); + } + + public ImmutableSetMultimap<Class<? extends ReferentialDto>, String> getIds() { + return idsBuilder.build(); } } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiff.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiff.java index 6faf9f0..b1d3db0 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiff.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiff.java @@ -22,11 +22,13 @@ public class ReferentialSynchronizeDiff { private final ImmutableSetMultimap.Builder<Class<? extends ReferentialDto>, ReferentialSynchronizeDiffState> addedReferentialsBuilder; private final ImmutableSetMultimap.Builder<Class<? extends ReferentialDto>, ReferentialSynchronizeDiffState> updatedReferentialsBuilder; + private final ImmutableSetMultimap.Builder<Class<? extends ReferentialDto>, String> existingIdsBuilder; public Builder() { addedReferentialsBuilder = ImmutableSetMultimap.builder(); updatedReferentialsBuilder = ImmutableSetMultimap.builder(); + existingIdsBuilder = ImmutableSetMultimap.builder(); } <R extends ReferentialDto> Builder addAddedReferential(Class<R> referentialName, ReferentialSynchronizeDiffState referentialDto) { @@ -39,10 +41,14 @@ public class ReferentialSynchronizeDiff { return this; } - public ReferentialSynchronizeDiff build() { - return new ReferentialSynchronizeDiff(addedReferentialsBuilder.build(), updatedReferentialsBuilder.build()); + public <R extends ReferentialDto> Builder addExistingId(Class<R> referentialName, String id) { + existingIdsBuilder.put(referentialName, id); + return this; } + public ReferentialSynchronizeDiff build() { + return new ReferentialSynchronizeDiff(addedReferentialsBuilder.build(), updatedReferentialsBuilder.build(), existingIdsBuilder.build()); + } } /** @@ -59,22 +65,12 @@ public class ReferentialSynchronizeDiff { */ private final ImmutableSetMultimap<Class<? extends ReferentialDto>, ReferentialSynchronizeDiffState> updatedReferentials; - public boolean isEmpty() { - return referentialNames.isEmpty(); - } - - public boolean isNotEmpty() { - return !isEmpty(); - } + private final ImmutableSetMultimap<Class<? extends ReferentialDto>, String> existingIds; public ImmutableSet<Class<? extends ReferentialDto>> getReferentialNames() { return referentialNames; } - public <R extends ReferentialDto> boolean isReferentialUsed(Class<R> referentialName) { - return referentialNames.contains(referentialName); - } - public <R extends ReferentialDto> Optional<ImmutableSet<ReferentialSynchronizeDiffState>> getAddedReferentials(Class<R> referentialName) { return Optional.ofNullable(addedReferentials.get(referentialName)); } @@ -83,10 +79,16 @@ public class ReferentialSynchronizeDiff { return Optional.ofNullable(updatedReferentials.get(referentialName)); } + public ImmutableSetMultimap<Class<? extends ReferentialDto>, String> getExistingIds() { + return existingIds; + } + private ReferentialSynchronizeDiff(ImmutableSetMultimap<Class<? extends ReferentialDto>, ReferentialSynchronizeDiffState> addedReferentials, - ImmutableSetMultimap<Class<? extends ReferentialDto>, ReferentialSynchronizeDiffState> updatedReferentials) { + ImmutableSetMultimap<Class<? extends ReferentialDto>, ReferentialSynchronizeDiffState> updatedReferentials, + ImmutableSetMultimap<Class<? extends ReferentialDto>, String> existingIds) { this.addedReferentials = addedReferentials; this.updatedReferentials = updatedReferentials; + this.existingIds = existingIds; this.referentialNames = ImmutableSet.<Class<? extends ReferentialDto>>builder() .addAll(addedReferentials.keySet()) .addAll(updatedReferentials.keySet()) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffs.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffs.java index ec1f0f1..9d863f6 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffs.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffs.java @@ -79,14 +79,6 @@ public class ReferentialSynchronizeDiffs { return referentialNames; } - public <R extends ReferentialDto> boolean isLeftReferentialUsed(Class<R> referentialName) { - return leftDiff.isReferentialUsed(referentialName); - } - - public <R extends ReferentialDto> boolean isRightReferentialUsed(Class<R> referentialName) { - return rightDiff.isReferentialUsed(referentialName); - } - public <R extends ReferentialDto> Optional<ImmutableSet<ReferentialSynchronizeDiffState>> getLeftAddedReferentials(Class<R> referentialName) { return leftDiff.getAddedReferentials(referentialName); } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffsEngine.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffsEngine.java index 40dbcfc..bbfc4d3 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffsEngine.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/diff/ReferentialSynchronizeDiffsEngine.java @@ -19,7 +19,8 @@ public class ReferentialSynchronizeDiffsEngine { private final ReferentialSynchronizeDiffService leftDiffService; private final ReferentialSynchronizeDiffService rightDiffService; - public ReferentialSynchronizeDiffsEngine(ReferentialSynchronizeDiffService leftDiffService, ReferentialSynchronizeDiffService rightDiffService) { + public ReferentialSynchronizeDiffsEngine(ReferentialSynchronizeDiffService leftDiffService, + ReferentialSynchronizeDiffService rightDiffService) { this.leftDiffService = leftDiffService; this.rightDiffService = rightDiffService; } @@ -63,7 +64,6 @@ public class ReferentialSynchronizeDiffsEngine { private <R extends ReferentialDto> void build0(Class<R> referentialName, ReferentialSynchronizeDiffs.Builder result, ReferentialDataSourceState<R> leftStates, ReferentialDataSourceState<R> rightStates) { - ImmutableMap<String, ReferentialSynchronizeDiffState> leftLatestReferentialDiffState = leftStates.getReferentialStatesById(); ImmutableMap<String, ReferentialSynchronizeDiffState> rightLatestReferentialDiffState = rightStates.getReferentialStatesById(); diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeRequest.java index c8ea1aa..240d2cb 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeRequest.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeRequest.java @@ -1,7 +1,10 @@ package fr.ird.observe.services.service.actions.synchro.referential.ng; +import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSetMultimap; +import com.google.common.collect.Multimap; import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.service.actions.synchro.referential.ng.task.ReferentialSynchronizeTask; import fr.ird.observe.services.service.actions.synchro.referential.ng.task.ReferentialSynchronizeTaskType; @@ -24,21 +27,28 @@ public class ReferentialSynchronizeRequest { private final ImmutableMultimap<ReferentialSynchronizeTaskType, ReferentialSynchronizeTask<?>> tasks; private final ImmutableSet<Class<? extends ReferentialDto>> types; + private final Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide; private ReferentialSynchronizeRequest(ImmutableMultimap<ReferentialSynchronizeTaskType, ReferentialSynchronizeTask<?>> tasks, - ImmutableSet<Class<? extends ReferentialDto>> types) { + ImmutableSet<Class<? extends ReferentialDto>> types, + Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide) { this.tasks = tasks; this.types = types; + this.idsOnlyExistingOnThisSide = idsOnlyExistingOnThisSide; } - public static Builder builder() { - return new Builder(); + public static Builder builder(ImmutableSetMultimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide) { + return new Builder(idsOnlyExistingOnThisSide); } public boolean isNotEmpty() { return !tasks.isEmpty(); } + public Multimap<Class<? extends ReferentialDto>, String> getIdsOnlyExistingOnThisSide() { + return idsOnlyExistingOnThisSide; + } + public ImmutableMultimap<ReferentialSynchronizeTaskType, ReferentialSynchronizeTask<?>> getTasks() { return tasks; } @@ -76,9 +86,14 @@ public class ReferentialSynchronizeRequest { private final ImmutableMultimap.Builder<ReferentialSynchronizeTaskType, ReferentialSynchronizeTask<?>> tasksBuilder = ImmutableMultimap.builder(); private final ImmutableSet.Builder<Class<? extends ReferentialDto>> typesBuilder = ImmutableSet.builder(); + private final Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide; + + public Builder(ImmutableSetMultimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide) { + this.idsOnlyExistingOnThisSide = ArrayListMultimap.create(idsOnlyExistingOnThisSide); + } public ReferentialSynchronizeRequest build() { - return new ReferentialSynchronizeRequest(tasksBuilder.build(), typesBuilder.build()); + return new ReferentialSynchronizeRequest(tasksBuilder.build(), typesBuilder.build(), idsOnlyExistingOnThisSide); } public <R extends ReferentialDto> Builder addTask(ReferentialSynchronizeTaskType taskType, Class<R> type, String referentialId, String replaceReferentialId) { @@ -90,5 +105,11 @@ public class ReferentialSynchronizeRequest { return this; } + + public <R extends ReferentialDto> void removeIdOnlyExistOnThisSide(Class<R> type, String id) { + idsOnlyExistingOnThisSide.remove(type, id); + } + } + } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeServiceProduceSqlsRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeServiceProduceSqlsRequest.java index 92e7ef8..9362c29 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeServiceProduceSqlsRequest.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeServiceProduceSqlsRequest.java @@ -1,8 +1,11 @@ package fr.ird.observe.services.service.actions.synchro.referential.ng; +import com.google.common.collect.ImmutableSetMultimap; import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.service.actions.synchro.referential.ng.task.ReferentialSynchronizeTaskType; +import java.util.Set; + /** * Created on 15/08/16. * @@ -10,16 +13,22 @@ import fr.ird.observe.services.service.actions.synchro.referential.ng.task.Refer */ public class ReferentialSynchronizeServiceProduceSqlsRequest { - protected final ReferentialSynchronizeRequest leftRequest; - protected final ReferentialSynchronizeRequest rightRequest; + private final ReferentialSynchronizeRequest leftRequest; + private final ReferentialSynchronizeRequest rightRequest; + private final Set<Class<? extends ReferentialDto>> referentialTypesInShell; - private ReferentialSynchronizeServiceProduceSqlsRequest(ReferentialSynchronizeRequest leftRequest, ReferentialSynchronizeRequest rightRequest) { + private ReferentialSynchronizeServiceProduceSqlsRequest(ReferentialSynchronizeRequest leftRequest, + ReferentialSynchronizeRequest rightRequest, + Set<Class<? extends ReferentialDto>> referentialTypesInShell) { this.leftRequest = leftRequest; this.rightRequest = rightRequest; + this.referentialTypesInShell = referentialTypesInShell; } - public static Builder builder() { - return new Builder(); + public static Builder builder(ImmutableSetMultimap<Class<? extends ReferentialDto>, String> leftExistingIds, + ImmutableSetMultimap<Class<? extends ReferentialDto>, String> rightExistingIds, + Set<Class<? extends ReferentialDto>> referentialTypesInShell) { + return new Builder(leftExistingIds, rightExistingIds, referentialTypesInShell); } public ReferentialSynchronizeRequest getLeftRequest() { @@ -30,20 +39,29 @@ public class ReferentialSynchronizeServiceProduceSqlsRequest { return rightRequest; } + public Set<Class<? extends ReferentialDto>> getReferentialTypesInShell() { + return referentialTypesInShell; + } + public static class Builder { private final ReferentialSynchronizeRequest.Builder leftRequestBuilder; private final ReferentialSynchronizeRequest.Builder rightRequestBuilder; - - private Builder() { - leftRequestBuilder = ReferentialSynchronizeRequest.builder(); - rightRequestBuilder = ReferentialSynchronizeRequest.builder(); + private final Set<Class<? extends ReferentialDto>> referentialTypesInShell; + + private Builder(ImmutableSetMultimap<Class<? extends ReferentialDto>, String> leftIdsOnlyExistingOnThisSide, + ImmutableSetMultimap<Class<? extends ReferentialDto>, String> rightIdsOnlyExistingOnThisSide, + Set<Class<? extends ReferentialDto>> referentialTypesInShell) { + leftRequestBuilder = ReferentialSynchronizeRequest.builder(leftIdsOnlyExistingOnThisSide); + rightRequestBuilder = ReferentialSynchronizeRequest.builder(rightIdsOnlyExistingOnThisSide); + this.referentialTypesInShell = referentialTypesInShell; } public ReferentialSynchronizeServiceProduceSqlsRequest build() { return new ReferentialSynchronizeServiceProduceSqlsRequest(leftRequestBuilder.build(), - rightRequestBuilder.build()); + rightRequestBuilder.build(), + referentialTypesInShell); } @@ -52,7 +70,21 @@ public class ReferentialSynchronizeServiceProduceSqlsRequest { Class<R> type, String id, String replaceId) { - getRequestBuilder(left).addTask(taskType, type, id, replaceId); + + ReferentialSynchronizeRequest.Builder requestBuilder = getRequestBuilder(left); + requestBuilder.addTask(taskType, type, id, replaceId); + + if (ReferentialSynchronizeTaskType.ADD == taskType) { + + // le referentiel est à ajouter, il sera donc disponible dans les deux sources + requestBuilder.removeIdOnlyExistOnThisSide(type, id); + + } else if (ReferentialSynchronizeTaskType.DELETE == taskType) { + + // le référentiel est supprimer, il ne sera donc plus disponible du tout + getRequestBuilder(!left).removeIdOnlyExistOnThisSide(type, id); + + } return this; } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequestBuilder.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequestBuilder.java index 1de4f5a..e344d99 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequestBuilder.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequestBuilder.java @@ -10,8 +10,10 @@ import fr.ird.observe.services.service.actions.synchro.referential.ng.task.Refer import fr.ird.observe.services.service.actions.synchro.referential.sql.DeleteSqlStatementGenerator; import fr.ird.observe.services.service.actions.synchro.referential.sql.DesactivateSqlStatementGenerator; import fr.ird.observe.services.service.actions.synchro.referential.sql.InsertSqlStatementGenerator; +import fr.ird.observe.services.service.actions.synchro.referential.sql.InsertSqlWithCascadeStatementGenerator; import fr.ird.observe.services.service.actions.synchro.referential.sql.ReplaceSqlStatementGenerator; import fr.ird.observe.services.service.actions.synchro.referential.sql.UpdateSqlStatementGenerator; +import fr.ird.observe.services.service.actions.synchro.referential.sql.UpdateSqlWithCascadeStatementGenerator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; @@ -107,16 +109,39 @@ public class ReferentialSynchronizeSqlsRequestBuilder { ReferentialBinderSupport<E, R> binder = binderEngine.getReferentialBinder(type); Class<E> entityType = binderEngine.getReferentialEntityType(type); TopiaMetadataEntity metadata = metadataModel.getEntity(referentialName); - InsertSqlStatementGenerator<R> insertGenerator = new InsertSqlStatementGenerator<>(metadata, type); List<E> insertEntities = loadEntities(entityType, tasks); - for (E entity : insertEntities) { - R referential = binder.toDto(referentialLocale, entity); - String sql = insertGenerator.generateSql(referential); + if (metadata.withShell()) { - if (log.isInfoEnabled()) { - log.info("Insert referential: " + type.getName() + " / " + referential.getId() + " -- " + sql); + InsertSqlWithCascadeStatementGenerator<R> insertGenerator = new InsertSqlWithCascadeStatementGenerator<R>(metadata, type, request.getIdsOnlyExistingOnThisSide()) { + + @Override + protected <D extends ReferentialDto> String insertMissingReferential(Class<D> referentialType, String id) { + return addExtraInsertStatement(referentialType, id); + } + }; + + for (E entity : insertEntities) { + R referential = binder.toDto(referentialLocale, entity); + String sql = insertGenerator.generateSql(referential); + + if (log.isInfoEnabled()) { + log.info("Insert referential: " + type.getName() + " / " + referential.getId() + " -- " + sql); + } + resultBuilder.addInsertStatement(sql); + } + + } else { + + InsertSqlStatementGenerator<R> insertGenerator = new InsertSqlStatementGenerator<>(metadata, type); + for (E entity : insertEntities) { + R referential = binder.toDto(referentialLocale, entity); + String sql = insertGenerator.generateSql(referential); + + if (log.isInfoEnabled()) { + log.info("Insert referential: " + type.getName() + " / " + referential.getId() + " -- " + sql); + } + resultBuilder.addInsertStatement(sql); } - resultBuilder.addInsertStatement(sql); } } @@ -126,19 +151,41 @@ public class ReferentialSynchronizeSqlsRequestBuilder { ReferentialBinderSupport<E, R> binder = binderEngine.getReferentialBinder(type); TopiaMetadataEntity metadata = metadataModel.getEntity(referentialName); Class<E> entityType = binderEngine.getReferentialEntityType(type); - - UpdateSqlStatementGenerator<R> updateGenerator = new UpdateSqlStatementGenerator<>(metadata, type); List<E> updateEntities = loadEntities(entityType, tasks); - for (E entity : updateEntities) { - R referential = binder.toDto(referentialLocale, entity); - String sql = updateGenerator.generateSql(referential); - if (log.isInfoEnabled()) { - log.info("Update referential: " + type.getName() + " / " + referential.getId() + " -- " + sql); + if (metadata.withShell()) { + + UpdateSqlWithCascadeStatementGenerator<R> updateGenerator = new UpdateSqlWithCascadeStatementGenerator<R>(metadata, type, request.getIdsOnlyExistingOnThisSide()) { + @Override + protected <D extends ReferentialDto> String insertMissingReferential(Class<D> referentialType, String id) { + return addExtraInsertStatement(referentialType, id); + } + }; + for (E entity : updateEntities) { + R referential = binder.toDto(referentialLocale, entity); + String sql = updateGenerator.generateSql(referential); + + if (log.isInfoEnabled()) { + log.info("Update referential: " + type.getName() + " / " + referential.getId() + " -- " + sql); + } + resultBuilder.addUpdateStatement(sql); + } + + } else { + + UpdateSqlStatementGenerator<R> updateGenerator = new UpdateSqlStatementGenerator<>(metadata, type); + for (E entity : updateEntities) { + R referential = binder.toDto(referentialLocale, entity); + String sql = updateGenerator.generateSql(referential); + + if (log.isInfoEnabled()) { + log.info("Update referential: " + type.getName() + " / " + referential.getId() + " -- " + sql); + } + resultBuilder.addUpdateStatement(sql); } - resultBuilder.addUpdateStatement(sql); } + } private <R extends ReferentialDto, E extends ObserveReferentialEntity> void onRevert(String referentialName, Class<R> type, Set<ReferentialSynchronizeTask<R>> tasks) { @@ -224,6 +271,20 @@ public class ReferentialSynchronizeSqlsRequestBuilder { } + private <R extends ReferentialDto, E extends ObserveReferentialEntity> String addExtraInsertStatement(Class<R> referentialType, String id) { + + Class<E> entityType = binderEngine.getReferentialEntityType(referentialType); + String referentialName = ObserveEntityEnum.valueOf(entityType).name(); + TopiaMetadataEntity metadata = metadataModel.getEntity(referentialName); + + InsertSqlStatementGenerator<R> insertGenerator = new InsertSqlStatementGenerator<>(metadata, referentialType); + R referential = service.loadEntityToReferentialDto(referentialType, id); + + String sql = insertGenerator.generateSql(referential); + return sql; + + } + private <R extends ReferentialDto, E extends ObserveReferentialEntity> List<E> loadEntities(Class<E> entityType, Set<ReferentialSynchronizeTask<R>> tasks) { Set<String> ids = tasks.stream().map(ReferentialSynchronizeTask::getReferentialId).collect(Collectors.toSet()); diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/InsertSqlStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/InsertSqlStatementGenerator.java index 74e53cd..fd25ccd 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/InsertSqlStatementGenerator.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/InsertSqlStatementGenerator.java @@ -22,6 +22,8 @@ package fr.ird.observe.services.service.actions.synchro.referential.sql; * #L% */ +import fr.ird.observe.ObserveEntityEnum; +import fr.ird.observe.services.binder.BinderEngine; import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.dto.referential.ReferentialReference; import org.apache.commons.collections4.CollectionUtils; @@ -85,10 +87,13 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> { */ private final String tableName; - private ManyToManyAssociationStruct(String propertyName, String dbColumnName, String tableName) { + private final Class<? extends ReferentialDto> type; + + private ManyToManyAssociationStruct(String propertyName, String dbColumnName, String tableName, Class<? extends ReferentialDto> type) { this.propertyName = propertyName; this.dbColumnName = dbColumnName; this.tableName = tableName; + this.type = type; } } @@ -111,7 +116,10 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> { String propertyName = entry.getKey(); String dbColumnName = metadataEntity.getDbColumnName(propertyName); String tableName = metadataEntity.getBdManyToManyAssociationTableName(propertyName); - ManyToManyAssociationStruct manyToManyAssociation = new ManyToManyAssociationStruct(propertyName, dbColumnName, tableName); + String typeName = entry.getValue(); + Class entityType = ObserveEntityEnum.valueOf(typeName).getContract(); + Class<? extends ReferentialDto> referentialype = BinderEngine.get().getReferentialDtoType(entityType); + ManyToManyAssociationStruct manyToManyAssociation = new ManyToManyAssociationStruct(propertyName, dbColumnName, tableName, referentialype); manyToManyAssociations.add(manyToManyAssociation); } this.columnNames = computeColumnNames(metadataEntity, simplePropertyNames, manyToOneAssociationNames); @@ -214,17 +222,7 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> { for (ReferentialReference<?> nmAssociationValue : manyToManyAssociationValues) { - String sql = String.format(NM_ASSOCIATION_INSERT_STATEMENT, - schemaName, - nmAssociationTableName, - this.tableName, - nmAssociationDbColumnName, - referentialDtoId, - nmAssociationValue.getId()); - if (log.isDebugEnabled()) { - log.debug("sql: " + sql); - } - builder.append(sql); + addMnAssociation(nmAssociationTableName, nmAssociationDbColumnName, referentialDtoId, manyToManyAssociationStruct.type, nmAssociationValue.getId(), builder); } } @@ -233,6 +231,28 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> { } + protected <D extends ReferentialDto> void addMnAssociation(String nmAssociationTableName, + String nmAssociationDbColumnName, + String referentialDtoId, + Class<D> associationType, + String associationId, + StringBuilder builder) { + + + String sql = String.format(NM_ASSOCIATION_INSERT_STATEMENT, + schemaName, + nmAssociationTableName, + this.tableName, + nmAssociationDbColumnName, + referentialDtoId, + associationId); + if (log.isDebugEnabled()) { + log.debug("sql: " + sql); + } + builder.append(sql); + + } + private Set<String> computeColumnNames(TopiaMetadataEntity metadataEntity, String[] simplePropertyNames, String[] compositionPropertyNames) { @@ -291,11 +311,11 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> { parameters.add("" + parameter); } - private void addReferentialReferenceParameter(ReferentialReference parameter, List<String> parameters) { + protected void addReferentialReferenceParameter(ReferentialReference parameter, List<String> parameters) { addStringParameter(parameter.getId(), parameters); } - private void addReferentialDtoParameter(ReferentialDto parameter, List<String> parameters) { + protected void addReferentialDtoParameter(ReferentialDto parameter, List<String> parameters) { addStringParameter(parameter.getId(), parameters); } } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/InsertSqlWithCascadeStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/InsertSqlWithCascadeStatementGenerator.java new file mode 100644 index 0000000..95eb3d3 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/InsertSqlWithCascadeStatementGenerator.java @@ -0,0 +1,105 @@ +package fr.ird.observe.services.service.actions.synchro.referential.sql; + +/*- + * #%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.SetMultimap; +import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; + +import java.util.List; + +/** + * Pour générer une requète sql d'ajout à partir d'un référentiel donné et aussi tous les inserts manquants + * + * Created on 29/06/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public abstract class InsertSqlWithCascadeStatementGenerator<R extends ReferentialDto> { + + /** Logger. */ + private static final Log log = LogFactory.getLog(InsertSqlWithCascadeStatementGenerator.class); + + private final InsertSqlStatementGenerator<R> delegateGenerator; + private final SetMultimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide; + + private final StringBuilder sqlBuilder = new StringBuilder(); + + protected abstract <D extends ReferentialDto> String insertMissingReferential(Class<D> referentialType, String id); + + public InsertSqlWithCascadeStatementGenerator(TopiaMetadataEntity metadataEntity, + Class<R> dtoType, + SetMultimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide) { + this.idsOnlyExistingOnThisSide = idsOnlyExistingOnThisSide; + this.delegateGenerator = new InsertSqlStatementGenerator<R>(metadataEntity, dtoType) { + + @Override + protected <D extends ReferentialDto> void addMnAssociation(String nmAssociationTableName, String nmAssociationDbColumnName, String referentialDtoId, Class<D> associationType, String associationId, StringBuilder builder) { + super.addMnAssociation(nmAssociationTableName, nmAssociationDbColumnName, referentialDtoId, associationType, associationId, builder); + addMissingReferentialIfNecessary(associationType, associationId); + } + + @Override + protected void addReferentialReferenceParameter(ReferentialReference parameter, List<String> parameters) { + super.addReferentialReferenceParameter(parameter, parameters); + addMissingReferentialIfNecessary(parameter.getType(), parameter.getId()); + } + + @Override + protected void addReferentialDtoParameter(ReferentialDto parameter, List<String> parameters) { + super.addReferentialDtoParameter(parameter, parameters); + addMissingReferentialIfNecessary(parameter.getClass(), parameter.getId()); + } + }; + } + + public String generateSql(R referentialDto) { + + String sql = delegateGenerator.generateSql(referentialDto); + sqlBuilder.append(sql); + return sqlBuilder.toString(); + + } + + private <D extends ReferentialDto> String addMissingReferentialIfNecessary(Class<D> associationType, String associationId) { + + if (idsOnlyExistingOnThisSide.containsEntry(associationType, associationId)) { + + // il faut insérer aussi ce référentiel + String sql = insertMissingReferential(associationType, associationId); + sqlBuilder.append(sql); + + // ce référentiel est désormais présent dans les deux sources + idsOnlyExistingOnThisSide.remove(associationType, associationId); + + return sql; + + } + return null; + } + +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java index 3fbf6d7..1a0556c 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java @@ -249,18 +249,14 @@ public class UpdateSqlStatementGenerator<R extends ReferentialDto> { for (ReferentialReference<?> manyToManyAssociationValue : manyToManyAssociationValues) { - String sql = String.format(MANY_TO_MANY_ASSOCIATION_INSERT_STATEMENT, - schemaName, - manyToManyAssociationTableName, - tableName, - manyToManyAssociationDbColumnName, - referentialDtoId, - manyToManyAssociationValue.getId()); - if (log.isDebugEnabled()) { - log.debug("sql: " + sql); - } - builder.append(sql); - + addMnAssociation( + manyToManyAssociationTableName, + manyToManyAssociationDbColumnName, + referentialDtoId, + manyToManyAssociationValue.getType(), + manyToManyAssociationValue.getId(), + builder + ); } } @@ -268,6 +264,27 @@ public class UpdateSqlStatementGenerator<R extends ReferentialDto> { } + protected <D extends ReferentialDto> void addMnAssociation(String nmAssociationTableName, + String nmAssociationDbColumnName, + String referentialDtoId, + Class<D> associationType, + String associationId, + StringBuilder builder) { + + String sql = String.format(MANY_TO_MANY_ASSOCIATION_INSERT_STATEMENT, + schemaName, + nmAssociationTableName, + this.tableName, + nmAssociationDbColumnName, + referentialDtoId, + associationId); + if (log.isDebugEnabled()) { + log.debug("sql: " + sql); + } + builder.append(sql); + + } + private Map<String, String> computeColumnNames(TopiaMetadataEntity metadataEntity, String[] simplePropertyNames, String[] compositionPropertyNames) { @@ -306,11 +323,11 @@ public class UpdateSqlStatementGenerator<R extends ReferentialDto> { addParameter0(columnName, "" + parameter, parameters); } - private void addReferentialReferenceParameter(String columnName, ReferentialReference parameter, StringBuilder parameters) { + protected void addReferentialReferenceParameter(String columnName, ReferentialReference parameter, StringBuilder parameters) { addStringParameter(columnName, parameter.getId(), parameters); } - private void addReferentialDtoParameter(String columnName, ReferentialDto parameter, StringBuilder parameters) { + protected void addReferentialDtoParameter(String columnName, ReferentialDto parameter, StringBuilder parameters) { addStringParameter(columnName, parameter.getId(), parameters); } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/UpdateSqlWithCascadeStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/UpdateSqlWithCascadeStatementGenerator.java new file mode 100644 index 0000000..8493869 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/referential/sql/UpdateSqlWithCascadeStatementGenerator.java @@ -0,0 +1,103 @@ +package fr.ird.observe.services.service.actions.synchro.referential.sql; + +/*- + * #%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.SetMultimap; +import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; + +/** + * Pour générer une requète sql d'ajout à partir d'un référentiel donné et aussi tous les inserts manquants. + * + * Created on 29/06/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public abstract class UpdateSqlWithCascadeStatementGenerator<R extends ReferentialDto> { + + /** Logger. */ + private static final Log log = LogFactory.getLog(UpdateSqlWithCascadeStatementGenerator.class); + + private final UpdateSqlStatementGenerator<R> delegateGenerator; + private final SetMultimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide; + + private final StringBuilder sqlBuilder = new StringBuilder(); + + protected abstract <D extends ReferentialDto> String insertMissingReferential(Class<D> referentialType, String id); + + public UpdateSqlWithCascadeStatementGenerator(TopiaMetadataEntity metadataEntity, + Class<R> dtoType, + SetMultimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide) { + this.idsOnlyExistingOnThisSide = idsOnlyExistingOnThisSide; + this.delegateGenerator = new UpdateSqlStatementGenerator<R>(metadataEntity, dtoType) { + + @Override + protected <D extends ReferentialDto> void addMnAssociation(String nmAssociationTableName, String nmAssociationDbColumnName, String referentialDtoId, Class<D> associationType, String associationId, StringBuilder builder) { + super.addMnAssociation(nmAssociationTableName, nmAssociationDbColumnName, referentialDtoId, associationType, associationId, builder); + addMissingReferentialIfNecessary(associationType, associationId); + } + + @Override + protected void addReferentialReferenceParameter(String columnName, ReferentialReference parameter, StringBuilder parameters) { + super.addReferentialReferenceParameter(columnName, parameter, parameters); + addMissingReferentialIfNecessary(parameter.getType(), parameter.getId()); + } + + @Override + protected void addReferentialDtoParameter(String columnName, ReferentialDto parameter, StringBuilder parameters) { + super.addReferentialDtoParameter(columnName, parameter, parameters); + addMissingReferentialIfNecessary(parameter.getClass(), parameter.getId()); + } + }; + } + + public String generateSql(R referentialDto) { + + String sql = delegateGenerator.generateSql(referentialDto); + sqlBuilder.append(sql); + return sqlBuilder.toString(); + + } + + private <D extends ReferentialDto> String addMissingReferentialIfNecessary(Class<D> associationType, String associationId) { + + if (idsOnlyExistingOnThisSide.containsEntry(associationType, associationId)) { + + // il faut insérer aussi ce référentiel + String sql = insertMissingReferential(associationType, associationId); + sqlBuilder.append(sql); + + // ce référentiel est désormais présent dans les deux sources + idsOnlyExistingOnThisSide.remove(associationType, associationId); + + return sql; + + } + return null; + } + +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm