Observe-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
July 2016
- 1 participants
- 132 discussions
12/26: Meilleur nommage dans le méta-modèle + correction de l'algorithme de remplacement
by codelutin.com scm 12 Jul '16
by codelutin.com scm 12 Jul '16
12 Jul '16
This is an automated email from the git hooks/post-receive script.
New commit to branch feature/7739 in repository tutti.
See https://gitlab.nuiton.org/codelutin/tutti.git
commit df3e90931dae509f5b2639a175f0a1cac27973d2
Author: Tony CHEMIT <chemit(a)codelutin.com>
Date: Mon Jul 4 12:14:47 2016 +0200
Meilleur nommage dans le méta-modèle + correction de l'algorithme de remplacement
---
.../synchro/InsertSqlStatementGenerator.java | 57 ++++-----
.../synchro/ReplaceSqlStatementGenerator.java | 76 ++++++-----
.../synchro/UpdateSqlStatementGenerator.java | 142 ++++++++++-----------
3 files changed, 130 insertions(+), 145 deletions(-)
diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/InsertSqlStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/InsertSqlStatementGenerator.java
index 65fcac6..312def0 100644
--- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/InsertSqlStatementGenerator.java
+++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/InsertSqlStatementGenerator.java
@@ -36,13 +36,13 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> {
private final String tableName;
private final Binder<R, R> binder;
private final String[] simplePropertyNames;
- private final String[] compositionPropertyNames;
- private final Set<NmAssociation> nmAssociations;
+ private final String[] manyToOneAssociationNames;
+ private final Set<ManyToManyAssociationStruct> manyToManyAssociations;
/**
* Pour décrire une association nm.
*/
- private static class NmAssociation {
+ private static class ManyToManyAssociationStruct {
/**
* Le nom de la propriété dans l'objet.
@@ -57,23 +57,12 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> {
*/
private final String tableName;
- private NmAssociation(String propertyName, String dbColumnName, String tableName) {
+ private ManyToManyAssociationStruct(String propertyName, String dbColumnName, String tableName) {
this.propertyName = propertyName;
this.dbColumnName = dbColumnName;
this.tableName = tableName;
}
- public String getPropertyName() {
- return propertyName;
- }
-
- public String getDbColumnName() {
- return dbColumnName;
- }
-
- public String getTableName() {
- return tableName;
- }
}
public InsertSqlStatementGenerator(TopiaMetadataEntity metadataEntity, Class<R> dtoType) {
@@ -81,19 +70,19 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> {
this.tableName = metadataEntity.getDbTableName();
Set<String> propertyNamesSet = metadataEntity.getProperties().keySet();
this.simplePropertyNames = propertyNamesSet.toArray(new String[propertyNamesSet.size()]);
- Set<String> compositionPropertyNamesSet = metadataEntity.getRequired().keySet();
- this.compositionPropertyNames = propertyNamesSet.toArray(new String[compositionPropertyNamesSet.size()]);
+ Set<String> manyToOneAssociationNamesSet = metadataEntity.getManyToOneAssociations().keySet();
+ this.manyToOneAssociationNames = propertyNamesSet.toArray(new String[manyToOneAssociationNamesSet.size()]);
- Map<String, String> nmAssociationsMap = metadataEntity.getNmAssociations();
- this.nmAssociations = new LinkedHashSet<>();
- for (Map.Entry<String, String> entry : nmAssociationsMap.entrySet()) {
+ Map<String, String> manyToManyAssociationsMap = metadataEntity.getManyToManyAssociations();
+ this.manyToManyAssociations = new LinkedHashSet<>();
+ for (Map.Entry<String, String> entry : manyToManyAssociationsMap.entrySet()) {
String propertyName = entry.getKey();
String dbColumnName = metadataEntity.getDbColumnName(propertyName);
- String tableName = metadataEntity.getBdNmAssociationName(propertyName);
- NmAssociation nmAssociation = new NmAssociation(propertyName, dbColumnName, tableName);
- nmAssociations.add(nmAssociation);
+ String tableName = metadataEntity.getBdManyToManyAssociationTableName(propertyName);
+ ManyToManyAssociationStruct manyToManyAssociation = new ManyToManyAssociationStruct(propertyName, dbColumnName, tableName);
+ manyToManyAssociations.add(manyToManyAssociation);
}
- this.columnNames = computeColumnNames(metadataEntity, simplePropertyNames, compositionPropertyNames);
+ this.columnNames = computeColumnNames(metadataEntity, simplePropertyNames, manyToOneAssociationNames);
this.binder = BinderFactory.newBinder(dtoType);
}
@@ -103,7 +92,7 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> {
addStringParameter(referentialDto.getId(), parameters);
addOtherTypeParameter(referentialDto.getVersion(), parameters);
- addOtherTypeParameter(referentialDto.getCreateDate(), parameters);
+ addDateParameter(referentialDto.getCreateDate(), parameters);
Map<String, Object> simpleParameters = binder.obtainProperties(referentialDto, true, simplePropertyNames);
for (Object parameterValue : simpleParameters.values()) {
@@ -128,7 +117,7 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> {
}
- Map<String, Object> compositionParameters = binder.obtainProperties(referentialDto, true, compositionPropertyNames);
+ Map<String, Object> compositionParameters = binder.obtainProperties(referentialDto, true, manyToOneAssociationNames);
for (Object parameterValue : compositionParameters.values()) {
if (parameterValue == null) {
@@ -154,8 +143,8 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> {
if (log.isDebugEnabled()) {
log.debug("sql: " + result);
}
- for (NmAssociation nmAssociation : nmAssociations) {
- String nmAssociationSql = generateNmAssociationSql(referentialDto, nmAssociation);
+ for (ManyToManyAssociationStruct manyToManyAssociation : manyToManyAssociations) {
+ String nmAssociationSql = generateNmAssociationSql(referentialDto, manyToManyAssociation);
result += nmAssociationSql;
}
@@ -163,18 +152,18 @@ public class InsertSqlStatementGenerator<R extends ReferentialDto> {
}
- private String generateNmAssociationSql(R referentialDto, NmAssociation nmAssociation) {
+ private String generateNmAssociationSql(R referentialDto, ManyToManyAssociationStruct manyToManyAssociationStruct) {
StringBuilder builder = new StringBuilder();
- Collection<ReferentialReference<?>> nmAssociationValues = binder.obtainSourceProperty(referentialDto, nmAssociation.getPropertyName());
- if (CollectionUtils.isNotEmpty(nmAssociationValues)) {
+ Collection<ReferentialReference<?>> manyToManyAssociationValues = binder.obtainSourceProperty(referentialDto, manyToManyAssociationStruct.propertyName);
+ if (CollectionUtils.isNotEmpty(manyToManyAssociationValues)) {
- String nmAssociationTableName = nmAssociation.getTableName();
- String nmAssociationDbColumnName = nmAssociation.getDbColumnName();
+ String nmAssociationTableName = manyToManyAssociationStruct.tableName;
+ String nmAssociationDbColumnName = manyToManyAssociationStruct.dbColumnName;
String referentialDtoId = referentialDto.getId();
- for (ReferentialReference<?> nmAssociationValue : nmAssociationValues) {
+ for (ReferentialReference<?> nmAssociationValue : manyToManyAssociationValues) {
String sql = String.format(NM_ASSOCIATION_INSERT_STATEMENT,
schemaName,
diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/ReplaceSqlStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/ReplaceSqlStatementGenerator.java
index 68e44ff..e0d6e9d 100644
--- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/ReplaceSqlStatementGenerator.java
+++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/ReplaceSqlStatementGenerator.java
@@ -21,11 +21,17 @@ public class ReplaceSqlStatementGenerator {
/** Logger. */
private static final Log log = LogFactory.getLog(ReplaceSqlStatementGenerator.class);
- private static final String REQUIRED_UPDATE_STATEMENT = "UPDATE %s.%s SET %s = '%s', SET topiaVersion = topiaVersion + 1 WHERE topiaId ='%s';\n";
- private static final String NMASSOCIATION_UPDATE_STATEMENT = "UPDATE %s.%s SET %s = '%s' WHERE topiaId ='%s';\n";
-
- private final Set<ReplacementStruct> requiredReplacements;
- private final Set<ReplacementStruct> nmAssociationReplacements;
+ private static final String MANY_TO_ONE_ASSOCIATION_UPDATE_STATEMENT = "UPDATE %s.%s SET %s = '%s', SET topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';\n";
+ private static final String MANY_TO_MANY_ASSOCIATION_UPDATE_STATEMENT = "UPDATE %s.%s SET %s = '%s' WHERE %s = '%s';\n";
+
+ /**
+ * Informations pour remplacer dans une relation many-to-one.
+ */
+ private final Set<ReplacementStruct> manyToOneAssociationReplacements;
+ /**
+ * Informations pour remplacer dans une relation many-to-many.
+ */
+ private final Set<ReplacementStruct> manyToManyAssociationReplacements;
private static class ReplacementStruct {
@@ -42,24 +48,41 @@ public class ReplaceSqlStatementGenerator {
}
public ReplaceSqlStatementGenerator(TopiaMetadataModel topiaMetadataModel, String referentialName) {
- this.requiredReplacements = computeRequiredReplacements(referentialName, topiaMetadataModel);
- this.nmAssociationReplacements = computeNmAssociationReplacements(referentialName, topiaMetadataModel);
+ this.manyToOneAssociationReplacements = computeManyToOneAssociationReplacements(referentialName, topiaMetadataModel);
+ this.manyToManyAssociationReplacements = computeManyToManyAssociationReplacements(referentialName, topiaMetadataModel);
}
public String generateSql(String sourceId, String replacementId) {
StringBuilder builder = new StringBuilder();
- for (ReplacementStruct replacementStruct : requiredReplacements) {
-
- String sql = generateSqlStatement(REQUIRED_UPDATE_STATEMENT, replacementStruct, sourceId, replacementId);
+ for (ReplacementStruct replacementStruct : manyToOneAssociationReplacements) {
+
+ String sql = String.format(MANY_TO_ONE_ASSOCIATION_UPDATE_STATEMENT,
+ replacementStruct.schemaName,
+ replacementStruct.tableName,
+ replacementStruct.columnName,
+ replacementId,
+ sourceId);
+ if (log.isDebugEnabled()) {
+ log.debug("sql: " + sql);
+ }
builder.append(sql);
}
- for (ReplacementStruct replacementStruct : nmAssociationReplacements) {
-
- String sql = generateSqlStatement(NMASSOCIATION_UPDATE_STATEMENT, replacementStruct, sourceId, replacementId);
+ for (ReplacementStruct replacementStruct : manyToManyAssociationReplacements) {
+
+ String sql = String.format(MANY_TO_MANY_ASSOCIATION_UPDATE_STATEMENT,
+ replacementStruct.schemaName,
+ replacementStruct.tableName,
+ replacementStruct.columnName,
+ replacementId,
+ replacementStruct.columnName,
+ sourceId);
+ if (log.isDebugEnabled()) {
+ log.debug("sql: " + sql);
+ }
builder.append(sql);
}
@@ -68,13 +91,13 @@ public class ReplaceSqlStatementGenerator {
}
- private Set<ReplacementStruct> computeRequiredReplacements(String referentialName, TopiaMetadataModel topiaMetadataModel) {
+ private Set<ReplacementStruct> computeManyToOneAssociationReplacements(String referentialName, TopiaMetadataModel topiaMetadataModel) {
Set<ReplacementStruct> result = new LinkedHashSet<>();
for (TopiaMetadataEntity metadataEntity : topiaMetadataModel) {
- result.addAll(metadataEntity.getRequired().entrySet().stream()
+ result.addAll(metadataEntity.getManyToOneAssociations().entrySet().stream()
.filter(entry -> entry.getValue().equals(referentialName))
.map(entry -> new ReplacementStruct(metadataEntity.getDbSchemaName(),
metadataEntity.getDbTableName(),
@@ -87,16 +110,16 @@ public class ReplaceSqlStatementGenerator {
}
- private Set<ReplacementStruct> computeNmAssociationReplacements(String referentialName, TopiaMetadataModel topiaMetadataModel) {
+ private Set<ReplacementStruct> computeManyToManyAssociationReplacements(String referentialName, TopiaMetadataModel topiaMetadataModel) {
Set<ReplacementStruct> result = new LinkedHashSet<>();
for (TopiaMetadataEntity metadataEntity : topiaMetadataModel) {
- result.addAll(metadataEntity.getNmAssociations().entrySet().stream()
+ result.addAll(metadataEntity.getManyToManyAssociations().entrySet().stream()
.filter(entry -> entry.getValue().equals(referentialName))
.map(entry -> new ReplacementStruct(metadataEntity.getDbSchemaName(),
- metadataEntity.getBdNmAssociationName(entry.getValue()),
+ metadataEntity.getBdManyToManyAssociationTableName(entry.getValue()),
metadataEntity.getDbColumnName(entry.getValue())))
.collect(Collectors.toList()));
@@ -106,21 +129,4 @@ public class ReplaceSqlStatementGenerator {
}
- private String generateSqlStatement(String replacementPattern, ReplacementStruct replacementStruct, String sourceId, String replacementId) {
-
- String sql = String.format(replacementPattern,
- replacementStruct.schemaName,
- replacementStruct.tableName,
- replacementStruct.columnName,
- replacementId,
- sourceId);
-
- if (log.isDebugEnabled()) {
- log.debug("sql: " + sql);
- }
-
- return sql;
-
- }
-
}
diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UpdateSqlStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UpdateSqlStatementGenerator.java
index d238410..365e0f4 100644
--- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UpdateSqlStatementGenerator.java
+++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UpdateSqlStatementGenerator.java
@@ -30,21 +30,21 @@ public class UpdateSqlStatementGenerator<R extends ReferentialDto> {
private static final Log log = LogFactory.getLog(UpdateSqlStatementGenerator.class);
private static final String UPDATE_STATEMENT = "UPDATE %s.%s %s WHERE topiaId ='%s';\n";
- private static final String NM_ASSOCIATION_DELETE_STATEMENT = "DELETE FROM %s.%s WHERE %s = '%s';\n";
- private static final String NM_ASSOCIATION_INSERT_STATEMENT = "INSERT INTO %s.%s(%s, %s) VALUES ('%s', '%s');\n";
+ private static final String MANY_TO_MANY_ASSOCIATION_DELETE_STATEMENT = "DELETE FROM %s.%s WHERE %s = '%s';\n";
+ private static final String MANY_TO_MANY_ASSOCIATION_INSERT_STATEMENT = "INSERT INTO %s.%s(%s, %s) VALUES ('%s', '%s');\n";
private final Map<String, String> columnNames;
private final String schemaName;
private final String tableName;
private final Binder<R, R> binder;
private final String[] simplePropertyNames;
- private final String[] compositionPropertyNames;
- private final Set<NmAssociation> nmAssociations;
+ private final String[] manyToOneAssociationNames;
+ private final Set<ManyToManyAssociationStruct> manyToManyAssociations;
/**
* Pour décrire une association nm.
*/
- private static class NmAssociation {
+ private static class ManyToManyAssociationStruct {
/**
* Le nom de la propriété dans l'objet.
@@ -59,43 +59,32 @@ public class UpdateSqlStatementGenerator<R extends ReferentialDto> {
*/
private final String tableName;
- private NmAssociation(String propertyName, String dbColumnName, String tableName) {
+ private ManyToManyAssociationStruct(String propertyName, String dbColumnName, String tableName) {
this.propertyName = propertyName;
this.dbColumnName = dbColumnName;
this.tableName = tableName;
}
- public String getPropertyName() {
- return propertyName;
- }
-
- public String getDbColumnName() {
- return dbColumnName;
- }
-
- public String getTableName() {
- return tableName;
- }
}
public UpdateSqlStatementGenerator(TopiaMetadataEntity metadataEntity, Class<R> dtoType) {
this.schemaName = metadataEntity.getDbSchemaName();
this.tableName = metadataEntity.getDbTableName();
- Set<String> propertyNamesSet = metadataEntity.getProperties().keySet();
- this.simplePropertyNames = propertyNamesSet.toArray(new String[propertyNamesSet.size()]);
- Set<String> compositionPropertyNamesSet = metadataEntity.getRequired().keySet();
- this.compositionPropertyNames = propertyNamesSet.toArray(new String[compositionPropertyNamesSet.size()]);
-
- Map<String, String> nmAssociationsMap = metadataEntity.getNmAssociations();
- this.nmAssociations = new LinkedHashSet<>();
- for (Map.Entry<String, String> entry : nmAssociationsMap.entrySet()) {
+ Set<String> simplePropertyNamesSet = metadataEntity.getProperties().keySet();
+ this.simplePropertyNames = simplePropertyNamesSet.toArray(new String[simplePropertyNamesSet.size()]);
+ Set<String> manyToOneAssociationNamesSet = metadataEntity.getManyToOneAssociations().keySet();
+ this.manyToOneAssociationNames = simplePropertyNamesSet.toArray(new String[manyToOneAssociationNamesSet.size()]);
+
+ Map<String, String> manyToManyAssociationsMap = metadataEntity.getManyToManyAssociations();
+ this.manyToManyAssociations = new LinkedHashSet<>();
+ for (Map.Entry<String, String> entry : manyToManyAssociationsMap.entrySet()) {
String propertyName = entry.getKey();
String dbColumnName = metadataEntity.getDbColumnName(propertyName);
- String tableName = metadataEntity.getBdNmAssociationName(propertyName);
- NmAssociation nmAssociation = new NmAssociation(propertyName, dbColumnName, tableName);
- nmAssociations.add(nmAssociation);
+ String tableName = metadataEntity.getBdManyToManyAssociationTableName(propertyName);
+ ManyToManyAssociationStruct manyToManyAssociation = new ManyToManyAssociationStruct(propertyName, dbColumnName, tableName);
+ manyToManyAssociations.add(manyToManyAssociation);
}
- this.columnNames = computeColumnNames(metadataEntity, simplePropertyNames, compositionPropertyNames);
+ this.columnNames = computeColumnNames(metadataEntity, simplePropertyNames, manyToOneAssociationNames);
this.binder = BinderFactory.newBinder(dtoType);
}
@@ -105,87 +94,88 @@ public class UpdateSqlStatementGenerator<R extends ReferentialDto> {
addStringParameter(TopiaEntity.PROPERTY_TOPIA_ID, referentialDto.getId(), parameters);
addOtherTypeParameter(TopiaEntity.PROPERTY_TOPIA_VERSION, referentialDto.getVersion(), parameters);
- addOtherTypeParameter(TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, referentialDto.getCreateDate(), parameters);
+ addDateParameter(TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, referentialDto.getCreateDate(), parameters);
- Map<String, Object> simpleParameters = binder.obtainProperties(referentialDto, true, simplePropertyNames);
- for (Map.Entry<String, Object> entry : simpleParameters.entrySet()) {
+ Map<String, Object> simpleProperties = binder.obtainProperties(referentialDto, true, simplePropertyNames);
+ for (Map.Entry<String, Object> entry : simpleProperties.entrySet()) {
- String parameterName = entry.getKey();
- String columnName = columnNames.get(parameterName);
- Object parameterValue = entry.getValue();
+ String simplePropertyName = entry.getKey();
+ String columnName = columnNames.get(simplePropertyName);
+ Object simplePropertyValue = entry.getValue();
- if (parameterValue == null) {
+ if (simplePropertyValue == null) {
addNullParameter(columnName, parameters);
continue;
}
- if (parameterValue instanceof String) {
- addStringParameter(columnName, (String) parameterValue, parameters);
+ if (simplePropertyValue instanceof String) {
+ addStringParameter(columnName, (String) simplePropertyValue, parameters);
continue;
}
- if (parameterValue instanceof Date) {
- addDateParameter(columnName, (Date) parameterValue, parameters);
+ if (simplePropertyValue instanceof Date) {
+ addDateParameter(columnName, (Date) simplePropertyValue, parameters);
continue;
}
- if (parameterValue instanceof Enum) {
- addEnumParameter(columnName, (Enum) parameterValue, parameters);
+ if (simplePropertyValue instanceof Enum) {
+ addEnumParameter(columnName, (Enum) simplePropertyValue, parameters);
continue;
}
- addOtherTypeParameter(columnName, parameterValue, parameters);
+ addOtherTypeParameter(columnName, simplePropertyValue, parameters);
}
+ Map<String, Object> manyToOneAssociations = binder.obtainProperties(referentialDto, true, manyToOneAssociationNames);
+ for (Map.Entry<String, Object> entry : manyToOneAssociations.entrySet()) {
- Map<String, Object> compositionParameters = binder.obtainProperties(referentialDto, true, compositionPropertyNames);
- for (Map.Entry<String, Object> entry : compositionParameters.entrySet()) {
-
- String parameterName = entry.getKey();
- String columnName = columnNames.get(parameterName);
- Object parameterValue = entry.getValue();
+ String manyToOneAssociationName = entry.getKey();
+ String columnName = columnNames.get(manyToOneAssociationName);
+ Object manyToOneAssociationValue = entry.getValue();
- if (parameterValue == null) {
+ if (manyToOneAssociationValue == null) {
addNullParameter(columnName, parameters);
continue;
}
- if (parameterValue instanceof ReferentialDto) {
- addReferentialDtoParameter(columnName, (ReferentialDto) parameterValue, parameters);
+ if (manyToOneAssociationValue instanceof ReferentialDto) {
+ addReferentialDtoParameter(columnName, (ReferentialDto) manyToOneAssociationValue, parameters);
continue;
}
- if (parameterValue instanceof ReferentialReference) {
- addReferentialReferenceParameter(columnName, (ReferentialReference) parameterValue, parameters);
+ if (manyToOneAssociationValue instanceof ReferentialReference) {
+ addReferentialReferenceParameter(columnName, (ReferentialReference) manyToOneAssociationValue, parameters);
}
}
- String result = String.format(UPDATE_STATEMENT,
- schemaName,
- tableName,
- parameters.substring(2),
- referentialDto.getId());
+ StringBuilder result = new StringBuilder();
+ String sql = String.format(UPDATE_STATEMENT,
+ schemaName,
+ tableName,
+ parameters.substring(2),
+ referentialDto.getId());
+ result.append(sql);
if (log.isDebugEnabled()) {
- log.debug("sql: " + result);
+ log.debug("sql: " + sql);
}
- for (NmAssociation nmAssociation : nmAssociations) {
- String nmAssociationSql = generateNmAssociationSql(referentialDto, nmAssociation);
- result += nmAssociationSql;
+ for (ManyToManyAssociationStruct manyToManyAssociation : manyToManyAssociations) {
+ String manyToManyAssociationSql = generateManyToManyAssociationSql(referentialDto, manyToManyAssociation);
+ result.append(manyToManyAssociationSql);
}
- return result;
+ return result.toString();
}
- private String generateNmAssociationSql(R referentialDto, NmAssociation nmAssociation) {
+ private String generateManyToManyAssociationSql(R referentialDto, ManyToManyAssociationStruct manyToManyAssociation) {
StringBuilder builder = new StringBuilder();
String referentialDtoId = referentialDto.getId();
- String nmAssociationTableName = nmAssociation.getTableName();
+ String manyToManyAssociationTableName = manyToManyAssociation.tableName;
// On commence toujours par supprimer toutes les anciennes associations, elles seront ré-ajoutées juste après
- String deleteSql = String.format(NM_ASSOCIATION_DELETE_STATEMENT,
+ String deleteSql = String.format(MANY_TO_MANY_ASSOCIATION_DELETE_STATEMENT,
schemaName,
- nmAssociationTableName,
+ manyToManyAssociationTableName,
tableName,
referentialDtoId);
builder.append(deleteSql);
@@ -193,22 +183,22 @@ public class UpdateSqlStatementGenerator<R extends ReferentialDto> {
log.debug("sql: " + deleteSql);
}
- Collection<ReferentialReference<?>> nmAssociationValues = binder.obtainSourceProperty(referentialDto, nmAssociation.getPropertyName());
- if (CollectionUtils.isNotEmpty(nmAssociationValues)) {
+ Collection<ReferentialReference<?>> manyToManyAssociationValues = binder.obtainSourceProperty(referentialDto, manyToManyAssociation.propertyName);
+ if (CollectionUtils.isNotEmpty(manyToManyAssociationValues)) {
- String nmAssociationDbColumnName = nmAssociation.getDbColumnName();
+ String manyToManyAssociationDbColumnName = manyToManyAssociation.dbColumnName;
- for (ReferentialReference<?> nmAssociationValue : nmAssociationValues) {
+ for (ReferentialReference<?> manyToManyAssociationValue : manyToManyAssociationValues) {
- String sql = String.format(NM_ASSOCIATION_INSERT_STATEMENT,
+ String sql = String.format(MANY_TO_MANY_ASSOCIATION_INSERT_STATEMENT,
schemaName,
- nmAssociationTableName,
+ manyToManyAssociationTableName,
tableName,
- nmAssociationDbColumnName,
+ manyToManyAssociationDbColumnName,
referentialDtoId,
- nmAssociationValue.getId());
+ manyToManyAssociationValue.getId());
if (log.isDebugEnabled()) {
log.debug("sql: " + sql);
}
--
To stop receiving notification emails like this one, please contact
codelutin.com SCM administrator <admin+scm(a)codelutin.com>.
1
0
This is an automated email from the git hooks/post-receive script.
New commit to branch feature/7739 in repository tutti.
See https://gitlab.nuiton.org/codelutin/tutti.git
commit 87ce55786b4dc97d6adf45b171125eca687bac73
Author: Tony CHEMIT <chemit(a)codelutin.com>
Date: Mon Jul 4 12:12:50 2016 +0200
Meilleur nommage dans le méta-modèle
---
.../persistence/metadata/TopiaMetadataEntity.java | 68 +++++++++++-----------
.../metadata/TopiaMetadataModelVisitor.java | 30 +++++-----
.../sql/batch/tables/TopiaSqlTablesFactory.java | 6 +-
.../templates/TopiaMetadataModelGenerator.java | 14 ++---
4 files changed, 59 insertions(+), 59 deletions(-)
diff --git a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java
index 6f4b8ba..22b89e9 100644
--- a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java
+++ b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java
@@ -59,7 +59,7 @@ public class TopiaMetadataEntity {
/**
* Le dictionnaire des associations simples (multiplicitié 1→n) (la clef est le nom de la propriété, la valeur son type).
*/
- protected final Map<String, String> associations = new LinkedHashMap<>();
+ protected final Map<String, String> oneToManyAssociations = new LinkedHashMap<>();
/**
* Le dictionnaire des associations inversées (la clef est le nom de la propriété, la valeur son type).
*/
@@ -67,11 +67,11 @@ public class TopiaMetadataEntity {
/**
* Le dictionnaire des associations nm (multiplicitié n→m) (la clef est le nom de la propriété, la valeur son type).
*/
- protected final Map<String, String> nmAssociations = new LinkedHashMap<>();
+ protected final Map<String, String> manyToManyAssociations = new LinkedHashMap<>();
/**
* Le dictionnaire des compositions simples vers des entitées (la clef est le nom de la propriété, la valeur son type).
*/
- protected final Map<String, String> required = new LinkedHashMap<>();
+ protected final Map<String, String> manyToOneAssociations = new LinkedHashMap<>();
/**
* Le dictionnaire des propriétés qui ne sont pas des entités (la clef est le nom de la propriété, la valeur son type).
*/
@@ -86,7 +86,7 @@ public class TopiaMetadataEntity {
/**
* Le nom des tables utilisées pour les associations nm.
*/
- protected final Map<String, String> dbNmAssociationsName = new LinkedHashMap<>();
+ protected final Map<String, String> dbManyToManyAssociationsTableName = new LinkedHashMap<>();
public TopiaMetadataEntity(String parent, String type, String dbSchemaName, String dbTableName) {
@@ -141,16 +141,16 @@ public class TopiaMetadataEntity {
return reversedAssociations;
}
- public Map<String, String> getNmAssociations() {
- return nmAssociations;
+ public Map<String, String> getManyToManyAssociations() {
+ return manyToManyAssociations;
}
- public Map<String, String> getAssociations() {
- return associations;
+ public Map<String, String> getOneToManyAssociations() {
+ return oneToManyAssociations;
}
- public Map<String, String> getRequired() {
- return required;
+ public Map<String, String> getManyToOneAssociations() {
+ return manyToOneAssociations;
}
public Map<String, String> getProperties() {
@@ -169,17 +169,17 @@ public class TopiaMetadataEntity {
return dbColumnName;
}
- public Map<String, String> getDbNmAssociationsName() {
- return dbNmAssociationsName;
+ public Map<String, String> getDbManyToManyAssociationsTableName() {
+ return dbManyToManyAssociationsTableName;
}
- public String getBdNmAssociationName(String propertyName) {
- return dbNmAssociationsName.get(propertyName);
+ public String getBdManyToManyAssociationTableName(String propertyName) {
+ return dbManyToManyAssociationsTableName.get(propertyName);
}
- public void addAssociation(TopiaMetadataEntity associationClazz, String name, String dbColumnName) {
+ public void addOneToManyAssociation(TopiaMetadataEntity associationClazz, String name, String dbColumnName) {
log.info(getType() + "/" + name + "(" + dbColumnName + ") →" + associationClazz.getType());
- associations.put(name, associationClazz.getType());
+ oneToManyAssociations.put(name, associationClazz.getType());
addDbColumnName(name, dbColumnName);
}
@@ -189,16 +189,16 @@ public class TopiaMetadataEntity {
addDbColumnName(name, dbColumnName);
}
- public void addNmAssociation(TopiaMetadataEntity associationClazz, String name, String dbColumnName, String dbNmAssociationName) {
- log.info(getType() + "/" + name + "(" + dbNmAssociationName + ") →" + associationClazz.getType());
- nmAssociations.put(name, associationClazz.getType());
+ public void addManyToManyAssociation(TopiaMetadataEntity associationClazz, String name, String dbColumnName, String dbManyToManyAssociationTableName) {
+ log.info(getType() + "/" + name + "(" + dbManyToManyAssociationTableName + ") →" + associationClazz.getType());
+ manyToManyAssociations.put(name, associationClazz.getType());
addDbColumnName(name, dbColumnName);
- dbNmAssociationsName.put(name, dbNmAssociationName);
+ dbManyToManyAssociationsTableName.put(name, dbManyToManyAssociationTableName);
}
- public void addRequired(TopiaMetadataEntity attributeClazz, String name, String dbColumnName) {
- log.info(getType() + "/" + name + "(" + dbColumnName + ") →" + attributeClazz.getType());
- required.put(name, attributeClazz.getType());
+ public void addManyToOneAssociation(TopiaMetadataEntity associationClazz, String name, String dbColumnName) {
+ log.info(getType() + "/" + name + "(" + dbColumnName + ") →" + associationClazz.getType());
+ manyToOneAssociations.put(name, associationClazz.getType());
addDbColumnName(name, dbColumnName);
}
@@ -210,13 +210,13 @@ public class TopiaMetadataEntity {
public TopiaMetadataEntity copy() {
TopiaMetadataEntity copy = new TopiaMetadataEntity(parent, type, dbSchemaName, dbTableName);
- copy.associations.putAll(associations);
+ copy.oneToManyAssociations.putAll(oneToManyAssociations);
copy.reversedAssociations.putAll(reversedAssociations);
- copy.nmAssociations.putAll(nmAssociations);
- copy.required.putAll(required);
+ copy.manyToManyAssociations.putAll(manyToManyAssociations);
+ copy.manyToOneAssociations.putAll(manyToOneAssociations);
copy.properties.putAll(properties);
copy.dbColumnsName.putAll(dbColumnsName);
- copy.dbNmAssociationsName.putAll(dbNmAssociationsName);
+ copy.dbManyToManyAssociationsTableName.putAll(dbManyToManyAssociationsTableName);
return copy;
}
@@ -227,20 +227,20 @@ public class TopiaMetadataEntity {
String propertyType = entry.getValue();
visitor.visitReversedAssociation(metadataModel, this, propertyName, metadataModel.getEntity(propertyType));
}
- for (Map.Entry<String, String> entry : associations.entrySet()) {
+ for (Map.Entry<String, String> entry : oneToManyAssociations.entrySet()) {
String propertyName = entry.getKey();
String propertyType = entry.getValue();
- visitor.visitAssociation(metadataModel, this, propertyName, metadataModel.getEntity(propertyType));
+ visitor.visitOneToManyAssociation(metadataModel, this, propertyName, metadataModel.getEntity(propertyType));
}
- for (Map.Entry<String, String> entry : nmAssociations.entrySet()) {
+ for (Map.Entry<String, String> entry : manyToManyAssociations.entrySet()) {
String propertyName = entry.getKey();
String propertyType = entry.getValue();
- visitor.visitNmAssociation(metadataModel, this, propertyName, metadataModel.getEntity(propertyType));
+ visitor.visitManyToManyAssociation(metadataModel, this, propertyName, metadataModel.getEntity(propertyType));
}
- for (Map.Entry<String, String> entry : required.entrySet()) {
+ for (Map.Entry<String, String> entry : manyToOneAssociations.entrySet()) {
String propertyName = entry.getKey();
String propertyType = entry.getValue();
- visitor.visitRequired(metadataModel, this, propertyName, metadataModel.getEntity(propertyType));
+ visitor.visitManyToOneAssociation(metadataModel, this, propertyName, metadataModel.getEntity(propertyType));
}
for (Map.Entry<String, String> entry : properties.entrySet()) {
String propertyName = entry.getKey();
@@ -251,7 +251,7 @@ public class TopiaMetadataEntity {
}
public boolean withShell() {
- return !(reversedAssociations.isEmpty() && associations.isEmpty() && nmAssociations.isEmpty());
+ return !(reversedAssociations.isEmpty() && oneToManyAssociations.isEmpty() && manyToManyAssociations.isEmpty());
}
private void addDbColumnName(String name, String dbColumnName) {
diff --git a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java
index 3573c3a..a41b311 100644
--- a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java
+++ b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java
@@ -46,11 +46,11 @@ public interface TopiaMetadataModelVisitor {
void visitReversedAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType);
- void visitAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType);
+ void visitOneToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType);
- void visitNmAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType);
+ void visitManyToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType);
- void visitRequired(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType);
+ void visitManyToOneAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType);
void visitProperty(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, String propertyType);
@@ -82,17 +82,17 @@ public interface TopiaMetadataModelVisitor {
}
@Override
- public void visitAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
+ public void visitOneToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
}
@Override
- public void visitNmAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
+ public void visitManyToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
}
@Override
- public void visitRequired(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
+ public void visitManyToOneAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
}
@@ -141,24 +141,24 @@ public interface TopiaMetadataModelVisitor {
}
@Override
- public void visitAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
- appendProperty("Association: ", metadataEntity, propertyName, propertyType.getType());
+ public void visitOneToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
+ appendProperty("OneToManyAssociation: ", metadataEntity, propertyName, propertyType.getType());
if (visited.add(propertyType.getType())) {
propertyType.accept(this, metadataModel);
}
}
@Override
- public void visitNmAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
- appendProperty("NmAssociation: ", metadataEntity, propertyName, propertyType.getType());
+ public void visitManyToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
+ appendProperty("ManyToManyAssociation: ", metadataEntity, propertyName, propertyType.getType());
if (visited.add(propertyType.getType())) {
propertyType.accept(this, metadataModel);
}
}
@Override
- public void visitRequired(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
- appendProperty("Required: ", metadataEntity, propertyName, propertyType.getType());
+ public void visitManyToOneAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
+ appendProperty("ManyToOneAssociation: ", metadataEntity, propertyName, propertyType.getType());
if (visited.add(propertyType.getType())) {
propertyType.accept(this, metadataModel);
}
@@ -217,21 +217,21 @@ public interface TopiaMetadataModelVisitor {
}
@Override
- public void visitAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
+ public void visitOneToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
if (!deepVisit) {
appendProperty("Association: ", metadataEntity, propertyName, propertyType.getType());
}
}
@Override
- public void visitNmAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
+ public void visitManyToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
if (!deepVisit) {
appendProperty("NmAssociation: ", metadataEntity, propertyName, propertyType.getType());
}
}
@Override
- public void visitRequired(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
+ public void visitManyToOneAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
if (!deepVisit) {
appendProperty("Required: ", metadataEntity, propertyName, propertyType.getType());
}
diff --git a/observe-topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/tables/TopiaSqlTablesFactory.java b/observe-topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/tables/TopiaSqlTablesFactory.java
index 2da7191..b60d321 100644
--- a/observe-topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/tables/TopiaSqlTablesFactory.java
+++ b/observe-topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/tables/TopiaSqlTablesFactory.java
@@ -151,7 +151,7 @@ public class TopiaSqlTablesFactory {
}
@Override
- public void visitAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
+ public void visitOneToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
if (predicate.acceptAssociation(metadataEntity, propertyName, propertyType)) {
@@ -170,7 +170,7 @@ public class TopiaSqlTablesFactory {
}
@Override
- public void visitNmAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
+ public void visitManyToManyAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
if (predicate.acceptNmAssociation(metadataEntity, propertyName, propertyType)) {
@@ -182,7 +182,7 @@ public class TopiaSqlTablesFactory {
}
@Override
- public void visitRequired(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
+ public void visitManyToOneAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
}
@Override
diff --git a/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java b/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java
index 950ae90..b667aab 100644
--- a/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java
+++ b/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java
@@ -216,13 +216,13 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator {
if (optionalEntity.isPresent()) {
TopiaMetadataEntity parentMetadataEntity = optionalEntity.get();
- metadataEntity.getAssociations().putAll(parentMetadataEntity.getAssociations());
+ metadataEntity.getOneToManyAssociations().putAll(parentMetadataEntity.getOneToManyAssociations());
metadataEntity.getReversedAssociations().putAll(parentMetadataEntity.getReversedAssociations());
- metadataEntity.getNmAssociations().putAll(parentMetadataEntity.getNmAssociations());
- metadataEntity.getRequired().putAll(parentMetadataEntity.getRequired());
+ metadataEntity.getManyToManyAssociations().putAll(parentMetadataEntity.getManyToManyAssociations());
+ metadataEntity.getManyToOneAssociations().putAll(parentMetadataEntity.getManyToOneAssociations());
metadataEntity.getProperties().putAll(parentMetadataEntity.getProperties());
metadataEntity.getDbColumnsName().putAll(parentMetadataEntity.getDbColumnsName());
- metadataEntity.getDbColumnsName().putAll(parentMetadataEntity.getDbNmAssociationsName());
+ metadataEntity.getDbColumnsName().putAll(parentMetadataEntity.getDbManyToManyAssociationsTableName());
applyInheritance(metadataEntity, superClass, metadataModel);
@@ -323,18 +323,18 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator {
// many to many
String tableName = templateHelper.getManyToManyTableName(attr);
- metadataEntity.addNmAssociation(attributeClazz, name, attrColumn, tableName);
+ metadataEntity.addManyToManyAssociation(attributeClazz, name, attrColumn, tableName);
} else {
// one to many
- metadataEntity.addAssociation(attributeClazz, name, attrColumn);
+ metadataEntity.addOneToManyAssociation(attributeClazz, name, attrColumn);
}
} else {
if (GeneratorUtil.isNMultiplicity(attr.getReverseMaxMultiplicity()) && !attr.hasAssociationClass()) {
// many to one
- metadataEntity.addRequired(attributeClazz, name, attrColumn);
+ metadataEntity.addManyToOneAssociation(attributeClazz, name, attrColumn);
} else {
--
To stop receiving notification emails like this one, please contact
codelutin.com SCM administrator <admin+scm(a)codelutin.com>.
1
0
10/26: Ajout du générateur de reqètes sql de remplacement (See #7739)
by codelutin.com scm 12 Jul '16
by codelutin.com scm 12 Jul '16
12 Jul '16
This is an automated email from the git hooks/post-receive script.
New commit to branch feature/7739 in repository tutti.
See https://gitlab.nuiton.org/codelutin/tutti.git
commit e5f6f5f1138baf05dfa88a71f31153e427eb9ea6
Author: Tony CHEMIT <chemit(a)codelutin.com>
Date: Mon Jul 4 11:20:50 2016 +0200
Ajout du générateur de reqètes sql de remplacement (See #7739)
---
.../synchro/ReplaceSqlStatementGenerator.java | 126 +++++++++++++++++++++
1 file changed, 126 insertions(+)
diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/ReplaceSqlStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/ReplaceSqlStatementGenerator.java
new file mode 100644
index 0000000..68e44ff
--- /dev/null
+++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/ReplaceSqlStatementGenerator.java
@@ -0,0 +1,126 @@
+package fr.ird.observe.services.service.actions.synchro;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity;
+import org.nuiton.topia.persistence.metadata.TopiaMetadataModel;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Pour générer une requète sql de remplacement à partir d'un référentiel donné.
+ * Created on 04/07/16.
+ *
+ * @author Tony Chemit - chemit(a)codelutin.com
+ * @since 5.0
+ */
+public class ReplaceSqlStatementGenerator {
+
+ /** Logger. */
+ private static final Log log = LogFactory.getLog(ReplaceSqlStatementGenerator.class);
+
+ private static final String REQUIRED_UPDATE_STATEMENT = "UPDATE %s.%s SET %s = '%s', SET topiaVersion = topiaVersion + 1 WHERE topiaId ='%s';\n";
+ private static final String NMASSOCIATION_UPDATE_STATEMENT = "UPDATE %s.%s SET %s = '%s' WHERE topiaId ='%s';\n";
+
+ private final Set<ReplacementStruct> requiredReplacements;
+ private final Set<ReplacementStruct> nmAssociationReplacements;
+
+ private static class ReplacementStruct {
+
+ private final String schemaName;
+ private final String tableName;
+ private final String columnName;
+
+ private ReplacementStruct(String schemaName, String tableName, String columnName) {
+ this.schemaName = schemaName;
+ this.tableName = tableName;
+ this.columnName = columnName;
+ }
+
+ }
+
+ public ReplaceSqlStatementGenerator(TopiaMetadataModel topiaMetadataModel, String referentialName) {
+ this.requiredReplacements = computeRequiredReplacements(referentialName, topiaMetadataModel);
+ this.nmAssociationReplacements = computeNmAssociationReplacements(referentialName, topiaMetadataModel);
+ }
+
+ public String generateSql(String sourceId, String replacementId) {
+
+ StringBuilder builder = new StringBuilder();
+
+ for (ReplacementStruct replacementStruct : requiredReplacements) {
+
+ String sql = generateSqlStatement(REQUIRED_UPDATE_STATEMENT, replacementStruct, sourceId, replacementId);
+ builder.append(sql);
+
+ }
+
+ for (ReplacementStruct replacementStruct : nmAssociationReplacements) {
+
+ String sql = generateSqlStatement(NMASSOCIATION_UPDATE_STATEMENT, replacementStruct, sourceId, replacementId);
+ builder.append(sql);
+
+ }
+
+ return builder.toString();
+
+ }
+
+ private Set<ReplacementStruct> computeRequiredReplacements(String referentialName, TopiaMetadataModel topiaMetadataModel) {
+
+ Set<ReplacementStruct> result = new LinkedHashSet<>();
+
+ for (TopiaMetadataEntity metadataEntity : topiaMetadataModel) {
+
+ result.addAll(metadataEntity.getRequired().entrySet().stream()
+ .filter(entry -> entry.getValue().equals(referentialName))
+ .map(entry -> new ReplacementStruct(metadataEntity.getDbSchemaName(),
+ metadataEntity.getDbTableName(),
+ metadataEntity.getDbColumnName(entry.getValue())))
+ .collect(Collectors.toList()));
+
+ }
+
+ return result;
+
+ }
+
+ private Set<ReplacementStruct> computeNmAssociationReplacements(String referentialName, TopiaMetadataModel topiaMetadataModel) {
+
+ Set<ReplacementStruct> result = new LinkedHashSet<>();
+
+ for (TopiaMetadataEntity metadataEntity : topiaMetadataModel) {
+
+ result.addAll(metadataEntity.getNmAssociations().entrySet().stream()
+ .filter(entry -> entry.getValue().equals(referentialName))
+ .map(entry -> new ReplacementStruct(metadataEntity.getDbSchemaName(),
+ metadataEntity.getBdNmAssociationName(entry.getValue()),
+ metadataEntity.getDbColumnName(entry.getValue())))
+ .collect(Collectors.toList()));
+
+ }
+
+ return result;
+
+ }
+
+ private String generateSqlStatement(String replacementPattern, ReplacementStruct replacementStruct, String sourceId, String replacementId) {
+
+ String sql = String.format(replacementPattern,
+ replacementStruct.schemaName,
+ replacementStruct.tableName,
+ replacementStruct.columnName,
+ replacementId,
+ sourceId);
+
+ if (log.isDebugEnabled()) {
+ log.debug("sql: " + sql);
+ }
+
+ return sql;
+
+ }
+
+}
--
To stop receiving notification emails like this one, please contact
codelutin.com SCM administrator <admin+scm(a)codelutin.com>.
1
0
This is an automated email from the git hooks/post-receive script.
New commit to branch feature/7739 in repository tutti.
See https://gitlab.nuiton.org/codelutin/tutti.git
commit 9a4c7aa6130535a1ea860b52721b5fda40db7d0c
Author: Tony CHEMIT <chemit(a)codelutin.com>
Date: Mon Jul 4 11:20:22 2016 +0200
Ajout du contrat Iterable sur le méta-modèle
---
.../topia/persistence/metadata/TopiaMetadataModel.java | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java
index d4de2b1..43e135f 100644
--- a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java
+++ b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java
@@ -33,15 +33,21 @@ import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
+import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
/**
+ * Méta-modèle topia simplifié qui contient des informations utile pour des algorithmes générique sur les entités.
+ *
+ * Ce méta-modèle est juste un conteneur de méta-modèle d'entités.
+ *
* Created on 03/01/16.
*
* @author Tony Chemit - chemit(a)codelutin.com
+ * @since 5.0
*/
-public class TopiaMetadataModel {
+public class TopiaMetadataModel implements Iterable<TopiaMetadataEntity> {
private static final Log log = LogFactory.getLog(TopiaMetadataModel.class);
@@ -81,4 +87,9 @@ public class TopiaMetadataModel {
}
}
+ @Override
+ public Iterator<TopiaMetadataEntity> iterator() {
+ return entities.values().iterator();
+ }
+
}
--
To stop receiving notification emails like this one, please contact
codelutin.com SCM administrator <admin+scm(a)codelutin.com>.
1
0
08/26: Mise en place de la génération des requètes sql et de leur application (See #7739)
by codelutin.com scm 12 Jul '16
by codelutin.com scm 12 Jul '16
12 Jul '16
This is an automated email from the git hooks/post-receive script.
New commit to branch feature/7739 in repository tutti.
See https://gitlab.nuiton.org/codelutin/tutti.git
commit 472c89862574799bede31d4a61d39c6168873aa8
Author: Tony CHEMIT <chemit(a)codelutin.com>
Date: Wed Jun 29 12:39:49 2016 +0200
Mise en place de la génération des requètes sql et de leur application (See #7739)
---
...UnidirectionalReferentialSynchronizeEngine.java | 15 ++-
...ectionalReferentialSynchronizeLocalService.java | 23 ++++
...nidirectionalReferentialSynchronizeRequest.java | 57 +++++++---
...nalReferentialSynchronizeLocalServiceTopia.java | 121 ++++++++++++++++-----
4 files changed, 170 insertions(+), 46 deletions(-)
diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java
index 9df5e43..44f22f6 100644
--- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java
+++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java
@@ -33,17 +33,24 @@ public class UnidirectionalReferentialSynchronizeEngine {
LocalReferentialStates localReferentialStates = localService.getLocalSourceReferentialStates();
RemoteReferentialDiff remoteReferentialDiff = remoteService.getReferentialDifferential(localReferentialStates);
+ Set<String> sqlRequests = new LinkedHashSet<>();
for (String referentialName : remoteReferentialDiff.getReferentialNames()) {
- UnidirectionalReferentialSynchronizeRequest referentialSynchronizeRequest = buildReferentialSynchronizeRequest(callback, referentialName, remoteReferentialDiff);
+ UnidirectionalReferentialSynchronizeRequest<?> referentialSynchronizeRequest =
+ buildReferentialSynchronizeRequest(callback, referentialName, remoteReferentialDiff);
+
+ Set<String> sqlRequestsforReferential = localService.generateSqlRequests(referentialSynchronizeRequest);
+ sqlRequests.addAll(sqlRequestsforReferential);
}
+ localService.applySqlRequests(sqlRequests);
+
}
private <R extends ReferentialDto> UnidirectionalReferentialSynchronizeRequest buildReferentialSynchronizeRequest(Callback callback, String referentialName, RemoteReferentialDiff remoteReferentialDiff) {
- UnidirectionalReferentialSynchronizeRequest.Builder builder = UnidirectionalReferentialSynchronizeRequest.builder(referentialName);
+ UnidirectionalReferentialSynchronizeRequest.Builder<R> builder = UnidirectionalReferentialSynchronizeRequest.builder(referentialName);
Collection<R> referentialsToAdd = remoteReferentialDiff.getReferentialsToAdd(referentialName);
if (CollectionUtils.isNotEmpty(referentialsToAdd)) {
@@ -101,8 +108,8 @@ public class UnidirectionalReferentialSynchronizeEngine {
// calcul de l'univers de référentiels disponibles pour les remplacements
- ReferentialReferenceSet<R> localSourceEnabledReferenceSet = remoteService.getEnabledReferentialReferenceSet(referentialName);
- Set<ReferentialReference<R>> availableReferentials = localSourceEnabledReferenceSet.getReferences();
+ ReferentialReferenceSet<R> availableReferenceSet = remoteService.getEnabledReferentialReferenceSet(referentialName);
+ Set<ReferentialReference<R>> availableReferentials = availableReferenceSet.getReferences();
if (needCallbackForRemove) {
diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java
index a1b4b22..0c2caa2 100644
--- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java
+++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java
@@ -1,6 +1,11 @@
package fr.ird.observe.services.service.actions.synchro;
+import fr.ird.observe.services.dto.referential.ReferentialDto;
+import fr.ird.observe.services.spi.NoDataAccess;
+import fr.ird.observe.services.spi.PostRequest;
import fr.ird.observe.services.spi.ReadReferentialPermission;
+import fr.ird.observe.services.spi.Write;
+import fr.ird.observe.services.spi.WriteReferentialPermission;
import java.util.Collection;
import java.util.Set;
@@ -34,4 +39,22 @@ public interface UnidirectionalReferentialSynchronizeLocalService {
@ReadReferentialPermission
Set<String> filterIdsUsedInLocalSource(String referentialName, Collection<String> ids);
+ /**
+ * Pour produire le code sql à partir de la demande pour un référentiel donné.
+ *
+ * @param request la demande des actions à produire pour un référentiel donné
+ * @return l'ensemble des requètes sql à appliquer.
+ */
+ @NoDataAccess
+ <R extends ReferentialDto> Set<String> generateSqlRequests(UnidirectionalReferentialSynchronizeRequest<R> request);
+
+ /**
+ * Pour appliquer les requètes sql de mise à jour du réferentiel.
+ *
+ * @param sqlRequests les requètes sql à appliquer
+ */
+ @WriteReferentialPermission
+ @Write
+ @PostRequest
+ void applySqlRequests(Set<String> sqlRequests);
}
diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java
index 4cbe9ed..d049d04 100644
--- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java
+++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java
@@ -1,5 +1,6 @@
package fr.ird.observe.services.service.actions.synchro;
+import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import fr.ird.observe.services.dto.referential.ReferentialDto;
@@ -14,15 +15,15 @@ import fr.ird.observe.services.dto.referential.ReferentialDto;
* @author Tony Chemit - chemit(a)codelutin.com
* @since 5.0
*/
-public class UnidirectionalReferentialSynchronizeRequest {
+public class UnidirectionalReferentialSynchronizeRequest<R extends ReferentialDto> {
- public static Builder builder(String referentialName) {
- return new Builder(referentialName);
+ public static <R extends ReferentialDto> Builder<R> builder(String referentialName) {
+ return new Builder<>(referentialName);
}
private final String referentialName;
- private final ImmutableSet<ReferentialDto> referentialToAdd;
- private final ImmutableSet<ReferentialDto> referentialToUpdate;
+ private final ImmutableSet<R> referentialToAdd;
+ private final ImmutableSet<R> referentialToUpdate;
private final ImmutableSet<String> referentialToRemove;
private final ImmutableMap<String, String> referentialToReplace;
@@ -30,11 +31,11 @@ public class UnidirectionalReferentialSynchronizeRequest {
return referentialName;
}
- public ImmutableSet<ReferentialDto> getReferentialToAdd() {
+ public ImmutableSet<R> getReferentialToAdd() {
return referentialToAdd;
}
- public ImmutableSet<ReferentialDto> getReferentialToUpdate() {
+ public ImmutableSet<R> getReferentialToUpdate() {
return referentialToUpdate;
}
@@ -46,9 +47,33 @@ public class UnidirectionalReferentialSynchronizeRequest {
return referentialToReplace;
}
+ public boolean withReferentialToAdd() {
+ return !referentialToAdd.isEmpty();
+ }
+ public boolean withReferentialToUpdate() {
+ return !referentialToUpdate.isEmpty();
+ }
+ public boolean withReferentialToRemove() {
+ return !referentialToRemove.isEmpty();
+ }
+ public boolean withReferentialToReplace() {
+ return !referentialToReplace.isEmpty();
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("referentialName", referentialName)
+ .add("referentialToAdd", referentialToAdd.size())
+ .add("referentialToUpdate", referentialToUpdate.size())
+ .add("referentialToRemove", referentialToRemove.size())
+ .add("referentialToReplace", referentialToReplace.size())
+ .toString();
+ }
+
private UnidirectionalReferentialSynchronizeRequest(String referentialName,
- ImmutableSet<ReferentialDto> referentialToAdd,
- ImmutableSet<ReferentialDto> referentialToUpdate,
+ ImmutableSet<R> referentialToAdd,
+ ImmutableSet<R> referentialToUpdate,
ImmutableSet<String> referentialToRemove,
ImmutableMap<String, String> toReplace) {
this.referentialName = referentialName;
@@ -58,20 +83,20 @@ public class UnidirectionalReferentialSynchronizeRequest {
this.referentialToReplace = toReplace;
}
- public static class Builder {
+ public static class Builder<R extends ReferentialDto> {
private final String referentialName;
- private final ImmutableSet.Builder<ReferentialDto> toAddBuilder = ImmutableSet.builder();
- private final ImmutableSet.Builder<ReferentialDto> toUpdateBuilder = ImmutableSet.builder();
+ private final ImmutableSet.Builder<R> toAddBuilder = ImmutableSet.builder();
+ private final ImmutableSet.Builder<R> toUpdateBuilder = ImmutableSet.builder();
private final ImmutableSet.Builder<String> toRemoveBuilder = ImmutableSet.builder();
private final ImmutableMap.Builder<String, String> toReplaceBuilder = ImmutableMap.builder();
- public Builder entityToAdd(ReferentialDto referentialDto) {
+ public Builder entityToAdd(R referentialDto) {
toAddBuilder.add(referentialDto);
return this;
}
- public Builder entityToUpdate(ReferentialDto referentialDto) {
+ public Builder entityToUpdate(R referentialDto) {
toUpdateBuilder.add(referentialDto);
return this;
}
@@ -86,9 +111,9 @@ public class UnidirectionalReferentialSynchronizeRequest {
return this;
}
- public UnidirectionalReferentialSynchronizeRequest build() {
+ public UnidirectionalReferentialSynchronizeRequest<R> build() {
- return new UnidirectionalReferentialSynchronizeRequest(
+ return new UnidirectionalReferentialSynchronizeRequest<>(
referentialName,
toAddBuilder.build(),
toUpdateBuilder.build(),
diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java
index e9c2245..79ab42f 100644
--- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java
+++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java
@@ -4,17 +4,19 @@ import fr.ird.observe.ObserveEntityEnum;
import fr.ird.observe.entities.Entities;
import fr.ird.observe.entities.referentiel.ObserveReferentialEntity;
import fr.ird.observe.services.ObserveServiceTopia;
+import fr.ird.observe.services.binder.BinderEngine;
import fr.ird.observe.services.dto.referential.ReferentialDto;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.topia.persistence.TopiaDao;
import org.nuiton.topia.persistence.TopiaEntity;
import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity;
-import org.nuiton.util.beans.Binder;
-import org.nuiton.util.beans.BinderFactory;
+import org.nuiton.topia.persistence.support.TopiaSqlWork;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
import java.util.Collection;
-import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
@@ -67,35 +69,71 @@ public class UnidirectionalReferentialSynchronizeLocalServiceTopia extends Obser
}
- private <E extends ObserveReferentialEntity, R extends ReferentialDto> void generateInsertSqlStatements0(StringBuilder builder,
- Class<E> entityType,
- Class<R> dtoType,
- TopiaMetadataEntity metadataEntity,
- Collection<R> referentialsToAdd) {
-
- Set<String> columnNames = new LinkedHashSet<>();
- columnNames.add(TopiaEntity.PROPERTY_TOPIA_ID);
- columnNames.add(TopiaEntity.PROPERTY_TOPIA_VERSION);
- columnNames.add(TopiaEntity.PROPERTY_TOPIA_CREATE_DATE);
-
- Set<String> propertyNamesSet = metadataEntity.getProperties().keySet();
- String[] propertyNames = propertyNamesSet.toArray(new String[propertyNamesSet.size()]);
- for (String propertyName : propertyNames) {
- columnNames.add(metadataEntity.getDbColumnName(propertyName));
+ @Override
+ public <R extends ReferentialDto> Set<String> generateSqlRequests(UnidirectionalReferentialSynchronizeRequest<R> request) {
+
+ if (log.isTraceEnabled()) {
+ log.trace("generateSqlRequests(" + request + ")");
+ }
+
+ Set<String> result = new LinkedHashSet<>();
+
+ String referentialName = request.getReferentialName();
+
+ ObserveEntityEnum entityEnum = ObserveEntityEnum.valueOf(referentialName);
+ Class entityType = entityEnum.getContract();
+ Class<R> dtoType = BinderEngine.get().getReferentialDtoType(entityType);
+
+ TopiaMetadataEntity metadataEntity = serviceContext.getTopiaApplicationContext().getMetadataModel().getEntity(referentialName);
+ if (request.withReferentialToAdd()) {
+
+ InsertSqlStatementGenerator<R> sqlStatementGenerator = new InsertSqlStatementGenerator<>(metadataEntity, dtoType);
+ for (R referentialDto : request.getReferentialToAdd()) {
+ String sql = sqlStatementGenerator.generateSql(referentialDto);
+ result.add(sql);
+ }
+ }
+
+ if (request.withReferentialToUpdate()) {
+
+ UpdateSqlStatementGenerator<R> sqlStatementGenerator = new UpdateSqlStatementGenerator<R>(metadataEntity, dtoType);
+ for (R referentialDto : request.getReferentialToUpdate()) {
+ String sql = sqlStatementGenerator.generateSql(referentialDto);
+ result.add(sql);
+ }
+
+ }
+
+ if (request.withReferentialToReplace()) {
+
+ //TODO
+
+ }
+ if (request.withReferentialToRemove()) {
+
+ DeleteSqlStatementGenerator sqlStatementGenerator = new DeleteSqlStatementGenerator(metadataEntity);
+ for (String id : request.getReferentialToRemove()) {
+ String sql = sqlStatementGenerator.generateSql(id);
+ result.add(sql);
+ }
+
}
- Binder<R, R> binder = BinderFactory.newBinder(dtoType);
- for (R referentialToAdd : referentialsToAdd) {
- Map<String,Object> properties = new LinkedHashMap<>();
- properties.put(TopiaEntity.PROPERTY_TOPIA_ID, referentialToAdd.getId());
- properties.put(TopiaEntity.PROPERTY_TOPIA_VERSION, referentialToAdd.getVersion());
- properties.put(TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, referentialToAdd.getCreateDate());
+ return result;
+
+ }
- Map<String, Object> obtainProperties = binder.obtainProperties(referentialToAdd, true, propertyNames);
- properties.putAll(obtainProperties);
+ @Override
+ public void applySqlRequests(Set<String> sqlRequests) {
+ if (log.isTraceEnabled()) {
+ log.trace("applySqlRequests(" + sqlRequests + ")");
}
+
+ TopiaSqlWork applySqlWork = new ApplySqlRequestWork(sqlRequests);
+ getTopiaPersistenceContext().getSqlSupport().doSqlWork(applySqlWork);
+
}
private <E extends ObserveReferentialEntity> void getLocalSourceReferentialVersions0(String entityName, Class<E> entityType, LocalReferentialStates localReferentialStates) {
@@ -120,4 +158,35 @@ public class UnidirectionalReferentialSynchronizeLocalServiceTopia extends Obser
}
+ private static class ApplySqlRequestWork implements TopiaSqlWork {
+
+ private static final int BATCH_SIZE = 100;
+
+ private final Set<String> sqlRequests;
+
+ ApplySqlRequestWork(Set<String> sqlRequests) {
+ this.sqlRequests = sqlRequests;
+ }
+
+ @Override
+ public void execute(Connection connection) throws SQLException {
+
+ Statement statement = connection.createStatement();
+
+ int count = 0;
+ for (String sqlRequest : sqlRequests) {
+ statement.addBatch(sqlRequest);
+ if ((count % BATCH_SIZE) == 0) {
+ flush(statement);
+ }
+ }
+ flush(statement);
+
+ }
+
+ private void flush(Statement statement) throws SQLException {
+ statement.executeBatch();
+ statement.clearBatch();
+ }
+ }
}
--
To stop receiving notification emails like this one, please contact
codelutin.com SCM administrator <admin+scm(a)codelutin.com>.
1
0
07/26: Introduction des générateurs de requètes sql (RAF celui de remplacement) (See #7739)
by codelutin.com scm 12 Jul '16
by codelutin.com scm 12 Jul '16
12 Jul '16
This is an automated email from the git hooks/post-receive script.
New commit to branch feature/7739 in repository tutti.
See https://gitlab.nuiton.org/codelutin/tutti.git
commit 7083ee69efa7cd597c309c4acca622ef327445a7
Author: Tony CHEMIT <chemit(a)codelutin.com>
Date: Wed Jun 29 12:37:35 2016 +0200
Introduction des générateurs de requètes sql (RAF celui de remplacement) (See #7739)
---
.../synchro/DeleteSqlStatementGenerator.java | 41 ++++
.../synchro/InsertSqlStatementGenerator.java | 242 ++++++++++++++++++
.../synchro/UpdateSqlStatementGenerator.java | 269 +++++++++++++++++++++
3 files changed, 552 insertions(+)
diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/DeleteSqlStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/DeleteSqlStatementGenerator.java
new file mode 100644
index 0000000..c4339de
--- /dev/null
+++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/DeleteSqlStatementGenerator.java
@@ -0,0 +1,41 @@
+package fr.ird.observe.services.service.actions.synchro;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity;
+
+/**
+ * Pour générer une requète sql de suppression à partir d'un référentiel donné.
+ *
+ * Created on 29/06/16.
+ *
+ * @author Tony Chemit - chemit(a)codelutin.com
+ */
+public class DeleteSqlStatementGenerator {
+
+ /** Logger. */
+ private static final Log log = LogFactory.getLog(DeleteSqlStatementGenerator.class);
+
+ private static final String DELETE_STATEMENT = "DELETE FROM %s.%s WHERE topiaId = '%s';\n";
+
+ private final String schemaName;
+ private final String tableName;
+
+ public DeleteSqlStatementGenerator(TopiaMetadataEntity metadataEntity) {
+ this.schemaName = metadataEntity.getDbSchemaName();
+ this.tableName = metadataEntity.getDbTableName();
+ }
+
+ public String generateSql(String id) {
+
+ String result = String.format(DELETE_STATEMENT, schemaName, tableName, id);
+
+ if (log.isDebugEnabled()) {
+ log.debug("sql: " + result);
+ }
+
+ return result;
+
+ }
+
+}
diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/InsertSqlStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/InsertSqlStatementGenerator.java
new file mode 100644
index 0000000..65fcac6
--- /dev/null
+++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/InsertSqlStatementGenerator.java
@@ -0,0 +1,242 @@
+package fr.ird.observe.services.service.actions.synchro;
+
+import fr.ird.observe.services.dto.referential.ReferentialDto;
+import fr.ird.observe.services.dto.referential.ReferentialReference;
+import org.apache.commons.collections.CollectionUtils;
+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.util.beans.Binder;
+import org.nuiton.util.beans.BinderFactory;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Pour générer une requète sql d'ajout à partir d'un référentiel donné.
+ *
+ * Created on 29/06/16.
+ *
+ * @author Tony Chemit - chemit(a)codelutin.com
+ */
+public class InsertSqlStatementGenerator<R extends ReferentialDto> {
+
+ /** Logger. */
+ private static final Log log = LogFactory.getLog(InsertSqlStatementGenerator.class);
+
+ private static final String INSERT_STATEMENT = "INSERT INTO %s.%s(%s) VALUES (%s);\n";
+ private static final String NM_ASSOCIATION_INSERT_STATEMENT = "INSERT INTO %s.%s(%s, %s) VALUES ('%s', '%s');\n";
+
+ private final Set<String> columnNames;
+ private final String schemaName;
+ private final String tableName;
+ private final Binder<R, R> binder;
+ private final String[] simplePropertyNames;
+ private final String[] compositionPropertyNames;
+ private final Set<NmAssociation> nmAssociations;
+
+ /**
+ * Pour décrire une association nm.
+ */
+ private static class NmAssociation {
+
+ /**
+ * Le nom de la propriété dans l'objet.
+ */
+ private final String propertyName;
+ /**
+ * Le nom de la colonne de l'association dans la table d'association.
+ */
+ private final String dbColumnName;
+ /**
+ * Le nom de la table d'association.
+ */
+ private final String tableName;
+
+ private NmAssociation(String propertyName, String dbColumnName, String tableName) {
+ this.propertyName = propertyName;
+ this.dbColumnName = dbColumnName;
+ this.tableName = tableName;
+ }
+
+ public String getPropertyName() {
+ return propertyName;
+ }
+
+ public String getDbColumnName() {
+ return dbColumnName;
+ }
+
+ public String getTableName() {
+ return tableName;
+ }
+ }
+
+ public InsertSqlStatementGenerator(TopiaMetadataEntity metadataEntity, Class<R> dtoType) {
+ this.schemaName = metadataEntity.getDbSchemaName();
+ this.tableName = metadataEntity.getDbTableName();
+ Set<String> propertyNamesSet = metadataEntity.getProperties().keySet();
+ this.simplePropertyNames = propertyNamesSet.toArray(new String[propertyNamesSet.size()]);
+ Set<String> compositionPropertyNamesSet = metadataEntity.getRequired().keySet();
+ this.compositionPropertyNames = propertyNamesSet.toArray(new String[compositionPropertyNamesSet.size()]);
+
+ Map<String, String> nmAssociationsMap = metadataEntity.getNmAssociations();
+ this.nmAssociations = new LinkedHashSet<>();
+ for (Map.Entry<String, String> entry : nmAssociationsMap.entrySet()) {
+ String propertyName = entry.getKey();
+ String dbColumnName = metadataEntity.getDbColumnName(propertyName);
+ String tableName = metadataEntity.getBdNmAssociationName(propertyName);
+ NmAssociation nmAssociation = new NmAssociation(propertyName, dbColumnName, tableName);
+ nmAssociations.add(nmAssociation);
+ }
+ this.columnNames = computeColumnNames(metadataEntity, simplePropertyNames, compositionPropertyNames);
+ this.binder = BinderFactory.newBinder(dtoType);
+ }
+
+ public String generateSql(R referentialDto) {
+
+ Set<String> parameters = new LinkedHashSet<>();
+
+ addStringParameter(referentialDto.getId(), parameters);
+ addOtherTypeParameter(referentialDto.getVersion(), parameters);
+ addOtherTypeParameter(referentialDto.getCreateDate(), parameters);
+
+ Map<String, Object> simpleParameters = binder.obtainProperties(referentialDto, true, simplePropertyNames);
+ for (Object parameterValue : simpleParameters.values()) {
+
+ if (parameterValue == null) {
+ addNullParameter(parameters);
+ continue;
+ }
+ if (parameterValue instanceof String) {
+ addStringParameter((String) parameterValue, parameters);
+ continue;
+ }
+ if (parameterValue instanceof Date) {
+ addDateParameter((Date) parameterValue, parameters);
+ continue;
+ }
+ if (parameterValue instanceof Enum) {
+ addEnumParameter((Enum) parameterValue, parameters);
+ continue;
+ }
+ addOtherTypeParameter(parameterValue, parameters);
+
+ }
+
+ Map<String, Object> compositionParameters = binder.obtainProperties(referentialDto, true, compositionPropertyNames);
+ for (Object parameterValue : compositionParameters.values()) {
+
+ if (parameterValue == null) {
+ addNullParameter(parameters);
+ continue;
+ }
+ if (parameterValue instanceof ReferentialDto) {
+ addReferentialDtoParameter((ReferentialDto) parameterValue, parameters);
+ continue;
+ }
+ if (parameterValue instanceof ReferentialReference) {
+ addReferentialReferenceParameter((ReferentialReference) parameterValue, parameters);
+ }
+
+ }
+
+ String result = String.format(INSERT_STATEMENT,
+ schemaName,
+ tableName,
+ String.join(",", columnNames),
+ String.join(",", parameters));
+
+ if (log.isDebugEnabled()) {
+ log.debug("sql: " + result);
+ }
+ for (NmAssociation nmAssociation : nmAssociations) {
+ String nmAssociationSql = generateNmAssociationSql(referentialDto, nmAssociation);
+ result += nmAssociationSql;
+ }
+
+ return result;
+
+ }
+
+ private String generateNmAssociationSql(R referentialDto, NmAssociation nmAssociation) {
+
+ StringBuilder builder = new StringBuilder();
+
+ Collection<ReferentialReference<?>> nmAssociationValues = binder.obtainSourceProperty(referentialDto, nmAssociation.getPropertyName());
+ if (CollectionUtils.isNotEmpty(nmAssociationValues)) {
+
+ String nmAssociationTableName = nmAssociation.getTableName();
+ String nmAssociationDbColumnName = nmAssociation.getDbColumnName();
+ String referentialDtoId = referentialDto.getId();
+
+ for (ReferentialReference<?> nmAssociationValue : nmAssociationValues) {
+
+ String sql = String.format(NM_ASSOCIATION_INSERT_STATEMENT,
+ schemaName,
+ nmAssociationTableName,
+ this.tableName,
+ nmAssociationDbColumnName,
+ referentialDtoId,
+ nmAssociationValue.getId());
+ if (log.isDebugEnabled()) {
+ log.debug("sql: " + sql);
+ }
+ builder.append(sql);
+
+ }
+ }
+
+ return builder.toString();
+
+ }
+
+ private Set<String> computeColumnNames(TopiaMetadataEntity metadataEntity,
+ String[] simplePropertyNames,
+ String[] compositionPropertyNames) {
+ Set<String> columnNames = new LinkedHashSet<>();
+ columnNames.add(TopiaEntity.PROPERTY_TOPIA_ID);
+ columnNames.add(TopiaEntity.PROPERTY_TOPIA_VERSION);
+ columnNames.add(TopiaEntity.PROPERTY_TOPIA_CREATE_DATE);
+
+ for (String propertyName : simplePropertyNames) {
+ columnNames.add(metadataEntity.getDbColumnName(propertyName));
+ }
+ for (String propertyName : compositionPropertyNames) {
+ columnNames.add(metadataEntity.getDbColumnName(propertyName));
+ }
+ return columnNames;
+ }
+
+ private void addNullParameter(Set<String> parameters) {
+ parameters.add("NULL");
+ }
+
+ private void addStringParameter(String parameter, Set<String> parameters) {
+ parameters.add("'" + parameter.replaceAll("'", "''") + "'");
+ }
+
+ private void addDateParameter(Date parameter, Set<String> parameters) {
+ parameters.add("'" + parameter + "'");
+ }
+
+ private void addEnumParameter(Enum parameter, Set<String> parameters) {
+ parameters.add("" + parameter.ordinal());
+ }
+
+ private void addOtherTypeParameter(Object parameter, Set<String> parameters) {
+ parameters.add("" + parameter);
+ }
+
+ private void addReferentialReferenceParameter(ReferentialReference parameter, Set<String> parameters) {
+ addStringParameter(parameter.getId(), parameters);
+ }
+
+ private void addReferentialDtoParameter(ReferentialDto parameter, Set<String> parameters) {
+ addStringParameter(parameter.getId(), parameters);
+ }
+}
diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UpdateSqlStatementGenerator.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UpdateSqlStatementGenerator.java
new file mode 100644
index 0000000..d238410
--- /dev/null
+++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UpdateSqlStatementGenerator.java
@@ -0,0 +1,269 @@
+package fr.ird.observe.services.service.actions.synchro;
+
+import fr.ird.observe.services.dto.referential.ReferentialDto;
+import fr.ird.observe.services.dto.referential.ReferentialReference;
+import org.apache.commons.collections.CollectionUtils;
+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.util.beans.Binder;
+import org.nuiton.util.beans.BinderFactory;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+/**
+ * Pour générer une requète sql de mise à jour à partir d'un référentiel donné.
+ *
+ * Created on 29/06/16.
+ *
+ * @author Tony Chemit - chemit(a)codelutin.com
+ */
+public class UpdateSqlStatementGenerator<R extends ReferentialDto> {
+
+ /** Logger. */
+ private static final Log log = LogFactory.getLog(UpdateSqlStatementGenerator.class);
+
+ private static final String UPDATE_STATEMENT = "UPDATE %s.%s %s WHERE topiaId ='%s';\n";
+ private static final String NM_ASSOCIATION_DELETE_STATEMENT = "DELETE FROM %s.%s WHERE %s = '%s';\n";
+ private static final String NM_ASSOCIATION_INSERT_STATEMENT = "INSERT INTO %s.%s(%s, %s) VALUES ('%s', '%s');\n";
+
+ private final Map<String, String> columnNames;
+ private final String schemaName;
+ private final String tableName;
+ private final Binder<R, R> binder;
+ private final String[] simplePropertyNames;
+ private final String[] compositionPropertyNames;
+ private final Set<NmAssociation> nmAssociations;
+
+ /**
+ * Pour décrire une association nm.
+ */
+ private static class NmAssociation {
+
+ /**
+ * Le nom de la propriété dans l'objet.
+ */
+ private final String propertyName;
+ /**
+ * Le nom de la colonne de l'association dans la table d'association.
+ */
+ private final String dbColumnName;
+ /**
+ * Le nom de la table d'association.
+ */
+ private final String tableName;
+
+ private NmAssociation(String propertyName, String dbColumnName, String tableName) {
+ this.propertyName = propertyName;
+ this.dbColumnName = dbColumnName;
+ this.tableName = tableName;
+ }
+
+ public String getPropertyName() {
+ return propertyName;
+ }
+
+ public String getDbColumnName() {
+ return dbColumnName;
+ }
+
+ public String getTableName() {
+ return tableName;
+ }
+ }
+
+ public UpdateSqlStatementGenerator(TopiaMetadataEntity metadataEntity, Class<R> dtoType) {
+ this.schemaName = metadataEntity.getDbSchemaName();
+ this.tableName = metadataEntity.getDbTableName();
+ Set<String> propertyNamesSet = metadataEntity.getProperties().keySet();
+ this.simplePropertyNames = propertyNamesSet.toArray(new String[propertyNamesSet.size()]);
+ Set<String> compositionPropertyNamesSet = metadataEntity.getRequired().keySet();
+ this.compositionPropertyNames = propertyNamesSet.toArray(new String[compositionPropertyNamesSet.size()]);
+
+ Map<String, String> nmAssociationsMap = metadataEntity.getNmAssociations();
+ this.nmAssociations = new LinkedHashSet<>();
+ for (Map.Entry<String, String> entry : nmAssociationsMap.entrySet()) {
+ String propertyName = entry.getKey();
+ String dbColumnName = metadataEntity.getDbColumnName(propertyName);
+ String tableName = metadataEntity.getBdNmAssociationName(propertyName);
+ NmAssociation nmAssociation = new NmAssociation(propertyName, dbColumnName, tableName);
+ nmAssociations.add(nmAssociation);
+ }
+ this.columnNames = computeColumnNames(metadataEntity, simplePropertyNames, compositionPropertyNames);
+ this.binder = BinderFactory.newBinder(dtoType);
+ }
+
+ public String generateSql(R referentialDto) {
+
+ StringBuilder parameters = new StringBuilder();
+
+ addStringParameter(TopiaEntity.PROPERTY_TOPIA_ID, referentialDto.getId(), parameters);
+ addOtherTypeParameter(TopiaEntity.PROPERTY_TOPIA_VERSION, referentialDto.getVersion(), parameters);
+ addOtherTypeParameter(TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, referentialDto.getCreateDate(), parameters);
+
+ Map<String, Object> simpleParameters = binder.obtainProperties(referentialDto, true, simplePropertyNames);
+ for (Map.Entry<String, Object> entry : simpleParameters.entrySet()) {
+
+ String parameterName = entry.getKey();
+ String columnName = columnNames.get(parameterName);
+ Object parameterValue = entry.getValue();
+
+ if (parameterValue == null) {
+ addNullParameter(columnName, parameters);
+ continue;
+ }
+ if (parameterValue instanceof String) {
+ addStringParameter(columnName, (String) parameterValue, parameters);
+ continue;
+ }
+ if (parameterValue instanceof Date) {
+ addDateParameter(columnName, (Date) parameterValue, parameters);
+ continue;
+ }
+ if (parameterValue instanceof Enum) {
+ addEnumParameter(columnName, (Enum) parameterValue, parameters);
+ continue;
+ }
+ addOtherTypeParameter(columnName, parameterValue, parameters);
+
+ }
+
+
+ Map<String, Object> compositionParameters = binder.obtainProperties(referentialDto, true, compositionPropertyNames);
+ for (Map.Entry<String, Object> entry : compositionParameters.entrySet()) {
+
+ String parameterName = entry.getKey();
+ String columnName = columnNames.get(parameterName);
+ Object parameterValue = entry.getValue();
+
+ if (parameterValue == null) {
+ addNullParameter(columnName, parameters);
+ continue;
+ }
+ if (parameterValue instanceof ReferentialDto) {
+ addReferentialDtoParameter(columnName, (ReferentialDto) parameterValue, parameters);
+ continue;
+ }
+ if (parameterValue instanceof ReferentialReference) {
+ addReferentialReferenceParameter(columnName, (ReferentialReference) parameterValue, parameters);
+ }
+
+ }
+
+ String result = String.format(UPDATE_STATEMENT,
+ schemaName,
+ tableName,
+ parameters.substring(2),
+ referentialDto.getId());
+
+ if (log.isDebugEnabled()) {
+ log.debug("sql: " + result);
+ }
+
+ for (NmAssociation nmAssociation : nmAssociations) {
+ String nmAssociationSql = generateNmAssociationSql(referentialDto, nmAssociation);
+ result += nmAssociationSql;
+ }
+
+ return result;
+
+ }
+
+ private String generateNmAssociationSql(R referentialDto, NmAssociation nmAssociation) {
+
+ StringBuilder builder = new StringBuilder();
+
+ String referentialDtoId = referentialDto.getId();
+ String nmAssociationTableName = nmAssociation.getTableName();
+
+ // On commence toujours par supprimer toutes les anciennes associations, elles seront ré-ajoutées juste après
+ String deleteSql = String.format(NM_ASSOCIATION_DELETE_STATEMENT,
+ schemaName,
+ nmAssociationTableName,
+ tableName,
+ referentialDtoId);
+ builder.append(deleteSql);
+ if (log.isDebugEnabled()) {
+ log.debug("sql: " + deleteSql);
+ }
+
+ Collection<ReferentialReference<?>> nmAssociationValues = binder.obtainSourceProperty(referentialDto, nmAssociation.getPropertyName());
+ if (CollectionUtils.isNotEmpty(nmAssociationValues)) {
+
+
+ String nmAssociationDbColumnName = nmAssociation.getDbColumnName();
+
+
+ for (ReferentialReference<?> nmAssociationValue : nmAssociationValues) {
+
+ String sql = String.format(NM_ASSOCIATION_INSERT_STATEMENT,
+ schemaName,
+ nmAssociationTableName,
+ tableName,
+ nmAssociationDbColumnName,
+ referentialDtoId,
+ nmAssociationValue.getId());
+ if (log.isDebugEnabled()) {
+ log.debug("sql: " + sql);
+ }
+ builder.append(sql);
+
+ }
+ }
+
+ return builder.toString();
+
+ }
+
+ private Map<String, String> computeColumnNames(TopiaMetadataEntity metadataEntity,
+ String[] simplePropertyNames,
+ String[] compositionPropertyNames) {
+ Map<String, String> columnNames = new TreeMap<>();
+
+ for (String propertyName : simplePropertyNames) {
+ columnNames.put(propertyName, metadataEntity.getDbColumnName(propertyName));
+ }
+ for (String propertyName : compositionPropertyNames) {
+ columnNames.put(propertyName, metadataEntity.getDbColumnName(propertyName));
+ }
+ return columnNames;
+ }
+
+ private void addNullParameter(String columnName, StringBuilder parameters) {
+ addParameter0(columnName, "NULL", parameters);
+ }
+
+ private void addStringParameter(String columnName, String parameter, StringBuilder parameters) {
+ addParameter0(columnName, "'" + parameter.replaceAll("'", "''") + "'", parameters);
+ }
+
+ private void addDateParameter(String columnName, Date parameter, StringBuilder parameters) {
+ addParameter0(columnName, "'" + parameter + "'", parameters);
+ }
+
+ private void addEnumParameter(String columnName, Enum parameter, StringBuilder parameters) {
+ addParameter0(columnName, "" + parameter.ordinal(), parameters);
+ }
+
+ private void addOtherTypeParameter(String columnName, Object parameter, StringBuilder parameters) {
+ addParameter0(columnName, "" + parameter, parameters);
+ }
+
+ private void addReferentialReferenceParameter(String columnName, ReferentialReference parameter, StringBuilder parameters) {
+ addStringParameter(columnName, parameter.getId(), parameters);
+ }
+
+ private void addReferentialDtoParameter(String columnName, ReferentialDto parameter, StringBuilder parameters) {
+ addStringParameter(columnName, parameter.getId(), parameters);
+ }
+
+ private void addParameter0(String columnName, String value, StringBuilder parameters) {
+ parameters.append(", SET ").append(columnName).append(" = ").append(value);
+ }
+}
--
To stop receiving notification emails like this one, please contact
codelutin.com SCM administrator <admin+scm(a)codelutin.com>.
1
0
12 Jul '16
This is an automated email from the git hooks/post-receive script.
New commit to branch feature/7739 in repository tutti.
See https://gitlab.nuiton.org/codelutin/tutti.git
commit acbf463dfae4b2fa6aba567fbf36c80393af71e2
Author: Tony CHEMIT <chemit(a)codelutin.com>
Date: Wed Jun 29 11:58:49 2016 +0200
Ajout du nom des tables pour les associations many-to-many
---
.../persistence/metadata/TopiaMetadataEntity.java | 26 ++++++++++++++++++----
.../templates/TopiaMetadataModelGenerator.java | 4 +++-
2 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java
index 8c16f2c..6f4b8ba 100644
--- a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java
+++ b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java
@@ -83,9 +83,14 @@ public class TopiaMetadataEntity {
* @see #getDbColumnName(String)
*/
protected final Map<String, String> dbColumnsName = new LinkedHashMap<>();
+ /**
+ * Le nom des tables utilisées pour les associations nm.
+ */
+ protected final Map<String, String> dbNmAssociationsName = new LinkedHashMap<>();
+
public TopiaMetadataEntity(String parent, String type, String dbSchemaName, String dbTableName) {
- this.parent=parent;
+ this.parent = parent;
this.type = type;
this.dbSchemaName = dbSchemaName;
this.dbTableName = dbTableName;
@@ -116,7 +121,10 @@ public class TopiaMetadataEntity {
.toString();
}
- public boolean withParent() { return parent!=null;}
+ public boolean withParent() {
+ return parent != null;
+ }
+
public String getParent() {
return parent;
}
@@ -161,6 +169,14 @@ public class TopiaMetadataEntity {
return dbColumnName;
}
+ public Map<String, String> getDbNmAssociationsName() {
+ return dbNmAssociationsName;
+ }
+
+ public String getBdNmAssociationName(String propertyName) {
+ return dbNmAssociationsName.get(propertyName);
+ }
+
public void addAssociation(TopiaMetadataEntity associationClazz, String name, String dbColumnName) {
log.info(getType() + "/" + name + "(" + dbColumnName + ") →" + associationClazz.getType());
associations.put(name, associationClazz.getType());
@@ -173,10 +189,11 @@ public class TopiaMetadataEntity {
addDbColumnName(name, dbColumnName);
}
- public void addNmAssociation(TopiaMetadataEntity associationClazz, String name, String dbColumnName) {
- log.info(getType() + "/" + name + "(" + dbColumnName + ") →" + associationClazz.getType());
+ public void addNmAssociation(TopiaMetadataEntity associationClazz, String name, String dbColumnName, String dbNmAssociationName) {
+ log.info(getType() + "/" + name + "(" + dbNmAssociationName + ") →" + associationClazz.getType());
nmAssociations.put(name, associationClazz.getType());
addDbColumnName(name, dbColumnName);
+ dbNmAssociationsName.put(name, dbNmAssociationName);
}
public void addRequired(TopiaMetadataEntity attributeClazz, String name, String dbColumnName) {
@@ -199,6 +216,7 @@ public class TopiaMetadataEntity {
copy.required.putAll(required);
copy.properties.putAll(properties);
copy.dbColumnsName.putAll(dbColumnsName);
+ copy.dbNmAssociationsName.putAll(dbNmAssociationsName);
return copy;
}
diff --git a/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java b/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java
index 4d79925..950ae90 100644
--- a/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java
+++ b/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java
@@ -222,6 +222,7 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator {
metadataEntity.getRequired().putAll(parentMetadataEntity.getRequired());
metadataEntity.getProperties().putAll(parentMetadataEntity.getProperties());
metadataEntity.getDbColumnsName().putAll(parentMetadataEntity.getDbColumnsName());
+ metadataEntity.getDbColumnsName().putAll(parentMetadataEntity.getDbNmAssociationsName());
applyInheritance(metadataEntity, superClass, metadataModel);
@@ -321,7 +322,8 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator {
if (GeneratorUtil.isNMultiplicity(attr.getReverseMaxMultiplicity()) && !attr.hasAssociationClass()) {
// many to many
- metadataEntity.addNmAssociation(attributeClazz, name, attrColumn);
+ String tableName = templateHelper.getManyToManyTableName(attr);
+ metadataEntity.addNmAssociation(attributeClazz, name, attrColumn, tableName);
} else {
// one to many
--
To stop receiving notification emails like this one, please contact
codelutin.com SCM administrator <admin+scm(a)codelutin.com>.
1
0
05/26: Introduction du moteur de synchronisation (reste plus qu'à générer le code sql à partir de la requète produite (See #7739)
by codelutin.com scm 12 Jul '16
by codelutin.com scm 12 Jul '16
12 Jul '16
This is an automated email from the git hooks/post-receive script.
New commit to branch feature/7739 in repository tutti.
See https://gitlab.nuiton.org/codelutin/tutti.git
commit f89492829439b9a5a6d1e6d79ebaf1c8a2096f53
Author: Tony CHEMIT <chemit(a)codelutin.com>
Date: Tue Jun 28 18:31:08 2016 +0200
Introduction du moteur de synchronisation (reste plus qu'à générer le code sql à partir de la requète produite (See #7739)
---
.../actions/synchro/RemoteReferentialDiff.java | 39 +++--
...UnidirectionalReferentialSynchronizeEngine.java | 177 +++++++++++++++++++++
...ectionalReferentialSynchronizeLocalService.java | 10 --
...ctionalReferentialSynchronizeRemoteService.java | 11 ++
...nidirectionalReferentialSynchronizeRequest.java | 106 ++++++++++++
...nalReferentialSynchronizeLocalServiceTopia.java | 55 ++++---
...alReferentialSynchronizeRemoteServiceTopia.java | 35 ++++
7 files changed, 388 insertions(+), 45 deletions(-)
diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/RemoteReferentialDiff.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/RemoteReferentialDiff.java
index 2aa4b8d..83787d2 100644
--- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/RemoteReferentialDiff.java
+++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/RemoteReferentialDiff.java
@@ -7,6 +7,8 @@ import fr.ird.observe.services.dto.referential.ReferentialReference;
import java.io.Serializable;
import java.util.Collection;
+import java.util.LinkedHashSet;
+import java.util.Set;
/**
* Contient le différentiel de référentiels calculé sur la source centrale à partir des états de la source à synchroniser.
@@ -20,6 +22,7 @@ public class RemoteReferentialDiff implements Serializable {
private static final long serialVersionUID = 1L;
+ private final Set<String> referentialNames;
/**
* Les référentiels à ajouter (indexé par nom de référentiel).
*/
@@ -38,41 +41,57 @@ public class RemoteReferentialDiff implements Serializable {
private final Multimap<String, ReferentialReference> referentialsToFix;
public RemoteReferentialDiff() {
+ referentialNames = new LinkedHashSet<>();
referentialsToAdd = ArrayListMultimap.create();
referentialsToUpdate = ArrayListMultimap.create();
referentialsToRemove = ArrayListMultimap.create();
referentialsToFix = ArrayListMultimap.create();
}
- public Collection<ReferentialDto> getReferentialsToAdd(String referentialName) {
- return referentialsToAdd.get(referentialName);
+ public boolean isReferentialUsed(String referentialName) {
+ return referentialsToAdd.containsKey(referentialName)
+ || referentialsToUpdate.containsKey(referentialName)
+ || referentialsToRemove.containsKey(referentialName)
+ || referentialsToFix.containsKey(referentialName);
+
+ }
+ public <R extends ReferentialDto> Collection<R> getReferentialsToAdd(String referentialName) {
+ return (Collection) referentialsToAdd.get(referentialName);
+ }
+
+ public <R extends ReferentialDto> Collection<R> getReferentialsToUpdate(String referentialName) {
+ return (Collection) referentialsToUpdate.get(referentialName);
}
- public Collection<ReferentialDto> getReferentialsToUpdate(String referentialName) {
- return referentialsToUpdate.get(referentialName);
+ public <R extends ReferentialDto> Collection<ReferentialReference<R>> getReferentialsToRemove(String referentialName) {
+ return (Collection)referentialsToRemove.get(referentialName);
}
- public Collection<ReferentialReference> getReferentialsToRemove(String referentialName) {
- return referentialsToRemove.get(referentialName);
+ public <R extends ReferentialDto> Collection<ReferentialReference<R>> getReferentialsToFix(String referentialName) {
+ return (Collection)referentialsToFix.get(referentialName);
}
- public Collection<ReferentialReference> getReferentialsToFix(String referentialName) {
- return referentialsToFix.get(referentialName);
+ public Set<String> getReferentialNames() {
+ return referentialNames;
}
void addReferentialToAdd(String referentialName, ReferentialDto referentialDto) {
+ referentialNames.add(referentialName);
referentialsToAdd.put(referentialName, referentialDto);
}
void addReferentialToUpdate(String referentialName, ReferentialDto referentialDto) {
+ referentialNames.add(referentialName);
referentialsToUpdate.put(referentialName, referentialDto);
}
void addReferentialToDelete(String referentialName, ReferentialReference referentialReference) {
+ referentialNames.add(referentialName);
referentialsToRemove.put(referentialName, referentialReference);
}
- void addReferentialToFix(String entityName, ReferentialReference referentialReference) {
- referentialsToFix.put(entityName, referentialReference);
+ void addReferentialToFix(String referentialName, ReferentialReference referentialReference) {
+ referentialNames.add(referentialName);
+ referentialsToFix.put(referentialName, referentialReference);
}
}
diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java
new file mode 100644
index 0000000..9df5e43
--- /dev/null
+++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java
@@ -0,0 +1,177 @@
+package fr.ird.observe.services.service.actions.synchro;
+
+import fr.ird.observe.services.dto.referential.ReferentialDto;
+import fr.ird.observe.services.dto.referential.ReferentialReference;
+import fr.ird.observe.services.dto.referential.ReferentialReferenceSet;
+import org.apache.commons.collections.CollectionUtils;
+
+import java.util.Collection;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Created on 28/06/16.
+ *
+ * @author Tony Chemit - chemit(a)codelutin.com
+ * @since 5.0
+ */
+public class UnidirectionalReferentialSynchronizeEngine {
+
+ private final UnidirectionalReferentialSynchronizeLocalService localService;
+ private final UnidirectionalReferentialSynchronizeRemoteService remoteService;
+
+ public UnidirectionalReferentialSynchronizeEngine(UnidirectionalReferentialSynchronizeLocalService localService,
+ UnidirectionalReferentialSynchronizeRemoteService remoteService) {
+ this.localService = localService;
+ this.remoteService = remoteService;
+ }
+
+ public void run(Callback callback) {
+
+ LocalReferentialStates localReferentialStates = localService.getLocalSourceReferentialStates();
+ RemoteReferentialDiff remoteReferentialDiff = remoteService.getReferentialDifferential(localReferentialStates);
+
+ for (String referentialName : remoteReferentialDiff.getReferentialNames()) {
+
+ UnidirectionalReferentialSynchronizeRequest referentialSynchronizeRequest = buildReferentialSynchronizeRequest(callback, referentialName, remoteReferentialDiff);
+
+ }
+
+ }
+
+ private <R extends ReferentialDto> UnidirectionalReferentialSynchronizeRequest buildReferentialSynchronizeRequest(Callback callback, String referentialName, RemoteReferentialDiff remoteReferentialDiff) {
+
+ UnidirectionalReferentialSynchronizeRequest.Builder builder = UnidirectionalReferentialSynchronizeRequest.builder(referentialName);
+
+ Collection<R> referentialsToAdd = remoteReferentialDiff.getReferentialsToAdd(referentialName);
+ if (CollectionUtils.isNotEmpty(referentialsToAdd)) {
+ referentialsToAdd.forEach(builder::entityToAdd);
+ }
+
+ Collection<R> referentialsToUpdate = remoteReferentialDiff.getReferentialsToUpdate(referentialName);
+ if (CollectionUtils.isNotEmpty(referentialsToUpdate)) {
+ referentialsToUpdate.forEach(builder::entityToUpdate);
+ }
+
+ Collection<ReferentialReference<R>> referentialsToRemove = remoteReferentialDiff.getReferentialsToRemove(referentialName);
+ Collection<ReferentialReference<R>> blockingReferentialsToRemove = null;
+ if (CollectionUtils.isNotEmpty(referentialsToRemove)) {
+
+ Set<String> idsToRemove = referentialsToRemove.stream()
+ .map(ReferentialReference::getId)
+ .collect(Collectors.toCollection(LinkedHashSet::new));
+
+ Set<String> blockingIdsToRemove = localService.filterIdsUsedInLocalSource(referentialName, idsToRemove);
+
+
+ blockingReferentialsToRemove = referentialsToRemove
+ .stream()
+ .filter(referentialReference -> blockingIdsToRemove.contains(referentialReference.getId()))
+ .collect(Collectors.toSet());
+
+ idsToRemove.removeAll(blockingIdsToRemove);
+ idsToRemove.forEach(builder::entityToRemove);
+
+ }
+
+ Collection<ReferentialReference<R>> referentialsToReplace = remoteReferentialDiff.getReferentialsToFix(referentialName);
+ Collection<ReferentialReference<R>> blockingReferentialsToReplace = null;
+
+ if (CollectionUtils.isNotEmpty(referentialsToReplace)) {
+
+ Set<String> idsToReplace = referentialsToReplace.stream()
+ .map(ReferentialReference::getId)
+ .collect(Collectors.toCollection(LinkedHashSet::new));
+
+ Set<String> blockingIdsToReplace = localService.filterIdsUsedInLocalSource(referentialName, idsToReplace);
+
+ blockingReferentialsToReplace = referentialsToRemove
+ .stream()
+ .filter(referentialReference -> blockingIdsToReplace.contains(referentialReference.getId()))
+ .collect(Collectors.toSet());
+
+ }
+
+ boolean needCallbackForRemove = CollectionUtils.isNotEmpty(blockingReferentialsToRemove);
+ boolean needCallbackToReplace = CollectionUtils.isNotEmpty(blockingReferentialsToReplace);
+ boolean needCallback = needCallbackForRemove || needCallbackToReplace;
+ if (needCallback) {
+
+ // calcul de l'univers de référentiels disponibles pour les remplacements
+
+ ReferentialReferenceSet<R> localSourceEnabledReferenceSet = remoteService.getEnabledReferentialReferenceSet(referentialName);
+ Set<ReferentialReference<R>> availableReferentials = localSourceEnabledReferenceSet.getReferences();
+
+ if (needCallbackForRemove) {
+
+ CallbackRequest callbackRequest = CallbackRequest.of(referentialName, blockingReferentialsToRemove, availableReferentials);
+ Map<String, String> referentialsToRemoveIds = callback.askUserToReplaceDisabledReferentials(callbackRequest);
+ for (Map.Entry<String, String> entry : referentialsToRemoveIds.entrySet()) {
+ builder.entityToReplace(entry.getKey(), entry.getValue());
+ builder.entityToRemove(entry.getKey());
+ }
+
+ }
+
+ if (needCallbackToReplace) {
+
+ CallbackRequest callbackRequest = CallbackRequest.of(referentialName, referentialsToReplace, availableReferentials);
+ Map<String, String> referentialsToReplaceIds = callback.askUserToReplaceDisabledReferentials(callbackRequest);
+ for (Map.Entry<String, String> entry : referentialsToReplaceIds.entrySet()) {
+ builder.entityToReplace(entry.getKey(), entry.getValue());
+ }
+
+ }
+
+ }
+
+ UnidirectionalReferentialSynchronizeRequest referentialSynchronizeRequest = builder.build();
+ return referentialSynchronizeRequest;
+
+ }
+
+ public interface Callback {
+
+ Map<String, String> askUserToReplaceRemovedReferentials(CallbackRequest request);
+
+ Map<String, String> askUserToReplaceDisabledReferentials(CallbackRequest request);
+
+ }
+
+ public static class CallbackRequest<R extends ReferentialDto> {
+
+ public static <R extends ReferentialDto> CallbackRequest<R> of(String referentialName,
+ Collection<ReferentialReference<R>> referentialsToReplace,
+ Collection<ReferentialReference<R>> availableReferentials) {
+ return new CallbackRequest<>(referentialName, referentialsToReplace, availableReferentials);
+ }
+
+ private final String referentialName;
+ private final Collection<ReferentialReference<R>> referentialsToReplace;
+ private final Collection<ReferentialReference<R>> availableReferentials;
+
+ public String getReferentialName() {
+ return referentialName;
+ }
+
+ public Collection<ReferentialReference<R>> getReferentialsToReplace() {
+ return referentialsToReplace;
+ }
+
+ public Collection<ReferentialReference<R>> getAvailableReferentials() {
+ return availableReferentials;
+ }
+
+ private CallbackRequest(String referentialName,
+ Collection<ReferentialReference<R>> referentialsToReplace,
+ Collection<ReferentialReference<R>> availableReferentials) {
+ this.referentialName = referentialName;
+ this.referentialsToReplace = referentialsToReplace;
+ this.availableReferentials = availableReferentials;
+ }
+
+ }
+
+}
diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java
index 3c3f570..a1b4b22 100644
--- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java
+++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalService.java
@@ -1,6 +1,5 @@
package fr.ird.observe.services.service.actions.synchro;
-import fr.ird.observe.services.dto.referential.ReferentialReferenceSet;
import fr.ird.observe.services.spi.ReadReferentialPermission;
import java.util.Collection;
@@ -35,13 +34,4 @@ public interface UnidirectionalReferentialSynchronizeLocalService {
@ReadReferentialPermission
Set<String> filterIdsUsedInLocalSource(String referentialName, Collection<String> ids);
- /**
- * Pour récupérer un ensemble de référentiels non désactivés pour un type donné (et ceci afin de remplacer
- * un référentiel de même type supprimé ou désactivé).
- *
- * @param referentialName le nom du référentiel
- * @return l'ensemble des référentiels non désactivés du type demandé
- */
- @ReadReferentialPermission
- ReferentialReferenceSet getLocalSourceEnabledReferenceSet(String referentialName);
}
diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteService.java
index 66983a3..44d15a1 100644
--- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteService.java
+++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteService.java
@@ -1,5 +1,7 @@
package fr.ird.observe.services.service.actions.synchro;
+import fr.ird.observe.services.dto.referential.ReferentialDto;
+import fr.ird.observe.services.dto.referential.ReferentialReferenceSet;
import fr.ird.observe.services.spi.ReadReferentialPermission;
/**
@@ -21,4 +23,13 @@ public interface UnidirectionalReferentialSynchronizeRemoteService {
@ReadReferentialPermission
RemoteReferentialDiff getReferentialDifferential(LocalReferentialStates localReferentialStates);
+ /**
+ * Pour récupérer un ensemble de référentiels non désactivés pour un type donné (et ceci afin de remplacer
+ * un référentiel de même type supprimé ou désactivé).
+ *
+ * @param referentialName le nom du référentiel
+ * @return l'ensemble des référentiels non désactivés du type demandé
+ */
+ @ReadReferentialPermission
+ <R extends ReferentialDto> ReferentialReferenceSet<R> getEnabledReferentialReferenceSet(String referentialName);
}
diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java
new file mode 100644
index 0000000..4cbe9ed
--- /dev/null
+++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java
@@ -0,0 +1,106 @@
+package fr.ird.observe.services.service.actions.synchro;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import fr.ird.observe.services.dto.referential.ReferentialDto;
+
+/**
+ * Pour un référentiel de type donné, l'ensemble des opérations à effectuer.
+ *
+ * À partir de cette demande, on génèrera ensuite le code sql correspondant.
+ *
+ * Created on 28/06/16.
+ *
+ * @author Tony Chemit - chemit(a)codelutin.com
+ * @since 5.0
+ */
+public class UnidirectionalReferentialSynchronizeRequest {
+
+ public static Builder builder(String referentialName) {
+ return new Builder(referentialName);
+ }
+
+ private final String referentialName;
+ private final ImmutableSet<ReferentialDto> referentialToAdd;
+ private final ImmutableSet<ReferentialDto> referentialToUpdate;
+ private final ImmutableSet<String> referentialToRemove;
+ private final ImmutableMap<String, String> referentialToReplace;
+
+ public String getReferentialName() {
+ return referentialName;
+ }
+
+ public ImmutableSet<ReferentialDto> getReferentialToAdd() {
+ return referentialToAdd;
+ }
+
+ public ImmutableSet<ReferentialDto> getReferentialToUpdate() {
+ return referentialToUpdate;
+ }
+
+ public ImmutableSet<String> getReferentialToRemove() {
+ return referentialToRemove;
+ }
+
+ public ImmutableMap<String, String> getReferentialToReplace() {
+ return referentialToReplace;
+ }
+
+ private UnidirectionalReferentialSynchronizeRequest(String referentialName,
+ ImmutableSet<ReferentialDto> referentialToAdd,
+ ImmutableSet<ReferentialDto> referentialToUpdate,
+ ImmutableSet<String> referentialToRemove,
+ ImmutableMap<String, String> toReplace) {
+ this.referentialName = referentialName;
+ this.referentialToAdd = referentialToAdd;
+ this.referentialToUpdate = referentialToUpdate;
+ this.referentialToRemove = referentialToRemove;
+ this.referentialToReplace = toReplace;
+ }
+
+ public static class Builder {
+
+ private final String referentialName;
+ private final ImmutableSet.Builder<ReferentialDto> toAddBuilder = ImmutableSet.builder();
+ private final ImmutableSet.Builder<ReferentialDto> toUpdateBuilder = ImmutableSet.builder();
+ private final ImmutableSet.Builder<String> toRemoveBuilder = ImmutableSet.builder();
+ private final ImmutableMap.Builder<String, String> toReplaceBuilder = ImmutableMap.builder();
+
+ public Builder entityToAdd(ReferentialDto referentialDto) {
+ toAddBuilder.add(referentialDto);
+ return this;
+ }
+
+ public Builder entityToUpdate(ReferentialDto referentialDto) {
+ toUpdateBuilder.add(referentialDto);
+ return this;
+ }
+
+ public Builder entityToRemove(String id) {
+ toRemoveBuilder.add(id);
+ return this;
+ }
+
+ public Builder entityToReplace(String sourceId, String targetId) {
+ toReplaceBuilder.put(sourceId, targetId);
+ return this;
+ }
+
+ public UnidirectionalReferentialSynchronizeRequest build() {
+
+ return new UnidirectionalReferentialSynchronizeRequest(
+ referentialName,
+ toAddBuilder.build(),
+ toUpdateBuilder.build(),
+ toRemoveBuilder.build(),
+ toReplaceBuilder.build()
+ );
+
+ }
+
+ private Builder(String referentialName) {
+ this.referentialName = referentialName;
+ }
+
+ }
+}
diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java
index 69c87f7..e9c2245 100644
--- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java
+++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeLocalServiceTopia.java
@@ -1,20 +1,20 @@
package fr.ird.observe.services.service.actions.synchro;
import fr.ird.observe.ObserveEntityEnum;
-import fr.ird.observe.ObserveTopiaPersistenceContext;
import fr.ird.observe.entities.Entities;
-import fr.ird.observe.entities.constants.ReferenceStatusPersist;
import fr.ird.observe.entities.referentiel.ObserveReferentialEntity;
import fr.ird.observe.services.ObserveServiceTopia;
-import fr.ird.observe.services.binder.BinderEngine;
import fr.ird.observe.services.dto.referential.ReferentialDto;
-import fr.ird.observe.services.dto.referential.ReferentialReferenceSet;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.topia.persistence.TopiaDao;
import org.nuiton.topia.persistence.TopiaEntity;
+import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity;
+import org.nuiton.util.beans.Binder;
+import org.nuiton.util.beans.BinderFactory;
import java.util.Collection;
+import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
@@ -67,19 +67,35 @@ public class UnidirectionalReferentialSynchronizeLocalServiceTopia extends Obser
}
- @Override
- public ReferentialReferenceSet getLocalSourceEnabledReferenceSet(String referentialName) {
-
- if (log.isTraceEnabled()) {
- log.trace("getLocalSourceEnabledReferenceSet(" + referentialName + ")");
+ private <E extends ObserveReferentialEntity, R extends ReferentialDto> void generateInsertSqlStatements0(StringBuilder builder,
+ Class<E> entityType,
+ Class<R> dtoType,
+ TopiaMetadataEntity metadataEntity,
+ Collection<R> referentialsToAdd) {
+
+ Set<String> columnNames = new LinkedHashSet<>();
+ columnNames.add(TopiaEntity.PROPERTY_TOPIA_ID);
+ columnNames.add(TopiaEntity.PROPERTY_TOPIA_VERSION);
+ columnNames.add(TopiaEntity.PROPERTY_TOPIA_CREATE_DATE);
+
+ Set<String> propertyNamesSet = metadataEntity.getProperties().keySet();
+ String[] propertyNames = propertyNamesSet.toArray(new String[propertyNamesSet.size()]);
+ for (String propertyName : propertyNames) {
+ columnNames.add(metadataEntity.getDbColumnName(propertyName));
}
- ObserveEntityEnum entityEnum = ObserveEntityEnum.valueOf(referentialName);
- Class entityType = entityEnum.getContract();
- Class dtoType = BinderEngine.get().getReferentialDtoType(entityType);
- ReferentialReferenceSet result = getLocalSourceEnabledReferenceSet0(entityType, dtoType);
- return result;
+ Binder<R, R> binder = BinderFactory.newBinder(dtoType);
+ for (R referentialToAdd : referentialsToAdd) {
+
+ Map<String,Object> properties = new LinkedHashMap<>();
+ properties.put(TopiaEntity.PROPERTY_TOPIA_ID, referentialToAdd.getId());
+ properties.put(TopiaEntity.PROPERTY_TOPIA_VERSION, referentialToAdd.getVersion());
+ properties.put(TopiaEntity.PROPERTY_TOPIA_CREATE_DATE, referentialToAdd.getCreateDate());
+
+ Map<String, Object> obtainProperties = binder.obtainProperties(referentialToAdd, true, propertyNames);
+ properties.putAll(obtainProperties);
+ }
}
private <E extends ObserveReferentialEntity> void getLocalSourceReferentialVersions0(String entityName, Class<E> entityType, LocalReferentialStates localReferentialStates) {
@@ -104,15 +120,4 @@ public class UnidirectionalReferentialSynchronizeLocalServiceTopia extends Obser
}
- private <E extends ObserveReferentialEntity, R extends ReferentialDto> ReferentialReferenceSet<R> getLocalSourceEnabledReferenceSet0(Class<E> entityType, Class<R> dtoType) {
-
- ObserveTopiaPersistenceContext persistenceContext = getTopiaPersistenceContext();
- TopiaDao<E> dao = persistenceContext.getDao(entityType);
- List<E> entities = dao.forEquals(ObserveReferentialEntity.PROPERTY_STATUS, ReferenceStatusPersist.enabled).findAll();
- ReferentialReferenceSet<R> result = toReferentialReferenceSet(dtoType, entities, null);
- return result;
-
- }
-
-
}
diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java
index 3d9cba1..9f65167 100644
--- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java
+++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRemoteServiceTopia.java
@@ -1,13 +1,18 @@
package fr.ird.observe.services.service.actions.synchro;
import fr.ird.observe.ObserveEntityEnum;
+import fr.ird.observe.ObserveTopiaPersistenceContext;
import fr.ird.observe.entities.Entities;
+import fr.ird.observe.entities.constants.ReferenceStatusPersist;
import fr.ird.observe.entities.referentiel.ObserveReferentialEntity;
import fr.ird.observe.services.ObserveServiceTopia;
import fr.ird.observe.services.binder.BinderEngine;
import fr.ird.observe.services.dto.constants.ReferentialLocale;
import fr.ird.observe.services.dto.referential.ReferentialDto;
import fr.ird.observe.services.dto.referential.ReferentialReference;
+import fr.ird.observe.services.dto.referential.ReferentialReferenceSet;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.nuiton.topia.persistence.TopiaDao;
import java.util.Collection;
@@ -24,6 +29,9 @@ import java.util.Set;
*/
public class UnidirectionalReferentialSynchronizeRemoteServiceTopia extends ObserveServiceTopia implements UnidirectionalReferentialSynchronizeRemoteService {
+ /** Logger. */
+ private static final Log log = LogFactory.getLog(UnidirectionalReferentialSynchronizeRemoteServiceTopia.class);
+
@Override
public RemoteReferentialDiff getReferentialDifferential(LocalReferentialStates localReferentialStates) {
@@ -36,6 +44,22 @@ public class UnidirectionalReferentialSynchronizeRemoteServiceTopia extends Obse
}
+ @Override
+ public <R extends ReferentialDto> ReferentialReferenceSet<R> getEnabledReferentialReferenceSet(String referentialName) {
+
+ if (log.isTraceEnabled()) {
+ log.trace("getEnabledReferentialReferenceSet(" + referentialName + ")");
+ }
+
+ ObserveEntityEnum entityEnum = ObserveEntityEnum.valueOf(referentialName);
+ Class entityType = entityEnum.getContract();
+ Class dtoType = BinderEngine.get().getReferentialDtoType(entityType);
+ ReferentialReferenceSet<R> result = getLocalSourceEnabledReferenceSet0(entityType, dtoType);
+ return result;
+
+ }
+
+
private <E extends ObserveReferentialEntity> void getReferentialDifferential0(String entityName, Class<E> entityType, LocalReferentialStates localReferentialStates, RemoteReferentialDiff result) {
ReferentialLocale referentialLocale = getReferentialLocale();
@@ -89,4 +113,15 @@ public class UnidirectionalReferentialSynchronizeRemoteServiceTopia extends Obse
}
+ private <E extends ObserveReferentialEntity, R extends ReferentialDto> ReferentialReferenceSet<R> getLocalSourceEnabledReferenceSet0(Class<E> entityType, Class<R> dtoType) {
+
+ ObserveTopiaPersistenceContext persistenceContext = getTopiaPersistenceContext();
+ TopiaDao<E> dao = persistenceContext.getDao(entityType);
+ List<E> entities = dao.forEquals(ObserveReferentialEntity.PROPERTY_STATUS, ReferenceStatusPersist.enabled).findAll();
+ ReferentialReferenceSet<R> result = toReferentialReferenceSet(dtoType, entities, null);
+ return result;
+
+ }
+
+
}
--
To stop receiving notification emails like this one, please contact
codelutin.com SCM administrator <admin+scm(a)codelutin.com>.
1
0
04/26: Mettre à plat la notion d'héritage pour tout avoir de disponible dans le méta-modèle allégé
by codelutin.com scm 12 Jul '16
by codelutin.com scm 12 Jul '16
12 Jul '16
This is an automated email from the git hooks/post-receive script.
New commit to branch feature/7739 in repository tutti.
See https://gitlab.nuiton.org/codelutin/tutti.git
commit e29483113f2a6fca5cbbead039996db280dbf451
Author: Tony CHEMIT <chemit(a)codelutin.com>
Date: Tue Jun 28 18:29:32 2016 +0200
Mettre à plat la notion d'héritage pour tout avoir de disponible dans le méta-modèle allégé
---
.../persistence/metadata/TopiaMetadataEntity.java | 14 ++++++-
.../persistence/metadata/TopiaMetadataModel.java | 4 +-
.../templates/TopiaMetadataModelGenerator.java | 43 +++++++++++++++++++++-
3 files changed, 56 insertions(+), 5 deletions(-)
diff --git a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java
index 02fdd0d..8c16f2c 100644
--- a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java
+++ b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java
@@ -41,6 +41,10 @@ public class TopiaMetadataEntity {
private static final Log log = LogFactory.getLog(TopiaMetadataEntity.class);
/**
+ * L'entité parent (optionnelle).
+ */
+ protected final String parent;
+ /**
* Le nom simple de l'entité (correspond au nom de l'énumération qui caractérise cette entité).
*/
protected final String type;
@@ -80,7 +84,8 @@ public class TopiaMetadataEntity {
*/
protected final Map<String, String> dbColumnsName = new LinkedHashMap<>();
- public TopiaMetadataEntity(String type, String dbSchemaName, String dbTableName) {
+ public TopiaMetadataEntity(String parent, String type, String dbSchemaName, String dbTableName) {
+ this.parent=parent;
this.type = type;
this.dbSchemaName = dbSchemaName;
this.dbTableName = dbTableName;
@@ -111,6 +116,11 @@ public class TopiaMetadataEntity {
.toString();
}
+ public boolean withParent() { return parent!=null;}
+ public String getParent() {
+ return parent;
+ }
+
public String getDbSchemaName() {
return dbSchemaName;
}
@@ -182,7 +192,7 @@ public class TopiaMetadataEntity {
}
public TopiaMetadataEntity copy() {
- TopiaMetadataEntity copy = new TopiaMetadataEntity(type, dbSchemaName, dbTableName);
+ TopiaMetadataEntity copy = new TopiaMetadataEntity(parent, type, dbSchemaName, dbTableName);
copy.associations.putAll(associations);
copy.reversedAssociations.putAll(reversedAssociations);
copy.nmAssociations.putAll(nmAssociations);
diff --git a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java
index 5aef1d1..d4de2b1 100644
--- a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java
+++ b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java
@@ -63,9 +63,9 @@ public class TopiaMetadataModel {
visitor.visitModelEnd(this);
}
- public TopiaMetadataEntity newEntity(String type, String dbSchemaName, String dbTableName) {
+ public TopiaMetadataEntity newEntity(String parent, String type, String dbSchemaName, String dbTableName) {
Preconditions.checkState(!entities.containsKey(type), type + " already in cache");
- TopiaMetadataEntity clazz = new TopiaMetadataEntity(type, dbSchemaName, dbTableName);
+ TopiaMetadataEntity clazz = new TopiaMetadataEntity(parent, type, dbSchemaName, dbTableName);
entities.put(type, clazz);
log.info(clazz.getType());
return clazz;
diff --git a/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java b/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java
index fa93caa..4d79925 100644
--- a/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java
+++ b/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java
@@ -80,10 +80,18 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator {
List<ObjectModelClass> entityClasses = getTemplateHelper().getEntityClasses(model, true);
TopiaMetadataModel metadataModel = new TopiaMetadataModel();
+
+ // Première passe pour construire toutes les entités
for (ObjectModelClass entityClass : entityClasses) {
buildMetadataEntity(entityClass, metadataModel);
}
+ // Seconde passe pour aggréger les héritages
+ for (ObjectModelClass entityClass : entityClasses) {
+ TopiaMetadataEntity metadataEntity = metadataModel.getEntity(entityClass.getName());
+ applyInheritance(metadataEntity, entityClass, metadataModel);
+ }
+
if (log.isDebugEnabled()) {
TopiaMetadataModelVisitor.PrintVisitor visitor = new TopiaMetadataModelVisitor.PrintVisitor(true, "\n");
metadataModel.accept(visitor);
@@ -195,6 +203,32 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator {
// content.append(" /* ").append(comment).append(" */");
// }
+
+
+
+ protected void applyInheritance(TopiaMetadataEntity metadataEntity, ObjectModelClass entityClass, TopiaMetadataModel metadataModel) {
+
+ boolean haveSuper = entityClass.getSuperclasses().size() > 0;
+ if (haveSuper) {
+ ObjectModelClass superClass = entityClass.getSuperclasses().iterator().next();
+ String parentName = superClass.getName();
+ Optional<TopiaMetadataEntity> optionalEntity = metadataModel.getOptionalEntity(parentName);
+ if (optionalEntity.isPresent()) {
+
+ TopiaMetadataEntity parentMetadataEntity = optionalEntity.get();
+ metadataEntity.getAssociations().putAll(parentMetadataEntity.getAssociations());
+ metadataEntity.getReversedAssociations().putAll(parentMetadataEntity.getReversedAssociations());
+ metadataEntity.getNmAssociations().putAll(parentMetadataEntity.getNmAssociations());
+ metadataEntity.getRequired().putAll(parentMetadataEntity.getRequired());
+ metadataEntity.getProperties().putAll(parentMetadataEntity.getProperties());
+ metadataEntity.getDbColumnsName().putAll(parentMetadataEntity.getDbColumnsName());
+
+ applyInheritance(metadataEntity, superClass, metadataModel);
+
+ }
+ }
+
+ }
protected TopiaMetadataEntity buildMetadataEntity(ObjectModelClass entityClass, TopiaMetadataModel metadataModel) {
TopiaMetadataEntity metadataEntity;
@@ -213,7 +247,14 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator {
String dbSchemaName = topiaTagValues.getDbSchemaNameTagValue(entityClass, aPackage, model);
String dbTableName = templateHelper.getDbName(entityClass);
- metadataEntity = metadataModel.newEntity(entityClassName, dbSchemaName, dbTableName);
+ boolean haveSuper = entityClass.getSuperclasses().size() > 0;
+
+ String parent = null;
+ if (haveSuper) {
+ ObjectModelClass superClass = entityClass.getSuperclasses().iterator().next();
+ parent = superClass.getName();
+ }
+ metadataEntity = metadataModel.newEntity(parent, entityClassName, dbSchemaName, dbTableName);
Collection<ObjectModelAttribute> attributes = entityClass.getAttributes();
for (ObjectModelAttribute attr : attributes) {
--
To stop receiving notification emails like this one, please contact
codelutin.com SCM administrator <admin+scm(a)codelutin.com>.
1
0
03/26: Ajout des informations sur les propriétés simples dans le méta-modèle simplifié + les informations sur les noms en base
by codelutin.com scm 12 Jul '16
by codelutin.com scm 12 Jul '16
12 Jul '16
This is an automated email from the git hooks/post-receive script.
New commit to branch feature/7739 in repository tutti.
See https://gitlab.nuiton.org/codelutin/tutti.git
commit e7b308702550ef9f22f2f4df3d0b6485044dc344
Author: Tony CHEMIT <chemit(a)codelutin.com>
Date: Tue Jun 28 12:28:08 2016 +0200
Ajout des informations sur les propriétés simples dans le méta-modèle simplifié + les informations sur les noms en base
---
.../persistence/metadata/TopiaMetadataEntity.java | 110 ++++++++++++++++++---
.../persistence/metadata/TopiaMetadataModel.java | 4 +-
.../metadata/TopiaMetadataModelVisitor.java | 40 +++++---
.../sql/batch/tables/TopiaSqlTablesFactory.java | 5 +
.../templates/TopiaMetadataModelGenerator.java | 52 ++++++++--
5 files changed, 178 insertions(+), 33 deletions(-)
diff --git a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java
index 789063a..02fdd0d 100644
--- a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java
+++ b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java
@@ -40,14 +40,50 @@ public class TopiaMetadataEntity {
private static final Log log = LogFactory.getLog(TopiaMetadataEntity.class);
+ /**
+ * Le nom simple de l'entité (correspond au nom de l'énumération qui caractérise cette entité).
+ */
protected final String type;
+ /**
+ * Le nom du schéma qui contient la table correspondant à l'entité.
+ */
+ protected final String dbSchemaName;
+ /**
+ * Le nom de la table qui correspond à l'entité.
+ */
+ protected final String dbTableName;
+ /**
+ * Le dictionnaire des associations simples (multiplicitié 1→n) (la clef est le nom de la propriété, la valeur son type).
+ */
protected final Map<String, String> associations = new LinkedHashMap<>();
+ /**
+ * 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<>();
+ /**
+ * Le dictionnaire des associations nm (multiplicitié n→m) (la clef est le nom de la propriété, la valeur son type).
+ */
protected final Map<String, String> nmAssociations = new LinkedHashMap<>();
+ /**
+ * Le dictionnaire des compositions simples vers des entitées (la clef est le nom de la propriété, la valeur son type).
+ */
protected final Map<String, String> required = new LinkedHashMap<>();
-
- public TopiaMetadataEntity(String type) {
+ /**
+ * Le dictionnaire des propriétés qui ne sont pas des entités (la clef est le nom de la propriété, la valeur son type).
+ */
+ protected final Map<String, String> properties = new LinkedHashMap<>();
+ /**
+ * Le nom des colunnes correspondants aux propriétés de l'entité.
+ * <b>Note: </b> On ne conserve que les correspondances qui diffèrent du nom de la propriété.
+ *
+ * @see #getDbColumnName(String)
+ */
+ protected final Map<String, String> dbColumnsName = new LinkedHashMap<>();
+
+ public TopiaMetadataEntity(String type, String dbSchemaName, String dbTableName) {
this.type = type;
+ this.dbSchemaName = dbSchemaName;
+ this.dbTableName = dbTableName;
}
public String getType() {
@@ -70,8 +106,17 @@ public class TopiaMetadataEntity {
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
- .add("type", type)
- .toString();
+ .add("type", type)
+ .add("dbName", dbSchemaName + "." + dbTableName)
+ .toString();
+ }
+
+ public String getDbSchemaName() {
+ return dbSchemaName;
+ }
+
+ public String getDbTableName() {
+ return dbTableName;
}
public Map<String, String> getReversedAssociations() {
@@ -90,32 +135,60 @@ public class TopiaMetadataEntity {
return required;
}
- public void addAssociation(TopiaMetadataEntity associationClazz, String name) {
- log.info(getType() + "/" + name + "→" + associationClazz.getType());
+ public Map<String, String> getProperties() {
+ return properties;
+ }
+
+ public Map<String, String> getDbColumnsName() {
+ return dbColumnsName;
+ }
+
+ public String getDbColumnName(String propertyName) {
+ String dbColumnName = dbColumnsName.get(propertyName);
+ if (dbColumnName == null) {
+ dbColumnName = propertyName;
+ }
+ return dbColumnName;
+ }
+
+ public void addAssociation(TopiaMetadataEntity associationClazz, String name, String dbColumnName) {
+ log.info(getType() + "/" + name + "(" + dbColumnName + ") →" + associationClazz.getType());
associations.put(name, associationClazz.getType());
+ addDbColumnName(name, dbColumnName);
}
- public void addReversedAssociation(TopiaMetadataEntity associationClazz, String name) {
- log.info(getType() + "/" + name + "→" + associationClazz.getType());
+ public void addReversedAssociation(TopiaMetadataEntity associationClazz, String name, String dbColumnName) {
+ log.info(getType() + "/" + name + "(" + dbColumnName + ") →" + associationClazz.getType());
reversedAssociations.put(name, associationClazz.getType());
+ addDbColumnName(name, dbColumnName);
}
- public void addNmAssociation(TopiaMetadataEntity associationClazz, String name) {
- log.info(getType() + "/" + name + "→" + associationClazz.getType());
+ public void addNmAssociation(TopiaMetadataEntity associationClazz, String name, String dbColumnName) {
+ log.info(getType() + "/" + name + "(" + dbColumnName + ") →" + associationClazz.getType());
nmAssociations.put(name, associationClazz.getType());
+ addDbColumnName(name, dbColumnName);
}
- public void addRequired(TopiaMetadataEntity attributeClazz, String name) {
- log.info(getType() + "/" + name + "→" + attributeClazz.getType());
+ public void addRequired(TopiaMetadataEntity attributeClazz, String name, String dbColumnName) {
+ log.info(getType() + "/" + name + "(" + dbColumnName + ") →" + attributeClazz.getType());
required.put(name, attributeClazz.getType());
+ addDbColumnName(name, dbColumnName);
+ }
+
+ public void addProperty(String name, String type, String dbColumnName) {
+ log.info(getType() + "/" + name + "(" + dbColumnName + ") →" + type);
+ properties.put(name, type);
+ addDbColumnName(name, dbColumnName);
}
public TopiaMetadataEntity copy() {
- TopiaMetadataEntity copy = new TopiaMetadataEntity(type);
+ TopiaMetadataEntity copy = new TopiaMetadataEntity(type, dbSchemaName, dbTableName);
copy.associations.putAll(associations);
copy.reversedAssociations.putAll(reversedAssociations);
copy.nmAssociations.putAll(nmAssociations);
copy.required.putAll(required);
+ copy.properties.putAll(properties);
+ copy.dbColumnsName.putAll(dbColumnsName);
return copy;
}
@@ -141,10 +214,21 @@ public class TopiaMetadataEntity {
String propertyType = entry.getValue();
visitor.visitRequired(metadataModel, this, propertyName, metadataModel.getEntity(propertyType));
}
+ for (Map.Entry<String, String> entry : properties.entrySet()) {
+ String propertyName = entry.getKey();
+ String propertyType = entry.getValue();
+ visitor.visitProperty(metadataModel, this, propertyName, propertyType);
+ }
visitor.visitEntiyEnd(metadataModel, this);
}
public boolean withShell() {
return !(reversedAssociations.isEmpty() && associations.isEmpty() && nmAssociations.isEmpty());
}
+
+ private void addDbColumnName(String name, String dbColumnName) {
+ if (!name.equals(dbColumnName)) {
+ dbColumnsName.put(name, dbColumnName);
+ }
+ }
}
diff --git a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java
index 19812fe..5aef1d1 100644
--- a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java
+++ b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java
@@ -63,9 +63,9 @@ public class TopiaMetadataModel {
visitor.visitModelEnd(this);
}
- public TopiaMetadataEntity newEntity(String type) {
+ public TopiaMetadataEntity newEntity(String type, String dbSchemaName, String dbTableName) {
Preconditions.checkState(!entities.containsKey(type), type + " already in cache");
- TopiaMetadataEntity clazz = new TopiaMetadataEntity(type);
+ TopiaMetadataEntity clazz = new TopiaMetadataEntity(type, dbSchemaName, dbTableName);
entities.put(type, clazz);
log.info(clazz.getType());
return clazz;
diff --git a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java
index 2aefd8f..3573c3a 100644
--- a/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java
+++ b/observe-topia-extension/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java
@@ -52,6 +52,8 @@ public interface TopiaMetadataModelVisitor {
void visitRequired(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType);
+ void visitProperty(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, String propertyType);
+
class TopiaMetadataModelVisitorAdapter implements TopiaMetadataModelVisitor {
@Override
@@ -94,6 +96,10 @@ public interface TopiaMetadataModelVisitor {
}
+ @Override
+ public void visitProperty(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, String propertyType) {
+
+ }
}
class PrintVisitor implements TopiaMetadataModelVisitor {
@@ -128,7 +134,7 @@ public interface TopiaMetadataModelVisitor {
@Override
public void visitReversedAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
- appendPrefix("ReversedAssociation: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol);
+ appendProperty("ReversedAssociation: ", metadataEntity, propertyName, propertyType.getType());
if (visited.add(propertyType.getType())) {
propertyType.accept(this, metadataModel);
}
@@ -136,7 +142,7 @@ public interface TopiaMetadataModelVisitor {
@Override
public void visitAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
- appendPrefix("Association: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol);
+ appendProperty("Association: ", metadataEntity, propertyName, propertyType.getType());
if (visited.add(propertyType.getType())) {
propertyType.accept(this, metadataModel);
}
@@ -144,7 +150,7 @@ public interface TopiaMetadataModelVisitor {
@Override
public void visitNmAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
- appendPrefix("NmAssociation: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol);
+ appendProperty("NmAssociation: ", metadataEntity, propertyName, propertyType.getType());
if (visited.add(propertyType.getType())) {
propertyType.accept(this, metadataModel);
}
@@ -152,16 +158,19 @@ public interface TopiaMetadataModelVisitor {
@Override
public void visitRequired(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
- appendPrefix("Required: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol);
+ appendProperty("Required: ", metadataEntity, propertyName, propertyType.getType());
if (visited.add(propertyType.getType())) {
propertyType.accept(this, metadataModel);
}
}
- protected StringBuilder appendPrefix(String prefix) {
+ private StringBuilder appendPrefix(String prefix) {
return builder.append(this.prefix).append(prefix);
}
+ private StringBuilder appendProperty(String prefix, TopiaMetadataEntity metadataEntity, String propertyName, String propertyType) {
+ return appendPrefix(prefix).append(metadataEntity).append("/").append(propertyName).append("(").append(metadataEntity.getDbColumnName(propertyName)).append(")→").append(propertyType).append(eol);
+ }
}
public PrintVisitor(boolean deepVisit, String eol) {
@@ -186,7 +195,7 @@ public interface TopiaMetadataModelVisitor {
if (deepVisit) {
metadataEntity.accept(new DeepVisitor(prefix), metadataModel);
- }else {
+ } else {
prefix += " ";
appendPrefix("E → ").append(metadataEntity).append(eol);
}
@@ -203,37 +212,46 @@ public interface TopiaMetadataModelVisitor {
@Override
public void visitReversedAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
if (!deepVisit) {
- appendPrefix("ReversedAssociation: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol);
+ appendProperty("ReversedAssociation: ", metadataEntity, propertyName, propertyType.getType());
}
}
@Override
public void visitAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
if (!deepVisit) {
- appendPrefix("Association: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol);
+ appendProperty("Association: ", metadataEntity, propertyName, propertyType.getType());
}
}
@Override
public void visitNmAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
if (!deepVisit) {
- appendPrefix("NmAssociation: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol);
+ appendProperty("NmAssociation: ", metadataEntity, propertyName, propertyType.getType());
}
}
@Override
public void visitRequired(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
if (!deepVisit) {
- appendPrefix("Required: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol);
+ appendProperty("Required: ", metadataEntity, propertyName, propertyType.getType());
}
}
@Override
+ public void visitProperty(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, String propertyType) {
+ appendProperty("Property: ", metadataEntity, propertyName, propertyType);
+ }
+
+ @Override
public String toString() {
return builder.toString();
}
- protected StringBuilder appendPrefix(String prefix) {
+ private StringBuilder appendProperty(String prefix, TopiaMetadataEntity metadataEntity, String propertyName, String propertyType) {
+ return appendPrefix(prefix).append(metadataEntity).append("/").append(propertyName).append("(").append(metadataEntity.getDbColumnName(propertyName)).append(")→").append(propertyType).append(eol);
+ }
+
+ private StringBuilder appendPrefix(String prefix) {
return builder.append(this.prefix).append(prefix);
}
diff --git a/observe-topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/tables/TopiaSqlTablesFactory.java b/observe-topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/tables/TopiaSqlTablesFactory.java
index 0ee5d12..2da7191 100644
--- a/observe-topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/tables/TopiaSqlTablesFactory.java
+++ b/observe-topia-extension/src/main/java/org/nuiton/topia/service/sql/batch/tables/TopiaSqlTablesFactory.java
@@ -185,6 +185,11 @@ public class TopiaSqlTablesFactory {
public void visitRequired(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) {
}
+ @Override
+ public void visitProperty(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, String propertyType) {
+
+ }
+
protected void visitChild(TopiaMetadataEntity propertyType) {
dones.add(propertyType);
propertyType.accept(this, model);
diff --git a/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java b/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java
index 79de4e2..fa93caa 100644
--- a/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java
+++ b/observe-topia-templates-extension/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java
@@ -32,6 +32,7 @@ import org.nuiton.eugene.models.object.ObjectModel;
import org.nuiton.eugene.models.object.ObjectModelAttribute;
import org.nuiton.eugene.models.object.ObjectModelClass;
import org.nuiton.eugene.models.object.ObjectModelGenerator;
+import org.nuiton.eugene.models.object.ObjectModelPackage;
import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity;
import org.nuiton.topia.persistence.metadata.TopiaMetadataModel;
import org.nuiton.topia.persistence.metadata.TopiaMetadataModelVisitor;
@@ -208,7 +209,11 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator {
log.info("Start " + entityClassName);
- metadataEntity = metadataModel.newEntity(entityClassName);
+ ObjectModelPackage aPackage = model.getPackage(entityClass);
+ String dbSchemaName = topiaTagValues.getDbSchemaNameTagValue(entityClass, aPackage, model);
+ String dbTableName = templateHelper.getDbName(entityClass);
+
+ metadataEntity = metadataModel.newEntity(entityClassName, dbSchemaName, dbTableName);
Collection<ObjectModelAttribute> attributes = entityClass.getAttributes();
for (ObjectModelAttribute attr : attributes) {
@@ -221,7 +226,42 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator {
continue;
}
+ String name = attr.getName();
+ String attrColumn = templateHelper.getDbName(attr);
+
if (attr.getClassifier() == null || !getTemplateHelper().isEntity(attr.getClassifier())) {
+
+ String attrType = attr.getType();
+ switch (attrType) {
+ case "String":
+ attrType="java.lang.String";
+ break;
+ case "Boolean":
+ attrType="java.lang.Boolean";
+ break;
+ case "Byte":
+ attrType="java.lang.Byte";
+ break;
+ case "Character":
+ attrType="java.lang.Character";
+ break;
+ case "Short":
+ attrType="java.lang.Short";
+ break;
+ case "Integer":
+ attrType="java.lang.Integer";
+ break;
+ case "Long":
+ attrType="java.lang.Long";
+ break;
+ case "Float":
+ attrType="java.lang.Float";
+ break;
+ case "Double":
+ attrType="java.lang.Double";
+ break;
+ }
+ metadataEntity.addProperty(name, attrType, attrColumn);
continue;
}
@@ -229,8 +269,6 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator {
Optional<TopiaMetadataEntity> optionalAttributeClass = metadataModel.getOptionalEntity(attributeClass.getName());
- String name = attr.getName();
-
TopiaMetadataEntity attributeClazz;
if (optionalAttributeClass.isPresent()) {
attributeClazz = optionalAttributeClass.get().copy();
@@ -242,23 +280,23 @@ public class TopiaMetadataModelGenerator extends ObjectModelGenerator {
if (GeneratorUtil.isNMultiplicity(attr.getReverseMaxMultiplicity()) && !attr.hasAssociationClass()) {
// many to many
- metadataEntity.addNmAssociation(attributeClazz, name);
+ metadataEntity.addNmAssociation(attributeClazz, name, attrColumn);
} else {
// one to many
- metadataEntity.addAssociation(attributeClazz, name);
+ metadataEntity.addAssociation(attributeClazz, name, attrColumn);
}
} else {
if (GeneratorUtil.isNMultiplicity(attr.getReverseMaxMultiplicity()) && !attr.hasAssociationClass()) {
// many to one
- metadataEntity.addRequired(attributeClazz, name);
+ metadataEntity.addRequired(attributeClazz, name, attrColumn);
} else {
// one to one
- metadataEntity.addReversedAssociation(attributeClazz, name);
+ metadataEntity.addReversedAssociation(attributeClazz, name, attrColumn);
}
}
--
To stop receiving notification emails like this one, please contact
codelutin.com SCM administrator <admin+scm(a)codelutin.com>.
1
0