Author: tchemit Date: 2008-11-01 22:16:50 +0000 (Sat, 01 Nov 2008) New Revision: 1206 Modified: topia/trunk/src/main/java/org/codelutin/topia/generator/DAOHelperGenerator.java topia/trunk/src/main/java/org/codelutin/topia/generator/EntityEnumGenerator.java topia/trunk/src/main/java/org/codelutin/topia/generator/EntityProviderGenerator.java topia/trunk/src/main/java/org/codelutin/topia/generator/GeneratorUtil.java Log: fix bug whern no entity class in model sort entities class by their fqn fix javadoc in GeneratorUtil Modified: topia/trunk/src/main/java/org/codelutin/topia/generator/DAOHelperGenerator.java =================================================================== --- topia/trunk/src/main/java/org/codelutin/topia/generator/DAOHelperGenerator.java 2008-11-01 20:49:57 UTC (rev 1205) +++ topia/trunk/src/main/java/org/codelutin/topia/generator/DAOHelperGenerator.java 2008-11-01 22:16:50 UTC (rev 1206) @@ -29,12 +29,11 @@ package org.codelutin.topia.generator; -import static org.codelutin.topia.generator.GeneratorUtil.STEREOTYPE_ENTITY; - import java.io.File; import java.io.IOException; import java.io.Writer; import java.util.Iterator; +import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -87,7 +86,8 @@ }*/ String entitiesList = ""; - if (model.getClasses().isEmpty()) { + List<ObjectModelClass> classes = GeneratorUtil.getEntityClasses(model,true); + if (classes.isEmpty()) { /*{ public static final String entitiesList = ""; }*/ @@ -96,13 +96,11 @@ public static final String entitiesList = "" + }*/ - for (Iterator i=model.getClasses().iterator(); i.hasNext();) { + for (Iterator i=classes.iterator(); i.hasNext();) { ObjectModelClass clazz = (ObjectModelClass)i.next(); - if(/*!clazz.isAbstract() && */clazz.hasStereotype(STEREOTYPE_ENTITY)){ - entitiesList += GeneratorUtil.getDOType(clazz, model) + (i.hasNext()?",":""); + entitiesList += GeneratorUtil.getDOType(clazz, model) + (i.hasNext()?",":""); /*{ "<%=GeneratorUtil.getDOType(clazz, model)%><%=(i.hasNext()?",\" +":"\";")%> }*/ - } } } if (log.isDebugEnabled()) { @@ -113,9 +111,8 @@ protected <%=model.getName()%>DAOHelper() { } }*/ - for (ObjectModelClass objectModelClass : model.getClasses()) { + for (ObjectModelClass objectModelClass : classes) { ObjectModelClass clazz = objectModelClass; - if (/*!clazz.isAbstract() && */clazz.hasStereotype(STEREOTYPE_ENTITY)) { /*{ static public <%=clazz.getQualifiedName()%>DAO get<%=clazz.getName()%>DAO(TopiaContext context) throws TopiaException { TopiaContextImplementor ci = (TopiaContextImplementor)context; @@ -123,7 +120,6 @@ return result; } }*/ - } } /*{ } Modified: topia/trunk/src/main/java/org/codelutin/topia/generator/EntityEnumGenerator.java =================================================================== --- topia/trunk/src/main/java/org/codelutin/topia/generator/EntityEnumGenerator.java 2008-11-01 20:49:57 UTC (rev 1205) +++ topia/trunk/src/main/java/org/codelutin/topia/generator/EntityEnumGenerator.java 2008-11-01 22:16:50 UTC (rev 1206) @@ -28,12 +28,12 @@ import org.codelutin.generator.ObjectModelGenerator; import org.codelutin.generator.models.object.ObjectModel; import org.codelutin.generator.models.object.ObjectModelClass; -import static org.codelutin.topia.generator.GeneratorUtil.STEREOTYPE_ENTITY; import java.io.File; import java.io.IOException; import java.io.Writer; import java.util.Iterator; +import java.util.List; /** * Ce generateur permet d'avoir une énumeration sur les entités du model. @@ -89,21 +89,20 @@ /*{public enum <%=className%> { }*/ - if (model.getClasses().isEmpty()) { + List<ObjectModelClass> classes = GeneratorUtil.getEntityClasses(model,true); + if (classes.isEmpty()) { /*{ TopiaEntity(TopiaEntity.class); }*/ } else { - for (Iterator i = model.getClasses().iterator(); i.hasNext();) { + for (Iterator i = classes.iterator(); i.hasNext();) { ObjectModelClass clazz = (ObjectModelClass) i.next(); - if (clazz.hasStereotype(STEREOTYPE_ENTITY)) { - boolean hasNext = i.hasNext(); - if (log.isDebugEnabled()) { - log.debug("generating entry " + clazz + " (hasNext:" + hasNext + ")"); - } + boolean hasNext = i.hasNext(); + if (log.isDebugEnabled()) { + log.debug("generating entry " + clazz + " (hasNext:" + hasNext + ")"); + } /*{ <%=clazz.getName()%>(<%=clazz.getQualifiedName()%>.class)<%=(hasNext?",":";")%> }*/ - } } } /*{ @@ -189,12 +188,12 @@ return buffer.substring(1); } - public static <T extends TopiaEntity, D extends TopiaDAO<? super T>> D getDao(Class<T> klass, TopiaContext ctxt) throws TopiaException { + public static <T extends TopiaEntity, D extends TopiaDAO<? super T>> D getDAO(Class<T> klass, TopiaContext ctxt) throws TopiaException { <%=className%> e = <%=className%>.valueOf(klass); return (D) e.getDAO(ctxt); } - public static <T extends TopiaEntity, D extends TopiaDAO<? super T>> D getDao(T entity, TopiaContext ctxt) throws TopiaException { + public static <T extends TopiaEntity, D extends TopiaDAO<? super T>> D getDAO(T entity, TopiaContext ctxt) throws TopiaException { <%=className%> e = <%=className%>.valueOf(entity); return (D) e.getDAO(ctxt); } Modified: topia/trunk/src/main/java/org/codelutin/topia/generator/EntityProviderGenerator.java =================================================================== --- topia/trunk/src/main/java/org/codelutin/topia/generator/EntityProviderGenerator.java 2008-11-01 20:49:57 UTC (rev 1205) +++ topia/trunk/src/main/java/org/codelutin/topia/generator/EntityProviderGenerator.java 2008-11-01 22:16:50 UTC (rev 1206) @@ -22,12 +22,11 @@ package org.codelutin.topia.generator; -import static org.codelutin.topia.generator.GeneratorUtil.STEREOTYPE_ENTITY; - import java.io.File; import java.io.IOException; import java.io.Writer; import java.util.Iterator; +import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -83,7 +82,8 @@ protected static java.util.Map<Class<? extends TopiaEntity>, Class<? extends TopiaEntity>> cache; }*/ - if (model.getClasses().isEmpty()) { + List<ObjectModelClass> classes = GeneratorUtil.getEntityClasses(model,true); + if (classes.isEmpty()) { /*{ protected static Class<? extends TopiaEntity>[] entitiesClass = new Class[]{}; }*/ @@ -92,12 +92,10 @@ protected static Class<? extends TopiaEntity>[] entitiesClass = new Class[]{ }*/ } - for (Iterator i=model.getClasses().iterator(); i.hasNext();) { + for (Iterator i=classes.iterator(); i.hasNext();) { ObjectModelClass clazz = (ObjectModelClass)i.next(); - if(/*!clazz.isAbstract() && */clazz.hasStereotype(STEREOTYPE_ENTITY)){ /*{ <%=clazz.getQualifiedName()%>.class<%=(i.hasNext()?", ":"\n};")%> -}*/ - } +}*/ } /*{ public static <E extends TopiaEntity> Class<E> getImpl(Class<E> klazz) { Modified: topia/trunk/src/main/java/org/codelutin/topia/generator/GeneratorUtil.java =================================================================== --- topia/trunk/src/main/java/org/codelutin/topia/generator/GeneratorUtil.java 2008-11-01 20:49:57 UTC (rev 1205) +++ topia/trunk/src/main/java/org/codelutin/topia/generator/GeneratorUtil.java 2008-11-01 22:16:50 UTC (rev 1206) @@ -17,26 +17,18 @@ /******************************************************************************* * GeneratorUtil.java - * + * * Created: 13 déc. 2005 - * + * * @author Arnaud Thimel <thimel@codelutin.com> - * + * * @version $Revision$ - * + * * Mise a jour: $Date$ par : $Author$ */ package org.codelutin.topia.generator; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; - import org.apache.commons.lang.StringUtils; import org.codelutin.generator.Generator; import org.codelutin.generator.Util; @@ -48,114 +40,85 @@ import org.codelutin.generator.models.object.ObjectModelInterface; import org.codelutin.generator.models.object.ObjectModelOperation; -/** - * Classe regroupant divers méthodes utiles pour la génération des entités - */ +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +/** Classe regroupant divers méthodes utiles pour la génération des entités */ public class GeneratorUtil extends Util { - /** - * Stéréotype pour les interfaces devant être générées sous forme de facades - */ + /** Stéréotype pour les interfaces devant être générées sous forme de facades */ public final static String STEREOTYPE_FACADE = "facade"; - /** - * Stéréotype pour les objets devant être générées sous forme d'entités - */ + /** Stéréotype pour les objets devant être générées sous forme d'entités */ public static final String STEREOTYPE_ENTITY = "entity"; - - /** - * Stéréotype pour les objets devant être générées sous forme de DTO - */ + + /** Stéréotype pour les objets devant être générées sous forme de DTO */ public static final String STEREOTYPE_DTO = "dto"; - + /** * Stéréotype pour les interfaces devant être générées sous forme de * services */ public static final String STEREOTYPE_SERVICE = "service"; - /** - * Stéréotype pour les interfaces devant être générées sous forme de DAO - */ + /** Stéréotype pour les interfaces devant être générées sous forme de DAO */ public static final String STEREOTYPE_DAO = "dao"; - /** - * Stéréotype pour les attributs à indexer en base - */ + /** Stéréotype pour les attributs à indexer en base */ public static final String STEREOTYPE_INDEXED = "indexed"; - /** - * Stéréotype pour les collections avec unicité - */ + /** Stéréotype pour les collections avec unicité */ public static final String STEREOTYPE_UNIQUE = "unique"; - /** - * Stéréotype pour les attributs étant des clés primaires - */ + /** Stéréotype pour les attributs étant des clés primaires */ public static final String STEREOTYPE_PRIMARYKAY = "primaryKey"; - /** - * Tag pour le type de persistence - */ + /** Tag pour le type de persistence */ public static final String TAG_PERSISTENCE_TYPE = "persistenceType"; - /** - * Tag pour le nom du champ / entité en BD - */ + /** Tag pour le nom du champ / entité en BD */ public static final String TAG_DB_NAME = "dbName"; - /** - * Tag pour le nom du schema en BD - */ + /** Tag pour le nom du schema en BD */ public static final String TAG_SCHEMA_NAME = "dbSchema"; - /** - * Tag pour la taille du champ en BD - */ + /** Tag pour la taille du champ en BD */ public static final String TAG_LENGTH = "length"; - /** - * Tag pour ajouter une annotation à un champ - */ + /** Tag pour ajouter une annotation à un champ */ public static final String TAG_ANNOTATION = "annotation"; - /** - * Tag pour ajouter specifier le copyright d'un fichier - */ + /** Tag pour ajouter specifier le copyright d'un fichier */ public static final String TAG_COPYRIGHT = "copyright"; - /** - * Tag pour specfier le type d'acces a un champ - */ + /** Tag pour specfier le type d'acces a un champ */ public static final String TAG_ACCESS = "access"; - /** - * Type de persistence Hibernate - */ + /** Type de persistence Hibernate */ public static final String PERSISTENCE_TYPE_HIBERNATE = "hibernate"; - /** - * Type de persistence LDAP - */ + /** Type de persistence LDAP */ public static final String PERSISTENCE_TYPE_LDAP = "ldap"; - /** - * Type de persistence par défaut (si aucun précisé) - */ + /** Type de persistence par défaut (si aucun précisé) */ public static final String PERSISTENCE_TYPE_DEFAULT = PERSISTENCE_TYPE_HIBERNATE; - /** - * Propriété des générateurs indiquant le package par défaut - */ + /** Propriété des générateurs indiquant le package par défaut */ public static final String PROPERTY_DEFAULT_PACKAGE = "defaultPackage"; - /** - * Le package par défaut si aucun n'est spécifié - */ + /** Le package par défaut si aucun n'est spécifié */ public static final String DEFAULT_PACKAGE = "org.codelutin.malo"; /** * Renvoie le package par défaut pour le générateur donné + * + * @param generator le générateur donné + * @return le package par défaut du générator donné */ public static String getDefaultPackage(Generator generator) { String packageName = generator @@ -168,7 +131,8 @@ /** * Indique si l'élément spécifié dispose de documentation - * + * + * @param element l'élément à tester * @return true s'il y a documentation, false sinon */ public static boolean hasDocumentation(ObjectModelElement element) { @@ -177,7 +141,8 @@ /** * Indique si la chaine de caratère n'est pas vide (null ou "") - * + * + * @param s la chaine de caractères à tester * @return true si <code>s</code> n'est pas vide */ public static boolean notEmpty(String s) { @@ -186,14 +151,15 @@ /** * Renvoie l'interface DAO associée à la classe passée en paramètre - * + * + * @param clazz la classe à tester + * @param model le modele utilisé * @return l'interface trouvée ou null sinon */ public static ObjectModelInterface getDAOInterface(ObjectModelClass clazz, - ObjectModel model) { - for (Iterator it = model.getInterfaces().iterator(); it.hasNext();) { - ObjectModelInterface daoInterface = (ObjectModelInterface) it - .next(); + ObjectModel model) { + for (Object o : model.getInterfaces()) { + ObjectModelInterface daoInterface = (ObjectModelInterface) o; if (daoInterface.getName().equals(clazz.getName() + "DAO")) { if (daoInterface.hasStereotype(STEREOTYPE_DAO)) { return daoInterface; @@ -206,6 +172,9 @@ /** * Renvoie le type de persistence pour l'élément donné. Si aucun n'est * trouvé, le type par défaut est utilisé + * + * @param element l'élément à tester + * @return le type de persitence pour l'élément donné. */ public static String getPersistenceType(ObjectModelElement element) { String tag = element.getTagValue(TAG_PERSISTENCE_TYPE); @@ -226,8 +195,8 @@ /** * Renvoie le nom BD de l'élement passé en paramètre. Elle se base sur le * tag associé si il existe, sinon sur le nom de l'élément - * - * @param element + * + * @param element l'élément à tester * @return le nom de table */ public static String getDBName(ObjectModelElement element) { @@ -242,6 +211,9 @@ /** * Cherches et renvoie le schema a utiliser sur cet element, sinon sur le model. + * + * @param element l'élément à tester + * @param model le modele utilisé * @return le nom du schema ou null */ public static String getSchemaName(ObjectModelElement element, ObjectModel model) { @@ -250,6 +222,8 @@ /** * Cherches et renvoie le copyright a utiliser sur le model. + * + * @param model le modele utilisé * @return le texte du copyright ou null */ public static String getCopyright(Model model) { @@ -259,6 +233,10 @@ /** * Cherches et renvoie la valeur du tagvalue indique sur cet element, * sinon sur le model. + * + * @param tagName le nom du tag + * @param element l'élément à tester + * @param model le modele utilisé * @return la valeur du tagValue ou null */ public static String findTagValue(String tagName, ObjectModelElement element, Model model) { @@ -289,7 +267,7 @@ } public static boolean hasStereotypes(ObjectModelElement element, - String... stereotypes) { + String... stereotypes) { for (String stereotype : stereotypes) { if (!element.hasStereotype(stereotype)) { return false; @@ -302,7 +280,7 @@ ObjectModelClass clazz, boolean includeName) { String attributes = ""; for (ObjectModelAttribute attr : getElementsWithStereotype( - (Collection<ObjectModelAttribute>) clazz.getAttributes(), + clazz.getAttributes(), STEREOTYPE_PRIMARYKAY)) { attributes += attr.getType(); if (includeName) { @@ -328,8 +306,9 @@ * Renvoie le nom de l'attribut de classe d'association en fonction des cas: * Si l'attribut porte le même nom que le type (extrémité inverse de * l'association), on lui ajoute le nom de la classe d'association - * @param attr - * @return + * + * @param attr l'attribut a traiter + * @return le nom de l'attribut de classe d'association */ public static String getAssocAttrName(ObjectModelAttribute attr) { String typeName = attr.getType().substring(attr.getType().lastIndexOf(".") + 1); @@ -343,10 +322,11 @@ public static String getDOType(ObjectModelElement elem, ObjectModel model) { String type = elem.getName(); if (elem instanceof ObjectModelAttribute) { - type = ((ObjectModelAttribute)elem).getType(); - } if (elem instanceof ObjectModelClass) { - type = ((ObjectModelClass)elem).getQualifiedName(); + type = ((ObjectModelAttribute) elem).getType(); } + if (elem instanceof ObjectModelClass) { + type = ((ObjectModelClass) elem).getQualifiedName(); + } return getDOType(type, model); } @@ -354,7 +334,7 @@ if (!model.hasClass(type)) { return type; } - ObjectModelClass clazz = model.getClass(type); + ObjectModelClass clazz = model.getClass(type); if (clazz.hasStereotype(STEREOTYPE_ENTITY)) { if (shouldBeAbstract(clazz)) { type += "Abstract"; @@ -366,6 +346,7 @@ } private static Set<String> numberTypes = new HashSet<String>(); + static { numberTypes.add("byte"); numberTypes.add("java.lang.Byte"); @@ -386,6 +367,7 @@ } private static Set<String> textTypes = new HashSet<String>(); + static { textTypes.add("char"); textTypes.add("java.lang.Char"); @@ -406,30 +388,29 @@ /** * Indique si la classe specifiee n'a aucune ou que des methodes abstraites + * * @param clazz l'instance de ObjectModelClass * @return true si la classe n'a que des operations abstraite ou aucune - * operation + * operation */ public static boolean hasNothingOrAbstractMethods(ObjectModelClass clazz) { boolean result = true; Iterator operations = clazz.getOperations().iterator(); while (result && operations.hasNext()) { - ObjectModelOperation op = (ObjectModelOperation)operations.next(); - result &= op.isAbstract(); + ObjectModelOperation op = (ObjectModelOperation) operations.next(); + result = op.isAbstract(); } return result; } /** * Indique si la classe specifiee devrait etre abstraite + * * @param clazz l'instance de ObjectModelClass * @return true dans ce cas, false sinon */ public static boolean shouldBeAbstract(ObjectModelClass clazz) { - if (clazz == null) { - return false; - } - return (clazz.isAbstract() && hasNothingOrAbstractMethods(clazz)); + return clazz != null && (clazz.isAbstract() && hasNothingOrAbstractMethods(clazz)); } /** @@ -439,11 +420,12 @@ * - cette relation est unidirectionnelle * - le type de l'attribut représente un entité * - cette entité a des sous-classes dans le modèle - * + * <p/> * Ce cas correspond à une incompatibilité d'Hibernate qui nous oblige a * adopter un comportement particulier. * </p> - * @param attr l'attribut a tester + * + * @param attr l'attribut a tester * @param model le model * @return true si et seulement si il s'agit bien de ce type de relation */ @@ -459,10 +441,7 @@ ObjectModelClass clazz = model.getClass(attr.getType()); if (clazz != null && clazz.hasStereotype(STEREOTYPE_ENTITY)) { //Cette classe a des sous-classes dans le modèle - Iterator subClasses = model.getClasses().iterator(); - while (subClasses.hasNext()) { - ObjectModelClass subClass = - (ObjectModelClass)subClasses.next(); + for (ObjectModelClass subClass : model.getClasses()) { if (subClass.getSuperclasses().contains(clazz)) { return true; } @@ -472,26 +451,26 @@ } return false; } - + /** * Renvoie le nom unique de table pour une relation ManyToMany en fonction * de l'attribut <code>attr</code> - * <p> + * <p/> * Plusieurs cas de figure: * <li> - * + * * @param attr l'attribut servant de base au calcul du nom * @return le nom de la table - */ + */ public static String getManyToManyTableName(ObjectModelAttribute attr) { String result; - + if (attr.hasAssociationClass()) { result = GeneratorUtil.getDBName(attr.getAssociationClass()); } else { String name = attr.getName(); String revers = attr.getReverseAttributeName(); - + if (name.compareToIgnoreCase(revers) < 0) { result = name + "_" + revers; } else { @@ -509,7 +488,9 @@ /** * Renvoie le type d'interface à utiliser en fonction de l'attribut - * @return String + * + * @param attr l'attribut a traiter + * @return String */ public static String getNMultiplicityInterfaceType(ObjectModelAttribute attr) { if (attr.hasStereotype(STEREOTYPE_UNIQUE)) { @@ -522,7 +503,9 @@ /** * Renvoie le type d'objet (instance) à utiliser en fonction de l'attribut - * @return String + * + * @param attr l'attribut a traiter + * @return String */ public static String getNMultiplicityObjectType(ObjectModelAttribute attr) { if (attr.hasStereotype(STEREOTYPE_UNIQUE)) { @@ -539,7 +522,9 @@ /** * Renvoie le type d'interface à utiliser en fonction de l'attribut - * @return String + * + * @param attr l'attribut a traiter + * @return String */ public static String getNMultiplicityHibernateType(ObjectModelAttribute attr) { if (attr.hasStereotype(STEREOTYPE_UNIQUE)) { @@ -551,4 +536,39 @@ return "bag"; } + /** + * Obtain the list of entities classes with the possibility to sort the result. + * + * @param model the current model to scan + * @param sort flag to allow sort the result + * @return the list of filtred classes by their stereotype + */ + public static List<ObjectModelClass> getEntityClasses(ObjectModel model, boolean sort) { + return getClassesByStereotype(STEREOTYPE_ENTITY, model, sort); + } + + /** + * Obtain the list of classes for a given stereotype with the possibility to sort the result. + * + * @param stereotype filter stereotype + * @param model the current model to scan + * @param sort flag to allow sort the result + * @return the list of filtred classes by their stereotype + */ + public static List<ObjectModelClass> getClassesByStereotype(String stereotype, ObjectModel model, boolean sort) { + List<ObjectModelClass> classes = new ArrayList<ObjectModelClass>(); + for (ObjectModelClass clazz : model.getClasses()) { + if (clazz.hasStereotype(stereotype)) { + classes.add(clazz); + } + } + if (sort && !classes.isEmpty()) { + java.util.Collections.sort(classes, new java.util.Comparator<ObjectModelClass>() { + public int compare(ObjectModelClass o1, ObjectModelClass o2) { + return o1.getQualifiedName().compareTo(o2.getQualifiedName()); + } + }); + } + return classes; + } } // GeneratorUtil