r1709 - branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator
Author: tchemit Date: 2009-12-14 20:40:38 +0100 (Mon, 14 Dec 2009) New Revision: 1709 Added: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityInterfaceTransformer.java Modified: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityInterfaceGenerator.java Log: - remove unused method + comment on EntityInterfaceGenerator - add EntityInterfacTransformer (could be optimized ?) Modified: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityInterfaceGenerator.java =================================================================== --- branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityInterfaceGenerator.java 2009-12-14 14:21:02 UTC (rev 1708) +++ branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityInterfaceGenerator.java 2009-12-14 19:40:38 UTC (rev 1709) @@ -59,6 +59,7 @@ import java.util.List; import java.util.Set; +// do not remove me :) import org.apache.commons.lang.StringUtils; public class EntityInterfaceGenerator extends ObjectModelGenerator { @@ -76,24 +77,25 @@ return interfacez.getQualifiedName().replace('.', File.separatorChar) + ".java"; } - @Override - public void generateFromInterface(Writer output, ObjectModelInterface interfacez) throws IOException { - if (!interfacez.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_ENTITY)) { - return; - } + //TC-20091214 : never used : always generate from a <<entity>> class +// @Override +// public void generateFromInterface(Writer output, ObjectModelInterface interfacez) throws IOException { +// if (!interfacez.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_ENTITY)) { +// return; +// } +// +// if (log.isDebugEnabled()) { +// log.debug("Generating interface for : " + interfacez.getName()); +// } +// +// generateInterfaceHeaderFromClassifier(output, interfacez); +// +// generateInterfaceOperations(output, interfacez); +// +///{} //<%=interfacez.getName()%> +//}*/ +// } - if (log.isDebugEnabled()) { - log.debug("Generating interface for : " + interfacez.getName()); - } - - generateInterfaceHeaderFromClassifier(output, interfacez); - - generateInterfaceOperations(output, interfacez); - -/*{} //<%=interfacez.getName()%> -}*/ - } - private String getStringRepresentation(List<String> strings) { StringBuffer result = new StringBuffer(); String doubleQuote = "\""; Added: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityInterfaceTransformer.java =================================================================== --- branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityInterfaceTransformer.java (rev 0) +++ branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityInterfaceTransformer.java 2009-12-14 19:40:38 UTC (rev 1709) @@ -0,0 +1,450 @@ +package org.nuiton.topia.generator; + +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.GeneratorUtil; +import org.nuiton.eugene.java.ObjectModelTransformerToJava; +import org.nuiton.eugene.models.object.*; +import org.nuiton.topia.persistence.SearchFields; +import org.nuiton.topia.persistence.TopiaEntity; + +import java.util.*; + + +/*{generator option: parentheses = false}*/ + +/*{generator option: writeString = +}*/ + +/** + * Created: 14 déc. 2009 + * + * @author Tony Chemit <chemit@codelutin.com> Copyright Code Lutin + * @version $Revision$ + * <p/> + * Mise a jour: $Date$ par : + * $Author: tchemit $ + */ +public class EntityInterfaceTransformer extends ObjectModelTransformerToJava { + + /** + * Logger + */ + private static final Log log = LogFactory.getLog(EntityInterfaceTransformer.class); + + @Override + public void transformFromClass(ObjectModelClass clazz) { + if (!clazz.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_ENTITY)) { + return; + } + + String clazzName = clazz.getName(); + + ObjectModelInterface result; + + if (log.isInfoEnabled()) { + log.info("for entity : "+clazz.getQualifiedName()); + } + + result = createInterface(clazzName, clazz.getPackageName()); + + addImport(result, SearchFields.class); + addImport(result, TopiaEntity.class); + if (TopiaGeneratorUtil.hasDocumentation(clazz)) { + setDocumentation(result,clazz.getDocumentation()); + } + + generateSearchFields(result, clazz); + + // super classes + + for (ObjectModelClassifier parent : clazz.getInterfaces()) { + addInterface(result,parent.getQualifiedName()); + } + + for (ObjectModelClassifier parent : clazz.getSuperclasses()) { + if (parent.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_ENTITY)) { + addInterface(result,parent.getQualifiedName()); + break; + } + } + + addInterface(result, TopiaEntity.class); + + generateStaticColumnNames(result, clazz); + + for (ObjectModelAttribute attr : clazz.getAttributes()) { + ObjectModelAttribute reverse = attr.getReverseAttribute(); + if (!attr.isNavigable() && !TopiaGeneratorUtil.hasUnidirectionalRelationOnAbstractType(reverse, model)) { + continue; + } + + if (attr.hasAssociationClass()) { + + addAssociationAttribute(result, attr); + + } else { + + addNoneAssociationAttribute(result, attr); + } + } + + //Méthodes d'accès aux attributs d'une classe d'associations + generateAssociationAttributes(result, clazz); + + generateInterfaceOperations(result, clazz); + } + + protected void generateAssociationAttributes(ObjectModelInterface result, ObjectModelClass clazz) { + if (clazz instanceof ObjectModelAssociationClass) { + ObjectModelAssociationClass assoc = (ObjectModelAssociationClass) clazz; + for (ObjectModelAttribute attr : assoc.getParticipantsAttributes()) { + if (attr != null) { + String type = attr.getType(); + String name = attr.getName(); + generateAssociationAccessors(result, name, type); + if (attr.getReverseAttribute() == null) { + type = ((ObjectModelClassifier) attr.getDeclaringElement()).getQualifiedName(); + name = attr.getDeclaringElement().getName(); + generateAssociationAccessors(result, name, type); + } + } + } + } + } + + + protected void addNoneAssociationAttribute(ObjectModelInterface result, ObjectModelAttribute attr) { + String attrName = attr.getName(); + String attrType = attr.getType(); + ObjectModelOperation op; + ObjectModelParameter attr2; + + if (!GeneratorUtil.isNMultiplicity(attr)) { + + // setXXX + + op = addOperation(result, "set" + StringUtils.capitalize(attrName), "void", ObjectModelModifier.PACKAGE); + if (TopiaGeneratorUtil.hasDocumentation(attr)) { + setDocumentation(op, attr.getDocumentation()); + } + attr2 = addParameter(op, attrType, GeneratorUtil.toLowerCaseFirstLetter(attrName)); + setDocumentation(attr2, "La valeur de l'attribut " + attrName + " à positionner."); + + // getXXX + + op = addOperation(result, "get" + StringUtils.capitalize(attrName), attrType, ObjectModelModifier.PACKAGE); + if (TopiaGeneratorUtil.hasDocumentation(attr)) { + setDocumentation(op, attr.getDocumentation()); + } + } else { + String collectionInterface = TopiaGeneratorUtil.getNMultiplicityInterfaceType(attr); + + // addXXX + + op = addOperation(result, "add" + StringUtils.capitalize(attrName), "void", ObjectModelModifier.PACKAGE); + if (TopiaGeneratorUtil.hasDocumentation(attr)) { + setDocumentation(op, attr.getDocumentation()); + } + attr2 = addParameter(op, attrType, GeneratorUtil.toLowerCaseFirstLetter(attrName)); + setDocumentation(attr2, "L'instance de " + attrName + " à ajouter"); + + // addAllXXX + + op = addOperation(result, "addAll" + StringUtils.capitalize(attrName), "void", ObjectModelModifier.PACKAGE); + if (TopiaGeneratorUtil.hasDocumentation(attr)) { + setDocumentation(op, attr.getDocumentation()); + } + attr2 = addParameter(op, collectionInterface + "<" + attrType + ">", GeneratorUtil.toLowerCaseFirstLetter(attrName)); + setDocumentation(attr2, "Les instances de " + attrName + " à ajouter"); + + // setXXX + + op = addOperation(result, "set" + StringUtils.capitalize(attrName), "void", ObjectModelModifier.PACKAGE); + if (TopiaGeneratorUtil.hasDocumentation(attr)) { + setDocumentation(op, attr.getDocumentation()); + } + attr2 = addParameter(op, collectionInterface + "<" + attrType + ">", GeneratorUtil.toLowerCaseFirstLetter(attrName)); + setDocumentation(attr2, "La Collection de " + attrName + " à ajouter"); + + // removeXXX + + op = addOperation(result, "remove" + StringUtils.capitalize(attrName), "void", ObjectModelModifier.PACKAGE); + if (TopiaGeneratorUtil.hasDocumentation(attr)) { + setDocumentation(op, attr.getDocumentation()); + } + attr2 = addParameter(op, attrType, GeneratorUtil.toLowerCaseFirstLetter(attrName)); + setDocumentation(attr2, "L'instance de " + attrName + " à retirer"); + + // clearXXX + + op = addOperation(result, "clear" + StringUtils.capitalize(attrName), "void", ObjectModelModifier.PACKAGE); + if (TopiaGeneratorUtil.hasDocumentation(attr)) { + setDocumentation(op, attr.getDocumentation()); + } + setDocumentation(attr2, "Vide la Collection de " + attrName); + + // getXXX + + op = addOperation(result, "get" + StringUtils.capitalize(attrName), collectionInterface + "<" + attrType + ">", ObjectModelModifier.PACKAGE); + if (TopiaGeneratorUtil.hasDocumentation(attr)) { + setDocumentation(op, "Retourne la collection."); + } + + if (!TopiaGeneratorUtil.isPrimitiveType(attr) && !TopiaGeneratorUtil.isDateType(attr)) { + + // getXXXByTopiaId + + op = addOperation(result, "get" + StringUtils.capitalize(attrName) + "ByTopiaId", attrType, ObjectModelModifier.PACKAGE); + setDocumentation(op, "Recupère l'attribut " + attrName + " à partir de son topiaId"); + attr2 = addParameter(op, String.class, "topiaId"); + setDocumentation(attr2, "le topia id de l'entité recherchée"); + } + + // sizeXXX + + op = addOperation(result, "size" + StringUtils.capitalize(attrName), int.class, ObjectModelModifier.PACKAGE); + setDocumentation(op, "Retourne le nombre d'éléments de la collection " + attrName); + + // isXXXEmpty + + op = addOperation(result, "is" + StringUtils.capitalize(attrName) + "Empty", boolean.class, ObjectModelModifier.PACKAGE); + setDocumentation(op, "Retourne {@code true} si la collection " + attrName + " est vide."); + } + } + + protected void addAssociationAttribute(ObjectModelInterface result, ObjectModelAttribute attr) { + String attrName = attr.getName(); + String attrType = attr.getType(); + String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(attr); + String assocClassFQN = attr.getAssociationClass().getQualifiedName(); + String assocClassName = attr.getAssociationClass().getName(); + + ObjectModelOperation op; + ObjectModelParameter attr2; + + if (!GeneratorUtil.isNMultiplicity(attr)) { + + // setXXX + + op = addOperation(result, "set" + StringUtils.capitalize(assocAttrName), "void", ObjectModelModifier.PACKAGE); + attr2 = addParameter(op, assocClassFQN, GeneratorUtil.toLowerCaseFirstLetter(assocClassName)); + setDocumentation(attr2, "La valeur de l'attribut " + assocClassName + " à positionner"); + + // getXXX + + addOperation(result, "get" + StringUtils.capitalize(assocAttrName), assocClassFQN, ObjectModelModifier.PACKAGE); + + } else { + String collectionInterface = TopiaGeneratorUtil.getNMultiplicityInterfaceType(attr); + + // addXXX + + op = addOperation(result, "add" + StringUtils.capitalize(assocAttrName), "void", ObjectModelModifier.PACKAGE); + attr2 = addParameter(op, assocClassFQN, GeneratorUtil.toLowerCaseFirstLetter(assocClassName)); + setDocumentation(attr2, "L'instance de " + assocClassName + " à ajouter"); + + // addAllXXX + + op = addOperation(result, "addAll" + StringUtils.capitalize(assocAttrName), "void", ObjectModelModifier.PACKAGE); + attr2 = addParameter(op, collectionInterface + "<" + assocClassFQN + ">", GeneratorUtil.toLowerCaseFirstLetter(assocClassName)); + setDocumentation(attr2, "Les instances de " + assocClassName + " à ajouter"); + + // setXXX + + op = addOperation(result, "set" + StringUtils.capitalize(assocAttrName), "void", ObjectModelModifier.PACKAGE); + attr2 = addParameter(op, collectionInterface + "<" + assocClassFQN + ">", GeneratorUtil.toLowerCaseFirstLetter(assocClassName)); + setDocumentation(attr2, "La Collection de " + assocClassName + " à ajouter"); + + // removeXXX + + op = addOperation(result, "remove" + StringUtils.capitalize(assocAttrName), "void", ObjectModelModifier.PACKAGE); + attr2 = addParameter(op, assocClassFQN, GeneratorUtil.toLowerCaseFirstLetter(assocClassName)); + setDocumentation(attr2, "L'instance de " + assocClassName + " à retirer"); + + // clearXXX + + op = addOperation(result, "clear" + StringUtils.capitalize(assocAttrName), "void", ObjectModelModifier.PACKAGE); + setDocumentation(op, "Vide la Collection de " + assocClassName + " ."); + + // getXXX + + addOperation(result, "get" + StringUtils.capitalize(assocAttrName), collectionInterface + "<" + assocClassFQN + ">", ObjectModelModifier.PACKAGE); + + if (!TopiaGeneratorUtil.isPrimitiveType(attr) && !TopiaGeneratorUtil.isDateType(attr)) { + + // getXXXByTopiaId + + op = addOperation(result, "get" + StringUtils.capitalize(assocAttrName) + "ByTopiaId", assocClassFQN, ObjectModelModifier.PACKAGE); + setDocumentation(op, "Recupère l'attribut " + attrName + " à partir de son topiaId"); + attr2 = addParameter(op, String.class, "topiaId"); + setDocumentation(attr2, "le topia id de l'entité recherchée"); + } + + // getXXX + + op = addOperation(result, "get" + StringUtils.capitalize(assocAttrName), assocClassFQN); + addParameter(op, attrType, "value"); + + + // sizeXXX + + addOperation(result, "size" + StringUtils.capitalize(assocAttrName), int.class, ObjectModelModifier.PACKAGE); + + + // isXXXEmpty + + addOperation(result, "is" + StringUtils.capitalize(assocAttrName) + "Empty", boolean.class, ObjectModelModifier.PACKAGE); + } + } + + private void generateInterfaceOperations(ObjectModelInterface output, ObjectModelClassifier classifier) { + + for (ObjectModelOperation op : classifier.getOperations()) { + + if (op.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_DAO)) { + // Pas de génération des signatures de méthodes pour celles à intégrer au DAO de l'entité + continue; + } + + String opName = op.getName(); + String opType = op.getReturnType(); + + ObjectModelOperation op2 = addOperation(output, opName, opType, ObjectModelModifier.PACKAGE); + if (TopiaGeneratorUtil.hasDocumentation(op)) { + setDocumentation(op2, op.getDocumentation()); + } + + for (ObjectModelParameter param : op.getParameters()) { + String paramName = param.getName(); + String paramType = param.getType(); + ObjectModelParameter param2 = addParameter(op2, paramType, paramName); + if (TopiaGeneratorUtil.hasDocumentation(param)) { + setDocumentation(param2, param.getDocumentation()); + } + } + for (String exception : op.getExceptions()) { + addException(op2, exception); + } + } + } + + private void generateAssociationAccessors(ObjectModelInterface output, String attrName, String attrType) { + + ObjectModelOperation op; + ObjectModelParameter param; + + op = addOperation(output, "set" + StringUtils.capitalize(attrName), "void", ObjectModelModifier.PACKAGE); + param = addParameter(op, attrType, "value"); + setDocumentation(param, "La valeur de l'attribut " + attrName + " à positionner."); + + op = addOperation(output, "get" + StringUtils.capitalize(attrName), attrType, ObjectModelModifier.PACKAGE); + setDocumentation(op, "Retourne la valeur de l'attribut " + attrName + "."); + } + + private static final String doubleQuote = "\""; + private static final String comma = ","; + + private String getStringRepresentation(List<String> strings) { + StringBuilder result = new StringBuilder(); + + Iterator<String> it = strings.iterator(); + if (it.hasNext()) { + result.append(doubleQuote).append(it.next()).append(doubleQuote); + } + while (it.hasNext()) { + result.append(comma).append(doubleQuote).append(it.next()).append(doubleQuote); + } + return result.toString(); + } + + private void generateSearchFields(ObjectModelInterface result, ObjectModelClass clazz) { + List<String> txtFields = new ArrayList<String>(); + List<String> numFields = new ArrayList<String>(); + List<String> boolFields = new ArrayList<String>(); + List<String> dateFields = new ArrayList<String>(); + List<ObjectModelAttribute> allAttrs = new ArrayList<ObjectModelAttribute>(); + allAttrs.addAll(clazz.getAttributes()); + allAttrs.addAll(clazz.getAllOtherAttributes()); + boolean needAnnotation = false; + for (ObjectModelAttribute attr : allAttrs) { + String name = GeneratorUtil.toLowerCaseFirstLetter(attr.getName()); + if (TopiaGeneratorUtil.isTextType(attr)) { + txtFields.add(name); + needAnnotation = true; + } else if (TopiaGeneratorUtil.isNumericType(attr)) { + numFields.add(name); + needAnnotation = true; + } else if (TopiaGeneratorUtil.isBooleanType(attr)) { + boolFields.add(name); + needAnnotation = true; + } else if (TopiaGeneratorUtil.isDateType(attr)) { + dateFields.add(name); + needAnnotation = true; + } + } + //FIXME introduce a annotation extension to generate them + +/*@SearchFields (*/ + if (needAnnotation) { + StringBuilder buffer = new StringBuilder(); + if (!txtFields.isEmpty()) { + buffer.append("\n txtFields={").append(getStringRepresentation(txtFields)).append("}"); + if (!numFields.isEmpty() || !boolFields.isEmpty() || !dateFields.isEmpty()) { + buffer.append(","); + } + } + if (!numFields.isEmpty()) { + buffer.append("\n numFields={").append(getStringRepresentation(numFields)).append("}"); + if (!boolFields.isEmpty() || !dateFields.isEmpty()) { + buffer.append(","); + } + } + if (!boolFields.isEmpty()) { + buffer.append("\n boolFields={").append(getStringRepresentation(boolFields)).append("}"); + if (!dateFields.isEmpty()) { + buffer.append(","); + } + } + if (!dateFields.isEmpty()) { + buffer.append("\n dateFields={").append(getStringRepresentation(dateFields)).append("}"); + } +/*<%=buffer.toString()%> +*/ + } +/*) +*/ + } + + private void generateStaticColumnNames(ObjectModelInterface result, ObjectModelClass clazz) { + for (ObjectModelAttribute attr : clazz.getAttributes()) { + ObjectModelAttribute reverse = attr.getReverseAttribute(); + if (!(attr.isNavigable() + || TopiaGeneratorUtil.hasUnidirectionalRelationOnAbstractType(reverse, model) + || attr.hasAssociationClass())) { + continue; + } + String attrName; + if (!attr.hasAssociationClass()) { + attrName = attr.getName(); + } else { + String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(attr); + attrName = GeneratorUtil.toLowerCaseFirstLetter(assocAttrName); + } + String attrColName = TopiaGeneratorUtil.convertVariableNameToConstantName(attrName); + addAttribute(result, attrColName, String.class, "\"" + attrName + "\"", ObjectModelModifier.PACKAGE); + } + + //Déclaration des noms des champs des attributs d'une classe d'associations + if (clazz instanceof ObjectModelAssociationClass) { + ObjectModelAssociationClass assoc = (ObjectModelAssociationClass) clazz; + for (ObjectModelAttribute attr : assoc.getParticipantsAttributes()) { + if (attr != null) { + String attrName = attr.getName(); + String attrColName = TopiaGeneratorUtil.convertVariableNameToConstantName(attrName); + addAttribute(result, attrColName, String.class, "\"" + attrName + "\"", ObjectModelModifier.PACKAGE); + } + } + } + } +} Property changes on: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityInterfaceTransformer.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL
participants (1)
-
tchemit@users.nuiton.org