Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 93b95077 by Tony Chemit at 2020-05-15T11:01:52+02:00 Ne pas sauvegarder automatiquement la base locale lors d'une action longue - Close #1487 - - - - - 1ae23adb by Tony Chemit at 2020-05-15T11:15:21+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 - - - - - b3e8d3f6 by Tony Chemit at 2020-05-15T11:17:06+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 (Use usage service (do not take account of modification of referential inside antoher referential) - See #1432 - - - - - 9 changed files: - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/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/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-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUIHandler.java ===================================== @@ -272,9 +272,7 @@ public class AdminUIHandler implements UIHandler<AdminUI>, WithClientUIContext { if (ui.getModel().getStepState(AdminStep.SAVE_LOCAL) == WizardState.PENDING) { SaveLocalUI tabUI = (SaveLocalUI) ui.getStepUI(AdminStep.SAVE_LOCAL); - if (tabUI.getStepModel().isLocalSourceNeedSave()) { - SwingUtilities.invokeLater(tabUI.getStart()::doClick); - } else { + 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 ===================================== @@ -41,10 +41,12 @@ import fr.ird.observe.services.local.service.actions.synchro.referential.sql.Upd import fr.ird.observe.services.service.LastUpdateDateService; import fr.ird.observe.services.service.actions.synchro.referential.legacy.UnidirectionalReferentialSynchronizeLocalService; import fr.ird.observe.services.service.actions.synchro.referential.legacy.UnidirectionalReferentialSynchronizeRequest; +import fr.ird.observe.services.service.usage.DtoUsageCountRequest; +import fr.ird.observe.services.service.usage.DtoUsageCountResult; +import fr.ird.observe.services.service.usage.UsageService; import fr.ird.observe.spi.DbModelHelper; import fr.ird.observe.spi.context.ReferentialDtoEntityContext; import org.nuiton.topia.persistence.TopiaDao; -import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; import org.nuiton.topia.persistence.support.TopiaSqlWork; @@ -63,19 +65,20 @@ import java.util.Set; public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends ObserveServiceLocal implements UnidirectionalReferentialSynchronizeLocalService { private LastUpdateDateService lastUpdateDateService; + private UsageService usageService; @Override public void setServiceContext(ObserveServiceContextLocal serviceContext) { super.setServiceContext(serviceContext); lastUpdateDateService = serviceContext.newService(LastUpdateDateService.class); + usageService = serviceContext.newService(UsageService.class); } @Override public <D extends ReferentialDto> ImmutableSet<String> filterIdsUsedInLocalSource(Class<D> dtoType, ImmutableSet<String> ids) { - Class<? extends ReferentialEntity<D, ?>> entityType = DbModelHelper.fromReferentialDtoWeak(dtoType).toEntityType(); Set<String> result = new LinkedHashSet<>(); for (String id : ids) { - int count = countUsage0(entityType, id); + long count = countUsage0(dtoType, id); if (count > 0) { result.add(id); } @@ -101,7 +104,7 @@ public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends Obser TopiaMetadataModel metadataModel = serviceContext.getTopiaApplicationContext().getMetadataModel(); 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)) { // must reorder to be sure to insert parent before sons @@ -149,15 +152,10 @@ public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends Obser lastUpdateDateService.updateReferentialLastUpdateDates(); } - private <E extends ReferentialEntity<?, ?>> int countUsage0(Class<E> entityType, String id) { - TopiaDao<E> dao = getTopiaPersistenceContext().getDao(entityType); - 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(); - } - return count; + private <D extends ReferentialDto> long countUsage0(Class<D> dtoType, String id) { + DtoUsageCountRequest<D> request = new DtoUsageCountRequest<>(dtoType, id); + DtoUsageCountResult<?> usageCount = usageService.count(request); + return usageCount.getCount().values().stream().reduce(Long::sum).orElse(0L); } private <E extends ReferentialEntity<D, R>, D extends ReferentialDto, R extends ReferentialDtoReference<D, R>> ReferentialDtoReferenceSet<R> getLocalSourceReferentialToDelete0(Class<E> entityType, Class<R> referenceType, ImmutableSet<String> ids) { ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlListRequestBuilder.java ===================================== @@ -140,20 +140,13 @@ public class ReferentialSynchronizeSqlListRequestBuilder { private <D extends ReferentialDto, R extends ReferentialDtoReference<D, R>, E extends ReferentialEntity<D, R>> void onAdd(TopiaMetadataEntity metadata, Class<D> dtoType, Class<E> entityType, Set<ReferentialSynchronizeTask> tasks, Multimap<Class<? extends ReferentialDto>, String> newIds) { 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(modelContext, id); - } - }; + 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,15 +166,7 @@ public class ReferentialSynchronizeSqlListRequestBuilder { if (metadata.withEntities()) { Multimap<Class<? extends ReferentialDto>, String> allIds = ArrayListMultimap.create(request.getIdsOnlyExistingOnThisSide()); allIds.putAll(newIds); - updateGenerator = new UpdateSqlWithCascadeStatementGenerator<D>(metadataModel, metadata, request.getIdsOnlyExistingOnThisSide()) { - - @Override - protected <DD extends ReferentialDto> ImmutableList<String> insertMissingReferential(Class<DD> referentialType, String id) { - ReferentialDtoEntityContext<DD, ?, ?, ?> modelContext = DbModelHelper.fromReferentialDto(referentialType); - return addExtraInsertStatement(modelContext, id); - } - }; - + updateGenerator = new UpdateSqlWithCascadeStatementGenerator(service, metadataModel, metadata, request.getIdsOnlyExistingOnThisSide()); } else { updateGenerator = new UpdateSqlStatementGenerator(metadataModel, metadata); } @@ -256,7 +241,6 @@ public class ReferentialSynchronizeSqlListRequestBuilder { } } - private <D extends ReferentialDto> void onDeactivateWithReplacement(TopiaMetadataEntity metadata, Class<D> dtoType, Set<ReferentialSynchronizeTask> tasks) { ReplaceSqlStatementGenerator replaceGenerator = new ReplaceSqlStatementGenerator(metadataModel, metadata); @@ -277,18 +261,6 @@ public class ReferentialSynchronizeSqlListRequestBuilder { } } - private <D extends ReferentialDto, E extends ReferentialEntity<D, ?>> ImmutableList<String> addExtraInsertStatement(ReferentialDtoEntityContext<D, ?, E, ?> binder, String id) { - - Class<E> entityType = binder.toEntityType(); - Class<D> dtoType = binder.toDtoType(); - 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 ReferentialEntity> 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(); @@ -152,22 +152,27 @@ 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(); + } + protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association, + String sourceId, + RR associationValue, + ImmutableList.Builder<String> builder) { + String insertSql = TopiaSqlStatements.generateAssociationInsertStatement(association, sourceId, associationValue.getId()); + builder.add(TopiaSqlStatements.boxAssociationStatement(insertSql)); } + protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(RR parameter, List<String> parameters, ImmutableList.Builder<String> result) { + addStringParameter(parameter.getId(), parameters); + } - <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association, - String sourceId, - RR associationValue, - ImmutableList.Builder<String> builder) { - String insertAssocationSql = TopiaSqlStatements.generateAssociationInsertStatement(association, sourceId, associationValue.getId()); - builder.add(TopiaSqlStatements.boxAssociationStatement(insertAssocationSql)); + protected <DD extends ReferentialDto> void addReferentialDtoParameter(DD parameter, List<String> parameters, ImmutableList.Builder<String> result) { + addStringParameter(parameter.getId(), parameters); } private Set<String> computeColumnNames(TopiaMetadataEntity metadataEntity, @@ -227,12 +232,4 @@ public class InsertSqlStatementGenerator<D extends ReferentialDto> implements In parameters.add("" + parameter); } - protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(RR parameter, List<String> parameters, ImmutableList.Builder<String> result) { - addStringParameter(parameter.getId(), parameters); - } - - protected <DD extends ReferentialDto> void addReferentialDtoParameter(DD parameter, List<String> parameters, ImmutableList.Builder<String> result) { - addStringParameter(parameter.getId(), parameters); - } - } ===================================== 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,62 +41,43 @@ 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, - String sourceId, - RR associationValue, - ImmutableList.Builder<String> builder) { + protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association, + String sourceId, + RR associationValue, + ImmutableList.Builder<String> builder) { super.addAssociation(association, sourceId, associationValue, builder); - addMissingReferentialIfNecessary(associationValue.getDtoType(), associationValue.getId(), builder); + 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); + protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(RR parameter, List<String> parameters, ImmutableList.Builder<String> builder) { + super.addReferentialReferenceParameter(parameter, parameters, builder); + addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, parameter.getDtoType(), parameter.getId(), builder); } @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); + protected <DD extends ReferentialDto> void addReferentialDtoParameter(DD parameter, List<String> parameters, ImmutableList.Builder<String> builder) { + super.addReferentialDtoParameter(parameter, parameters, builder); + addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, dtoType, parameter.getId(), builder); } }; } - 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/UpdateSqlStatementGenerator.java ===================================== @@ -208,14 +208,22 @@ public class UpdateSqlStatementGenerator implements UpdateSqlGenerator { return result.build(); } - <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association, - String sourceId, - RR associationValue, - ImmutableList.Builder<String> builder) { + protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association, + String sourceId, + RR associationValue, + ImmutableList.Builder<String> builder) { String insertSql = TopiaSqlStatements.generateAssociationInsertStatement(association, sourceId, associationValue.getId()); builder.add(TopiaSqlStatements.boxAssociationStatement(insertSql)); } + protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(String columnName, RR parameter, StringBuilder parameters, ImmutableList.Builder<String> result) { + addStringParameter(columnName, parameter.getId(), parameters); + } + + protected <DD extends ReferentialDto> void addReferentialDtoParameter(String columnName, DD parameter, StringBuilder parameters, ImmutableList.Builder<String> result) { + addStringParameter(columnName, parameter.getId(), parameters); + } + private Map<String, String> computeColumnNames(TopiaMetadataEntity metadataEntity, String[] simplePropertyNames, String[] compositionPropertyNames) { Map<String, String> columnNames = new TreeMap<>(); @@ -252,14 +260,6 @@ public class UpdateSqlStatementGenerator implements UpdateSqlGenerator { addParameter0(columnName, "" + parameter, parameters); } - protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(String columnName, RR parameter, StringBuilder parameters, ImmutableList.Builder<String> result) { - addStringParameter(columnName, parameter.getId(), parameters); - } - - protected <DD extends ReferentialDto> void addReferentialDtoParameter(String columnName, DD parameter, StringBuilder parameters, ImmutableList.Builder<String> result) { - addStringParameter(columnName, parameter.getId(), parameters); - } - private void addParameter0(String columnName, String value, StringBuilder parameters) { parameters.append(", ").append(columnName).append(" = ").append(value); } ===================================== 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,58 +42,41 @@ import java.util.Date; * @author Tony Chemit - dev@tchemit.fr * @since 5.0 */ -public abstract class UpdateSqlWithCascadeStatementGenerator<D extends ReferentialDto> implements UpdateSqlGenerator { +public class UpdateSqlWithCascadeStatementGenerator extends WithCascadeStatementGenerator implements UpdateSqlGenerator { private final UpdateSqlStatementGenerator delegateGenerator; - private final Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide; - protected UpdateSqlWithCascadeStatementGenerator(TopiaMetadataModel topiaMetadataModel, - TopiaMetadataEntity metadataEntity, - Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide) { - this.idsOnlyExistingOnThisSide = idsOnlyExistingOnThisSide; + public UpdateSqlWithCascadeStatementGenerator(ReferentialSynchronizeServiceLocal service, + TopiaMetadataModel topiaMetadataModel, + TopiaMetadataEntity metadataEntity, + Multimap<Class<? extends ReferentialDto>, String> idsOnlyExistingOnThisSide) { + super(service, topiaMetadataModel); this.delegateGenerator = new UpdateSqlStatementGenerator(topiaMetadataModel, metadataEntity) { - - - <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association, - String sourceId, - RR associationValue, - ImmutableList.Builder<String> builder) { + @Override + protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addAssociation(TopiaMetadataAssociation association, + String sourceId, + RR associationValue, + ImmutableList.Builder<String> builder) { super.addAssociation(association, sourceId, associationValue, builder); - addMissingReferentialIfNecessary(associationValue.getDtoType(), associationValue.getId(), builder); + 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); + protected <DD extends ReferentialDto, RR extends ReferentialDtoReference<DD, RR>> void addReferentialReferenceParameter(String columnName, RR parameter, StringBuilder parameters, ImmutableList.Builder<String> builder) { + super.addReferentialReferenceParameter(columnName, parameter, parameters, builder); + addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, parameter.getDtoType(), parameter.getId(), builder); } @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); + protected <DD extends ReferentialDto> void addReferentialDtoParameter(String columnName, DD parameter, StringBuilder parameters, ImmutableList.Builder<String> builder) { + super.addReferentialDtoParameter(columnName, parameter, parameters, builder); + addMissingReferentialIfNecessary(idsOnlyExistingOnThisSide, parameter.getClass(), parameter.getId(), builder); } }; } - protected abstract <DD extends ReferentialDto> ImmutableList<String> insertMissingReferential(Class<DD> referentialType, String id); - @Override 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.ObserveEntityEnum; +import fr.ird.observe.entities.referential.ReferentialEntity; +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 ReferentialEntity<D, R>> 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, id); + return insertGenerator.generateSql(referential); + } + + +} View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/27f5f925a42849f4eeb6887c6... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/27f5f925a42849f4eeb6887c6... You're receiving this email because of your account on gitlab.com.