r1733 - in trunk: . topia-persistence/src/main/java/org/nuiton/topia/generator
Author: tchemit Date: 2009-12-20 19:41:57 +0100 (Sun, 20 Dec 2009) New Revision: 1733 Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DTOTransformer.java Modified: trunk/pom.xml trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOAbstractTransformer.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOTransformer.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DTOGenerator.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDTOTransformer.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/InterfaceTransformer.java Log: - use eugene last stable version - migrate DTOGenerator to DTOTransformer - improve some transformers (clean imports, add methods to make code more readable...) Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2009-12-20 16:29:38 UTC (rev 1732) +++ trunk/pom.xml 2009-12-20 18:41:57 UTC (rev 1733) @@ -189,7 +189,7 @@ <projectId>topia</projectId> <!-- libs version --> - <eugene.version>2.0.0-beta-2-SNAPSHOT</eugene.version> + <eugene.version>2.0.0-beta-2</eugene.version> <lutinutil.version>1.1.1</lutinutil.version> <processor.version>1.0.2</processor.version> <i18n.version>1.0.1</i18n.version> Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOAbstractTransformer.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOAbstractTransformer.java 2009-12-20 16:29:38 UTC (rev 1732) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOAbstractTransformer.java 2009-12-20 18:41:57 UTC (rev 1733) @@ -67,7 +67,6 @@ } String clazzName = clazz.getName(); - String clazzFQN = clazz.getQualifiedName(); ObjectModelClass result = createAbstractClass(clazzName + "DAOAbstract<E extends " + clazzName + ">", clazz.getPackageName()); @@ -329,7 +328,7 @@ * Generation of DAO operations signatures from class. * These operations are abstract and identified by <<dao>> stereotype in the model. * The developper must defined these methods in the DAOImpl associated to this DAOAbstract. - * @param result + * @param result clazz where to add operations * @param operations operations to generate */ private void generateDAOOperations(ObjectModelClass result, Collection<ObjectModelOperation> operations) { Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOTransformer.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOTransformer.java 2009-12-20 16:29:38 UTC (rev 1732) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOTransformer.java 2009-12-20 18:41:57 UTC (rev 1733) @@ -22,8 +22,6 @@ import org.nuiton.eugene.java.ObjectModelTransformerToJava; import org.nuiton.eugene.models.object.ObjectModelClass; -import org.nuiton.eugene.models.object.ObjectModelElement; -import org.nuiton.eugene.models.object.xml.ObjectModelElementImpl; /*{generator option: parentheses = false}*/ Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DTOGenerator.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DTOGenerator.java 2009-12-20 16:29:38 UTC (rev 1732) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DTOGenerator.java 2009-12-20 18:41:57 UTC (rev 1733) @@ -57,7 +57,10 @@ /** * DTO generator * @plexus.component role="org.nuiton.eugene.Template" role-hint="org.nuiton.topia.generator.DTOGenerator" + * @deprecated since 2.3.0, prefer use the corresponding {@link org.nuiton.eugene.Transformer} : + * {@link DTOTransformer}. */ +@Deprecated public class DTOGenerator extends ObjectModelGenerator { /** Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DTOTransformer.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DTOTransformer.java (rev 0) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DTOTransformer.java 2009-12-20 18:41:57 UTC (rev 1733) @@ -0,0 +1,440 @@ +package org.nuiton.topia.generator; + +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.GeneratorUtil; +import org.nuiton.eugene.java.ObjectModelTransformerToJava; +import org.nuiton.eugene.models.object.*; +import static org.nuiton.topia.generator.TopiaGeneratorUtil.TAG_ANNOTATION; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + + +/*{generator option: parentheses = false}*/ + +/*{generator option: writeString = +}*/ + +/** + * Created: 20 déc. 2009 + * + * @author Tony Chemit <chemit@codelutin.com> Copyright Code Lutin + * @version $Revision$ + * <p/> + * Mise a jour: $Date$ par : + * $Author: tchemit $ + * @plexus.component role="org.nuiton.eugene.Template" role-hint="org.nuiton.topia.generator.DTOTransformer" + * @since 2.3.0 + */ +public class DTOTransformer extends ObjectModelTransformerToJava { + + /** + * Logger + */ + private static final Log log = LogFactory.getLog(DTOTransformer.class); + + @Override + public void transformFromClass(ObjectModelClass clazz) { + if (!clazz.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_DTO)) { + 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); + for (ObjectModelInterface parentInterface : clazz.getInterfaces()) { + if (parentInterface.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_DTO)) { + addInterface(result, parentInterface.getName() + "DTO"); + } else { + addInterface(result, parentInterface.getName()); + } + } + + addAttributes(result, clazz); + + addOperations(result, clazz); + } + + protected void addAttributes(ObjectModelClass result, ObjectModelClass clazz) { + + String svUID = TopiaGeneratorUtil.findTagValue("dto-serialVersionUID", clazz, model); + if (StringUtils.isNotEmpty(svUID)) { + addAttribute(result, "serialVersionUID", long.class, svUID, ObjectModelModifier.FINAL, ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); + } + + addAttribute(result, "p", PropertyChangeSupport.class, null, ObjectModelModifier.PROTECTED); + +/* +* Définition des attributs +*/ + ObjectModelAttribute attr2; + for (ObjectModelAttribute attr : clazz.getAttributes()) { + ObjectModelAttribute reverse = attr.getReverseAttribute(); + + String attributeName; + String attributeType; + if (!(attr.isNavigable() + || attr.hasAssociationClass())) { + continue; + } + + String attrName = attr.getName(); + String attrVisibility = attr.getVisibility(); + String attrType = attr.getType(); + if (!GeneratorUtil.isNMultiplicity(attr)) { + if (!attr.hasAssociationClass()) { + if (isDTO(attrType)) { + attrType += "DTO"; + } + attributeType = attrType; + attributeName = attrName; + } else { + String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(attr); + attributeType = attr.getAssociationClass().getQualifiedName(); + attributeName = GeneratorUtil.toLowerCaseFirstLetter(assocAttrName); + } + } else { + if (!attr.hasAssociationClass()) { + String nMultType; + if (attr.isOrdered()) { + nMultType = List.class.getName() + "<"; + } else { + nMultType = Collection.class.getName() + "<"; + } + nMultType += attrType; + if (isDTO(attrType)) { + nMultType += "DTO"; + } + nMultType += ">"; + + attributeType = nMultType; + attributeName = attrName; + } else { + String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(attr); + String assocClassFQN = attr.getAssociationClass().getQualifiedName(); + String nMultType; + if (attr.isOrdered()) { + nMultType = List.class.getName() + "<"; + } else { + nMultType = Collection.class.getName() + "<"; + } + nMultType += assocClassFQN; + if (isDTO(attrType)) { + nMultType += "DTO"; + } + nMultType += ">"; + attributeType = nMultType; + attributeName = GeneratorUtil.toLowerCaseFirstLetter(assocAttrName); + } + } + + attr2 = addAttribute(result, attributeName, attributeType, null, ObjectModelModifier.PROTECTED); + + if (attr2 != null) { + if (TopiaGeneratorUtil.hasDocumentation(attr)) { + setDocumentation(attr2, attr.getDocumentation()); + } + String annotation = attr.getTagValue(TAG_ANNOTATION); + if (StringUtils.isNotEmpty(annotation)) { + addAnnotation(result, attr2, annotation); + } + } + } /* end for*/ + + //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 attrName = attr.getName(); + String attrVisibility = attr.getVisibility(); + String attrType = attr.getType(); + if (isDTO(attrType)) { + attrType += "DTO"; + } + addAttribute(result, GeneratorUtil.toLowerCaseFirstLetter(attrName), attrType); + } + } + } + + } + + protected void addOperations(ObjectModelClass result, ObjectModelClass clazz) { + ObjectModelOperation op; + op = addOperation(result, "addPropertyChangeListener", "void", ObjectModelModifier.PUBLIC); + addParameter(op, PropertyChangeListener.class, "listener"); + setOperationBody(op, "" +/*{ + p.addPropertyChangeListener(listener); + }*/ + ); + + op = addOperation(result, "addPropertyChangeListener", "void", ObjectModelModifier.PUBLIC); + addParameter(op, String.class, "propertyName"); + addParameter(op, PropertyChangeListener.class, "listener"); + setOperationBody(op, "" +/*{ + p.addPropertyChangeListener(propertyName, listener); + }*/ + ); + + op = addOperation(result, "removePropertyChangeListener", "void", ObjectModelModifier.PUBLIC); + addParameter(op, PropertyChangeListener.class, "listener"); + setOperationBody(op, "" +/*{ + p.removePropertyChangeListener(listener); + }*/ + ); + + op = addOperation(result, "removePropertyChangeListener", "void", ObjectModelModifier.PUBLIC); + addParameter(op, String.class, "propertyName"); + addParameter(op, PropertyChangeListener.class, "listener"); + setOperationBody(op, "" +/*{ + p.removePropertyChangeListener(propertyName, listener); + }*/ + ); + /* + * Définition des getteurs et setteurs + */ + for (ObjectModelAttribute attr : clazz.getAttributes()) { + + ObjectModelAttribute reverse = attr.getReverseAttribute(); + +// if (!(attr.isNavigable() || hasUnidirectionalRelationOnAbstractType(reverse, model))) { + if (!attr.isNavigable()) { + continue; + } + + String attrName = attr.getName(); + String attrType = attr.getType(); + String attrTypeDTO = attr.getType(); + if (isDTO(attrType)) { + attrTypeDTO += "DTO"; + } + + if (!GeneratorUtil.isNMultiplicity(attr)) { + if (!attr.hasAssociationClass()) { + op = addOperation(result, "set" + StringUtils.capitalize(attrName), "void", ObjectModelModifier.PUBLIC); + addParameter(op, attrTypeDTO, "value"); + setOperationBody(op, "" +/*{ + <%=attrTypeDTO%> oldValue = this.<%=attrName%>; + this.<%=attrName%> = value; + p.firePropertyChange("<%=attrName%>", oldValue, value); + }*/ + ); + + op = addOperation(result, "get" + StringUtils.capitalize(attrName), attrTypeDTO, ObjectModelModifier.PUBLIC); + setOperationBody(op, "" +/*{ + return <%=attrName%>; + }*/ + ); + + } else { + String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(attr); + String assocClassFQN = attr.getAssociationClass().getQualifiedName(); + if (log.isTraceEnabled()) { + log.trace("assocAttrName: " + assocAttrName); + } + op = addOperation(result, "set" + StringUtils.capitalize(assocAttrName), "void", ObjectModelModifier.PUBLIC); + addParameter(op, assocClassFQN + "DTO", "association"); + setOperationBody(op, "" +/*{ + <%=assocClassFQN%>DTO oldAssocation = this.<%=GeneratorUtil.toLowerCaseFirstLetter(assocAttrName)%>; + this.<%=GeneratorUtil.toLowerCaseFirstLetter(assocAttrName)%> = association; + p.firePropertyChange("<%=attrName%>", oldAssocation, assocation); + }*/ + ); + + op = addOperation(result, "get" + StringUtils.capitalize(assocAttrName), assocClassFQN + "DTO", ObjectModelModifier.PUBLIC); + setOperationBody(op, "" +/*{ + return <%=GeneratorUtil.toLowerCaseFirstLetter(assocAttrName)%>; + }*/ + ); + } + } else { //NMultiplicity + if (!attr.hasAssociationClass()) { //Méthodes remplacées par des accesseurs sur les classes d'assoc + + String nMultType; + if (attr.isOrdered()) { + nMultType = List.class.getName() + "<" + attrTypeDTO + ">"; + } else { + nMultType = Collection.class.getName() + "<" + attrTypeDTO + ">"; + } + op = addOperation(result, "set" + StringUtils.capitalize(attrName), "void", ObjectModelModifier.PUBLIC); + addParameter(op, nMultType, "values"); + setOperationBody(op, "" +/*{ + <%=nMultType%> oldValues = this.<%=attrName%>; + this.<%=attrName%> = values; + p.firePropertyChange("<%=attrName%>", oldValues, values); + }*/ + ); + + op = addOperation(result, "addChild" + StringUtils.capitalize(attrName), attrTypeDTO, ObjectModelModifier.PUBLIC); + addParameter(op, attrTypeDTO, attrName); + StringBuilder buffercode = new StringBuilder(); + + buffercode.append("" +/*{ + this.<%=attrName%>.add(<%=attrName%>); + }*/ + ); + + if (reverse != null && reverse.isNavigable()) { + String reverseAttrName = reverse.getName(); + buffercode.append("" +/*{ <%=attrName%>.set<%=StringUtils.capitalize(reverseAttrName)%>(this); + }*/ + ); + } + buffercode.append("" +/*{ return <%=attrName%>; + }*/ + ); + setOperationBody(op, buffercode.toString()); + + op = addOperation(result, "removeChild", "void"); + addParameter(op, attrTypeDTO, attrName); + + buffercode = new StringBuilder(); + buffercode.append("" +/*{ + this.<%=attrName%>.remove(<%=attrName%>); + }*/ + ); + + if (reverse != null && reverse.isNavigable()) { + String reverseAttrName = reverse.getName(); + buffercode.append("" +/*{ <%=attrName%>.set<%=StringUtils.capitalize(reverseAttrName)%>(null); + }*/ + ); + } + setOperationBody(op, buffercode.toString()); + + } else { + String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(attr); + String assocClassFQN = attr.getAssociationClass().getQualifiedName(); + String nMultType; + if (attr.isOrdered()) { + nMultType = List.class.getName() + "<" + assocClassFQN + "DTO>"; + } else { + nMultType = Collection.class.getName() + "<" + assocClassFQN + "DTO>"; + } + if (log.isTraceEnabled()) { + log.trace("assocAttrName: " + assocAttrName); + } + op = addOperation(result, "set" + StringUtils.capitalize(assocAttrName), "void"); + addParameter(op, nMultType, "values"); + setOperationBody(op, "" +/*{ + <%=nMultType%> oldValues = this.<%=GeneratorUtil.toLowerCaseFirstLetter(assocAttrName)%>; + this.<%=GeneratorUtil.toLowerCaseFirstLetter(assocAttrName)%> = values; + p.firePropertyChange("<%=attrName%>", oldValues, values); + }*/ + ); + } + if (!attr.hasAssociationClass()) { + String nMultType; + if (attr.isOrdered()) { + nMultType = List.class.getName() + "<" + attrTypeDTO + ">"; + } else { + nMultType = Collection.class.getName() + "<" + attrTypeDTO + ">"; + } + op = addOperation(result, "get" + StringUtils.capitalize(attrName), nMultType); + setOperationBody(op, "" +/*{ + return this.<%=attrName%>; + }*/ + ); + } else { + String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(attr); + String assocClassFQN = attr.getAssociationClass().getQualifiedName(); + String nMultType; + if (attr.isOrdered()) { + nMultType = List.class.getName() + "<" + assocClassFQN + "DTO>"; + } else { + nMultType = Collection.class.getName() + "<" + assocClassFQN + "DTO>"; + } + if (log.isTraceEnabled()) { + log.trace("assocAttrName: " + assocAttrName); + } + op = addOperation(result, "get" + StringUtils.capitalize(assocAttrName), nMultType); + setOperationBody(op, "" +/*{ + return this.<%=GeneratorUtil.toLowerCaseFirstLetter(assocAttrName)%>; + }*/ + ); + } + } + } + + 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; + if (!(attr.isNavigable() + || attr.hasAssociationClass())) { + continue; + } + //FIXME possibilité de boucles (non directes) + ObjectModelClass attrEntity = null; + if (model.hasClass(attr.getType())) { + attrEntity = model.getClass(attr.getType()); + } + boolean isDTO = (attrEntity != null && attrEntity.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_ENTITY)); //THIMEL : STEREOTYPE ENTITY ??? + ObjectModelAttribute reverse = attr.getReverseAttribute(); + if ((isDTO && (reverse == null || !reverse.isNavigable()) && !attr.hasAssociationClass()) || (!isDTO)) { + String attrName = attr.getName(); + buffer.append("" +/*{ append("<%=attrName%>", this.<%=attrName%>). +}*/ + ); + } + } + buffer.append("" +/*{ toString(); + return result; + }*/ + ); + setOperationBody(op, buffer.toString()); + } + + public boolean isDTO(String type) { + ObjectModelClassifier clazz = model.getClassifier(type); + return clazz != null && clazz.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_DTO); + } + + +} + Property changes on: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DTOTransformer.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDTOTransformer.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDTOTransformer.java 2009-12-20 16:29:38 UTC (rev 1732) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDTOTransformer.java 2009-12-20 18:41:57 UTC (rev 1733) @@ -76,6 +76,15 @@ } addInterface(result, Serializable.class); + + addAttributes(result,clazz); + + addOperations(result,clazz); + + } + + protected void addAttributes(ObjectModelClass result, ObjectModelClass clazz) { + String svUID = TopiaGeneratorUtil.findTagValue("dto-serialVersionUID", clazz, model); if (svUID != null) { addAttribute(result, "serialVersionUID", "long", svUID, ObjectModelModifier.FINAL, ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); @@ -94,13 +103,6 @@ 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()) { @@ -127,6 +129,11 @@ if (TopiaGeneratorUtil.hasDocumentation(attr)) { setDocumentation(attr2, attr.getDocumentation()); } + + if (attr.hasTagValue(TopiaGeneratorUtil.TAG_ANNOTATION)) { + String annotation = attr.getTagValue(TopiaGeneratorUtil.TAG_ANNOTATION); + addAnnotation(result, attr2, annotation); + } } } @@ -142,19 +149,22 @@ if (isEntity(attrType)) { attrType += "DTO"; } - attr2 = addAttribute(result, GeneratorUtil.toLowerCaseFirstLetter(attrName), attrType, null, modifier); + addAttribute(result, GeneratorUtil.toLowerCaseFirstLetter(attrName), attrType, null, modifier); } } } addAttribute(result,"p", PropertyChangeSupport.class,"new PropertyChangeSupport(this)",ObjectModelModifier.PROTECTED,ObjectModelModifier.FINAL); + } + protected void addOperations(ObjectModelClass result,ObjectModelClass clazz) { + ObjectModelOperation op; op = addOperation(result, "addPropertyChangeListener", "void"); addParameter(op,PropertyChangeListener.class,"listener"); setOperationBody(op,"" /*{ - p.addPropertyChangeListener(listener); + p.addPropertyChangeListener(listener); }*/ ); @@ -163,7 +173,7 @@ addParameter(op, PropertyChangeListener.class, "listener"); setOperationBody(op, "" /*{ - p.addPropertyChangeListener(propertyName, listener); + p.addPropertyChangeListener(propertyName, listener); }*/ ); @@ -191,7 +201,7 @@ if (!(attr.isNavigable() || hasUnidirectionalRelationOnAbstractType(reverse, model))) { continue; } - + String attrName = attr.getName(); if (!attr.hasAssociationClass()) { @@ -208,7 +218,7 @@ <%=attrType%> oldValue = this.<%=attrName%>; this.<%=attrName%> = value; p.firePropertyChange("<%=attrName%>", oldValue, value); - }*/ + }*/ ); op = addOperation(result, "get" + capitalizedAttrName, attrType, ObjectModelModifier.PUBLIC); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/InterfaceTransformer.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/InterfaceTransformer.java 2009-12-20 16:29:38 UTC (rev 1732) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/InterfaceTransformer.java 2009-12-20 18:41:57 UTC (rev 1733) @@ -57,6 +57,11 @@ ObjectModelInterface resultInterface = createInterface(interfacez.getName(), interfacez.getPackageName()); + if (log.isDebugEnabled()) { + log.debug("will create model for "+resultInterface.getQualifiedName()); + } + + // extend interface Iterator<ObjectModelInterface> it = interfacez.getInterfaces().iterator(); if (it.hasNext()) {
participants (1)
-
tchemit@users.nuiton.org