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 263d649ce75e3c598d6db4b967facfa6b0268255 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Sep 8 13:22:50 2016 +0200 Use exactly columns we are owing, skip other ones detected in databases + add test for TripManagementService --- .../topia/service/DataSourceServiceTopia.java | 5 + .../service/SqlScriptProducerServiceTopia.java | 13 +-- .../services/topia/TopiaTestClassResource.java | 2 +- .../services/topia/TopiaTestMethodResource.java | 2 +- .../topia/entity/ReplicateTestSupport.java | 2 +- .../service/TripManagementServiceTopiaTest.java | 102 +++++++++++++++++ .../persistence/metadata/TopiaMetadataEntity.java | 61 ++++++++++ .../metadata/TopiaMetadataModelVisitor.java | 19 ++++ .../topia/service/sql/batch/SqlRequests.java | 19 ++-- .../sql/batch/actions/AbstractTablesAction.java | 29 ++++- .../sql/batch/actions/DeleteTablesAction.java | 2 +- .../sql/batch/actions/ReplicateTablesAction.java | 21 ++-- .../sql/batch/actions/ReplicateTablesRequest.java | 16 +++ .../sql/batch/actions/UpdateTablesAction.java | 42 ++++--- .../sql/batch/tables/TopiaSqlTablesFactory.java | 5 + .../templates/TopiaMetadataModelGenerator.java | 125 ++++----------------- 16 files changed, 312 insertions(+), 153 deletions(-) diff --git a/services-topia/src/main/java/fr/ird/observe/services/topia/service/DataSourceServiceTopia.java b/services-topia/src/main/java/fr/ird/observe/services/topia/service/DataSourceServiceTopia.java index 2c9a838..87bfc4b 100644 --- a/services-topia/src/main/java/fr/ird/observe/services/topia/service/DataSourceServiceTopia.java +++ b/services-topia/src/main/java/fr/ird/observe/services/topia/service/DataSourceServiceTopia.java @@ -692,6 +692,11 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } @Override + public void visitOneToManyAssociationInverse(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + + } + + @Override public void visitProperty(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, String propertyType) { } 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 4fa7802..6cdb2c0 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 @@ -135,8 +135,7 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement ObserveTopiaApplicationContext topiaApplicationContext = serviceContext.getTopiaApplicationContext(); if (request.isAddReferential()) { - - builder.replicateTablesBuilder() + builder.replicateTablesBuilder(topiaApplicationContext.getMetadataModel()) .setTables(topiaApplicationContext.getReferentialTables()) .flush(); @@ -147,9 +146,9 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement ImmutableSet<String> tripIds = request.getDataIds(); if (tripIds == null) { - builder.replicateTablesBuilder() + builder.replicateTablesBuilder(topiaApplicationContext.getMetadataModel()) .setTables(topiaApplicationContext.getTripSeineTables()) - .replicateTablesBuilder() + .replicateTablesBuilder(topiaApplicationContext.getMetadataModel()) .setTables(topiaApplicationContext.getTripLonglineTables()) .flush(); @@ -161,7 +160,7 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement if (!tripIds1.isEmpty()) { - builder.replicateTablesBuilder() + builder.replicateTablesBuilder(topiaApplicationContext.getMetadataModel()) .setTables(topiaApplicationContext.getTripSeineTables()) .setSelectArgument(TopiaSqlTableSelectArgument.of(tripIds1)) .flush(); @@ -176,7 +175,7 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement if (!tripIds1.isEmpty()) { - builder.replicateTablesBuilder() + builder.replicateTablesBuilder(topiaApplicationContext.getMetadataModel()) .setTables(topiaApplicationContext.getTripLonglineTables()) .setSelectArgument(TopiaSqlTableSelectArgument.of(tripIds1)) .flush(); @@ -203,7 +202,7 @@ public class SqlScriptProducerServiceTopia extends ObserveServiceTopia implement builder.deleteTablesBuilder() .setTables(topiaApplicationContext.getTripSeineTables()) - .replicateTablesBuilder() + .replicateTablesBuilder(topiaApplicationContext.getMetadataModel()) .setTables(topiaApplicationContext.getTripLonglineTables()) .flush(); diff --git a/services-topia/src/test/java/fr/ird/observe/services/topia/TopiaTestClassResource.java b/services-topia/src/test/java/fr/ird/observe/services/topia/TopiaTestClassResource.java index 95c91fe..d29ddb4 100644 --- a/services-topia/src/test/java/fr/ird/observe/services/topia/TopiaTestClassResource.java +++ b/services-topia/src/test/java/fr/ird/observe/services/topia/TopiaTestClassResource.java @@ -89,7 +89,7 @@ public class TopiaTestClassResource extends TestClassResourceSupport { return dataSourcesForTestManager; } - public ObserveDataSourceConfigurationTopiaH2 createDataSource(Version dbVersion, String dbName, File targetPath, String login, char[] password) throws DataSourceCreateWithNoReferentialImportException, IOException, IncompatibleDataSourceCreateConfigurationException, DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException, BabModelVersionException { + public ObserveDataSourceConfigurationTopiaH2 createDataSourceConfiguration(Version dbVersion, String dbName, File targetPath, String login, char[] password) throws DataSourceCreateWithNoReferentialImportException, IOException, IncompatibleDataSourceCreateConfigurationException, DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException, BabModelVersionException { ObserveDataSourceConfigurationTopiaH2 sharedDatabaseConfiguration = dataSourcesForTestManager.createSharedDataSourceConfigurationH2(dbVersion, dbName, login, password); diff --git a/services-topia/src/test/java/fr/ird/observe/services/topia/TopiaTestMethodResource.java b/services-topia/src/test/java/fr/ird/observe/services/topia/TopiaTestMethodResource.java index e20f0e5..b6d92d8 100644 --- a/services-topia/src/test/java/fr/ird/observe/services/topia/TopiaTestMethodResource.java +++ b/services-topia/src/test/java/fr/ird/observe/services/topia/TopiaTestMethodResource.java @@ -158,7 +158,7 @@ public class TopiaTestMethodResource extends TestMethodResourceSupport<TopiaTest ? null : getTestDirectory().toPath().resolve("localDb").toFile(); - dataSourceConfiguration = testClassResource.createDataSource(getDbVersion(), getDbName(), databasePath, getLogin(), getPassword()); + dataSourceConfiguration = testClassResource.createDataSourceConfiguration(getDbVersion(), getDbName(), databasePath, getLogin(), getPassword()); } diff --git a/services-topia/src/test/java/fr/ird/observe/services/topia/entity/ReplicateTestSupport.java b/services-topia/src/test/java/fr/ird/observe/services/topia/entity/ReplicateTestSupport.java index ae3a239..370cd6e 100644 --- a/services-topia/src/test/java/fr/ird/observe/services/topia/entity/ReplicateTestSupport.java +++ b/services-topia/src/test/java/fr/ird/observe/services/topia/entity/ReplicateTestSupport.java @@ -66,7 +66,7 @@ public class ReplicateTestSupport extends AbstractServiceTopiaTest { protected ReplicateTablesRequest.Builder createReplicateTablesRequest(DatabaseName databaseName) throws DataSourceCreateWithNoReferentialImportException, IOException, IncompatibleDataSourceCreateConfigurationException, BabModelVersionException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { File targetDatabaseDirectory = new File(topiaTestMethodResource.getTestDirectory(), "targetReplication"); - ObserveDataSourceConfigurationTopiaH2 targetTopiaConfiguration = TOPIA_TEST_CLASS_RESOURCE.createDataSource(topiaTestMethodResource.getDbVersion(), databaseName.name(), targetDatabaseDirectory, topiaTestMethodResource.getLogin(), topiaTestMethodResource.getPassword()); + ObserveDataSourceConfigurationTopiaH2 targetTopiaConfiguration = TOPIA_TEST_CLASS_RESOURCE.createDataSourceConfiguration(topiaTestMethodResource.getDbVersion(), databaseName.name(), targetDatabaseDirectory, topiaTestMethodResource.getLogin(), topiaTestMethodResource.getPassword()); ObserveTopiaApplicationContext targetTopiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext(targetTopiaConfiguration); scriptFile = new File(topiaTestMethodResource.getTestDirectory(), "script.sql"); diff --git a/services-topia/src/test/java/fr/ird/observe/services/topia/service/TripManagementServiceTopiaTest.java b/services-topia/src/test/java/fr/ird/observe/services/topia/service/TripManagementServiceTopiaTest.java new file mode 100644 index 0000000..5842fd4 --- /dev/null +++ b/services-topia/src/test/java/fr/ird/observe/services/topia/service/TripManagementServiceTopiaTest.java @@ -0,0 +1,102 @@ +package fr.ird.observe.services.topia.service; + +import fr.ird.observe.services.configuration.ObserveDataSourceConnection; +import fr.ird.observe.services.configuration.topia.ObserveDataSourceConfigurationTopiaH2; +import fr.ird.observe.services.dto.DataReferenceSet; +import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; +import fr.ird.observe.services.dto.seine.TripSeineDto; +import fr.ird.observe.services.service.DataSourceService; +import fr.ird.observe.services.service.seine.TripSeineService; +import fr.ird.observe.services.service.trip.DeleteTripRequest; +import fr.ird.observe.services.service.trip.DeleteTripResult; +import fr.ird.observe.services.service.trip.ExportTripRequest; +import fr.ird.observe.services.service.trip.ExportTripResult; +import fr.ird.observe.services.service.trip.ImportTripRequest; +import fr.ird.observe.services.service.trip.TripManagementService; +import fr.ird.observe.services.topia.ObserveDataSourceConnectionTopiaTaiste; +import fr.ird.observe.test.DatabaseName; +import fr.ird.observe.test.ObserveFixtures; +import fr.ird.observe.test.spi.CopyDatabaseConfiguration; +import fr.ird.observe.test.spi.DatabaseNameConfiguration; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created on 08/09/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +@DatabaseNameConfiguration(DatabaseName.dataForTestSeine) +public class TripManagementServiceTopiaTest extends AbstractServiceTopiaTest { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ReferentialServiceTopiaTest.class); + + private TripManagementService tripManagementService; + private TripSeineService tripSeineService; + + @Before + public void setUp() throws Exception { + + tripManagementService = topiaTestMethodResource.newService(TripManagementService.class); + tripSeineService = topiaTestMethodResource.newService(TripSeineService.class); + + } + + @Test + public void exportTrip() throws Exception { + + ExportTripRequest request = new ExportTripRequest(false, ObserveFixtures.PROGRAM_ID, ObserveFixtures.TRIP_SEINE_ID_1); + ExportTripResult result = tripManagementService.exportTrip(request); + Assert.assertNotNull(result); + + } + + @CopyDatabaseConfiguration + @Test + public void deleteTrip() throws Exception { + + DataReferenceSet<TripSeineDto> allTripSeineBefore = tripSeineService.getAllTripSeine(); + + DeleteTripRequest request = new DeleteTripRequest(ObserveFixtures.PROGRAM_ID, ObserveFixtures.TRIP_SEINE_ID_1); + DeleteTripResult result = tripManagementService.deleteTrip(request); + Assert.assertNotNull(result); + + DataReferenceSet<TripSeineDto> allTripSeineAfter = tripSeineService.getAllTripSeine(); + Assert.assertTrue(allTripSeineBefore.sizeReference() == allTripSeineAfter.sizeReference() + 1); + } + + @Test + public void importTrip() throws Exception { + + ExportTripRequest request = new ExportTripRequest(false, ObserveFixtures.PROGRAM_ID, ObserveFixtures.TRIP_SEINE_ID_1); + ExportTripResult result = tripManagementService.exportTrip(request); + + ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration = topiaTestMethodResource.createDataSourceConfigurationH2(getClass(), "importTripTarget"); + + try (DataSourceService dataSourceService = TOPIA_TEST_CLASS_RESOURCE.newService(dataSourceConfiguration, DataSourceService.class)) { + + DataSourceCreateConfigurationDto dataSourceCreateConfiguration = new DataSourceCreateConfigurationDto(); + dataSourceCreateConfiguration.setImportReferentialDataSourceConfiguration(topiaTestMethodResource.getDataSourceConfiguration()); + + ObserveDataSourceConnection dataSourceConnection = dataSourceService.create(dataSourceConfiguration, dataSourceCreateConfiguration); + dataSourceConnection = new ObserveDataSourceConnectionTopiaTaiste(dataSourceConnection.getAuthenticationToken()); + + TripManagementService tripManagementService = TOPIA_TEST_CLASS_RESOURCE.newService(dataSourceConnection, TripManagementService.class); + TripSeineService tripSeineService = TOPIA_TEST_CLASS_RESOURCE.newService(dataSourceConnection, TripSeineService.class); + + DataReferenceSet<TripSeineDto> allTripSeineBefore = tripSeineService.getAllTripSeine(); + + tripManagementService.importTrip(new ImportTripRequest(result)); + + DataReferenceSet<TripSeineDto> allTripSeineAfter = tripSeineService.getAllTripSeine(); + Assert.assertTrue(allTripSeineAfter.sizeReference() == allTripSeineBefore.sizeReference() + 1); + + } + + } + +} \ No newline at end of file diff --git a/topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java b/topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java index 60ca076..9a484de 100644 --- a/topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java +++ b/topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java @@ -26,6 +26,7 @@ import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableSet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.TopiaEntity; import java.sql.Blob; import java.util.HashSet; @@ -34,6 +35,8 @@ import java.util.LinkedHashSet; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; /** * Created on 03/01/16. @@ -66,6 +69,12 @@ public class TopiaMetadataEntity { */ protected final Map<String, String> oneToManyAssociations = new LinkedHashMap<>(); /** + * La liste des terminaisons des associations simples. + * + * Uniquement utilisé pour connaitre les colonnes physiques de la table sql. + */ + protected final Set<String> oneToManyAssociationInverses = new TreeSet<>(); + /** * Le dictionnaire des associations inversées (la clef est le nom de la propriété, la valeur son type). */ protected final Map<String, String> reversedAssociations = new LinkedHashMap<>(); @@ -96,6 +105,7 @@ public class TopiaMetadataEntity { * Le nom des tables utilisées pour les associations nm. */ protected final Map<String, String> dbManyToManyAssociationsTableName = new LinkedHashMap<>(); + protected Set<String> allDbColumnNames; public TopiaMetadataEntity(String parent, String type, String dbSchemaName, String dbTableName) { @@ -146,6 +156,31 @@ public class TopiaMetadataEntity { return dbTableName; } + public Set<String> getAllDbColumnNames() { + if (allDbColumnNames == null) { + allDbColumnNames = getProperties().keySet().stream() + .map(this::getDbColumnName) + .map(String::toLowerCase) + .collect(Collectors.toSet()); + allDbColumnNames.addAll(getManyToOneAssociations().keySet().stream() + .map(this::getDbColumnName) + .map(String::toLowerCase) + .collect(Collectors.toSet())); + allDbColumnNames.addAll(getReversedAssociations().keySet().stream() + .map(this::getDbColumnName) + .map(String::toLowerCase) + .collect(Collectors.toSet())); + allDbColumnNames.addAll(getOneToManyAssociationInverses().stream() + .map(this::getDbColumnName) + .map(String::toLowerCase) + .collect(Collectors.toSet())); + allDbColumnNames.add(TopiaEntity.PROPERTY_TOPIA_ID.toLowerCase()); + allDbColumnNames.add(TopiaEntity.PROPERTY_TOPIA_CREATE_DATE.toLowerCase()); + allDbColumnNames.add(TopiaEntity.PROPERTY_TOPIA_VERSION.toLowerCase()); + } + return allDbColumnNames; + } + public Map<String, String> getReversedAssociations() { return reversedAssociations; } @@ -162,6 +197,10 @@ public class TopiaMetadataEntity { return manyToOneAssociations; } + public Set<String> getOneToManyAssociationInverses() { + return oneToManyAssociationInverses; + } + public Map<String, String> getProperties() { return properties; } @@ -224,6 +263,12 @@ public class TopiaMetadataEntity { addDbColumnName(name, dbColumnName); } + public void addOneToManyAssociationInverse(TopiaMetadataEntity associationClazz, String name, String dbColumnName) { + log.info(getType() + "/" + name + "(" + dbColumnName + ") →" + associationClazz.getType()); + oneToManyAssociationInverses.add(name); + addDbColumnName(name, dbColumnName); + } + public void addReversedAssociation(TopiaMetadataEntity associationClazz, String name, String dbColumnName) { log.info(getType() + "/" + name + "(" + dbColumnName + ") →" + associationClazz.getType()); reversedAssociations.put(name, associationClazz.getType()); @@ -255,6 +300,7 @@ public class TopiaMetadataEntity { public TopiaMetadataEntity copy() { TopiaMetadataEntity copy = new TopiaMetadataEntity(parent, type, dbSchemaName, dbTableName); copy.oneToManyAssociations.putAll(oneToManyAssociations); + copy.oneToManyAssociationInverses.addAll(oneToManyAssociationInverses); copy.reversedAssociations.putAll(reversedAssociations); copy.manyToManyAssociations.putAll(manyToManyAssociations); copy.manyToOneAssociations.putAll(manyToOneAssociations); @@ -264,6 +310,17 @@ public class TopiaMetadataEntity { return copy; } + public void putAll(TopiaMetadataEntity metadataEntity) { + metadataEntity.getOneToManyAssociations().putAll(getOneToManyAssociations()); + metadataEntity.getOneToManyAssociationInverses().addAll(getOneToManyAssociationInverses()); + metadataEntity.getReversedAssociations().putAll(getReversedAssociations()); + metadataEntity.getManyToManyAssociations().putAll(getManyToManyAssociations()); + metadataEntity.getManyToOneAssociations().putAll(getManyToOneAssociations()); + metadataEntity.getProperties().putAll(getProperties()); + metadataEntity.getDbColumnsName().putAll(getDbColumnsName()); + metadataEntity.getDbColumnsName().putAll(getDbManyToManyAssociationsTableName()); + } + public void accept(TopiaMetadataModelVisitor visitor, TopiaMetadataModel metadataModel) { visitor.visitEntiyStart(metadataModel, this); for (Map.Entry<String, String> entry : reversedAssociations.entrySet()) { @@ -276,6 +333,9 @@ public class TopiaMetadataEntity { String propertyType = entry.getValue(); visitor.visitOneToManyAssociation(metadataModel, this, propertyName, metadataModel.getEntity(propertyType)); } + for (String propertyType : oneToManyAssociationInverses) { + visitor.visitOneToManyAssociationInverse(metadataModel, this, propertyType, metadataModel.getEntity(propertyType)); + } for (Map.Entry<String, String> entry : manyToManyAssociations.entrySet()) { String propertyName = entry.getKey(); String propertyType = entry.getValue(); @@ -303,4 +363,5 @@ public class TopiaMetadataEntity { dbColumnsName.put(name, dbColumnName); } } + } diff --git a/topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java b/topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java index d440cfc..398e746 100644 --- a/topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java +++ b/topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java @@ -48,6 +48,8 @@ public interface TopiaMetadataModelVisitor { void visitOneToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType); + void visitOneToManyAssociationInverse(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType); + void visitManyToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType); void visitManyToOneAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType); @@ -100,6 +102,11 @@ public interface TopiaMetadataModelVisitor { public void visitProperty(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, String propertyType) { } + + @Override + public void visitOneToManyAssociationInverse(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + + } } class PrintVisitor implements TopiaMetadataModelVisitor { @@ -149,6 +156,11 @@ public interface TopiaMetadataModelVisitor { } @Override + public void visitOneToManyAssociationInverse(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + appendProperty("OneToManyAssociationInverse: ", metadataEntity, propertyName, propertyType.getType()); + } + + @Override public void visitManyToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { appendProperty("ManyToManyAssociation: ", metadataEntity, propertyName, propertyType.getType()); if (visited.add(propertyType.getType())) { @@ -238,6 +250,13 @@ public interface TopiaMetadataModelVisitor { } @Override + public void visitOneToManyAssociationInverse(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + if (!deepVisit) { + appendProperty("OneToManyAssociationInverse: ", metadataEntity, propertyName, propertyType.getType()); + } + } + + @Override public void visitProperty(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, String propertyType) { appendProperty("Property: ", metadataEntity, propertyName, propertyType); } diff --git a/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/SqlRequests.java b/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/SqlRequests.java index 1032e91..5bf84a9 100644 --- a/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/SqlRequests.java +++ b/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/SqlRequests.java @@ -25,6 +25,7 @@ package org.nuiton.topia.service.sql.batch; import com.google.common.collect.ImmutableSet; import org.hibernate.dialect.Dialect; import org.nuiton.topia.persistence.TopiaApplicationContext; +import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; import org.nuiton.topia.service.sql.batch.actions.AbstractSchemaRequest; import org.nuiton.topia.service.sql.batch.actions.AbstractSqlRequest; import org.nuiton.topia.service.sql.batch.actions.AbstractTablesRequest; @@ -90,7 +91,7 @@ public class SqlRequests implements Iterable<AbstractSqlRequest> { DropSchemaRequestBuilder dropSchemaBuilder(); - ReplicateTablesRequestBuilder replicateTablesBuilder(); + ReplicateTablesRequestBuilder replicateTablesBuilder(TopiaMetadataModel metadataModel); UpdateTablesRequestBuilder updateTablesBuilder(); @@ -161,8 +162,10 @@ public class SqlRequests implements Iterable<AbstractSqlRequest> { } @Override - public ReplicateTablesRequestBuilder replicateTablesBuilder() { - return new ReplicateTablesRequestBuilder(this, initBuilder(new ReplicateTablesRequest.Builder())); + public ReplicateTablesRequestBuilder replicateTablesBuilder(TopiaMetadataModel metadataModel) { + ReplicateTablesRequest.Builder builder = new ReplicateTablesRequest.Builder(); + builder.setTopiaMetaModel(metadataModel); + return new ReplicateTablesRequestBuilder(this, initBuilder(builder)); } @Override @@ -207,8 +210,8 @@ public class SqlRequests implements Iterable<AbstractSqlRequest> { protected <B extends AbstractSqlRequest.AbstractSqlRequestBuilder<B, ?>> B initBuilder(B builder) { return builder.from(sourceTopiaApplicationContext) - .to(targetTopiaApplicationContext) - .to(writer); + .to(targetTopiaApplicationContext) + .to(writer); } } @@ -283,8 +286,8 @@ public class SqlRequests implements Iterable<AbstractSqlRequest> { } @Override - public ReplicateTablesRequestBuilder replicateTablesBuilder() { - return flush().replicateTablesBuilder(); + public ReplicateTablesRequestBuilder replicateTablesBuilder(TopiaMetadataModel metadataModel) { + return flush().replicateTablesBuilder(metadataModel); } @Override @@ -323,7 +326,7 @@ public class SqlRequests implements Iterable<AbstractSqlRequest> { } @Override - public <R extends AbstractSqlRequest> BuilderAddRequestStep addRequest(R request) { + public <RR extends AbstractSqlRequest> BuilderAddRequestStep addRequest(RR request) { return builder.addRequest(request); } diff --git a/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/AbstractTablesAction.java b/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/AbstractTablesAction.java index a0eb5e0..3e3f701 100644 --- a/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/AbstractTablesAction.java +++ b/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/AbstractTablesAction.java @@ -24,6 +24,7 @@ package org.nuiton.topia.service.sql.batch.actions; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; import org.nuiton.topia.persistence.support.TopiaSqlWork; import org.nuiton.topia.service.sql.batch.tables.TopiaSqlTable; import org.nuiton.topia.service.sql.batch.tables.TopiaSqlTables; @@ -32,10 +33,13 @@ import org.nuiton.util.TimeLog; import java.io.Writer; import java.sql.Connection; import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.TreeSet; /** * Support to create action. @@ -104,10 +108,13 @@ public abstract class AbstractTablesAction<R extends AbstractTablesRequest> exte } } - protected List<String> getColumnNames(ResultSetMetaData readResultTatMetaData, int columnCount) throws SQLException { + protected List<String> getColumnNames(ResultSetMetaData readResultTatMetaData, int columnCount, Set<String> authorizedColumnNames) throws SQLException { List<String> builder = new ArrayList<>(columnCount); for (int i = 1; i <= columnCount; i++) { - builder.add(readResultTatMetaData.getColumnName(i).toLowerCase()); + String columnName = readResultTatMetaData.getColumnName(i); + if (authorizedColumnNames ==null || authorizedColumnNames.contains(columnName.toLowerCase())) { + builder.add(columnName.toLowerCase()); + } } return builder; } @@ -168,4 +175,22 @@ public abstract class AbstractTablesAction<R extends AbstractTablesRequest> exte } + protected List<String> getColumnNames(TopiaMetadataEntity metadataEntity, TopiaSqlTable table, ResultSet readResultSet ) throws SQLException { + + Set<String> authorizedColumnNames; + if (table.isAssociationTable()) { + authorizedColumnNames = new TreeSet<>(); + authorizedColumnNames.add(metadataEntity.getDbTableName().toLowerCase()); + authorizedColumnNames.add(table.getJoinColumnName().toLowerCase()); + } else { + authorizedColumnNames = metadataEntity.getAllDbColumnNames(); + } + + ResultSetMetaData readResultSetMetaData = readResultSet.getMetaData(); + int columnCount = readResultSetMetaData.getColumnCount(); + + return getColumnNames(readResultSetMetaData, columnCount, authorizedColumnNames); + + } + } diff --git a/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/DeleteTablesAction.java b/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/DeleteTablesAction.java index d6ae77a..f399377 100644 --- a/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/DeleteTablesAction.java +++ b/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/DeleteTablesAction.java @@ -64,7 +64,7 @@ public class DeleteTablesAction extends AbstractTablesAction<DeleteTablesRequest ResultSetMetaData readResultSetMetaData = readResultSet.getMetaData(); int columnCount = readResultSetMetaData.getColumnCount(); - List<String> columnNames = getColumnNames(readResultSetMetaData, columnCount); + List<String> columnNames = getColumnNames(readResultSetMetaData, columnCount, null); String topiaIdColumnName = TopiaEntity.PROPERTY_TOPIA_ID.toLowerCase(); int topiaIdColumnIndex = columnNames.indexOf(topiaIdColumnName) + 1; diff --git a/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/ReplicateTablesAction.java b/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/ReplicateTablesAction.java index a4bd96c..b263ba7 100644 --- a/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/ReplicateTablesAction.java +++ b/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/ReplicateTablesAction.java @@ -25,6 +25,7 @@ package org.nuiton.topia.service.sql.batch.actions; import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; import org.nuiton.topia.service.sql.batch.tables.TopiaSqlTable; import org.nuiton.topia.service.sql.batch.tables.TopiaSqlTables; @@ -60,14 +61,16 @@ public class ReplicateTablesAction extends AbstractTablesAction<ReplicateTablesR @Override protected void executeOnTable(ReplicateTablesRequest request, TopiaSqlTable table, PreparedStatement readStatement) throws SQLException { + TopiaMetadataEntity metadataEntity = table.getMetadataEntity(); + ResultSet readResultSet = readStatement.getResultSet(); ResultSetMetaData readResultSetMetaData = readResultSet.getMetaData(); int columnCount = readResultSetMetaData.getColumnCount(); - List<String> columnNames = getColumnNames(readResultSetMetaData, columnCount); + List<String> columnNames = getColumnNames(metadataEntity, table, readResultSet); - boolean useBlob = table.getMetadataEntity().withBlob(); + boolean useBlob = metadataEntity.withBlob(); boolean useOutputWriter = useOutputWriter(); boolean useOutputDb = useOutputDb(); @@ -75,7 +78,7 @@ public class ReplicateTablesAction extends AbstractTablesAction<ReplicateTablesR if (useBlob) { //FIXME On devrait gérer pour plusieurs colonnes - String columnName = table.getMetadataEntity().getBlobProperties().iterator().next(); + String columnName = metadataEntity.getBlobProperties().iterator().next(); blobsBuilder = BlobsContainer.builder(table.getFullyTableName(), columnName); registerBlobsContainer(blobsBuilder); } @@ -104,9 +107,13 @@ public class ReplicateTablesAction extends AbstractTablesAction<ReplicateTablesR if (useOutputDb) { writeStatement.clearParameters(); + int j = 1; for (int i = 1; i <= columnCount; i++) { - Object object = readResultSet.getObject(i); - writeStatement.setObject(i, object); + String columnName = readResultSetMetaData.getColumnName(i); + if (columnNames.contains(columnName.toLowerCase())) { + Object object = readResultSet.getObject(i); + writeStatement.setObject(j++, object); + } } writeStatement.addBatch(); @@ -145,9 +152,7 @@ public class ReplicateTablesAction extends AbstractTablesAction<ReplicateTablesR StringBuilder columnNamesBuilder = new StringBuilder(); - for (String columnName : columnNames) { - columnNamesBuilder.append(", ").append(columnName); - } + columnNames.forEach(columnName -> columnNamesBuilder.append(", ").append(columnName)); String sql = String.format(INSERT_STATEMENT, table.getSchemaName(), diff --git a/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/ReplicateTablesRequest.java b/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/ReplicateTablesRequest.java index 318ee31..ef87b93 100644 --- a/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/ReplicateTablesRequest.java +++ b/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/ReplicateTablesRequest.java @@ -22,6 +22,8 @@ package org.nuiton.topia.service.sql.batch.actions; * #L% */ +import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; + /** * Created on 01/01/16. * @@ -30,16 +32,30 @@ package org.nuiton.topia.service.sql.batch.actions; */ public class ReplicateTablesRequest extends AbstractTablesRequest { + private TopiaMetadataModel topiaMetaModel; + public static Builder builder() { return new Builder(); } + public TopiaMetadataModel getTopiaMetaModel() { + return topiaMetaModel; + } + + public void setTopiaMetaModel(TopiaMetadataModel topiaMetaModel) { + this.topiaMetaModel = topiaMetaModel; + } + public static class Builder extends AbstractTablesRequestBuilder<Builder, ReplicateTablesRequest> { public Builder() { super(new ReplicateTablesRequest()); } + public Builder setTopiaMetaModel(TopiaMetadataModel topiaMetadataModel) { + request.topiaMetaModel = topiaMetadataModel; + return this; + } } } diff --git a/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/UpdateTablesAction.java b/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/UpdateTablesAction.java index 862ee28..c6fea87 100644 --- a/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/UpdateTablesAction.java +++ b/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/actions/UpdateTablesAction.java @@ -22,11 +22,11 @@ package org.nuiton.topia.service.sql.batch.actions; * #L% */ -import com.google.common.collect.Lists; import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; import org.nuiton.topia.service.sql.batch.tables.TopiaSqlTable; import org.nuiton.topia.service.sql.batch.tables.TopiaSqlTables; @@ -35,7 +35,6 @@ import java.io.IOException; import java.sql.Blob; import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.Date; import java.util.List; @@ -67,10 +66,9 @@ public class UpdateTablesAction extends AbstractTablesAction<UpdateTablesRequest ResultSet readResultSet = readStatement.getResultSet(); - ResultSetMetaData readResultSetMetaData = readResultSet.getMetaData(); - int columnCount = readResultSetMetaData.getColumnCount(); + TopiaMetadataEntity metadataEntity = table.getMetadataEntity(); - List<String> columnNames = Lists.newArrayList(getColumnNames(readResultSetMetaData, columnCount)); + List<String> columnNames = getColumnNames(metadataEntity, table, readResultSet); String topiaIdColumnName = TopiaEntity.PROPERTY_TOPIA_ID.toLowerCase(); int topiaIdColumnIndex = columnNames.indexOf(topiaIdColumnName); @@ -103,18 +101,18 @@ public class UpdateTablesAction extends AbstractTablesAction<UpdateTablesRequest } - if (useOutputDb) { - - writeStatement.clearParameters(); - int i = 1; - for (String columnName : columnNames) { - Object object = readResultSet.getObject(columnName); - writeStatement.setObject(i++, object); - } - writeStatement.setString(columnCount + 1, topiaId); - writeStatement.addBatch(); - - } +// if (useOutputDb) { +// +// writeStatement.clearParameters(); +// int i = 1; +// for (String columnName : columnNames) { +// Object object = readResultSet.getObject(columnName); +// writeStatement.setObject(i++, object); +// } +// writeStatement.setString(i + 1, topiaId); +// writeStatement.addBatch(); +// +// } if (useOutputWriter) { @@ -186,14 +184,14 @@ public class UpdateTablesAction extends AbstractTablesAction<UpdateTablesRequest StringBuilder columnNamesBuilder = new StringBuilder(); - for (String columnName : columnNames) { + columnNames.forEach(columnName -> { columnNamesBuilder.append(", SET ").append(columnName).append(" = ?"); - } + }); String sql = String.format(UPDATE_STATEMENT, - table.getSchemaName(), - table.getTableName(), - columnNamesBuilder.substring(2)); + table.getSchemaName(), + table.getTableName(), + columnNamesBuilder.substring(2)); if (log.isDebugEnabled()) { log.debug("Insert sql: " + sql); } diff --git a/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/tables/TopiaSqlTablesFactory.java b/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/tables/TopiaSqlTablesFactory.java index 7237321..16c68f7 100644 --- a/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/tables/TopiaSqlTablesFactory.java +++ b/topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/tables/TopiaSqlTablesFactory.java @@ -170,6 +170,11 @@ public class TopiaSqlTablesFactory { } @Override + public void visitOneToManyAssociationInverse(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + // Rien a faire + } + + @Override public void visitManyToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { if (predicate.acceptNmAssociation(metadataEntity, propertyName, propertyType)) { diff --git a/topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java b/topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java index 92e8ab3..a13f3cb 100644 --- a/topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java +++ b/topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java @@ -22,6 +22,8 @@ package org.nuiton.topia.templates; * #L% */ +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.apache.commons.logging.Log; @@ -81,11 +83,26 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator { TopiaMetadataModel metadataModel = new TopiaMetadataModel(); + Multimap<String, String> oneToManyAssociationInverses = ArrayListMultimap.create(); + // Première passe pour construire toutes les entités for (ObjectModelClass entityClass : entityClasses) { - buildMetadataEntity(entityClass, metadataModel); + buildMetadataEntity(entityClass, metadataModel, oneToManyAssociationInverses); } + // On remplit désormais les oneToManyAssociationInverses + for (TopiaMetadataEntity metadataEntity : metadataModel) { + + if (oneToManyAssociationInverses.containsKey(metadataEntity.getType())) { + + for (String typeName : oneToManyAssociationInverses.get(metadataEntity.getType())) { + + TopiaMetadataEntity entity = metadataModel.getEntity(typeName); + metadataEntity.addOneToManyAssociationInverse(metadataEntity, typeName, entity.getDbTableName()); + } + + } + } // Seconde passe pour aggréger les héritages for (ObjectModelClass entityClass : entityClasses) { TopiaMetadataEntity metadataEntity = metadataModel.getEntity(entityClass.getName()); @@ -113,97 +130,6 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator { return (packageName + '.').replace('.', File.separatorChar) + model.getName() + "TopiaMetadataModel.json"; } - // protected void generateAddTableMethodContent(StringBuilder content, TopiaMetadataEntity clazz, Set<TopiaMetadataEntity> alreadyDone) { -// -// String clazzName = clazz.getName(); -// -// for (TopiaMetadataEntity reverseAssociationClazz : clazz.getReversedAssociations().values()) { -// -// if (alreadyDone.contains(reverseAssociationClazz)) { -// continue; -// } -// alreadyDone.add(reverseAssociationClazz); -// -// String reverseAssociationName = reverseAssociationClazz.getName(); -// -// if (reverseAssociationClazz.isEmpty()) { -// content.append("" -// -// .addReverseJoinTable(<%=entityEnumName%>.<%=reverseAssociationName%>)} -// ); -// addComment(content, "= " + clazzName); -// } else { -// -// content.append("" -// -// .addAndEnterReverseJoinTable(<%=entityEnumName%>.<%=reverseAssociationName%>)} -// ); -// addComment(content, "→ " + reverseAssociationName); -// generateAddTableMethodContent(content, reverseAssociationClazz, alreadyDone); -// addBackToParent(content, clazzName); -// } -// } -// -// for (TopiaMetadataEntity nmAssociationClazz : clazz.getNmAssociations().values()) { -// -// if (alreadyDone.contains(nmAssociationClazz)) { -// continue; -// } -// alreadyDone.add(nmAssociationClazz); -// -// String nmAssociationName = nmAssociationClazz.getName(); -// -// content.append("" -// -// .addAssociationTable(<%=entityEnumName%>.<%=nmAssociationName%>.name(), true)} -// ); -// addComment(content, "= " + clazzName); -// -// } -// -// for (TopiaMetadataEntity associationClazz : clazz.getAssociations().values()) { -// -// if (alreadyDone.contains(associationClazz)) { -// continue; -// } -// alreadyDone.add(associationClazz); -// -// String associationName = associationClazz.getName(); -// -// if (associationClazz.isEmpty()) { -// -// content.append("" -// -// .addJoinTable(<%=entityEnumName%>.<%=associationName%>)} -// ); -// addComment(content, "= " + clazzName); -// -// } else { -// content.append("" -// -// .addAndEnterJoinTable(<%=entityEnumName%>.<%=associationName%>)} -// ); -// addComment(content, "→ " + associationName); -// generateAddTableMethodContent(content, associationClazz, alreadyDone); -// addBackToParent(content, clazzName); -// -// } -// } -// } -// -// protected void addBackToParent(StringBuilder content, String clazzName) { -// content.append("" -/// -// .backToParent()} -// ); -// addComment(content, "← " + clazzName); -// } -// -// protected void addComment(StringBuilder content, String comment) { -// content.append(" /* ").append(comment).append(" */"); -// } - - protected void applyInheritance(TopiaMetadataEntity metadataEntity, ObjectModelClass entityClass, TopiaMetadataModel metadataModel) { boolean haveSuper = entityClass.getSuperclasses().size() > 0; @@ -214,14 +140,7 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator { if (optionalEntity.isPresent()) { TopiaMetadataEntity parentMetadataEntity = optionalEntity.get(); - metadataEntity.getOneToManyAssociations().putAll(parentMetadataEntity.getOneToManyAssociations()); - metadataEntity.getReversedAssociations().putAll(parentMetadataEntity.getReversedAssociations()); - metadataEntity.getManyToManyAssociations().putAll(parentMetadataEntity.getManyToManyAssociations()); - metadataEntity.getManyToOneAssociations().putAll(parentMetadataEntity.getManyToOneAssociations()); - metadataEntity.getProperties().putAll(parentMetadataEntity.getProperties()); - metadataEntity.getDbColumnsName().putAll(parentMetadataEntity.getDbColumnsName()); - metadataEntity.getDbColumnsName().putAll(parentMetadataEntity.getDbManyToManyAssociationsTableName()); - + parentMetadataEntity.putAll(metadataEntity); applyInheritance(metadataEntity, superClass, metadataModel); } @@ -229,7 +148,7 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator { } - protected TopiaMetadataEntity buildMetadataEntity(ObjectModelClass entityClass, TopiaMetadataModel metadataModel) { + protected TopiaMetadataEntity buildMetadataEntity(ObjectModelClass entityClass, TopiaMetadataModel metadataModel, Multimap<String, String> oneToManyAssociationInverses) { TopiaMetadataEntity metadataEntity; @@ -314,7 +233,7 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator { if (optionalAttributeClass.isPresent()) { attributeClazz = optionalAttributeClass.get().copy(); } else { - attributeClazz = buildMetadataEntity(attributeClass, metadataModel); + attributeClazz = buildMetadataEntity(attributeClass, metadataModel, oneToManyAssociationInverses); } if (GeneratorUtil.isNMultiplicity(attr)) { @@ -327,6 +246,8 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator { // one to many metadataEntity.addOneToManyAssociation(attributeClazz, name, attrColumn); + oneToManyAssociationInverses.put(attributeClazz.getType(), metadataEntity.getType()); + } } else { -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.