04/16: Introduce TopiaMetadataModelGenerator and include it into default Topia templates
This is an automated email from the git hooks/post-receive script. New commit to branch feature/3860_introduce_topiasqlbatchsupport in repository topia. See http://git.nuiton.org/topia.git commit b8ff4e829a893687069952964de30ff00481dc3b Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jan 4 13:39:07 2016 +0100 Introduce TopiaMetadataModelGenerator and include it into default Topia templates --- topia-templates/pom.xml | 4 + .../topia/templates/TopiaMetaTransformer.java | 3 +- .../templates/TopiaMetadataModelGenerator.java | 242 +++++++++++++++++++++ .../topia/templates/TopiaTemplateHelper.java | 10 +- 4 files changed, 256 insertions(+), 3 deletions(-) diff --git a/topia-templates/pom.xml b/topia-templates/pom.xml index 58d75be..e5e2fd2 100644 --- a/topia-templates/pom.xml +++ b/topia-templates/pom.xml @@ -67,6 +67,10 @@ <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> + <dependency> + <groupId>com.google.code.gson</groupId> + <artifactId>gson</artifactId> + </dependency> <dependency> <groupId>org.apache.commons</groupId> diff --git a/topia-templates/src/main/java/org/nuiton/topia/templates/TopiaMetaTransformer.java b/topia-templates/src/main/java/org/nuiton/topia/templates/TopiaMetaTransformer.java index 4da8fcd..890a11c 100644 --- a/topia-templates/src/main/java/org/nuiton/topia/templates/TopiaMetaTransformer.java +++ b/topia-templates/src/main/java/org/nuiton/topia/templates/TopiaMetaTransformer.java @@ -69,7 +69,8 @@ public class TopiaMetaTransformer extends AbstractMetaTransformer<ObjectModel> { EntityDaoTransformer.class, EntityEnumTransformer.class, ApplicationContextTransformer.class, - PersistenceContextTransformer.class + PersistenceContextTransformer.class, + TopiaMetadataModelGenerator.class ); } diff --git a/topia-templates/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java b/topia-templates/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java new file mode 100644 index 0000000..6e6e27b --- /dev/null +++ b/topia-templates/src/main/java/org/nuiton/topia/templates/TopiaMetadataModelGenerator.java @@ -0,0 +1,242 @@ +package org.nuiton.topia.templates; + +import com.google.common.base.Optional; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.GeneratorUtil; +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.topia.persistence.metadata.TopiaMetadataModelVisitor; +import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; +import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; + +import java.io.IOException; +import java.io.Writer; +import java.util.Collection; +import java.util.List; + +/*{generator option: parentheses = true}*/ +/*{generator option: writeString = output.write}*/ + +/** + * Created on 03/01/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @plexus.component role="org.nuiton.eugene.Template" role-hint="org.nuiton.topia.templates.TopiaMetadataModelGenerator" + */ +public class TopiaMetadataModelGenerator extends ObjectModelGenerator { + + private static final Log log = LogFactory.getLog(TopiaMetadataModelGenerator.class); + + protected TopiaTemplateHelper templateHelper; + + protected TopiaTagValues topiaTagValues; + + private String entityEnumName; + + @Override + public void generateFromModel(Writer output, ObjectModel input) throws IOException { + + if (templateHelper == null) { + templateHelper = new TopiaTemplateHelper(model); + } + if (topiaTagValues == null) { + topiaTagValues = templateHelper.getTopiaTagValues(); + } + + List<ObjectModelClass> entityClasses = templateHelper.getEntityClasses(model, true); + + TopiaMetadataModel metadataModel = new TopiaMetadataModel(); + for (ObjectModelClass entityClass : entityClasses) { + buildMetadataEntity(entityClass, metadataModel); + } + + if (log.isDebugEnabled()) { + TopiaMetadataModelVisitor.PrintVisitor visitor = new TopiaMetadataModelVisitor.PrintVisitor(true, "\n"); + metadataModel.accept(visitor); + log.info("MetadataModel:\n" + visitor); + } + + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + gson.toJson(metadataModel, output); + + } + + @Override + public String getFilenameForModel(ObjectModel model) { + if (templateHelper == null) { + templateHelper = new TopiaTemplateHelper(model); + } + return templateHelper.getTopiaMetadataModelFilePath(this, model); + } + + // protected void generateAddTableMethodContent(StringBuilder content, TopiaMetadataEntity clazz, Set<TopiaMetadataEntity> alreadyDone) { +// +// String clazzName = clazz.getName(); +// +// for (TopiaMetadataEntity reverseAssociationClazz : clazz.getReversedAssociations().values()) { +// +// if (alreadyDone.contains(reverseAssociationClazz)) { +// continue; +// } +// alreadyDone.add(reverseAssociationClazz); +// +// String reverseAssociationName = reverseAssociationClazz.getName(); +// +// if (reverseAssociationClazz.isEmpty()) { +// content.append("" +// +// .addReverseJoinTable(<%=entityEnumName%>.<%=reverseAssociationName%>)} +// ); +// addComment(content, "= " + clazzName); +// } else { +// +// content.append("" +// +// .addAndEnterReverseJoinTable(<%=entityEnumName%>.<%=reverseAssociationName%>)} +// ); +// addComment(content, "→ " + reverseAssociationName); +// generateAddTableMethodContent(content, reverseAssociationClazz, alreadyDone); +// addBackToParent(content, clazzName); +// } +// } +// +// for (TopiaMetadataEntity nmAssociationClazz : clazz.getNmAssociations().values()) { +// +// if (alreadyDone.contains(nmAssociationClazz)) { +// continue; +// } +// alreadyDone.add(nmAssociationClazz); +// +// String nmAssociationName = nmAssociationClazz.getName(); +// +// content.append("" +// +// .addAssociationTable(<%=entityEnumName%>.<%=nmAssociationName%>.name(), true)} +// ); +// addComment(content, "= " + clazzName); +// +// } +// +// for (TopiaMetadataEntity associationClazz : clazz.getAssociations().values()) { +// +// if (alreadyDone.contains(associationClazz)) { +// continue; +// } +// alreadyDone.add(associationClazz); +// +// String associationName = associationClazz.getName(); +// +// if (associationClazz.isEmpty()) { +// +// content.append("" +// +// .addJoinTable(<%=entityEnumName%>.<%=associationName%>)} +// ); +// addComment(content, "= " + clazzName); +// +// } else { +// content.append("" +// +// .addAndEnterJoinTable(<%=entityEnumName%>.<%=associationName%>)} +// ); +// addComment(content, "→ " + associationName); +// generateAddTableMethodContent(content, associationClazz, alreadyDone); +// addBackToParent(content, clazzName); +// +// } +// } +// } +// +// protected void addBackToParent(StringBuilder content, String clazzName) { +// content.append("" +/// +// .backToParent()} +// ); +// addComment(content, "← " + clazzName); +// } +// +// protected void addComment(StringBuilder content, String comment) { +// content.append(" /* ").append(comment).append(" */"); +// } + + protected TopiaMetadataEntity buildMetadataEntity(ObjectModelClass entityClass, TopiaMetadataModel metadataModel) { + + TopiaMetadataEntity metadataEntity; + + String entityClassName = entityClass.getName(); + Optional<TopiaMetadataEntity> optionalClazz = metadataModel.getOptionalEntity(entityClassName); + if (optionalClazz.isPresent()) { + + metadataEntity = optionalClazz.get().copy(); + + } else { + + log.info("Start " + entityClassName); + + metadataEntity = metadataModel.newEntity(entityClassName); + + Collection<ObjectModelAttribute> attributes = entityClass.getAttributes(); + for (ObjectModelAttribute attr : attributes) { + + ObjectModelAttribute reverse = attr.getReverseAttribute(); + + if (!attr.isNavigable() + && !templateHelper.hasUnidirectionalRelationOnAbstractType(reverse, model) + && !attr.hasAssociationClass()) { + continue; + } + + if (attr.getClassifier() == null || !templateHelper.isEntity(attr.getClassifier())) { + continue; + } + + ObjectModelClass attributeClass = model.getClass(attr.getType()); + + Optional<TopiaMetadataEntity> optionalAttributeClass = metadataModel.getOptionalEntity(attributeClass.getName()); + + String name = attr.getName(); + + TopiaMetadataEntity attributeClazz; + if (optionalAttributeClass.isPresent()) { + attributeClazz = optionalAttributeClass.get().copy(); + } else { + attributeClazz = buildMetadataEntity(attributeClass, metadataModel); + } + + if (GeneratorUtil.isNMultiplicity(attr)) { + if (GeneratorUtil.isNMultiplicity(attr.getReverseMaxMultiplicity()) && !attr.hasAssociationClass()) { + + // many to many + metadataEntity.addNmAssociation(attributeClazz, name); + } else { + + // one to many + metadataEntity.addAssociation(attributeClazz, name); + } + + } else { + if (GeneratorUtil.isNMultiplicity(attr.getReverseMaxMultiplicity()) && !attr.hasAssociationClass()) { + + // many to one + metadataEntity.addRequired(attributeClazz, name); + + } else { + + // one to one + metadataEntity.addReversedAssociation(attributeClazz, name); + } + } + + } + log.info("End " + entityClassName); + } + + return metadataEntity; + } + +} \ No newline at end of file diff --git a/topia-templates/src/main/java/org/nuiton/topia/templates/TopiaTemplateHelper.java b/topia-templates/src/main/java/org/nuiton/topia/templates/TopiaTemplateHelper.java index ec57837..236a1ed 100644 --- a/topia-templates/src/main/java/org/nuiton/topia/templates/TopiaTemplateHelper.java +++ b/topia-templates/src/main/java/org/nuiton/topia/templates/TopiaTemplateHelper.java @@ -29,9 +29,9 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.eugene.AbstractGenerator; import org.nuiton.eugene.EugeneStereoTypes; import org.nuiton.eugene.GeneratorUtil; +import org.nuiton.eugene.Template; import org.nuiton.eugene.java.JavaGeneratorUtil; import org.nuiton.eugene.java.ObjectModelTransformerToJava; import org.nuiton.eugene.models.object.ObjectModel; @@ -47,6 +47,7 @@ import org.nuiton.eugene.models.object.ObjectModelParameter; import org.nuiton.eugene.models.tagvalue.TagValueDefinitionProvider; import org.nuiton.eugene.models.tagvalue.TagValueDefinitionProviderManagerExtension; +import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -129,7 +130,7 @@ public class TopiaTemplateHelper { * @param generator le générateur donné * @return le package par défaut du générator donné */ - public String getDefaultPackage(AbstractGenerator<?> generator) { + public String getDefaultPackage(Template<?> generator) { String packageName = generator.getProperty(PROPERTY_DEFAULT_PACKAGE); if (StringUtils.isBlank(packageName)) { packageName = DEFAULT_PACKAGE; @@ -234,6 +235,11 @@ public class TopiaTemplateHelper { return input.getPackageName() + "." + getConcreteDaoName(input); } + public String getTopiaMetadataModelFilePath(Template<?> generator, ObjectModel model) { + String packageName = getDefaultPackage(generator); + return (packageName + '.').replace('.', File.separatorChar) + model.getName() + "TopiaMetadataModel.json"; + } + public String getEntityPackage(ObjectModelTransformerToJava transformer, ObjectModel model, ObjectModelClassifier input) { -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
participants (1)
-
nuiton.org scm