This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 394b8fc137f15becfb56630d7f58dbfedfffa0c8 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Jun 29 12:39:49 2016 +0200 Mise en place de la génération des requètes sql et de leur application (See #7739) --- ...UnidirectionalReferentialSynchronizeEngine.java | 15 ++- ...ectionalReferentialSynchronizeLocalService.java | 23 ++++ ...nidirectionalReferentialSynchronizeRequest.java | 57 +++++++--- ...nalReferentialSynchronizeLocalServiceTopia.java | 121 ++++++++++++++++----- 4 files changed, 170 insertions(+), 46 deletions(-) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java index 9df5e43..44f22f6 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java @@ -33,17 +33,24 @@ public class UnidirectionalReferentialSynchronizeEngine { LocalReferentialStates localReferentialStates = localService.getLocalSourceReferentialStates(); RemoteReferentialDiff remoteReferentialDiff = remoteService.getReferentialDifferential(localReferentialStates); + Set<String> sqlRequests = new LinkedHashSet<>(); for (String referentialName : remoteReferentialDiff.getReferentialNames()) { - UnidirectionalReferentialSynchronizeRequest referentialSynchronizeRequest = buildReferentialSynchronizeRequest(callback, referentialName, remoteReferentialDiff); + UnidirectionalReferentialSynchronizeRequest<?> referentialSynchronizeRequest = + buildReferentialSynchronizeRequest(callback, referentialName, remoteReferentialDiff); + + Set<String> sqlRequestsforReferential = localService.generateSqlRequests(referentialSynchronizeRequest); + sqlRequests.addAll(sqlRequestsforReferential); } + localService.applySqlRequests(sqlRequests); + } private <R extends ReferentialDto> UnidirectionalReferentialSynchronizeRequest buildReferentialSynchronizeRequest(Callback callback, String referentialName, RemoteReferentialDiff remoteReferentialDiff) { - UnidirectionalReferentialSynchronizeRequest.Builder builder = UnidirectionalReferentialSynchronizeRequest.builder(referentialName); + UnidirectionalReferentialSynchronizeRequest.Builder<R> builder = UnidirectionalReferentialSynchronizeRequest.builder(referentialName); Collection<R> referentialsToAdd = remoteReferentialDiff.getReferentialsToAdd(referentialName); if (CollectionUtils.isNotEmpty(referentialsToAdd)) { @@ -101,8 +108,8 @@ public class UnidirectionalReferentialSynchronizeEngine { // calcul de l'univers de référentiels disponibles pour les remplacements - ReferentialReferenceSet<R> localSourceEnabledReferenceSet = remoteService.getEnabledReferentialReferenceSet(referentialName); - Set<ReferentialReference<R>> availableReferentials = localSourceEnabledReferenceSet.getReferences(); + ReferentialReferenceSet<R> availableReferenceSet = remoteService.getEnabledReferentialReferenceSet(referentialName); + Set<ReferentialReference<R>> availableReferentials = availableReferenceSet.getReferences(); if (needCallbackForRemove) { diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java index a1b4b22..0c2caa2 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java @@ -1,6 +1,11 @@ package fr.ird.observe.services.service.actions.synchro; +import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.spi.NoDataAccess; +import fr.ird.observe.services.spi.PostRequest; import fr.ird.observe.services.spi.ReadReferentialPermission; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.spi.WriteReferentialPermission; import java.util.Collection; import java.util.Set; @@ -34,4 +39,22 @@ public interface UnidirectionalReferentialSynchronizeLocalService { @ReadReferentialPermission Set<String> filterIdsUsedInLocalSource(String referentialName, Collection<String> ids); + /** + * Pour produire le code sql à partir de la demande pour un référentiel donné. + * + * @param request la demande des actions à produire pour un référentiel donné + * @return l'ensemble des requètes sql à appliquer. + */ + @NoDataAccess + <R extends ReferentialDto> Set<String> generateSqlRequests(UnidirectionalReferentialSynchronizeRequest<R> request); + + /** + * Pour appliquer les requètes sql de mise à jour du réferentiel. + * + * @param sqlRequests les requètes sql à appliquer + */ + @WriteReferentialPermission + @Write + @PostRequest + void applySqlRequests(Set<String> sqlRequests); } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java index 4cbe9ed..d049d04 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java @@ -1,5 +1,6 @@ package fr.ird.observe.services.service.actions.synchro; +import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import fr.ird.observe.services.dto.referential.ReferentialDto; @@ -14,15 +15,15 @@ import fr.ird.observe.services.dto.referential.ReferentialDto; * @author Tony Chemit - chemit@codelutin.com * @since 5.0 */ -public class UnidirectionalReferentialSynchronizeRequest { +public class UnidirectionalReferentialSynchronizeRequest<R extends ReferentialDto> { - public static Builder builder(String referentialName) { - return new Builder(referentialName); + public static <R extends ReferentialDto> Builder<R> builder(String referentialName) { + return new Builder<>(referentialName); } private final String referentialName; - private final ImmutableSet<ReferentialDto> referentialToAdd; - private final ImmutableSet<ReferentialDto> referentialToUpdate; + private final ImmutableSet<R> referentialToAdd; + private final ImmutableSet<R> referentialToUpdate; private final ImmutableSet<String> referentialToRemove; private final ImmutableMap<String, String> referentialToReplace; @@ -30,11 +31,11 @@ public class UnidirectionalReferentialSynchronizeRequest { return referentialName; } - public ImmutableSet<ReferentialDto> getReferentialToAdd() { + public ImmutableSet<R> getReferentialToAdd() { return referentialToAdd; } - public ImmutableSet<ReferentialDto> getReferentialToUpdate() { + public ImmutableSet<R> getReferentialToUpdate() { return referentialToUpdate; } @@ -46,9 +47,33 @@ public class UnidirectionalReferentialSynchronizeRequest { return referentialToReplace; } + public boolean withReferentialToAdd() { + return !referentialToAdd.isEmpty(); + } + public boolean withReferentialToUpdate() { + return !referentialToUpdate.isEmpty(); + } + public boolean withReferentialToRemove() { + return !referentialToRemove.isEmpty(); + } + public boolean withReferentialToReplace() { + return !referentialToReplace.isEmpty(); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("referentialName", referentialName) + .add("referentialToAdd", referentialToAdd.size()) + .add("referentialToUpdate", referentialToUpdate.size()) + .add("referentialToRemove", referentialToRemove.size()) + .add("referentialToReplace", referentialToReplace.size()) + .toString(); + } + private UnidirectionalReferentialSynchronizeRequest(String referentialName, - ImmutableSet<ReferentialDto> referentialToAdd, - ImmutableSet<ReferentialDto> referentialToUpdate, + ImmutableSet<R> referentialToAdd, + ImmutableSet<R> referentialToUpdate, ImmutableSet<String> referentialToRemove, ImmutableMap<String, String> toReplace) { this.referentialName = referentialName; @@ -58,20 +83,20 @@ public class UnidirectionalReferentialSynchronizeRequest { this.referentialToReplace = toReplace; } - public static class Builder { + public static class Builder<R extends ReferentialDto> { private final String referentialName; - private final ImmutableSet.Builder<ReferentialDto> toAddBuilder = ImmutableSet.builder(); - private final ImmutableSet.Builder<ReferentialDto> toUpdateBuilder = ImmutableSet.builder(); + private final ImmutableSet.Builder<R> toAddBuilder = ImmutableSet.builder(); + private final ImmutableSet.Builder<R> toUpdateBuilder = ImmutableSet.builder(); private final ImmutableSet.Builder<String> toRemoveBuilder = ImmutableSet.builder(); private final ImmutableMap.Builder<String, String> toReplaceBuilder = ImmutableMap.builder(); - public Builder entityToAdd(ReferentialDto referentialDto) { + public Builder entityToAdd(R referentialDto) { toAddBuilder.add(referentialDto); return this; } - public Builder entityToUpdate(ReferentialDto referentialDto) { + public Builder entityToUpdate(R referentialDto) { toUpdateBuilder.add(referentialDto); return this; } @@ -86,9 +111,9 @@ public class UnidirectionalReferentialSynchronizeRequest { return this; } - public UnidirectionalReferentialSynchronizeRequest build() { + public UnidirectionalReferentialSynchronizeRequest<R> build() { - return new UnidirectionalReferentialSynchronizeRequest( + return new UnidirectionalReferentialSynchronizeRequest<>( referentialName, toAddBuilder.build(), toUpdateBuilder.build(), diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java index e9c2245..79ab42f 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java @@ -4,17 +4,19 @@ import fr.ird.observe.ObserveEntityEnum; import fr.ird.observe.entities.Entities; import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; import fr.ird.observe.services.ObserveServiceTopia; +import fr.ird.observe.services.binder.BinderEngine; 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.TopiaDao; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; -import org.nuiton.util.beans.Binder; -import org.nuiton.util.beans.BinderFactory; +import org.nuiton.topia.persistence.support.TopiaSqlWork; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; import java.util.Collection; -import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -67,35 +69,71 @@ public class UnidirectionalReferentialSynchronizeLocalServiceTopia extends Obser } - private <E extends ObserveReferentialEntity, R extends ReferentialDto> void generateInsertSqlStatements0(StringBuilder builder, - Class<E> entityType, - Class<R> dtoType, - TopiaMetadataEntity metadataEntity, - Collection<R> referentialsToAdd) { - - Set<String> columnNames = new LinkedHashSet<>(); - columnNames.add(TopiaEntity.PROPERTY_TOPIA_ID); - columnNames.add(TopiaEntity.PROPERTY_TOPIA_VERSION); - columnNames.add(TopiaEntity.PROPERTY_TOPIA_CREATE_DATE); - - Set<String> propertyNamesSet = metadataEntity.getProperties().keySet(); - String[] propertyNames = propertyNamesSet.toArray(new String[propertyNamesSet.size()]); - for (String propertyName : propertyNames) { - columnNames.add(metadataEntity.getDbColumnName(propertyName)); + @Override + public <R extends ReferentialDto> Set<String> generateSqlRequests(UnidirectionalReferentialSynchronizeRequest<R> request) { + + if (log.isTraceEnabled()) { + log.trace("generateSqlRequests(" + request + ")"); + } + + Set<String> result = new LinkedHashSet<>(); + + String referentialName = request.getReferentialName(); + + ObserveEntityEnum entityEnum = ObserveEntityEnum.valueOf(referentialName); + Class entityType = entityEnum.getContract(); + Class<R> dtoType = BinderEngine.get().getReferentialDtoType(entityType); + + TopiaMetadataEntity metadataEntity = serviceContext.getTopiaApplicationContext().getMetadataModel().getEntity(referentialName); + if (request.withReferentialToAdd()) { + + InsertSqlStatementGenerator<R> sqlStatementGenerator = new InsertSqlStatementGenerator<>(metadataEntity, dtoType); + for (R referentialDto : request.getReferentialToAdd()) { + String sql = sqlStatementGenerator.generateSql(referentialDto); + result.add(sql); + } + } + + if (request.withReferentialToUpdate()) { + + UpdateSqlStatementGenerator<R> sqlStatementGenerator = new UpdateSqlStatementGenerator<R>(metadataEntity, dtoType); + for (R referentialDto : request.getReferentialToUpdate()) { + String sql = sqlStatementGenerator.generateSql(referentialDto); + result.add(sql); + } + + } + + if (request.withReferentialToReplace()) { + + //TODO + + } + if (request.withReferentialToRemove()) { + + DeleteSqlStatementGenerator sqlStatementGenerator = new DeleteSqlStatementGenerator(metadataEntity); + for (String id : request.getReferentialToRemove()) { + String sql = sqlStatementGenerator.generateSql(id); + result.add(sql); + } + } - Binder<R, R> binder = BinderFactory.newBinder(dtoType); - for (R referentialToAdd : referentialsToAdd) { - Map<String,Object> properties = new LinkedHashMap<>(); - properties.put(TopiaEntity.PROPERTY_TOPIA_ID, referentialToAdd.getId()); - properties.put(TopiaEntity.PROPERTY_TOPIA_VERSION, referentialToAdd.getVersion()); - properties.put(TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, referentialToAdd.getCreateDate()); + return result; + + } - Map<String, Object> obtainProperties = binder.obtainProperties(referentialToAdd, true, propertyNames); - properties.putAll(obtainProperties); + @Override + public void applySqlRequests(Set<String> sqlRequests) { + if (log.isTraceEnabled()) { + log.trace("applySqlRequests(" + sqlRequests + ")"); } + + TopiaSqlWork applySqlWork = new ApplySqlRequestWork(sqlRequests); + getTopiaPersistenceContext().getSqlSupport().doSqlWork(applySqlWork); + } private <E extends ObserveReferentialEntity> void getLocalSourceReferentialVersions0(String entityName, Class<E> entityType, LocalReferentialStates localReferentialStates) { @@ -120,4 +158,35 @@ public class UnidirectionalReferentialSynchronizeLocalServiceTopia extends Obser } + private static class ApplySqlRequestWork implements TopiaSqlWork { + + private static final int BATCH_SIZE = 100; + + private final Set<String> sqlRequests; + + ApplySqlRequestWork(Set<String> sqlRequests) { + this.sqlRequests = sqlRequests; + } + + @Override + public void execute(Connection connection) throws SQLException { + + Statement statement = connection.createStatement(); + + int count = 0; + for (String sqlRequest : sqlRequests) { + statement.addBatch(sqlRequest); + if ((count % BATCH_SIZE) == 0) { + flush(statement); + } + } + flush(statement); + + } + + private void flush(Statement statement) throws SQLException { + statement.executeBatch(); + statement.clearBatch(); + } + } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.