Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 5ad12da3 by Tony Chemit at 2020-05-18T12:41:05+02:00 [SYNCHRO MAREES] L'assistant demande un remplacement de code manquant, même si celui-ci n'est pas utilisé par les données (Do not take account of referential usages) - See #1432 - - - - - 4b175471 by Tony Chemit at 2020-05-18T12:41:21+02:00 Ne pas sauvegarder automatiquement la base locale lors d'une action longue - Close #1487 - - - - - a0611f51 by Tony Chemit at 2020-05-18T12:56:36+02:00 [SYNCHRO MAREES] L'assistant demande un remplacement de code manquant, même si celui-ci n'est pas utilisé par les données (Improve generator code) - See #1432 - - - - - 10 changed files: - client-core/src/main/java/fr/ird/observe/client/ui/admin/AdminUIHandler.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/legacy/UnidirectionalReferentialSynchronizeLocalServiceLocal.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlListRequestBuilder.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/InsertSqlGenerator.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/InsertSqlStatementGenerator.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/InsertSqlWithCascadeStatementGenerator.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlGenerator.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlWithCascadeStatementGenerator.java - + services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/WithCascadeStatementGenerator.java Changes: ===================================== client-core/src/main/java/fr/ird/observe/client/ui/admin/AdminUIHandler.java ===================================== @@ -45,6 +45,7 @@ import org.nuiton.jaxx.runtime.swing.wizard.ext.WizardState; import javax.swing.Icon; import javax.swing.JCheckBox; import javax.swing.JComponent; +import javax.swing.SwingUtilities; import javax.swing.border.TitledBorder; import java.awt.Component; import java.util.Arrays; @@ -281,7 +282,9 @@ public class AdminUIHandler implements UIHandler<AdminUI> { if (ui.getModel().getStepState(AdminStep.SAVE_LOCAL) == WizardState.PENDING) { SaveLocalUI tabUI = (SaveLocalUI) ui.getStepUI(AdminStep.SAVE_LOCAL); - tabUI.getStartAction().doClick(); + if (!tabUI.getStepModel().isLocalSourceNeedSave()) { + SwingUtilities.invokeLater(tabUI.getContinueAction()::doClick); + } } } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/legacy/UnidirectionalReferentialSynchronizeLocalServiceLocal.java ===================================== @@ -110,7 +110,7 @@ public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends Obser TopiaMetadataEntity metadataEntity = metadataModel.getEntity(referentielName); if (request.withReferentialToAdd()) { - InsertSqlStatementGenerator<D> sqlStatementGenerator = new InsertSqlStatementGenerator<>(metadataModel, metadataEntity, dtoType); + InsertSqlStatementGenerator sqlStatementGenerator = new InsertSqlStatementGenerator(metadataModel, metadataEntity); ImmutableSet<D> referentialToAdd = request.getReferentialToAdd(); if (ObjectMaterialDto.class.equals(dtoType)) { @@ -127,7 +127,7 @@ public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends Obser if (request.withReferentialToUpdate()) { - UpdateSqlStatementGenerator<D> sqlStatementGenerator = new UpdateSqlStatementGenerator<>(metadataModel, metadataEntity, dtoType); + UpdateSqlStatementGenerator sqlStatementGenerator = new UpdateSqlStatementGenerator(metadataModel, metadataEntity); for (D referentialDto : request.getReferentialToUpdate()) { ImmutableList<String> sql = sqlStatementGenerator.generateSql(referentialDto, null, null); result.addAll(sql); @@ -169,8 +169,11 @@ public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends Obser E e = dao.forTopiaIdEquals(id).findUnique(); Map<Class<? extends TopiaEntity>, List<? extends TopiaEntity>> allUsages = dao.findAllUsages(e); int count = 0; - for (List<? extends TopiaEntity> entities : allUsages.values()) { - count += entities.size(); + for (Map.Entry<Class<? extends TopiaEntity>, List<? extends TopiaEntity>> entry : allUsages.entrySet()) { + if (ObserveReferentialEntity.class.isAssignableFrom(entry.getKey())) { + continue; + } + count+=entry.getValue().size(); } return count; ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlListRequestBuilder.java ===================================== @@ -144,20 +144,13 @@ public class ReferentialSynchronizeSqlListRequestBuilder { Class<E> entityType = binder.getEntityType(); Class<D> dtoType = binder.getDtoType(); List<E> insertEntities = loadEntities(entityType, tasks); - InsertSqlGenerator<D> insertGenerator; + InsertSqlGenerator insertGenerator; if (metadata.withEntities()) { Multimap<Class<? extends ReferentialDto>, String> allIds = ArrayListMultimap.create(request.getIdsOnlyExistingOnThisSide()); allIds.putAll(newIds); - insertGenerator = new InsertSqlWithCascadeStatementGenerator<D>(metadataModel, metadata, dtoType, allIds) { - - @Override - protected <DD extends ReferentialDto> ImmutableList<String> insertMissingReferential(Class<DD> referentialType, String id) { - ReferentialDtoEntityContext<DD, ?, ?> modelContext = DbModelHelper.fromReferentialDto(referentialType); - return addExtraInsertStatement(id, modelContext.toEntityBinder()); - } - }; + insertGenerator = new InsertSqlWithCascadeStatementGenerator(service, metadataModel, metadata, dtoType, allIds); } else { - insertGenerator = new InsertSqlStatementGenerator<>(metadataModel, metadata, dtoType); + insertGenerator = new InsertSqlStatementGenerator(metadataModel, metadata); } for (E entity : insertEntities) { @@ -173,24 +166,13 @@ public class ReferentialSynchronizeSqlListRequestBuilder { private <D extends ReferentialDto, E extends ObserveReferentialEntity> void onUpdate(TopiaMetadataEntity metadata, Set<ReferentialSynchronizeTask> tasks, ReferentialEntityDtoBinderSupport<D, E> binder, Multimap<Class<? extends ReferentialDto>, String> newIds) { - Class<D> dtoType = binder.getDtoType(); - UpdateSqlGenerator<D> updateGenerator; - + UpdateSqlGenerator updateGenerator; if (metadata.withEntities()) { - Multimap<Class<? extends ReferentialDto>, String> allIds = ArrayListMultimap.create(request.getIdsOnlyExistingOnThisSide()); allIds.putAll(newIds); - - updateGenerator = new UpdateSqlWithCascadeStatementGenerator<D>(metadataModel, metadata, dtoType, request.getIdsOnlyExistingOnThisSide()) { - @Override - protected <DD extends ReferentialDto> ImmutableList<String> insertMissingReferential(Class<DD> referentialType, String id) { - ReferentialEntityDtoBinderSupport<DD, ObserveReferentialEntity> binder = DbModelHelper.fromReferentialDto(referentialType).toEntityBinder(); - return addExtraInsertStatement(id, binder); - } - }; - + updateGenerator = new UpdateSqlWithCascadeStatementGenerator(service, metadataModel, metadata, request.getIdsOnlyExistingOnThisSide()); } else { - updateGenerator = new UpdateSqlStatementGenerator<>(metadataModel, metadata, dtoType); + updateGenerator = new UpdateSqlStatementGenerator(metadataModel, metadata); } for (ReferentialSynchronizeTask task : tasks) { @@ -208,7 +190,7 @@ public class ReferentialSynchronizeSqlListRequestBuilder { private <D extends ReferentialDto, E extends ObserveReferentialEntity> void onRevert(TopiaMetadataEntity metadata, Set<ReferentialSynchronizeTask> tasks, ReferentialEntityDtoBinderSupport<D, E> binder) { - UpdateSqlStatementGenerator<D> updateGenerator = new UpdateSqlStatementGenerator<>(metadataModel, metadata, binder.getDtoType()); + UpdateSqlStatementGenerator updateGenerator = new UpdateSqlStatementGenerator(metadataModel, metadata); for (ReferentialSynchronizeTask task : tasks) { E entity = loadEntity(task); D referential = binder.toDto(referentialLocale, entity); @@ -279,20 +261,6 @@ public class ReferentialSynchronizeSqlListRequestBuilder { } - private <D extends ReferentialDto, E extends ObserveReferentialEntity> ImmutableList<String> addExtraInsertStatement(String id, ReferentialEntityDtoBinderSupport<D, E> binder) { - - Class<E> entityType = binder.getEntityType(); - Class<D> dtoType = binder.getDtoType(); - String referentialName = ObserveEntityEnum.valueOf(entityType).name(); - TopiaMetadataEntity metadata = metadataModel.getEntity(referentialName); - - InsertSqlStatementGenerator<D> insertGenerator = new InsertSqlStatementGenerator<>(metadataModel, metadata, dtoType); - D referential = service.loadEntityToReferentialDto(binder, id); - - return insertGenerator.generateSql(referential); - - } - private <E extends ObserveReferentialEntity> List<E> loadEntities(Class<E> entityType, Set<ReferentialSynchronizeTask> tasks) { Set<String> ids = tasks.stream().map(ReferentialSynchronizeTask::getReferentialId).collect(Collectors.toSet()); return service.getTopiaPersistenceContext().loadEntities(entityType, ids); ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/InsertSqlGenerator.java ===================================== @@ -29,7 +29,7 @@ import fr.ird.observe.dto.referential.ReferentialDto; * @author Tony Chemit - dev@tchemit.fr * @since ? */ -public interface InsertSqlGenerator<D extends ReferentialDto> { +public interface InsertSqlGenerator { - ImmutableList<String> generateSql(D referentialDto); + ImmutableList<String> generateSql(ReferentialDto referentialDto); } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/InsertSqlStatementGenerator.java ===================================== @@ -48,7 +48,7 @@ import java.util.Set; * * @author Tony Chemit - dev@tchemit.fr */ -public class InsertSqlStatementGenerator<D extends ReferentialDto> implements InsertSqlGenerator<D> { +public class InsertSqlStatementGenerator implements InsertSqlGenerator { private final TopiaMetadataEntity metadataEntity; private final Set<TopiaMetadataComposition> compositions; @@ -61,7 +61,7 @@ public class InsertSqlStatementGenerator<D extends ReferentialDto> implements In private final Set<String> primitiveLongPropertyNames; private final Set<String> primitiveFloatPropertyNames; - public InsertSqlStatementGenerator(TopiaMetadataModel topiaMetadataModel, TopiaMetadataEntity metadataEntity, Class<D> dtoType) { + public InsertSqlStatementGenerator(TopiaMetadataModel topiaMetadataModel, TopiaMetadataEntity metadataEntity) { this.metadataEntity = Objects.requireNonNull(metadataEntity); this.compositions = topiaMetadataModel.getCompositions(this.metadataEntity); this.associations = topiaMetadataModel.getAssociations(this.metadataEntity); @@ -79,7 +79,7 @@ public class InsertSqlStatementGenerator<D extends ReferentialDto> implements In @SuppressWarnings("unchecked") @Override - public ImmutableList<String> generateSql(D referentialDto) { + public ImmutableList<String> generateSql(ReferentialDto referentialDto) { ImmutableList.Builder<String> result = ImmutableList.builder(); @@ -153,9 +153,8 @@ public class InsertSqlStatementGenerator<D extends ReferentialDto> implements In for (TopiaMetadataAssociation association : associations) { Collection<ReferentialDtoReference<?, ?>> associationValues = referentialDto.get(association.getTargetPropertyName()); - for (ReferentialDtoReference<?, ?> associationValue : associationValues) { - String insertAssocationSql = TopiaSqlStatements.generateAssociationInsertStatement(association, id, associationValue.getId()); - result.add(TopiaSqlStatements.boxAssociationStatement(insertAssocationSql)); + for (@SuppressWarnings("rawtypes") ReferentialDtoReference associationValue : associationValues) { + addAssociation(association, id, associationValue, result); } } return result.build(); ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/InsertSqlWithCascadeStatementGenerator.java ===================================== @@ -26,6 +26,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ReferentialDto; +import fr.ird.observe.services.local.service.actions.synchro.referential.ng.ReferentialSynchronizeServiceLocal; import org.nuiton.topia.persistence.metadata.TopiaMetadataAssociation; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; @@ -40,16 +41,17 @@ import java.util.List; * @author Tony Chemit - dev@tchemit.fr * @since 5.0 */ -public abstract class InsertSqlWithCascadeStatementGenerator<D extends ReferentialDto> implements InsertSqlGenerator<D>{ +public class InsertSqlWithCascadeStatementGenerator extends WithCascadeStatementGenerator implements InsertSqlGenerator { - private final InsertSqlStatementGenerator<D> delegateGenerator; - private final Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide; + private final InsertSqlStatementGenerator delegateGenerator; - protected InsertSqlWithCascadeStatementGenerator(TopiaMetadataModel topiaMetadataModel, TopiaMetadataEntity metadataEntity, - Class<D> dtoType, + public InsertSqlWithCascadeStatementGenerator(ReferentialSynchronizeServiceLocal service, + TopiaMetadataModel topiaMetadataModel, + TopiaMetadataEntity metadataEntity, + Class<? extends ReferentialDto> dtoType, Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide) { - this.idsOnlyExistingOnThisSide = idsOnlyExistingOnThisSide; - this.delegateGenerator = new InsertSqlStatementGenerator<D>(topiaMetadataModel, metadataEntity, dtoType) { + super(service, topiaMetadataModel); + this.delegateGenerator = new InsertSqlStatementGenerator(topiaMetadataModel, metadataEntity) { @Override <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association, @@ -57,45 +59,26 @@ public abstract class InsertSqlWithCascadeStatementGenerator<D extends Referenti RR associationValue, ImmutableList.Builder<String> builder) { super.addAssociation(association, sourceId, associationValue, builder); - addMissingReferentialIfNecessary(associationValue.getDtoType(), associationValue.getId(), builder); + addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, associationValue.getDtoType(), associationValue.getId(), builder); } @Override protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(RR parameter, List<String> parameters, ImmutableList.Builder<String> result) { super.addReferentialReferenceParameter(parameter, parameters, result); - addMissingReferentialIfNecessary(parameter.getDtoType(), parameter.getId(), result); + addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, parameter.getDtoType(), parameter.getId(), result); } @Override protected <DD extends ReferentialDto> void addReferentialDtoParameter(DD parameter, List<String> parameters, ImmutableList.Builder<String> result) { super.addReferentialDtoParameter(parameter, parameters, result); - addMissingReferentialIfNecessary(dtoType, parameter.getId(), result); + addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, dtoType, parameter.getId(), result); } }; } - protected abstract <DD extends ReferentialDto> ImmutableList<String> insertMissingReferential(Class<DD> referentialType, String id); - @Override - public ImmutableList<String> generateSql(D referentialDto) { - + public ImmutableList<String> generateSql(ReferentialDto referentialDto) { return delegateGenerator.generateSql(referentialDto); - - } - - private <DD extends ReferentialDto> void addMissingReferentialIfNecessary(Class<DD> associationType, String associationId, ImmutableList.Builder<String> builder) { - - if (idsOnlyExistingOnThisSide.containsEntry(associationType, associationId)) { - - // il faut insérer aussi ce référentiel - ImmutableList<String> sql = insertMissingReferential(associationType, associationId); - - builder.addAll(sql); - - // ce référentiel est désormais présent dans les deux sources - idsOnlyExistingOnThisSide.remove(associationType, associationId); - - } } } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlGenerator.java ===================================== @@ -32,7 +32,7 @@ import java.util.Date; * @author Tony Chemit - dev@tchemit.fr * @since 5 */ -public interface UpdateSqlGenerator<D extends ReferentialDto> { +public interface UpdateSqlGenerator { /** * Generate update sql requests for the given{@code referentialDto}. ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java ===================================== @@ -55,7 +55,7 @@ import java.util.stream.Collectors; * * @author Tony Chemit - dev@tchemit.fr */ -public class UpdateSqlStatementGenerator<D extends ReferentialDto>implements UpdateSqlGenerator<D> { +public class UpdateSqlStatementGenerator implements UpdateSqlGenerator { private static final Logger log = LogManager.getLogger(UpdateSqlStatementGenerator.class); private final Map<String, String> columnNames; @@ -69,7 +69,7 @@ public class UpdateSqlStatementGenerator<D extends ReferentialDto>implements Upd private final Set<String> primitiveFloatPropertyNames; private final Set<String> primitiveDoublePropertyNames; - public UpdateSqlStatementGenerator(TopiaMetadataModel topiaMetadataModel, TopiaMetadataEntity metadataEntity, Class<D> dtoType) { + public UpdateSqlStatementGenerator(TopiaMetadataModel topiaMetadataModel, TopiaMetadataEntity metadataEntity) { this.metadataEntity = Objects.requireNonNull(metadataEntity); this.compositions = topiaMetadataModel.getCompositions(metadataEntity); this.associations = topiaMetadataModel.getAssociations(metadataEntity); ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlWithCascadeStatementGenerator.java ===================================== @@ -27,6 +27,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ReferentialDto; +import fr.ird.observe.services.local.service.actions.synchro.referential.ng.ReferentialSynchronizeServiceLocal; import org.nuiton.topia.persistence.metadata.TopiaMetadataAssociation; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; @@ -41,17 +42,16 @@ import java.util.Date; * @author Tony Chemit - dev@tchemit.fr * @since 5.0 */ -public abstract class UpdateSqlWithCascadeStatementGenerator<D extends ReferentialDto> implements UpdateSqlGenerator<D> { +public class UpdateSqlWithCascadeStatementGenerator extends WithCascadeStatementGenerator implements UpdateSqlGenerator { - private final UpdateSqlStatementGenerator<D> delegateGenerator; - private final Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide; + private final UpdateSqlStatementGenerator delegateGenerator; - protected UpdateSqlWithCascadeStatementGenerator(TopiaMetadataModel topiaMetadataModel, + public UpdateSqlWithCascadeStatementGenerator(ReferentialSynchronizeServiceLocal service, + TopiaMetadataModel topiaMetadataModel, TopiaMetadataEntity metadataEntity, - Class<D> dtoType, Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide) { - this.idsOnlyExistingOnThisSide = idsOnlyExistingOnThisSide; - this.delegateGenerator = new UpdateSqlStatementGenerator<D>(topiaMetadataModel, metadataEntity, dtoType) { + super(service, topiaMetadataModel); + this.delegateGenerator = new UpdateSqlStatementGenerator(topiaMetadataModel, metadataEntity) { <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association, @@ -59,41 +59,25 @@ public abstract class UpdateSqlWithCascadeStatementGenerator<D extends Referenti RR associationValue, ImmutableList.Builder<String> builder) { super.addAssociation(association, sourceId, associationValue, builder); - addMissingReferentialIfNecessary(associationValue.getDtoType(), associationValue.getId(), builder); + addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, associationValue.getDtoType(), associationValue.getId(), builder); } @Override protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(String columnName, RR parameter, StringBuilder parameters, ImmutableList.Builder<String> result) { super.addReferentialReferenceParameter(columnName, parameter, parameters, result); - addMissingReferentialIfNecessary(parameter.getDtoType(), parameter.getId(), result); + addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, parameter.getDtoType(), parameter.getId(), result); } @Override protected <DD extends ReferentialDto> void addReferentialDtoParameter(String columnName, DD parameter, StringBuilder parameters, ImmutableList.Builder<String> result) { super.addReferentialDtoParameter(columnName, parameter, parameters, result); - addMissingReferentialIfNecessary(parameter.getClass(), parameter.getId(), result); + addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, parameter.getClass(), parameter.getId(), result); } }; } - protected abstract <DD extends ReferentialDto> ImmutableList<String> insertMissingReferential(Class<DD> referentialType, String id); - @Override - public ImmutableList<String> generateSql(ReferentialDto referentialDto, ImmutableSet<String> properties, Date addLastUpdateDate) { - return delegateGenerator.generateSql(referentialDto, properties, addLastUpdateDate); + public ImmutableList<String> generateSql(ReferentialDto referentialDto, ImmutableSet<String> properties, Date lastUpdateDate) { + return delegateGenerator.generateSql(referentialDto, properties, lastUpdateDate); } - - private <DD extends ReferentialDto> void addMissingReferentialIfNecessary(Class<DD> associationType, String associationId, ImmutableList.Builder<String> result) { - - if (idsOnlyExistingOnThisSide.containsEntry(associationType, associationId)) { - - // il faut insérer aussi ce référentiel - ImmutableList<String> sqlList = insertMissingReferential(associationType, associationId); - result.addAll(sqlList); - // ce référentiel est désormais présent dans les deux sources - idsOnlyExistingOnThisSide.remove(associationType, associationId); - - } - } - } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/WithCascadeStatementGenerator.java ===================================== @@ -0,0 +1,77 @@ +package fr.ird.observe.services.local.service.actions.synchro.referential.sql; + +/*- + * #%L + * ObServe :: Services local + * %% + * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Multimap; +import fr.ird.observe.dto.reference.ReferentialDtoReference; +import fr.ird.observe.dto.referential.ReferentialDto; +import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; +import fr.ird.observe.persistence.ObserveEntityEnum; +import fr.ird.observe.services.local.service.actions.synchro.referential.ng.ReferentialSynchronizeServiceLocal; +import fr.ird.observe.spi.DbModelHelper; +import fr.ird.observe.spi.context.ReferentialDtoEntityContext; +import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; +import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; + +/** + * Support statement generator when a cascade can be done on adding new referential. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 8.0 + */ +public abstract class WithCascadeStatementGenerator { + + private final ReferentialSynchronizeServiceLocal service; + private final TopiaMetadataModel metadataModel; + + protected WithCascadeStatementGenerator(ReferentialSynchronizeServiceLocal service, TopiaMetadataModel metadataModel) { + this.service = service; + this.metadataModel = metadataModel; + } + + public <D extends ReferentialDto> void addMissingReferentialIfNecessary(Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide, Class<D> associationType, String associationId, ImmutableList.Builder<String> builder) { + + if (idsOnlyExistingOnThisSide.containsEntry(associationType, associationId)) { + // need to add this referential on this other side + ImmutableList<String> sqlList = insertMissingReferential(associationType, associationId); + builder.addAll(sqlList); + // now this referential is on both side + idsOnlyExistingOnThisSide.remove(associationType, associationId); + } + } + + protected <D extends ReferentialDto, R extends ReferentialDtoReference<D, R>, E extends ObserveReferentialEntity> ImmutableList<String> insertMissingReferential(Class<D> referentialType, String id) { + ReferentialDtoEntityContext<D, R, E> modelContext = DbModelHelper.fromReferentialDto(referentialType); + + Class<E> entityType = modelContext.toEntityType(); + String referentialName = ObserveEntityEnum.valueOf(entityType).name(); + TopiaMetadataEntity metadata = metadataModel.getEntity(referentialName); + + InsertSqlStatementGenerator insertGenerator = new InsertSqlStatementGenerator(metadataModel, metadata); + D referential = service.loadEntityToReferentialDto(modelContext.toEntityBinder(), id); + return insertGenerator.generateSql(referential); + } + + +} View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/dd59aa482ecb044c43b38dc39... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/dd59aa482ecb044c43b38dc39... You're receiving this email because of your account on gitlab.com.