Index: topia2/src/java/org/codelutin/topia/generator/ServiceInterfaceGenerator.java diff -u topia2/src/java/org/codelutin/topia/generator/ServiceInterfaceGenerator.java:1.1 topia2/src/java/org/codelutin/topia/generator/ServiceInterfaceGenerator.java:1.2 --- topia2/src/java/org/codelutin/topia/generator/ServiceInterfaceGenerator.java:1.1 Wed Apr 18 10:38:10 2007 +++ topia2/src/java/org/codelutin/topia/generator/ServiceInterfaceGenerator.java Tue Jun 19 15:41:57 2007 @@ -1,6 +1,6 @@ /* *##% * Copyright (C) 2002, 2003, 2004, 2005 Code Lutin, -* Cédric Pineau, Benjamin Poussin, +* Benjamin Poussin, * * * This program is free software; you can redistribute it and/or @@ -18,30 +18,14 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *##%*/ -/* * -* EntityGenerator.java -* -* Created: 12 déc. 2005 -* -* @author Arnaud Thimel -* @version $Revision: 1.1 $ -* -* Mise a jour: $Date: 2007/04/18 10:38:10 $ -* par : $Author: chatellier $ -*/ - package org.codelutin.topia.generator; -import static org.codelutin.topia.generator.GeneratorUtil.hasUnidirectionalRelationOnAbstractType; - import java.io.File; import java.io.IOException; import java.io.Writer; import java.util.Collection; import java.util.Iterator; -import java.util.List; import java.util.Set; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codelutin.generator.Generator; @@ -55,6 +39,26 @@ import org.codelutin.generator.models.object.ObjectModelOperation; import org.codelutin.generator.models.object.ObjectModelParameter; +/** +* ServiceInterfaceGenerator.java +* +* Created: 14 juin 2007 +* +* @author ndupont +* @version $Revision: 1.2 $ +* +* L'interface du service etend TopiaApplicationService +* +* Genere les interfaces des services, genere les signatures de toutes les methodes +* des DAO utilises. Les signatures de methodes sont modifiees pour éviter les doublons, +* par exemple : findAllByAddress dans PersonDAO et EmployeeDAO deviennent findAllPersonByAddress +* et findAllEmployeeByAddress. +* +* @see TopiaApplicationService +* +* Mise a jour: $Date: 2007/06/19 15:41:57 $ +* par : $Author: ndupont $ +*/ public class ServiceInterfaceGenerator extends ObjectModelGenerator { /** @@ -62,58 +66,41 @@ */ private static final Log log = LogFactory .getLog(ServiceInterfaceGenerator.class); + + private static final String DAO = "dao"; public ServiceInterfaceGenerator(Generator parent) { super(parent); } @Override - public String getFilenameForClass(ObjectModelClass clazz) { - return clazz.getQualifiedName().replace('.', File.separatorChar) + ".java"; - } - - @Override public String getFilenameForInterface(ObjectModelInterface interfacez) { return interfacez.getQualifiedName().replace('.', File.separatorChar) + ".java"; } - /* (non-Javadoc) - * @see org.codelutin.generator.ObjectModelGenerator#generateFromInterface(java.io.Writer, org.codelutin.generator.models.object.ObjectModelInterface) - */ @Override public void generateFromInterface(Writer output, ObjectModelInterface interfacez) throws IOException { - + if (!interfacez.hasStereotype(GeneratorUtil.STEREOTYPE_SERVICE)) { return; } - + generateInterfaceHeader(output, interfacez); generateInterfaceOperations(output, interfacez); + + generateInheritedInterfaceOperations(output, interfacez); /*{} //<%=interfacez.getName()%> }*/ } - private String getStringRepresentation(List strings) { - StringBuffer result = new StringBuffer(); - String doubleQuote = "\""; - String comma = ","; - Iterator it = strings.iterator(); - while (it.hasNext()) { - result.append(doubleQuote); - result.append(it.next()); - result.append(doubleQuote); - if (it.hasNext()) { - result.append(comma); - } - } - return result.toString(); - } - private void generateInterfaceHeader(Writer output, ObjectModelClassifier classifier) throws IOException { /*{package <%=classifier.getPackageName()%>; +import java.util.List; +import org.codelutin.topia.TopiaException; + }*/ if (GeneratorUtil.hasDocumentation(classifier)) { /*{ @@ -126,9 +113,13 @@ String extendClass = ""; for (Iterator i=classifier.getInterfaces().iterator(); i.hasNext();) { ObjectModelClassifier parent = (ObjectModelClassifier)i.next(); - extendClass += parent.getQualifiedName(); - extendClass += ", "; + // pas pour les interfaces de DAO + if(!parent.hasStereotype(DAO)){ + extendClass += parent.getQualifiedName(); + extendClass += ", "; + } } + if (classifier instanceof ObjectModelClass) { ObjectModelClass clazz = (ObjectModelClass)classifier; for (Iterator i=clazz.getSuperclasses().iterator(); i.hasNext();) { @@ -141,207 +132,6 @@ } /*{<%=extendClass%>org.codelutin.topia.service.TopiaApplicationService { - -}*/ - } - - @Override - public void generateFromClass(Writer output, ObjectModelClass clazz) throws IOException { - if (!clazz.hasStereotype(GeneratorUtil.STEREOTYPE_SERVICE)) { - return; - } - generateInterfaceHeader(output, clazz); - for (Iterator it = clazz.getAttributes().iterator(); it.hasNext();) { - ObjectModelAttribute attr = (ObjectModelAttribute)it.next(); - ObjectModelAttribute reverse = attr.getReverseAttribute(); - if (!attr.isNavigable() - && !hasUnidirectionalRelationOnAbstractType(reverse, model)) { - continue; - } - if (!Util.isNMultiplicity(attr)) { - if (!attr.hasAssociationClass()) { -/*{ /** -}*/ - if (GeneratorUtil.hasDocumentation(attr)) { -/*{ * <%=attr.getName()%> : <%=attr.getDocumentation()%> -}*/ - } -/*{ * @param <%=Util.toLowerCaseFirstLetter(attr.getName())%> La valeur de l'attribut <%=attr.getName()%> à positionner. - *) - public void set<%=Util.capitalize(attr.getName())%>(<%=attr.getType()%> <%=Util.toLowerCaseFirstLetter(attr.getName())%>); - -}*/ -/*{ /** -}*/ - if (GeneratorUtil.hasDocumentation(attr)) { -/*{ * <%=attr.getName()%> : <%=attr.getDocumentation()%> -}*/ - } -/*{ * @return La valeur de l'attribut <%=attr.getName()%>. - *) - public <%=attr.getType()%> get<%=Util.capitalize(attr.getName())%>(); - -}*/ - } else { - String assocAttrName = GeneratorUtil.getAssocAttrName(attr); - if (log.isTraceEnabled()) { log.trace("assocAttrName: " + assocAttrName); } -/*{ /** - * @param <%=Util.toLowerCaseFirstLetter(attr.getAssociationClass().getName())%> La valeur de l'attribut <%=attr.getAssociationClass().getName()%> à positionner. - *) - public void set<%=Util.capitalize(assocAttrName)%>(<%=attr.getAssociationClass().getQualifiedName()%> <%=Util.toLowerCaseFirstLetter(attr.getAssociationClass().getName())%>); - - /** - * @return La valeur de l'attribut <%=attr.getAssociationClass().getName()%>. - *) - public <%=attr.getAssociationClass().getQualifiedName()%> get<%=Util.capitalize(assocAttrName)%>(); - -}*/ - } - } else { //NMultiplicity - if (!attr.hasAssociationClass()) { //Méthodes remplacées par des add/set sur les classes d'assoc -/*{ /** -}*/ - if (GeneratorUtil.hasDocumentation(attr)) { -/*{ * <%=attr.getName()%> : <%=attr.getDocumentation()%> -}*/ - } -/*{ * @param <%=Util.toLowerCaseFirstLetter(attr.getName())%> L'instance de <%=attr.getName()%> à ajouter. - *) - public void add<%=Util.capitalize(attr.getName())%>(<%=attr.getType()%> <%=Util.toLowerCaseFirstLetter(attr.getName())%>); - - /** -}*/ - if (GeneratorUtil.hasDocumentation(attr)) { -/*{ * <%=attr.getName()%> : <%=attr.getDocumentation()%> -}*/ - } -/*{ * @param <%=Util.toLowerCaseFirstLetter(attr.getName())%> Les instances de <%=attr.getName()%> à ajouter. - *) - public void addAll<%=Util.capitalize(attr.getName())%>(<%=(attr.isOrdered()?"java.util.List":"java.util.Collection")%><<%=attr.getType()%>> <%=Util.toLowerCaseFirstLetter(attr.getName())%>); - - /** -}*/ - if (GeneratorUtil.hasDocumentation(attr)) { -/*{ * <%=attr.getName()%> : <%=attr.getDocumentation()%> -}*/ - } -/*{ * @param <%=Util.toLowerCaseFirstLetter(attr.getName())%> La Collection de <%=attr.getName()%> à positionner. - *) - public void set<%=Util.capitalize(attr.getName())%>(<%=(attr.isOrdered()?"java.util.List":"java.util.Collection")%><<%=attr.getType()%>> <%=Util.toLowerCaseFirstLetter(attr.getName())%>); - - /** -}*/ - if (GeneratorUtil.hasDocumentation(attr)) { -/*{ * <%=attr.getName()%> : <%=attr.getDocumentation()%> -}*/ - } -/*{ * @param <%=Util.toLowerCaseFirstLetter(attr.getName())%> L'instance de <%=attr.getName()%> à retirer. - *) - public void remove<%=Util.capitalize(attr.getName())%>(<%=attr.getType()%> <%=Util.toLowerCaseFirstLetter(attr.getName())%>); - - /** -}*/ - if (GeneratorUtil.hasDocumentation(attr)) { -/*{ * <%=attr.getName()%> : <%=attr.getDocumentation()%> -}*/ - } -/*{ * Vide la Collection de <%=attr.getName()%>. - *) - public void clear<%=Util.capitalize(attr.getName())%>(); - -}*/ - } else { - String assocAttrName = GeneratorUtil.getAssocAttrName(attr); - if (log.isTraceEnabled()) { log.trace("assocAttrName: " + assocAttrName); } -/*{ /** - * @param <%=Util.toLowerCaseFirstLetter(attr.getAssociationClass().getName())%> L'instance de <%=attr.getAssociationClass().getName()%> à ajouter. - *) - public void add<%=Util.capitalize(assocAttrName)%>(<%=attr.getAssociationClass().getQualifiedName()%> <%=Util.toLowerCaseFirstLetter(attr.getAssociationClass().getName())%>); - - /** - * @param <%=Util.toLowerCaseFirstLetter(attr.getAssociationClass().getName())%> Les instances de <%=attr.getAssociationClass().getName()%> à ajouter. - *) - public void addAll<%=Util.capitalize(assocAttrName)%>(<%=(attr.isOrdered()?"java.util.List":"java.util.Collection")%><<%=attr.getAssociationClass().getQualifiedName()%>> <%=Util.toLowerCaseFirstLetter(attr.getAssociationClass().getName())%>); - - /** - * @param <%=Util.toLowerCaseFirstLetter(attr.getAssociationClass().getName())%> La Collection de <%=attr.getAssociationClass().getName()%> à positionner. - *) - public void set<%=Util.capitalize(assocAttrName)%>(<%=(attr.isOrdered()?"java.util.List":"java.util.Collection")%><<%=attr.getAssociationClass().getQualifiedName()%>> <%=Util.toLowerCaseFirstLetter(attr.getAssociationClass().getName())%>); - - /** - * @param <%=Util.toLowerCaseFirstLetter(attr.getAssociationClass().getName())%> L'instance de <%=attr.getAssociationClass().getName()%> à retirer. - *) - public void remove<%=Util.capitalize(assocAttrName)%>(<%=attr.getAssociationClass().getQualifiedName()%> <%=Util.toLowerCaseFirstLetter(attr.getAssociationClass().getName())%>); - - /** - * Vide la Collection de <%=attr.getAssociationClass().getName()%>. - *) - public void clear<%=Util.capitalize(assocAttrName)%>(); - -}*/ - } - - if (!attr.hasAssociationClass()) { -/*{ /** -}*/ - if (GeneratorUtil.hasDocumentation(attr)) { -/*{ * <%=attr.getName()%> : <%=attr.getDocumentation()%> -}*/ - } -/*{ * @return La Liste de <%=attr.getName()%>. - *) - public <%=(attr.isOrdered()?"java.util.List":"java.util.Collection")%><<%=attr.getType()%>> get<%=Util.capitalize(attr.getName())%>(); - - /** - * @return Le nombre d'éléments de la collection <%=attr.getName()%>. - *) - public int size<%=Util.capitalize(attr.getName())%>(); - -}*/ - } else { - String assocAttrName = GeneratorUtil.getAssocAttrName(attr); - if (log.isTraceEnabled()) { log.trace("assocAttrName: " + assocAttrName); } -/*{ /** - * @return La liste des attributs <%=attr.getAssociationClass().getName()%>. - *) - public <%=(attr.isOrdered()?"java.util.List":"java.util.Collection")%><<%=attr.getAssociationClass().getQualifiedName()%>> get<%=Util.capitalize(assocAttrName)%>(); - - /** - * @return L'attribut <%=attr.getAssociationClass().getName()%> associé à la valeur value de l'attribut <%=attr.getName()%>. - *) - public <%=attr.getAssociationClass().getQualifiedName()%> get<%=Util.capitalize(assocAttrName)%>(<%=attr.getType()%> value); - - /** - * @return Le nombre d'éléments de la collection <%=attr.getName()%>. - *) - public int size<%=Util.capitalize(assocAttrName)%>(); - -}*/ - } - } - } - - //Méthodes d'accès aux attributs d'une classe d'associations - if (clazz instanceof ObjectModelAssociationClass) { - ObjectModelAssociationClass assoc = (ObjectModelAssociationClass)clazz; - for (Iterator i = assoc.getParticipantsAttributes().iterator(); i.hasNext(); ) { - ObjectModelAttribute attr = (ObjectModelAttribute) i.next(); - if (attr != null) { - String type = attr.getType(); - String name = attr.getName(); - generateAssociationAccessors(output, name, type); - if (attr.getReverseAttribute() == null) { - type = ((ObjectModelClassifier)attr.getDeclaringElement()).getQualifiedName(); - name = attr.getDeclaringElement().getName(); - generateAssociationAccessors(output, name, type); - } - } - } - } - - generateInterfaceOperations(output, clazz); - -/*{} //<%=clazz.getName()%> }*/ } @@ -381,19 +171,120 @@ }*/ } } - - private void generateAssociationAccessors(Writer output, String name, String type) throws IOException { -/*{ /** - * @param value La valeur de l'attribut <%=name%> à positionner. + + private void generateInheritedInterfaceOperations(Writer output, ObjectModelClassifier classifier) throws IOException { + + for (Iterator i=classifier.getInterfaces().iterator(); i.hasNext();) { + ObjectModelClassifier parent = (ObjectModelClassifier)i.next(); + // pour tous les DAOInterface + if(parent.hasStereotype(DAO)){ + + // récupérer la classe de l'object model correspondant à la DAO + String entityClassName = null; + entityClassName = parent.getQualifiedName().replace("DAO", ""); + if(getModel().hasClass(entityClassName)){ + ObjectModelClass clazz = getModel().getClass(entityClassName); + + if (!clazz.hasStereotype(GeneratorUtil.STEREOTYPE_ENTITY)) { + return; + } +/*{ + /** + * Supprime l'entite <%=clazz.getName()%> passee en parametre + * @param entity l'entite a supprimer + *) + public abstract void delete<%=clazz.getName()%>(<%=clazz.getQualifiedName()%> entity) throws TopiaException; +}*/ + for (Iterator it = clazz.getAttributes().iterator(); it.hasNext();) { + ObjectModelAttribute attr = (ObjectModelAttribute)it.next(); + if (!attr.isNavigable()) { + continue; + } + + if (!Util.isNMultiplicity(attr)) { + generateNoNMultiplicity(output, attr, clazz, false); + } else { + generateNMultiplicity(output, attr, clazz, false); + } + } + + if (clazz instanceof ObjectModelAssociationClass) { + ObjectModelAssociationClass assocClass = (ObjectModelAssociationClass)clazz; + Iterator it = assocClass.getParticipantsAttributes().iterator(); + while (it.hasNext()) { + ObjectModelAttribute attr = (ObjectModelAttribute)it.next(); + if (attr != null) { + if (!Util.isNMultiplicity(attr)) { + generateNoNMultiplicity(output, attr, clazz, true); + } else { + generateNMultiplicity(output, attr, clazz, true); + } + } + } + } + } + } + } + } + + protected void generateNoNMultiplicity(Writer output, ObjectModelAttribute attr, ObjectModelClass clazz, boolean isAssoc) throws IOException { + String propertyName = attr.getName(); + if (!isAssoc && attr.hasAssociationClass()) { + propertyName = GeneratorUtil.toLowerCaseFirstLetter(attr.getAssociationClass().getName()) + "." + propertyName; + } +/*{ + /** + * Retourne le premier element trouve ayant comme valeur pour l'attribut + * <%=attr.getName()%> le parametre + * @param v la valeur que doit avoir <%=attr.getName()%> + * @return un element ou null *) - public void set<%=Util.capitalize(name)%>(<%=type%> value); - + public abstract <%=clazz.getQualifiedName()%> find<%=clazz.getName()%>By<%=GeneratorUtil.capitalize(attr.getName())%>(<%=attr.getType()%> v) throws TopiaException; /** - * @return La valeur de l'attribut <%=name%>. + * Retourne les éléments ayant comme valeur pour l'attribut + * <%=attr.getName()%> le paramètre + * @param v la valeur que doit avoir <%=attr.getName()%> + * @return une liste *) - public <%=type%> get<%=Util.capitalize(name)%>(); - + public abstract List<<%=clazz.getQualifiedName()%>> findAll<%=clazz.getName()%>By<%=GeneratorUtil.capitalize(attr.getName())%>(<%=attr.getType()%> v) throws TopiaException; }*/ - } + if (attr.hasAssociationClass()) { +/*{ + /** + * Retourne le premier element trouve ayant comme valeur pour l'attribut + * <%=GeneratorUtil.toLowerCaseFirstLetter(attr.getAssociationClass().getName())%> le parametre + * @param value la valeur que doit avoir <%=GeneratorUtil.toLowerCaseFirstLetter(attr.getAssociationClass().getName())%> + * @return un element ou null + *) + public abstract <%=clazz.getQualifiedName()%> find<%=clazz.getName()%>By<%=GeneratorUtil.capitalize(attr.getAssociationClass().getName())%>(<%=attr.getAssociationClass().getQualifiedName()%> value) throws TopiaException; + /** + * Retourne les éléments ayant comme valeur pour l'attribut + * <%=GeneratorUtil.toLowerCaseFirstLetter(attr.getAssociationClass().getName())%> le paramètre + * @param value la valeur que doit avoir <%=GeneratorUtil.toLowerCaseFirstLetter(attr.getAssociationClass().getName())%> + * @return une liste + *) + public abstract List<<%=clazz.getQualifiedName()%>> findAll<%=clazz.getName()%>By<%=GeneratorUtil.capitalize(attr.getAssociationClass().getName())%>(<%=attr.getAssociationClass().getQualifiedName()%> value) throws TopiaException; +}*/ + } + } + + protected void generateNMultiplicity(Writer output, ObjectModelAttribute attr, ObjectModelClass clazz, boolean isAssoc) throws IOException { +/*{ + /** + * Retourne le premier element trouve dont l'attribut + * <%=attr.getName()%> contient le parametre + * @param v la valeur que doit contenir <%=attr.getName()%> + * @return un element ou null + *) + public abstract <%=clazz.getQualifiedName()%> find<%=clazz.getName()%>Contains<%=GeneratorUtil.capitalize(attr.getName())%>(<%=attr.getType()%> ... v) throws TopiaException; + /** + * Retourne les elements trouve dont l'attribut + * <%=attr.getName()%> contient le parametre + * @param v la valeur que doit contenir <%=attr.getName()%> + * @return une liste + *) + public abstract List<<%=clazz.getQualifiedName()%>> findAll<%=clazz.getName()%>Contains<%=GeneratorUtil.capitalize(attr.getName())%>(<%=attr.getType()%> ... v) throws TopiaException; +}*/ + } } //ServiceInterfaceGenerator