branch develop updated (96bd942 -> 263d649)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git from 96bd942 Fix mapping new 263d649 Use exactly columns we are owing, skip other ones detected in databases + add test for TripManagementService The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: 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 Summary of changes: .../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(-) create mode 100644 services-topia/src/test/java/fr/ird/observe/services/topia/service/TripManagementServiceTopiaTest.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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>.
participants (1)
-
codelutin.com scm