branch feature/7739 updated (83695e3 -> 79f8009)
This is an automated email from the git hooks/post-receive script. New change to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git from 83695e3 Introduction des deux services à utiliser pour effectuer la synchronisation unidirectionnelle de référentiel (See #7739) new d4ecdfc Ajout de la configuration pour le plugin processor new f40b800 Ajout des informations sur les propriétés simples dans le méta-modèle simplifié + les informations sur les noms en base new 8336832 Mettre à plat la notion d'héritage pour tout avoir de disponible dans le méta-modèle allégé new 79f8009 Introduction du moteur de synchronisation (reste plus qu'à générer le code sql à partir de la requète produite (See #7739) The 4 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 79f8009151c9d9ae974695ae45548954f6e004a4 Author: Tony CHEMIT <chemit@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) commit 8336832448a4b754357adcc2a6fea0c381827687 Author: Tony CHEMIT <chemit@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é commit f40b800a0cf8fd0975f4429b4857ebb250912187 Author: Tony CHEMIT <chemit@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 commit d4ecdfce4f76b9d3517b7a5eff68681316ba4350 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jun 28 12:27:24 2016 +0200 Ajout de la configuration pour le plugin processor Summary of changes: .../actions/synchro/RemoteReferentialDiff.java | 39 +++-- ...UnidirectionalReferentialSynchronizeEngine.java | 177 +++++++++++++++++++++ ...ectionalReferentialSynchronizeLocalService.java | 10 -- ...ctionalReferentialSynchronizeRemoteService.java | 11 ++ ...nidirectionalReferentialSynchronizeRequest.java | 106 ++++++++++++ ...nalReferentialSynchronizeLocalServiceTopia.java | 55 ++++--- ...alReferentialSynchronizeRemoteServiceTopia.java | 35 ++++ .../persistence/metadata/TopiaMetadataEntity.java | 120 ++++++++++++-- .../persistence/metadata/TopiaMetadataModel.java | 4 +- .../metadata/TopiaMetadataModelVisitor.java | 40 +++-- .../sql/batch/tables/TopiaSqlTablesFactory.java | 5 + .../templates/TopiaMetadataModelGenerator.java | 93 ++++++++++- pom.xml | 23 +++ 13 files changed, 640 insertions(+), 78 deletions(-) create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeEngine.java create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/service/actions/synchro/UnidirectionalReferentialSynchronizeRequest.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit d4ecdfce4f76b9d3517b7a5eff68681316ba4350 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jun 28 12:27:24 2016 +0200 Ajout de la configuration pour le plugin processor --- pom.xml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pom.xml b/pom.xml index c2b98b0..ec9da12 100644 --- a/pom.xml +++ b/pom.xml @@ -119,6 +119,7 @@ <signatureVersion>1.0</signatureVersion> <eugenePluginVersion>3.0-alpha-5</eugenePluginVersion> + <processorPluginVersion>1.3</processorPluginVersion> <topiaVersion>3.1.2-SNAPSHOT</topiaVersion> <jaxxVersion>2.29</jaxxVersion> @@ -696,6 +697,28 @@ <doUpdate>false</doUpdate> </configuration> </plugin> + + <plugin> + <groupId>org.nuiton.processor</groupId> + <artifactId>processor-maven-plugin</artifactId> + <version>${processorPluginVersion}</version> + <executions> + <execution> + <phase>generate-sources</phase> + <goals> + <goal>process</goal> + </goals> + </execution> + </executions> + <configuration> + <includes>**/*.java</includes> + <filters> + org.nuiton.processor.filters.GeneratorTemplatesFilter, + org.nuiton.processor.filters.ActiveLogsCodeFilter + </filters> + </configuration> + </plugin> + </plugins> <pluginManagement> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7739 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit f40b800a0cf8fd0975f4429b4857ebb250912187 Author: Tony CHEMIT <chemit@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@codelutin.com>.
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 8336832448a4b754357adcc2a6fea0c381827687 Author: Tony CHEMIT <chemit@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@codelutin.com>.
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 79f8009151c9d9ae974695ae45548954f6e004a4 Author: Tony CHEMIT <chemit@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@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@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@codelutin.com>.
participants (1)
-
codelutin.com scm