Index: topia2/src/java/org/codelutin/topia/generator/EntityInterfaceGenerator.java diff -u topia2/src/java/org/codelutin/topia/generator/EntityInterfaceGenerator.java:1.9 topia2/src/java/org/codelutin/topia/generator/EntityInterfaceGenerator.java:1.10 --- topia2/src/java/org/codelutin/topia/generator/EntityInterfaceGenerator.java:1.9 Thu Feb 23 14:05:47 2006 +++ topia2/src/java/org/codelutin/topia/generator/EntityInterfaceGenerator.java Fri Mar 3 10:46:36 2006 @@ -24,23 +24,23 @@ * Created: 12 déc. 2005 * * @author Arnaud Thimel -* @version $Revision: 1.9 $ +* @version $Revision: 1.10 $ * -* Mise a jour: $Date: 2006/02/23 14:05:47 $ -* par : $Author: bpoussin $ +* Mise a jour: $Date: 2006/03/03 10:46:36 $ +* par : $Author: thimel $ */ package org.codelutin.topia.generator; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import java.io.File; import java.io.IOException; import java.io.Writer; import java.util.Collection; import java.util.Iterator; +import java.util.Set; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.codelutin.generator.Generator; import org.codelutin.generator.ObjectModelGenerator; import org.codelutin.generator.Util; @@ -48,6 +48,7 @@ import org.codelutin.generator.models.object.ObjectModelAttribute; import org.codelutin.generator.models.object.ObjectModelClass; import org.codelutin.generator.models.object.ObjectModelClassifier; +import org.codelutin.generator.models.object.ObjectModelInterface; import org.codelutin.generator.models.object.ObjectModelOperation; import org.codelutin.generator.models.object.ObjectModelParameter; @@ -69,38 +70,67 @@ } @Override - public void generateFromClass(Writer output, ObjectModelClass clazz) throws IOException { - if (!clazz.hasStereotype(GeneratorUtil.STEREOTYPE_ENTITY)) { + 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_ENTITY)) { return; } -/*{package <%=clazz.getPackageName()%>; +// System.err.println("!!!!!!!! Generating interface for " + interfacez.getQualifiedName() + " in " + getFilenameForClassifier()); + generateInterfaceHeader(output, interfacez); + + generateInterfaceOperations(output, interfacez); +/*{} //<%=interfacez.getName()%> }*/ - if (GeneratorUtil.hasDocumentation(clazz)) { + } + + private void generateInterfaceHeader(Writer output, ObjectModelClassifier classifier) throws IOException { +/*{package <%=classifier.getPackageName()%>; + +}*/ + if (GeneratorUtil.hasDocumentation(classifier)) { /*{ /** - * <%=clazz.getDocumentation()%> + * <%=classifier.getDocumentation()%> *) }*/ } -/*{public interface <%=clazz.getName()%> extends }*/ +/*{public interface <%=classifier.getName()%> extends }*/ String extendClass = ""; - for (Iterator i=clazz.getInterfaces().iterator(); i.hasNext();) { + for (Iterator i=classifier.getInterfaces().iterator(); i.hasNext();) { ObjectModelClassifier parent = (ObjectModelClassifier)i.next(); extendClass += parent.getQualifiedName(); extendClass += ", "; } - for (Iterator i=clazz.getSuperclasses().iterator(); i.hasNext();) { - ObjectModelClassifier parent = (ObjectModelClassifier)i.next(); - if (parent.hasStereotype(GeneratorUtil.STEREOTYPE_ENTITY)) { - extendClass += parent.getQualifiedName(); + if (classifier instanceof ObjectModelClass) { + ObjectModelClass clazz = (ObjectModelClass)classifier; + for (Iterator i=clazz.getSuperclasses().iterator(); i.hasNext();) { + ObjectModelClassifier parent = (ObjectModelClassifier)i.next(); + if (parent.hasStereotype(GeneratorUtil.STEREOTYPE_ENTITY)) { + extendClass += parent.getQualifiedName(); + } + extendClass += ", "; } - extendClass += ", "; } /*{<%=extendClass%>org.codelutin.topia.persistence.TopiaEntity { }*/ + } + + @Override + public void generateFromClass(Writer output, ObjectModelClass clazz) throws IOException { + if (!clazz.hasStereotype(GeneratorUtil.STEREOTYPE_ENTITY)) { + return; + } + generateInterfaceHeader(output, clazz); for (Iterator it = clazz.getAttributes().iterator(); it.hasNext();) { ObjectModelAttribute attr = (ObjectModelAttribute)it.next(); if (!attr.isNavigable()) { @@ -287,7 +317,14 @@ } } - for (Iterator it = clazz.getOperations().iterator(); it.hasNext();) { + generateInterfaceOperations(output, clazz); + +/*{} //<%=clazz.getName()%> +}*/ + } + + private void generateInterfaceOperations(Writer output, ObjectModelClassifier classifier) throws IOException { + for (Iterator it = classifier.getOperations().iterator(); it.hasNext();) { ObjectModelOperation op = (ObjectModelOperation)it.next(); /*{ /** }*/ @@ -309,13 +346,18 @@ /*{<%=vir%><%=param.getType()%> <%=param.getName()%>}*/ vir = ", "; } -/*{); +/*{)}*/ + Set exceptions = (Set)op.getExceptions(); + vir = " throws "; + for (String exception : exceptions) { + if(log.isTraceEnabled()) {log.trace("exception" + exception + " vir" + vir);} +/*{<%=vir%><%=exception%>}*/ + vir = ", "; + } +/*{; }*/ } - -/*{} //<%=clazz.getName()%> -}*/ } private void generateAssociationAccessors(Writer output, String name, String type) throws IOException { Index: topia2/src/java/org/codelutin/topia/generator/DAOHelperGenerator.java diff -u topia2/src/java/org/codelutin/topia/generator/DAOHelperGenerator.java:1.5 topia2/src/java/org/codelutin/topia/generator/DAOHelperGenerator.java:1.6 --- topia2/src/java/org/codelutin/topia/generator/DAOHelperGenerator.java:1.5 Mon Jan 23 13:51:52 2006 +++ topia2/src/java/org/codelutin/topia/generator/DAOHelperGenerator.java Fri Mar 3 10:46:36 2006 @@ -25,9 +25,9 @@ * * @author Arnaud Thimel * - * @version $Revision: 1.5 $ + * @version $Revision: 1.6 $ * - * Mise a jour: $Date: 2006/01/23 13:51:52 $ par : $Author: bpoussin $ + * Mise a jour: $Date: 2006/03/03 10:46:36 $ par : $Author: thimel $ */ package org.codelutin.topia.generator; @@ -40,6 +40,7 @@ import org.codelutin.generator.Generator; import org.codelutin.generator.ObjectModelGenerator; import org.codelutin.generator.models.object.ObjectModel; +import org.codelutin.generator.models.object.ObjectModelClass; import org.codelutin.generator.models.object.ObjectModelClassifier; /** @@ -85,10 +86,10 @@ /*{ public static final Class [] entitiesClasses = new Class []{ }*/ - for (Iterator i=model.getClassifiers().iterator(); i.hasNext();) { - ObjectModelClassifier classifier = (ObjectModelClassifier)i.next(); - if(classifier.hasStereotype(GeneratorUtil.STEREOTYPE_ENTITY)){ -/*{ <%=GeneratorUtil.getDOType(classifier, model)%>.class, + for (Iterator i=model.getClasses().iterator(); i.hasNext();) { + ObjectModelClass clazz = (ObjectModelClass)i.next(); + if (!clazz.isAbstract() && clazz.hasStereotype(GeneratorUtil.STEREOTYPE_ENTITY)){ +/*{ <%=GeneratorUtil.getDOType(clazz, model)%>.class, }*/ } } @@ -99,13 +100,13 @@ protected <%=model.getName()%>DAOHelper() { } }*/ - for (Iterator i=model.getClassifiers().iterator(); i.hasNext();) { - ObjectModelClassifier classifier = (ObjectModelClassifier)i.next(); - if(classifier.hasStereotype(GeneratorUtil.STEREOTYPE_ENTITY)){ + for (Iterator i=model.getClasses().iterator(); i.hasNext();) { + ObjectModelClass clazz = (ObjectModelClass)i.next(); + if(!clazz.isAbstract() && clazz.hasStereotype(GeneratorUtil.STEREOTYPE_ENTITY)){ /*{ - static public <%=classifier.getQualifiedName()%>DAO get<%=classifier.getName()%>DAO(TopiaContext context) throws TopiaException { + static public <%=clazz.getQualifiedName()%>DAO get<%=clazz.getName()%>DAO(TopiaContext context) throws TopiaException { TopiaContextImplementor ci = (TopiaContextImplementor)context; - <%=classifier.getQualifiedName()%>DAO result = (<%=classifier.getQualifiedName()%>DAO)ci.getDAO(<%=classifier.getQualifiedName()%>.class); + <%=clazz.getQualifiedName()%>DAO result = (<%=clazz.getQualifiedName()%>DAO)ci.getDAO(<%=clazz.getQualifiedName()%>.class); return result; } }*/ Index: topia2/src/java/org/codelutin/topia/generator/EntityImplGenerator.java diff -u topia2/src/java/org/codelutin/topia/generator/EntityImplGenerator.java:1.2 topia2/src/java/org/codelutin/topia/generator/EntityImplGenerator.java:1.3 --- topia2/src/java/org/codelutin/topia/generator/EntityImplGenerator.java:1.2 Fri Feb 10 14:01:25 2006 +++ topia2/src/java/org/codelutin/topia/generator/EntityImplGenerator.java Fri Mar 3 10:46:36 2006 @@ -24,10 +24,10 @@ * Created: 12 déc. 2005 * * @author Arnaud Thimel -* @version $Revision: 1.2 $ +* @version $Revision: 1.3 $ * -* Mise a jour: $Date: 2006/02/10 14:01:25 $ -* par : $Author: bpoussin $ +* Mise a jour: $Date: 2006/03/03 10:46:36 $ +* par : $Author: thimel $ */ package org.codelutin.topia.generator; @@ -35,11 +35,12 @@ import java.io.File; import java.io.IOException; import java.io.Writer; +import java.util.Iterator; import org.codelutin.generator.Generator; import org.codelutin.generator.ObjectModelGenerator; import org.codelutin.generator.models.object.ObjectModelClass; -import org.codelutin.topia.generator.GeneratorUtil; +import org.codelutin.generator.models.object.ObjectModelOperation; public class EntityImplGenerator extends ObjectModelGenerator { @@ -57,6 +58,32 @@ if (!clazz.hasStereotype(GeneratorUtil.STEREOTYPE_ENTITY) || clazz.getOperations().size() > 0) { return; } + //De même, on ne génère pas le impl si il y a des opérations venant des + // superclasses non implémentées + for (Iterator otherOps = clazz.getAllOtherOperations(true).iterator(); otherOps.hasNext(); ) { + ObjectModelOperation otherOp = (ObjectModelOperation)otherOps.next(); + if (otherOp.isAbstract()) { + return; + } + } + + boolean isAbstract = clazz.isAbstract(); + //Une classe peut être abstraite si elle a des méthodes définies dans + // ses superinterface et non implantées dans ses superclasses + if (!isAbstract) { + for (Iterator operations = clazz.getAllInterfaceOperations(true).iterator(); (!isAbstract) && operations.hasNext(); ) { + ObjectModelOperation op = (ObjectModelOperation)operations.next(); + boolean implementationFound = false; + for (Iterator superClasses = clazz.getSuperclasses().iterator(); (!implementationFound) && superClasses.hasNext(); ) { + ObjectModelClass superClazz = (ObjectModelClass)superClasses.next(); + for (Iterator matchingOps = superClazz.getOperations(op.getName()).iterator(); (!implementationFound) && matchingOps.hasNext(); ) { + ObjectModelOperation matchingOp = (ObjectModelOperation)matchingOps.next(); + implementationFound = (op.equals(matchingOp) && !matchingOp.isAbstract()); + } + } + isAbstract = !implementationFound; + } + } /*{package <%=clazz.getPackageName()%>; import java.io.Serializable; @@ -64,7 +91,7 @@ /** * Implantation des operations pour l'entité <%=GeneratorUtil.capitalize(clazz.getName())%>. *) -public <%=(clazz.isAbstract()?"abstract":"")%> class <%=clazz.getName()%>Impl extends <%=clazz.getQualifiedName()%>Abstract implements Serializable, <%=clazz.getQualifiedName()%> { +public <%=(isAbstract?"abstract ":" ")%>class <%=clazz.getName()%>Impl extends <%=clazz.getQualifiedName()%>Abstract implements Serializable, <%=clazz.getQualifiedName()%> { private static final long serialVersionUID = 1L; Index: topia2/src/java/org/codelutin/topia/generator/EntityAbstractGenerator.java diff -u topia2/src/java/org/codelutin/topia/generator/EntityAbstractGenerator.java:1.14 topia2/src/java/org/codelutin/topia/generator/EntityAbstractGenerator.java:1.15 --- topia2/src/java/org/codelutin/topia/generator/EntityAbstractGenerator.java:1.14 Tue Feb 28 17:20:07 2006 +++ topia2/src/java/org/codelutin/topia/generator/EntityAbstractGenerator.java Fri Mar 3 10:46:36 2006 @@ -24,22 +24,21 @@ * Created: 12 déc. 2005 * * @author Arnaud Thimel -* @version $Revision: 1.14 $ +* @version $Revision: 1.15 $ * -* Mise a jour: $Date: 2006/02/28 17:20:07 $ +* Mise a jour: $Date: 2006/03/03 10:46:36 $ * par : $Author: thimel $ */ package org.codelutin.topia.generator; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import java.io.File; import java.io.IOException; import java.io.Writer; import java.util.Iterator; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.codelutin.generator.Generator; import org.codelutin.generator.ObjectModelGenerator; import org.codelutin.generator.Util; @@ -47,6 +46,7 @@ import org.codelutin.generator.models.object.ObjectModelAttribute; import org.codelutin.generator.models.object.ObjectModelClass; import org.codelutin.generator.models.object.ObjectModelClassifier; +import org.codelutin.generator.models.object.ObjectModelOperation; public class EntityAbstractGenerator extends ObjectModelGenerator { @@ -84,8 +84,22 @@ for (Iterator i=clazz.getSuperclasses().iterator(); i.hasNext();) { ObjectModelClassifier parent = (ObjectModelClassifier)i.next(); extendClass += parent.getQualifiedName(); + //Si une des classes parentes définies des méthodes abstraites, son + // impl ne sera pas créé + boolean abstractParent = false; + if (parent instanceof ObjectModelClass) { + abstractParent = ((ObjectModelClass)parent).isAbstract(); + } + for (Iterator superOps = parent.getOperations().iterator(); (!abstractParent) && superOps.hasNext(); ) { + ObjectModelOperation superOp = (ObjectModelOperation)superOps.next(); + abstractParent = superOp.isAbstract(); + } if (parent.hasStereotype(GeneratorUtil.STEREOTYPE_ENTITY)) { - extendClass += "Impl"; + if (abstractParent) { + extendClass += "Abstract"; + } else { + extendClass += "Impl"; + } } if (i.hasNext()) { extendClass += ", ";