Author: tchemit Date: 2009-12-14 12:36:47 +0100 (Mon, 14 Dec 2009) New Revision: 1702 Added: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOImplTransformer.java branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDTOTransformer.java branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityImplTransformer.java Modified: branches/from2.2.2-eugene2-beta/topia-persistence/pom.xml branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOImplGenerator.java branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/DTOGenerator.java branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityAbstractGenerator.java branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDTOGenerator.java branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityImplGenerator.java 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/TopiaJavaValidator.java branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaMetaGenerator.java Log: - add deprecated on old generators - add new transformers - remove unecessary default constructors - reformat code - use Tranformers in TopiaMetaGenerator Modified: branches/from2.2.2-eugene2-beta/topia-persistence/pom.xml =================================================================== --- branches/from2.2.2-eugene2-beta/topia-persistence/pom.xml 2009-12-14 11:31:08 UTC (rev 1701) +++ branches/from2.2.2-eugene2-beta/topia-persistence/pom.xml 2009-12-14 11:36:47 UTC (rev 1702) @@ -163,15 +163,8 @@ <templates>org.nuiton.topia.generator.TopiaMetaGenerator, org.nuiton.topia.generator.ObjectModelTransformerToJavaInterface, org.nuiton.topia.generator.ObjectModelTransformerToJavaBean, - org.nuiton.topia.generator.DAOHelperTransformer, - org.nuiton.topia.generator.DAOTransformer, - org.nuiton.topia.generator.DAOAbstractTransformer + org.nuiton.topia.generator.EntityDTOTransformer </templates> - <excludeTemplates> - <template>org.nuiton.topia.generator.DAOHelperGenerator</template> - <template>org.nuiton.topia.generator.DAOGenerator</template> - <template>org.nuiton.topia.generator.DAOAbstractGenerator</template> - </excludeTemplates> <defaultPackage>org.nuiton.topia</defaultPackage> <extraClassPathDirectory>target/classes</extraClassPathDirectory> </configuration> Modified: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOImplGenerator.java =================================================================== --- branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOImplGenerator.java 2009-12-14 11:31:08 UTC (rev 1701) +++ branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOImplGenerator.java 2009-12-14 11:36:47 UTC (rev 1702) @@ -39,7 +39,12 @@ import org.nuiton.eugene.ObjectModelGenerator; import org.nuiton.eugene.models.object.ObjectModelClass; import org.nuiton.eugene.models.object.ObjectModelOperation; - +/** + * + * @deprecated since 2.3.0, prefer use the corresponding {@link org.nuiton.eugene.Transformer} : + * {@link DAOImplTransformer}. + */ +@Deprecated public class DAOImplGenerator extends ObjectModelGenerator { @Override Added: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOImplTransformer.java =================================================================== --- branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOImplTransformer.java (rev 0) +++ branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOImplTransformer.java 2009-12-14 11:36:47 UTC (rev 1702) @@ -0,0 +1,49 @@ +package org.nuiton.topia.generator; + +import org.nuiton.eugene.java.ObjectModelTransformerToJava; +import org.nuiton.eugene.models.object.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelOperation; + +/** + * 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 DAOImplTransformer extends ObjectModelTransformerToJava { + + @Override + public void transformFromClass(ObjectModelClass clazz) { + if (!clazz.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_ENTITY) || hasDAOOperations(clazz)) { + return; + } + String clazzName = clazz.getName(); + String clazzFQN = clazz.getQualifiedName(); + ObjectModelClass result = createClass(clazzName + "DAOImpl<E extends " + clazzName + ">", clazz.getPackageName()); + setDocumentation(result, "/**\n" + + " Implantation du DAO pour l'entité " + clazzName + ".\n" + + " * L'utilisateur peut remplacer cette classe par la sienne en la mettant \n" + + " * simplement dans ces sources. Cette classe générée sera alors simplement\n" + + " * écrasée\n" + + " */"); + setSuperClass(result, clazzFQN + "DAOAbstract<E>"); + } + + /** + * Detect if the class has DAO operations identified with <<dao>> stereotype. + * + * @param clazz The ObjectModelClass with operations (Corresponding to the Entity) + * @return true if the class has some dao operations, false if not + */ + public static boolean hasDAOOperations(ObjectModelClass clazz) { + for (ObjectModelOperation op : clazz.getOperations()) { + if (op.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_DAO)) { + return true; + } + } + return false; + } +} \ No newline at end of file Property changes on: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOImplTransformer.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL Modified: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/DTOGenerator.java =================================================================== --- branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/DTOGenerator.java 2009-12-14 11:31:08 UTC (rev 1701) +++ branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/DTOGenerator.java 2009-12-14 11:36:47 UTC (rev 1702) @@ -60,13 +60,8 @@ /** * Logger for this class */ - private static final Log log = LogFactory - .getLog(DTOGenerator.class); + private static final Log log = LogFactory.getLog(DTOGenerator.class); - public DTOGenerator() { - super(); - } - @Override public String getFilenameForClass(ObjectModelClass clazz) { return clazz.getQualifiedName().replace('.', File.separatorChar) + "DTO.java"; @@ -96,7 +91,7 @@ import java.util.Collection; /** - * DTO implantation for <%=GeneratorUtil.capitalize(clazzName)%> entity. + * DTO implantation for <%=StringUtils.capitalize(clazzName)%> entity. *) public class <%=clazzName%>DTO}*/ @@ -541,4 +536,4 @@ }*/ } -} //EntityDTOGenerator +} //DTOGenerator Modified: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityAbstractGenerator.java =================================================================== --- branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityAbstractGenerator.java 2009-12-14 11:31:08 UTC (rev 1701) +++ branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityAbstractGenerator.java 2009-12-14 11:36:47 UTC (rev 1702) @@ -61,8 +61,7 @@ public class EntityAbstractGenerator extends ObjectModelGenerator { /** Logger for this class */ - private static final Log log = LogFactory - .getLog(EntityAbstractGenerator.class); + private static final Log log = LogFactory.getLog(EntityAbstractGenerator.class); // TODO THIMEL : Je pense qu'il faudrait que l'EntityInterfaceGenerator // hérite de ce générateur, avec generateBody qui renvoie false, et que dans Modified: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDTOGenerator.java =================================================================== --- branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDTOGenerator.java 2009-12-14 11:31:08 UTC (rev 1701) +++ branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDTOGenerator.java 2009-12-14 11:36:47 UTC (rev 1702) @@ -55,19 +55,18 @@ * Generateur d'entites abstraites. Il s'agit de l'implatation par defaut d'une * entite. Les classes generees sont surchargees par un XXXImpl lorsque l'entite * n'est pas abstraite. La surcharge peut etre ecrite par l'utilisateur. + * + * @deprecated since 2.3.0, prefer use the corresponding {@link org.nuiton.eugene.Transformer} : + * {@link EntityDTOTransformer}. */ +@Deprecated public class EntityDTOGenerator extends ObjectModelGenerator { /** * Logger for this class */ - private static final Log log = LogFactory - .getLog(EntityDTOGenerator.class); + private static final Log log = LogFactory.getLog(EntityDTOGenerator.class); - public EntityDTOGenerator() { - super(); - } - @Override public String getFilenameForClass(ObjectModelClass clazz) { return clazz.getQualifiedName().replace('.', File.separatorChar) + "DTO.java"; Added: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDTOTransformer.java =================================================================== --- branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDTOTransformer.java (rev 0) +++ branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDTOTransformer.java 2009-12-14 11:36:47 UTC (rev 1702) @@ -0,0 +1,296 @@ +package org.nuiton.topia.generator; + +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.nuiton.eugene.GeneratorUtil; +import org.nuiton.eugene.java.ObjectModelTransformerToJava; +import org.nuiton.eugene.models.object.*; +import static org.nuiton.topia.generator.TopiaGeneratorUtil.hasUnidirectionalRelationOnAbstractType; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.io.Serializable; + + +/*{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 EntityDTOTransformer extends ObjectModelTransformerToJava { + + public boolean isEntity(String type) { + ObjectModelClassifier clazz = model.getClassifier(type); + return clazz != null && clazz.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_ENTITY); + } + + @Override + public void transformFromClass(ObjectModelClass clazz) { + if (!clazz.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_ENTITY)) { + return; + } + String clazzName = clazz.getName(); + ObjectModelClass result; + result = createClass(clazzName + "DTO", clazz.getPackageName()); + addImport(result, ToStringBuilder.class); + addImport(result, PropertyChangeListener.class); + + setDocumentation(result, "Implantation DTO pour l'entité " + StringUtils.capitalize(clazzName) + "."); + String extendClass = ""; + for (ObjectModelClass parent : clazz.getSuperclasses()) { + extendClass = parent.getQualifiedName() + "DTO"; + // no multi-inheritance in java + break; + } + if (extendClass.length() > 0) { + setSuperClass(result, extendClass); + } + addInterface(result, Serializable.class); + + String svUID = TopiaGeneratorUtil.findTagValue("dto-serialVersionUID", clazz, model); + if (svUID != null) { + addAttribute(result, "serialVersionUID", "long", svUID, ObjectModelModifier.FINAL, ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); + } + + ObjectModelAttribute attr2; + for (ObjectModelAttribute attr : clazz.getAttributes()) { + ObjectModelAttribute reverse = attr.getReverseAttribute(); + + // pour les asso quoi qu'il arrive il faut les lier des 2 cotes + // pour pouvoir supprimer en cascade l'asso lors de la suppression + // d'un des cotes + if (!(attr.isNavigable() + || hasUnidirectionalRelationOnAbstractType(reverse, model) + || attr.hasAssociationClass())) { + continue; + } + +//FIXME : make annotation possible +// if (attr.hasTagValue(TAG_ANNOTATION)) { +// String annotation = attr.getTagValue(TAG_ANNOTATION); +//{ <%=annotation%> +//}*/ +// } + + String attrVisibility = attr.getVisibility(); + ObjectModelModifier modifier = ObjectModelModifier.toValue(attrVisibility); + if (!attr.hasAssociationClass()) { + String attrType = attr.getType(); + String attrName = attr.getName(); + if (isEntity(attrType)) { + attrType += "DTO"; + } + if (!GeneratorUtil.isNMultiplicity(attr)) { + attr2 = addAttribute(result, attrName, attrType, null, modifier); + } else { + attr2 = addAttribute(result, attrName, attrType + "[]", null, modifier); + } + } else { + String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(attr); + String assocClassFQN = attr.getAssociationClass().getQualifiedName(); + if (!GeneratorUtil.isNMultiplicity(attr)) { + attr2 = addAttribute(result, GeneratorUtil.toLowerCaseFirstLetter(assocAttrName), assocClassFQN + "DTO", null, modifier); + } else { + attr2 = addAttribute(result, GeneratorUtil.toLowerCaseFirstLetter(assocAttrName), assocClassFQN + "DTO[]", null, modifier); + } + } + if (attr2 != null) { + if (TopiaGeneratorUtil.hasDocumentation(attr)) { + setDocumentation(attr2, attr.getDocumentation()); + } + } + } + + //Déclaration des attributs d'une classe d'associations + if (clazz instanceof ObjectModelAssociationClass) { + ObjectModelAssociationClass assoc = (ObjectModelAssociationClass) clazz; + for (ObjectModelAttribute attr : assoc.getParticipantsAttributes()) { + if (attr != null) { + String attrVisibility = attr.getVisibility(); + ObjectModelModifier modifier = ObjectModelModifier.toValue(attrVisibility); + String attrType = attr.getType(); + String attrName = attr.getName(); + if (isEntity(attrType)) { + attrType += "DTO"; + } + attr2 = addAttribute(result, GeneratorUtil.toLowerCaseFirstLetter(attrName), attrType, null, modifier); + } + } + } + + addAttribute(result,"p", PropertyChangeSupport.class,"new PropertyChangeSupport(this)",ObjectModelModifier.PROTECTED,ObjectModelModifier.FINAL); + + ObjectModelOperation op; + op = addOperation(result, "addPropertyChangeListener", "void"); + addParameter(op,PropertyChangeListener.class,"listener"); + setOperationBody(op,"" +/*{ + p.addPropertyChangeListener(listener); + }*/ + ); + + op = addOperation(result, "addPropertyChangeListener", "void"); + addParameter(op, String.class, "propertyName"); + addParameter(op, PropertyChangeListener.class, "listener"); + setOperationBody(op, "" +/*{ + p.addPropertyChangeListener(propertyName, listener); + }*/ + ); + + op = addOperation(result, "removePropertyChangeListener", "void"); + addParameter(op, PropertyChangeListener.class, "listener"); + setOperationBody(op, "" +/*{ + p.removePropertyChangeListener(listener); + }*/ + ); + + op = addOperation(result, "removePropertyChangeListener", "void"); + addParameter(op, String.class, "propertyName"); + addParameter(op, PropertyChangeListener.class, "listener"); + setOperationBody(op, "" +/*{ + p.removePropertyChangeListener(propertyName, listener); + }*/ + ); + + for (ObjectModelAttribute attr : clazz.getAttributes()) { + + ObjectModelAttribute reverse = attr.getReverseAttribute(); + + if (!(attr.isNavigable() || hasUnidirectionalRelationOnAbstractType(reverse, model))) { + continue; + } + + String attrName = attr.getName(); + + if (!attr.hasAssociationClass()) { + String attrType = attr.getType(); + if (isEntity(attrType)) { + attrType += "DTO"; + } + String capitalizedAttrName = StringUtils.capitalize(attrName); + if (!GeneratorUtil.isNMultiplicity(attr)) { + op = addOperation(result, "set" + capitalizedAttrName, "void", ObjectModelModifier.PUBLIC); + addParameter(op, attrType, "value"); + setOperationBody(op, "" +/*{ + <%=attrType%> oldValue = this.<%=attrName%>; + this.<%=attrName%> = value; + p.firePropertyChange("<%=attrName%>", oldValue, value); + }*/ + ); + + op = addOperation(result, "get" + capitalizedAttrName, attrType, ObjectModelModifier.PUBLIC); + setOperationBody(op, "" +/*{ + return <%=attrName%>; + }*/ + ); + + } else { + + op = addOperation(result, "set" + capitalizedAttrName, "void", ObjectModelModifier.PUBLIC); + addParameter(op, attrType+"[]", "values"); + setOperationBody(op, "" +/*{ + <%=attrType%>[] oldValues = this.<%=attrName%>; + this.<%=attrName%> = values; + p.firePropertyChange("<%=attrName%>", oldValues, values); + }*/ + ); + + op = addOperation(result, "get" + capitalizedAttrName, attrType+"[]", ObjectModelModifier.PUBLIC); + setOperationBody(op, "" +/*{ + return <%=attrName%>; + }*/ + ); + } + } else { + String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(attr); + String propertyName = GeneratorUtil.toLowerCaseFirstLetter(assocAttrName); + String assocClassFQN = attr.getAssociationClass().getQualifiedName(); + String capitaliedAttrName = StringUtils.capitalize(assocAttrName); + if (!GeneratorUtil.isNMultiplicity(attr)) { + op = addOperation(result, "set" + capitaliedAttrName, "void", ObjectModelModifier.PUBLIC); + addParameter(op, assocClassFQN + "DTO", "association"); + setOperationBody(op, "" +/*{ + <%=assocClassFQN%>DTO oldAssocation= this.<%=propertyName%>; + this.<%=propertyName%> = association; + p.firePropertyChange("<%=attrName%>", oldAssocation, assocation); + }*/ + ); + + op = addOperation(result, "get" + capitaliedAttrName, assocClassFQN + "DTO", ObjectModelModifier.PUBLIC); + setOperationBody(op, "" +/*{ + return <%=propertyName%>; + }*/ + ); + + } else { + op = addOperation(result, "set" + capitaliedAttrName, "void", ObjectModelModifier.PUBLIC); + addParameter(op, assocClassFQN + "DTO[]", "values"); + setOperationBody(op, "" +/*{ + <%=assocClassFQN%>DTO[] oldValues = this.<%=propertyName%>; + this.<%=propertyName%> = values; + p.firePropertyChange("<%=attrName%>", oldValues, values); + }*/ + ); + + op = addOperation(result, "get" + capitaliedAttrName, assocClassFQN + "DTO[]", ObjectModelModifier.PUBLIC); + setOperationBody(op, "" +/*{ + return this.<%=propertyName%>; + }*/ + ); + } + } + } + + op = addOperation(result,"toString",String.class, ObjectModelModifier.PUBLIC); + StringBuilder buffer = new StringBuilder(); + + buffer.append("" +/*{ + String result = new ToStringBuilder(this). +}*/ + ); + + for (Object o : clazz.getAttributes()) { + ObjectModelAttribute attr = (ObjectModelAttribute) o; + //FIXME possibilité de boucles (non directes) + ObjectModelClass attrEntity = null; + if (model.hasClass(attr.getType())) { + attrEntity = model.getClass(attr.getType()); + } + boolean isEntity = (attrEntity != null && attrEntity.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_ENTITY)); + ObjectModelAttribute reverse = attr.getReverseAttribute(); + if ((isEntity && (reverse == null || !reverse.isNavigable()) && !attr.hasAssociationClass()) || (!isEntity)) { + String attrName = attr.getName(); + buffer.append("" +/*{ append("<%=attrName%>", this.<%=attrName%>). +}*/ + ); + } + } + buffer.append("" +/*{ toString(); + return result; +}*/ + ); + setOperationBody(op, buffer.toString()); + } +} Property changes on: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDTOTransformer.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL Modified: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityImplGenerator.java =================================================================== --- branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityImplGenerator.java 2009-12-14 11:31:08 UTC (rev 1701) +++ branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityImplGenerator.java 2009-12-14 11:36:47 UTC (rev 1702) @@ -43,6 +43,12 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +/** + * + * @deprecated since 2.3.0, prefer use the corresponding {@link org.nuiton.eugene.Transformer} : + * {@link EntityImplTransformer}. + */ +@Deprecated public class EntityImplGenerator extends ObjectModelGenerator { private static final Log log = LogFactory.getLog(EntityImplGenerator.class); @@ -94,7 +100,6 @@ }*/ } - protected boolean isAbstract(ObjectModelClass clazz) { if (clazz.isAbstract()) { return true; Added: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityImplTransformer.java =================================================================== --- branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityImplTransformer.java (rev 0) +++ branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityImplTransformer.java 2009-12-14 11:36:47 UTC (rev 1702) @@ -0,0 +1,110 @@ +package org.nuiton.topia.generator; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.java.ObjectModelTransformerToJava; +import org.nuiton.eugene.models.object.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelOperation; + +import java.io.Serializable; +import java.util.Collection; + +/** + * 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 EntityImplTransformer extends ObjectModelTransformerToJava { + + /** + * Logger + */ + private static final Log log = LogFactory.getLog(EntityImplTransformer.class); + + @Override + public void transformFromClass(ObjectModelClass clazz) { + if (!clazz.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_ENTITY)) { + return; + } + // On ne génère pas le impl si l'entité a des opérations qui ne sont pas seulement pour le DAO + if (clazz.getOperations().size() > 0 && !hasOnlyDAOOperations(clazz)) { + 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 (ObjectModelOperation otherOp : clazz.getAllOtherOperations(false)) { + if (otherOp.isAbstract()) { + return; + } + } + String clazzName = clazz.getName(); + String clazzFQN = clazz.getQualifiedName(); + ObjectModelClass result; + if (isAbstract(clazz)) { + result = createAbstractClass(clazzName + "Impl", clazz.getPackageName()); + } else { + result = createClass(clazzName + "Impl", clazz.getPackageName()); + } + setDocumentation(result, "Implantation des operations pour l'entité " + clazzName + "."); + setSuperClass(result, clazzFQN + "Abstract"); + addInterface(result, Serializable.class); + addInterface(result, clazzFQN); + + } + + protected boolean isAbstract(ObjectModelClass clazz) { + if (clazz.isAbstract()) { + return true; + } + + //Une classe peut être abstraite si elle a des méthodes définies dans + // ses superinterface et non implantées dans ses superclasses + Collection<ObjectModelOperation> allInterfaceOperations = clazz.getAllInterfaceOperations(true); + allInterfaceOperations.removeAll(clazz.getAllOtherOperations(true)); + for (ObjectModelOperation op : allInterfaceOperations) { + boolean implementationFound = false; + for (ObjectModelClass superClazz : clazz.getSuperclasses()) { + for (ObjectModelOperation matchingOp : superClazz.getOperations(op.getName())) { + implementationFound = (op.equals(matchingOp) && !matchingOp.isAbstract()); + if (implementationFound) { + break; + } + } + if (implementationFound) { + break; + } + } + if (!implementationFound) { + if (log.isDebugEnabled()) { + log.debug(clazz.getName() + " : abstract operation " + op); + } + return true; + } + } + return false; + } + + /** + * Detect if the clazz has only operations for DAO implementation. + * These operations are identified with the stereotype <<dao>>. + * + * @param clazz The ObjectModelClass with all operations. + * @return true if there is only dao operations, false if there is no operations or some without + * dao stereotype. + */ + public static boolean hasOnlyDAOOperations(ObjectModelClass clazz) { + boolean res = true; + Collection<ObjectModelOperation> operations = clazz.getOperations(); + if (operations.size() == 0) { + res = false; + } + for (ObjectModelOperation op : operations) { + res &= op.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_DAO); + } + return res; + } +} \ No newline at end of file Property changes on: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityImplTransformer.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL 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 11:31:08 UTC (rev 1701) +++ branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityInterfaceGenerator.java 2009-12-14 11:36:47 UTC (rev 1702) @@ -76,9 +76,6 @@ return interfacez.getQualifiedName().replace('.', File.separatorChar) + ".java"; } - /* (non-Javadoc) - * @see org.nuiton.eugene.ObjectModelGenerator#generateFromInterface(java.io.Writer, org.nuiton.eugene.models.object.ObjectModelInterface) - */ @Override public void generateFromInterface(Writer output, ObjectModelInterface interfacez) throws IOException { if (!interfacez.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_ENTITY)) { Modified: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaJavaValidator.java =================================================================== --- branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaJavaValidator.java 2009-12-14 11:31:08 UTC (rev 1701) +++ branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaJavaValidator.java 2009-12-14 11:36:47 UTC (rev 1702) @@ -42,15 +42,12 @@ /** * Constructor. * - * @param model + * @param model model to validate */ public TopiaJavaValidator(ObjectModel model) { super(model); } - /* - * @see org.nuiton.eugene.models.object.validator.ObjectModelValidator#validateAttribute(org.nuiton.eugene.models.object.ObjectModelAttribute) - */ @Override protected boolean validateAttribute(ObjectModelAttribute attr) { @@ -77,9 +74,6 @@ } - /* - * @see org.nuiton.eugene.models.object.validator.ObjectModelValidator#validateClass(org.nuiton.eugene.models.object.ObjectModelClass) - */ @Override protected boolean validateClass(ObjectModelClass clazz) { @@ -102,9 +96,6 @@ return isValid; } - /* - * @see org.nuiton.eugene.models.object.validator.ObjectModelValidator#validateModel(org.nuiton.eugene.models.object.ObjectModel) - */ @Override protected boolean validateModel(ObjectModel model) { @@ -114,7 +105,7 @@ /** * Returns true if s is a legal Java identifier. * - * @param s + * @param s string to test * @return true if s is a legal Java identifier */ public static boolean isJavaIdentifier(String s) { Modified: branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaMetaGenerator.java =================================================================== --- branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaMetaGenerator.java 2009-12-14 11:31:08 UTC (rev 1701) +++ branches/from2.2.2-eugene2-beta/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaMetaGenerator.java 2009-12-14 11:36:47 UTC (rev 1702) @@ -32,7 +32,10 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.AbstractGenerator; import org.nuiton.eugene.ObjectModelGenerator; +import org.nuiton.eugene.Template; +import org.nuiton.eugene.Transformer; import org.nuiton.eugene.models.object.ObjectModel; import org.nuiton.eugene.models.object.validator.AttributeNamesValidator; import org.nuiton.eugene.models.object.validator.ClassNamesValidator; @@ -57,19 +60,25 @@ /** * la liste des generateurs par defaut a utiliser */ - protected static final List<Class<? extends ObjectModelGenerator>> DEFAULT_GENERATORS = java.util.Collections + protected static final List<Class<? extends Template<ObjectModel>>> DEFAULT_GENERATORS = java.util.Collections .unmodifiableList(Arrays.asList( EntityInterfaceGenerator.class, EntityAbstractGenerator.class, - EntityImplGenerator.class, + EntityImplTransformer.class, +// EntityImplGenerator.class, EntityHibernateMappingGenerator.class, - DAOGenerator.class, - DAOImplGenerator.class, - DAOAbstractGenerator.class, + DAOTransformer.class, + DAOImplTransformer.class, + DAOAbstractTransformer.class, + DAOHelperTransformer.class +// DAOGenerator.class, +// DAOImplGenerator.class, +// DAOAbstractGenerator.class, - DAOHelperGenerator.class)); +// DAOHelperGenerator.class) + )); protected boolean validateModel(ObjectModel model) { List<ObjectModelValidator> validators = new ArrayList<ObjectModelValidator>(); @@ -93,10 +102,8 @@ validators.add(attrValidator); ClassNamesValidator classValidator = new ClassNamesValidator(model); - classValidator.addNameAndReason("constraint", - "Nom de classe incompatible avec certains SGBD"); - classValidator.addNameAndReason("user", - "Nom de classe incompatible avec certains SGBD"); + classValidator.addNameAndReason("constraint", "Nom de classe incompatible avec certains SGBD"); + classValidator.addNameAndReason("user", "Nom de classe incompatible avec certains SGBD"); validators.add(classValidator); validators.add(new TopiaJavaValidator(model)); @@ -134,8 +141,8 @@ public void generatePersistence(ObjectModel model, File destDir) throws IOException { - for (Class<? extends ObjectModelGenerator> generatorClass : DEFAULT_GENERATORS) { - ObjectModelGenerator generator; + for (Class<? extends Template<ObjectModel>> generatorClass : DEFAULT_GENERATORS) { + Template<ObjectModel> generator; if (getExcludeTemplates().contains(generatorClass.getName())) { // exclude generator log.info("exclude generator " + generatorClass); @@ -144,8 +151,15 @@ try { generator = generatorClass.newInstance(); - generator.setParent(this); + // init generator + + if (generator instanceof AbstractGenerator) { + ((AbstractGenerator<ObjectModel>)generator).setParent(this); + } + if (generator instanceof Transformer) { + generator.setProperties(properties); + } } catch (Exception e) { // should never happens if(log.isErrorEnabled()) {
participants (1)
-
tchemit@users.nuiton.org