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(a)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