This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit 438ed9c536e496042523442b2eaace5ed717566e Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Nov 7 12:00:43 2016 +0100 Permettre de produire des requêtes d'insertion de référentiels --- .../v1/ReferentialServiceController.java | 16 +++++ application-web/src/main/resources/mapping | 3 + .../observe/ObserveTopiaApplicationContext.java | 6 ++ .../topia/service/ReferentialServiceTopia.java | 76 +++++++++++++++++++++- .../service/SqlScriptProducerServiceTopia.java | 37 +++++++++-- ...java => SqlScriptProducerServiceTopiaTest.java} | 15 ++++- .../service/AddSqlScriptProducerRequest.java | 37 +++++++++-- .../services/service/ReferentialService.java | 16 +++++ 8 files changed, 192 insertions(+), 14 deletions(-) diff --git a/application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java b/application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java index f7bbba0..c64a661 100644 --- a/application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java +++ b/application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java @@ -23,6 +23,7 @@ package fr.ird.observe.application.web.controller.v1; */ import com.google.common.collect.ImmutableSet; +import com.google.common.collect.SetMultimap; import fr.ird.observe.services.dto.ReferenceMap; import fr.ird.observe.services.dto.Form; import fr.ird.observe.services.dto.referential.ReferentialDto; @@ -107,4 +108,19 @@ public class ReferentialServiceController extends ObserveAuthenticatedServiceCon public <R extends ReferentialDto> boolean exists(Class<R> type, String id) { return service.exists(type, id); } + + @Override + public SetMultimap<Class<? extends ReferentialDto>, String> getReferentialIds() { + return service.getReferentialIds(); + } + + @Override + public byte[] computeMissingReferentials(SetMultimap<Class<? extends ReferentialDto>, String> centralSourceReferential, String... tripIds) { + return service.computeMissingReferentials(centralSourceReferential, tripIds); + } + + @Override + public void insertMissingReferentials(byte... referentialsShellSqlContent) { + service.insertMissingReferentials(referentialsShellSqlContent); + } } diff --git a/application-web/src/main/resources/mapping b/application-web/src/main/resources/mapping index 0435142..b51d7ec 100644 --- a/application-web/src/main/resources/mapping +++ b/application-web/src/main/resources/mapping @@ -176,6 +176,9 @@ GET /api/v1/seine/TripSeineService/loadDto GET /api/v1/seine/TripSeineService/loadForm v1.seine.TripSeineServiceController.loadForm GET /api/v1/seine/TripSeineService/loadReferenceToRead v1.seine.TripSeineServiceController.loadReferenceToRead GET /api/v1/seine/TripSeineService/preCreate v1.seine.TripSeineServiceController.preCreate +POST /api/v1/ReferentialService/computeMissingReferentials v1.ReferentialServiceController.computeMissingReferentials +POST /api/v1/ReferentialService/getReferentialIds v1.ReferentialServiceController.getReferentialIds +POST /api/v1/ReferentialService/insertMissingReferentials v1.ReferentialServiceController.insertMissingReferentials POST /api/v1/ReferentialService/save v1.ReferentialServiceController.save POST /api/v1/actions/consolidate/ConsolidateDataService/consolidateTripSeines v1.actions.consolidate.ConsolidateDataServiceController.consolidateTripSeines POST /api/v1/actions/report/ReportService/executeReport v1.actions.report.ReportServiceController.executeReport diff --git a/entities/src/main/java/fr/ird/observe/ObserveTopiaApplicationContext.java b/entities/src/main/java/fr/ird/observe/ObserveTopiaApplicationContext.java index 32d7300..5a649b9 100644 --- a/entities/src/main/java/fr/ird/observe/ObserveTopiaApplicationContext.java +++ b/entities/src/main/java/fr/ird/observe/ObserveTopiaApplicationContext.java @@ -26,6 +26,7 @@ import com.google.common.collect.ImmutableSet; import fr.ird.observe.entities.Entities; import fr.ird.observe.entities.migration.ObserveMigrationConfigurationProvider; import fr.ird.observe.entities.migration.ObserveMigrationEngine; +import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; @@ -462,6 +463,11 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat */ } + public <E extends ObserveReferentialEntity> TopiaSqlTables getReferentialTable(Class<E> entityType) { + ObserveEntityEnum entityEnum = ObserveEntityEnum.valueOf(entityType); + return referentialTables = topiaSqlTablesFactory.newReplicateEntityTables(new TripReplicateTablesPredicate(), entityEnum); + } + private static class TripReplicateTablesPredicate implements TopiaSqlTablesFactory.TopiaSqlTablesPredicate { protected final Set<TopiaMetadataEntity> dones = new LinkedHashSet<>(); diff --git a/services-topia/src/main/java/fr/ird/observe/services/topia/service/ReferentialServiceTopia.java b/services-topia/src/main/java/fr/ird/observe/services/topia/service/ReferentialServiceTopia.java index 24ed9a9..c84a349 100644 --- a/services-topia/src/main/java/fr/ird/observe/services/topia/service/ReferentialServiceTopia.java +++ b/services-topia/src/main/java/fr/ird/observe/services/topia/service/ReferentialServiceTopia.java @@ -23,18 +23,24 @@ package fr.ird.observe.services.topia.service; */ import com.google.common.base.Joiner; +import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.SetMultimap; import fr.ird.observe.ObserveEntityEnum; +import fr.ird.observe.entities.Entities; import fr.ird.observe.entities.EntityMap; import fr.ird.observe.entities.constants.ReferenceStatusPersist; +import fr.ird.observe.entities.longline.TripLongline; import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; import fr.ird.observe.entities.referentiel.Species; +import fr.ird.observe.entities.seine.TripSeine; import fr.ird.observe.services.dto.DataDto; import fr.ird.observe.services.dto.DataReferenceSet; import fr.ird.observe.services.dto.Form; import fr.ird.observe.services.dto.ReferenceMap; import fr.ird.observe.services.dto.constants.ReferenceStatus; +import fr.ird.observe.services.dto.longline.TripLonglineDto; import fr.ird.observe.services.dto.reference.ReferenceSetDefinition; import fr.ird.observe.services.dto.reference.request.ReferenceSetRequestDefinition; import fr.ird.observe.services.dto.reference.request.ReferenceSetRequestDefinitions; @@ -43,6 +49,9 @@ import fr.ird.observe.services.dto.referential.ReferentialReference; import fr.ird.observe.services.dto.referential.ReferentialReferenceSet; import fr.ird.observe.services.dto.referential.SpeciesDto; import fr.ird.observe.services.dto.result.SaveResultDto; +import fr.ird.observe.services.dto.seine.TripSeineDto; +import fr.ird.observe.services.service.AddSqlScriptProducerRequest; +import fr.ird.observe.services.service.AddSqlScriptProducerResult; import fr.ird.observe.services.service.DataNotFoundException; import fr.ird.observe.services.service.ReferenceSetsRequest; import fr.ird.observe.services.service.ReferentialService; @@ -61,6 +70,7 @@ import java.util.Date; import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Created on 16/08/15. @@ -223,7 +233,7 @@ public class ReferentialServiceTopia extends ObserveServiceTopia implements Refe TopiaMetadataModel metadataModel = serviceContext.getTopiaApplicationContext().getMetadataModel(); - ReplaceSqlStatementGenerator<E> generator = new ReplaceSqlStatementGenerator<E>(metadataModel, entityEnum.name()); + ReplaceSqlStatementGenerator<E> generator = new ReplaceSqlStatementGenerator<>(metadataModel, entityEnum.name()); String sql = generator.generateSql(idToReplace, replaceId); @@ -281,4 +291,68 @@ public class ReferentialServiceTopia extends ObserveServiceTopia implements Refe return existsEntity(entityType, id); } + @Override + public SetMultimap<Class<? extends ReferentialDto>, String> getReferentialIds() { + + SetMultimap<Class<? extends ReferentialDto>, String> result = HashMultimap.create(); + ImmutableSet<Class<? extends ReferentialDto>> referentialDtoTypes = BINDER_ENGINE.getReferentialDtoTypes(); + for (Class<? extends ReferentialDto> dtoType : referentialDtoTypes) { + + Class<ObserveReferentialEntity> entityType = BINDER_ENGINE.getReferentialEntityType(dtoType); + TopiaDao<ObserveReferentialEntity> dao = getTopiaPersistenceContext().getDao(entityType); + List<String> allIds = dao.findAllIds(); + result.putAll(dtoType, allIds); + + } + return result; + } + + @Override + public byte[] computeMissingReferentials(SetMultimap<Class<? extends ReferentialDto>, String> centralSourceReferential, String... tripIds) { + + ReferentialsShellBuilder referentialsShellBuilder = ReferentialsShellBuilder.builder(centralSourceReferential); + + for (String tripId : tripIds) { + if (Entities.isLonglineId(tripId)) { + TripLongline trip = loadEntity(TripLonglineDto.class, tripId); + if (log.isInfoEnabled()) { + log.info("Calcul des référentiels manquants pour la marée : " + tripId); + } + referentialsShellBuilder.scan(trip); + } else if (Entities.isSeineId(tripId)) { + TripSeine trip = loadEntity(TripSeineDto.class, tripId); + if (log.isInfoEnabled()) { + log.info("Calcul des référentiels manquants pour la marée : " + tripId); + } + referentialsShellBuilder.scan(trip); + } + } + + SetMultimap<Class<? extends ReferentialDto>, String> missingReferentialIds = referentialsShellBuilder.build(); + + if (missingReferentialIds.isEmpty()) { + return null; + } + + boolean h2 = serviceContext.getDataSourceConfiguration().isH2Database(); + + AddSqlScriptProducerRequest request = h2 ? AddSqlScriptProducerRequest.forH2() : AddSqlScriptProducerRequest.forPostgres(); + for (Class<? extends ReferentialDto> dtoType : missingReferentialIds.keySet()) { + Set<String> ids = missingReferentialIds.get(dtoType); + request.referentialIdsToAdd(dtoType, ids); + if (log.isInfoEnabled()) { + log.info("Ajout de " + ids.size() + " référentiel(s) de type " + dtoType.getName()); + } + } + + SqlScriptProducerServiceTopia sqlScriptProducerService = serviceContext.newService(SqlScriptProducerServiceTopia.class); + AddSqlScriptProducerResult addSqlScriptProducerResult = sqlScriptProducerService.produceAddSqlScript(request); + return addSqlScriptProducerResult.getSqlCode(); + + } + + @Override + public void insertMissingReferentials(byte... referentialsShellSqlContent) { + getTopiaPersistenceContext().executeSqlScript(referentialsShellSqlContent); + } } diff --git a/services-topia/src/main/java/fr/ird/observe/services/topia/service/SqlScriptProducerServiceTopia.java b/services-topia/src/main/java/fr/ird/observe/services/topia/service/SqlScriptProducerServiceTopia.java index 01cd9d4..0f57576 100644 --- a/services-topia/src/main/java/fr/ird/observe/services/topia/service/SqlScriptProducerServiceTopia.java +++ b/services-topia/src/main/java/fr/ird/observe/services/topia/service/SqlScriptProducerServiceTopia.java @@ -23,16 +23,21 @@ package fr.ird.observe.services.topia.service; */ import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ListMultimap; +import fr.ird.observe.ObserveEntityEnum; import fr.ird.observe.ObserveTopiaApplicationContext; import fr.ird.observe.entities.Entities; +import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.service.AddSqlScriptProducerRequest; import fr.ird.observe.services.service.AddSqlScriptProducerResult; import fr.ird.observe.services.service.DeleteSqlScriptProducerRequest; import fr.ird.observe.services.service.ObserveBlobsContainer; import fr.ird.observe.services.service.SqlScriptProducerService; import fr.ird.observe.services.topia.ObserveServiceTopia; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; import org.nuiton.topia.service.sql.batch.SqlRequests; import org.nuiton.topia.service.sql.batch.SqlResult; import org.nuiton.topia.service.sql.batch.TopiaSqlBatchService; @@ -43,12 +48,14 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; import java.util.zip.GZIPOutputStream; import static fr.ird.observe.entities.Entities.IS_LONGLINE_ID; import static fr.ird.observe.entities.Entities.IS_SEINE_ID; +import static fr.ird.observe.entities.Entities.REFERENCE_ENTITIES_LIST; /** * Created on 31/12/15. @@ -133,22 +140,42 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement } ObserveTopiaApplicationContext topiaApplicationContext = serviceContext.getTopiaApplicationContext(); + TopiaMetadataModel metadataModel = topiaApplicationContext.getMetadataModel(); if (request.isAddReferential()) { - builder.replicateTablesBuilder(topiaApplicationContext.getMetadataModel()) + builder.replicateTablesBuilder(metadataModel) .setTables(topiaApplicationContext.getReferentialTables()) .flush(); } + if (request.isAddSomeReferential()) { + + ListMultimap<Class<? extends ReferentialDto>, String> referentialIds = request.getReferentialIds(); + + for (ObserveEntityEnum entityEnum : REFERENCE_ENTITIES_LIST) { + Class entityType = entityEnum.getContract(); + List<String> ids = referentialIds.get(BINDER_ENGINE.getReferentialDtoType(entityEnum)); + if (CollectionUtils.isNotEmpty(ids)) { + + builder.replicateTablesBuilder(metadataModel) + .setTables(topiaApplicationContext.getReferentialTable(entityType)) + .setSelectArgument(TopiaSqlTableSelectArgument.of(ids)) + .flush(); + + } + } + + } + if (request.isAddData()) { ImmutableSet<String> tripIds = request.getDataIds(); if (tripIds == null) { - builder.replicateTablesBuilder(topiaApplicationContext.getMetadataModel()) + builder.replicateTablesBuilder(metadataModel) .setTables(topiaApplicationContext.getTripSeineTables()) - .replicateTablesBuilder(topiaApplicationContext.getMetadataModel()) + .replicateTablesBuilder(metadataModel) .setTables(topiaApplicationContext.getTripLonglineTables()) .flush(); @@ -160,7 +187,7 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement if (!tripIds1.isEmpty()) { - builder.replicateTablesBuilder(topiaApplicationContext.getMetadataModel()) + builder.replicateTablesBuilder(metadataModel) .setTables(topiaApplicationContext.getTripSeineTables()) .setSelectArgument(TopiaSqlTableSelectArgument.of(tripIds1)) .flush(); @@ -175,7 +202,7 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement if (!tripIds1.isEmpty()) { - builder.replicateTablesBuilder(topiaApplicationContext.getMetadataModel()) + builder.replicateTablesBuilder(metadataModel) .setTables(topiaApplicationContext.getTripLonglineTables()) .setSelectArgument(TopiaSqlTableSelectArgument.of(tripIds1)) .flush(); diff --git a/services-topia/src/test/java/fr/ird/observe/services/topia/service/AddSqlScriptProducerServiceTopiaTest.java b/services-topia/src/test/java/fr/ird/observe/services/topia/service/SqlScriptProducerServiceTopiaTest.java similarity index 84% rename from services-topia/src/test/java/fr/ird/observe/services/topia/service/AddSqlScriptProducerServiceTopiaTest.java rename to services-topia/src/test/java/fr/ird/observe/services/topia/service/SqlScriptProducerServiceTopiaTest.java index 699dc21..332b42c 100644 --- a/services-topia/src/test/java/fr/ird/observe/services/topia/service/AddSqlScriptProducerServiceTopiaTest.java +++ b/services-topia/src/test/java/fr/ird/observe/services/topia/service/SqlScriptProducerServiceTopiaTest.java @@ -22,6 +22,9 @@ package fr.ird.observe.services.topia.service; * #L% */ +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; +import fr.ird.observe.services.dto.referential.ProgramDto; import fr.ird.observe.services.service.AddSqlScriptProducerRequest; import fr.ird.observe.services.service.SqlScriptProducerService; import fr.ird.observe.test.DatabaseName; @@ -42,9 +45,9 @@ import java.io.IOException; * * @author Tony Chemit - chemit@codelutin.com */ -public class AddSqlScriptProducerServiceTopiaTest extends AbstractServiceTopiaTest { +public class SqlScriptProducerServiceTopiaTest extends AbstractServiceTopiaTest { - private static final TimeLog timeLog = new TimeLog(AddSqlScriptProducerServiceTopiaTest.class, 10, 1000); + private static final TimeLog timeLog = new TimeLog(SqlScriptProducerServiceTopiaTest.class, 10, 1000); protected SqlScriptProducerService service; @@ -70,6 +73,14 @@ public class AddSqlScriptProducerServiceTopiaTest extends AbstractServiceTopiaTe } + @DatabaseNameConfiguration(DatabaseName.referentiel) + @Test + public void testProduceSomeReferential() throws Exception { + + produce(AddSqlScriptProducerRequest.forPostgres().addSchema().referentialIdsToAdd(ProgramDto.class, ImmutableSet.of(ObserveFixtures.PROGRAM_ID))); + + } + @DatabaseNameConfiguration(DatabaseName.dataForTestSeine) @Test public void testProduceTripSeine() throws Exception { diff --git a/services/src/main/java/fr/ird/observe/services/service/AddSqlScriptProducerRequest.java b/services/src/main/java/fr/ird/observe/services/service/AddSqlScriptProducerRequest.java index 802ca9c..a31ffdf 100644 --- a/services/src/main/java/fr/ird/observe/services/service/AddSqlScriptProducerRequest.java +++ b/services/src/main/java/fr/ird/observe/services/service/AddSqlScriptProducerRequest.java @@ -23,8 +23,13 @@ package fr.ird.observe.services.service; */ import com.google.common.base.MoreObjects; +import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ListMultimap; +import com.google.common.collect.Multimaps; +import fr.ird.observe.services.dto.referential.ReferentialDto; +import java.util.Set; import java.util.stream.Collectors; /** @@ -37,8 +42,10 @@ public class AddSqlScriptProducerRequest { protected final boolean postgres; protected boolean addSchema; protected boolean addReferential; + protected boolean addSomeReferential; protected boolean addData; protected ImmutableSet<String> dataIds; + protected final ArrayListMultimap<Class<? extends ReferentialDto>, String> referentialIds = ArrayListMultimap.create(); public static AddSqlScriptProducerRequest forH2() { return new AddSqlScriptProducerRequest(false); @@ -69,10 +76,22 @@ public class AddSqlScriptProducerRequest { return this; } + public <D extends ReferentialDto> AddSqlScriptProducerRequest referentialIdsToAdd(Class<D> referentialType, Set<String> referentialIds) { + addSomeReferential = true; + for (String referentialId : referentialIds) { + this.referentialIds.put(referentialType, referentialId); + } + return this; + } + public boolean isAddSchema() { return addSchema; } + public boolean isAddSomeReferential() { + return addSomeReferential; + } + public boolean isAddReferential() { return addReferential; } @@ -89,6 +108,10 @@ public class AddSqlScriptProducerRequest { return dataIds; } + public ListMultimap<Class<? extends ReferentialDto>, String> getReferentialIds() { + return Multimaps.unmodifiableListMultimap(referentialIds); + } + public boolean isH2() { return !postgres; } @@ -100,11 +123,13 @@ public class AddSqlScriptProducerRequest { @Override public String toString() { return MoreObjects.toStringHelper(this) - .add("postgres", postgres) - .add("addSchema", addSchema) - .add("addReferential", addReferential) - .add("addData", addData) - .add("dataIds", dataIds == null ? "" : "[" + dataIds.stream().collect(Collectors.joining(", ")) + "]") - .toString(); + .add("postgres", postgres) + .add("addSchema", addSchema) + .add("addReferential", addReferential) + .add("addSomeReferential", addSomeReferential) + .add("addData", addData) + .add("dataIds", dataIds == null ? "" : "[" + dataIds.stream().collect(Collectors.joining(", ")) + "]") + .add("referentialIds", referentialIds.isEmpty() ? "" : "[" + referentialIds.values().stream().collect(Collectors.joining(", ")) + "]") + .toString(); } } diff --git a/services/src/main/java/fr/ird/observe/services/service/ReferentialService.java b/services/src/main/java/fr/ird/observe/services/service/ReferentialService.java index 3250650..a5b194b 100644 --- a/services/src/main/java/fr/ird/observe/services/service/ReferentialService.java +++ b/services/src/main/java/fr/ird/observe/services/service/ReferentialService.java @@ -23,6 +23,7 @@ package fr.ird.observe.services.service; */ import com.google.common.collect.ImmutableSet; +import com.google.common.collect.SetMultimap; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.dto.Form; import fr.ird.observe.services.dto.ReferenceMap; @@ -96,4 +97,19 @@ public interface ReferentialService extends ObserveService { @ReadDataPermission <R extends ReferentialDto> boolean exists(Class<R> type, String id); + @ReadReferentialPermission + @PostRequest + SetMultimap<Class<? extends ReferentialDto>,String> getReferentialIds(); + + + @ReadReferentialPermission + @ReadDataPermission + @PostRequest + byte[] computeMissingReferentials(SetMultimap<Class<? extends ReferentialDto>, String> centralSourceReferential, String... tripIds); + + @ReadReferentialPermission + @WriteDataPermission + @PostRequest + @Write + void insertMissingReferentials(byte... referentialsShellSqlContent); } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.