r2987 - in trunk: topia-it/src/main/java/org/nuiton/topia/it/legacy topia-persistence/src/main/java/org/nuiton/topia/persistence topia-templates/src/main/java/org/nuiton/topia/templates
Author: tchemit Date: 2014-01-22 14:59:45 +0100 (Wed, 22 Jan 2014) New Revision: 2987 Url: http://nuiton.org/projects/topia/repository/revisions/2987 Log: fixes #2776: Move .getComposite() and .getAggregate methods on entity's DAO Modified: trunk/topia-it/src/main/java/org/nuiton/topia/it/legacy/GeneratedPersonneTopiaDao.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDao.java trunk/topia-templates/src/main/java/org/nuiton/topia/templates/EntityDaoTransformer.java Modified: trunk/topia-it/src/main/java/org/nuiton/topia/it/legacy/GeneratedPersonneTopiaDao.java =================================================================== --- trunk/topia-it/src/main/java/org/nuiton/topia/it/legacy/GeneratedPersonneTopiaDao.java 2014-01-22 13:59:19 UTC (rev 2986) +++ trunk/topia-it/src/main/java/org/nuiton/topia/it/legacy/GeneratedPersonneTopiaDao.java 2014-01-22 13:59:45 UTC (rev 2987) @@ -58,4 +58,13 @@ return null; } + @Override + public List<TopiaEntity> getComposite(E entity) { + return null; + } + + @Override + public List<TopiaEntity> getAggregate(E entity) { + return null; + } } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDao.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDao.java 2014-01-22 13:59:19 UTC (rev 2986) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDao.java 2014-01-22 13:59:45 UTC (rev 2987) @@ -288,4 +288,17 @@ */ Map<Class<? extends TopiaEntity>, List<? extends TopiaEntity>> findAllUsages(E entity); + /** + * @param entity the entity on which search is done + * @return all objects that must be deleted if this object is deleted + * @since 3.0 + */ + List<TopiaEntity> getComposite(E entity); + + /** + * @param entity the entity on which search is done + * @return all objects that are aggregate with this instance, aggregate object are not removed automatically + * @since 3.0 + */ + List<TopiaEntity> getAggregate(E entity); } Modified: trunk/topia-templates/src/main/java/org/nuiton/topia/templates/EntityDaoTransformer.java =================================================================== --- trunk/topia-templates/src/main/java/org/nuiton/topia/templates/EntityDaoTransformer.java 2014-01-22 13:59:19 UTC (rev 2986) +++ trunk/topia-templates/src/main/java/org/nuiton/topia/templates/EntityDaoTransformer.java 2014-01-22 13:59:45 UTC (rev 2987) @@ -46,12 +46,15 @@ import org.nuiton.eugene.models.object.ObjectModelInterface; import org.nuiton.eugene.models.object.ObjectModelJavaModifier; import org.nuiton.eugene.models.object.ObjectModelOperation; +import org.nuiton.topia.persistence.TopiaDao; +import org.nuiton.topia.persistence.TopiaException; import org.nuiton.topia.persistence.internal.support.HibernateTopiaJpaSupport; import org.nuiton.topia.persistence.support.TopiaHibernateSupport; import org.nuiton.topia.persistence.internal.AbstractTopiaDao; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -63,7 +66,7 @@ /** * To generate all <code>DAO</code> related classes for a given entity. - * + * * @author tchemit <chemit@codelutin.com> * @since 2.5.4 * @plexus.component role="org.nuiton.eugene.Template" role-hint="org.nuiton.topia.templates.EntityDaoTransformer" @@ -134,13 +137,13 @@ } } } - + @Override public void transformFromInterface(ObjectModelInterface interfacez) { if (!TopiaGeneratorUtil.hasDaoStereotype(interfacez)) { return; } - + /** * EVO #636 : Manage extra operations for DAO from "dao" dependency * between an interface with stereotype <<dao>> (dependency client) and @@ -172,7 +175,7 @@ } return; } - + // keep only direct operations Collection<ObjectModelOperation> operations = interfacez.getOperations(); @@ -453,6 +456,9 @@ Set<ObjectModelClass> usagesForclass = usages.get(clazz); generateFindUsages(clazz, daoAbstractClass, usagesForclass); + + generateAggregateOperation(daoAbstractClass, clazz); + generateCompositeOperation(daoAbstractClass, clazz); } protected void generateDelete(ObjectModelClass clazz, @@ -1013,7 +1019,7 @@ * Obtain business operations of the DAO. * * This operations can not be generated, but must be written by developper. - * + * * @param clazz the clazz to test. * @return collections of extra operations, or empty collection if none found. * @deprecated Dao operation will not be generated anymore in a very close future @@ -1145,4 +1151,171 @@ ); } } + + protected void generateCompositeOperation(ObjectModelClass outputAbstract, ObjectModelClass input) { + + ObjectModelOperation operation = + addOperation(outputAbstract, "getComposite", + List.class.getName() + '<' + TopiaEntity.class.getName() + '>'); + addParameter(operation, "E", "entity"); + addException(operation, TopiaException.class); + addAnnotation(outputAbstract, operation, Override.class); + + StringBuilder body; + + addImport(outputAbstract, ArrayList.class); + addImport(outputAbstract, List.class); + addImport(outputAbstract, TopiaDao.class); + + body = new StringBuilder("" +/*{ + List<TopiaEntity> tmp = new ArrayList<TopiaEntity>(); + + // pour tous les attributs rechecher les composites et les class d'asso + // on les ajoute dans tmp +}*/ + ); + for (ObjectModelAttribute attr : input.getAttributes()) { + + if (attr.referenceClassifier() && + TopiaGeneratorUtil.isEntity(attr.getClassifier())) { + + if (attr.isComposite()) { + String attrName = attr.getName(); + String getterName = getJavaBeanMethodName("get", attrName); + if (TopiaGeneratorUtil.isNMultiplicity(attr)) { + body.append("" +/*{ if (entity.<%=getterName%>() != null) { + tmp.addAll(entity.<%=getterName%>()); + } +}*/ + ); + } else { + body.append("" +/*{ tmp.add(entity.<%=getterName%>()); +}*/ + ); + } + } else if (attr.hasAssociationClass()) { + String assocAttrName = TopiaGeneratorUtil.getAssocAttrName( + attr); + String assocClassFQN = TopiaGeneratorUtil.getSimpleName( + attr.getAssociationClass().getQualifiedName()); + String assocConcreteDaoClassName = assocClassFQN + "TopiaDao"; + String ref = "e." + getJavaBeanMethodName("get", assocAttrName); + if (!TopiaGeneratorUtil.isNMultiplicity(attr)) { + body.append("" +/*{ + if (<%=ref%> != null) { + tmp.add(<%=ref%>); + } +}*/ + ); + } else { + ObjectModelAttribute reverse = attr.getReverseAttribute(); + String reverseAttrName = reverse.getName(); + // On utilise pas l'attribut car il est potentiellement + // pas a jour, car pour les asso avec cardinalité + // personne ne fait de add. Ce qui est normal, mais + // pour pouvoir faire tout de meme des delete en cascade + // sur les asso, le champs est dans le mapping + // hibernate et donc il le faut aussi dans la classe + // sinon hibernate rale lorsqu'il charge l'objet +// if (<%=ref%> != null) { +// tmp.addAll(<%=ref%>); +// } + + body.append("" +/*{ + { + <%=assocConcreteDaoClassName%> dao = topiaDaoSupplier + .getDao(<%=assocClassFQN%>.class, <%=assocConcreteDaoClassName%>.class); + List<<%=assocClassFQN%>> findAllByProperties = dao.forProperties("<%=reverseAttrName%>", entity).findAll(); + if (findAllByProperties != null) { + tmp.addAll(findAllByProperties); + } + } +}*/ + ); + } + } + } + } + body.append("" +/*{ + // on refait un tour sur chaque entity de tmp pour recuperer leur + // composite + List<TopiaEntity> result = new ArrayList<TopiaEntity>(); + for (TopiaEntity e : tmp) { + if (e != null) { + result.add(e); + TopiaDao<TopiaEntity> dao = (TopiaDao<TopiaEntity>) topiaDaoSupplier.getDao(e.getClass()); + result.addAll(dao.getComposite(e)); + } + } + return result; + }*/ + ); + setOperationBody(operation, body.toString()); + } + + protected void generateAggregateOperation(ObjectModelClass outputAbstract, ObjectModelClass input) { + + ObjectModelOperation operation = + addOperation(outputAbstract, "getAggregate", + List.class.getName() + '<' + TopiaEntity.class.getName() + '>'); + addParameter(operation, "E", "entity"); + addException(operation, TopiaException.class); + addAnnotation(outputAbstract, operation, Override.class); + + + StringBuilder body = new StringBuilder(); + + addImport(outputAbstract, ArrayList.class); + addImport(outputAbstract, List.class); + addImport(outputAbstract, TopiaDao.class); + body .append("" +/*{ + List<TopiaEntity> tmp = new ArrayList<TopiaEntity>(); + + // pour tous les attributs rechecher les composites et les class d'asso + // on les ajoute dans tmp +}*/ + ); + for (ObjectModelAttribute attr : input.getAttributes()) { + + if (attr.referenceClassifier() && + TopiaGeneratorUtil.isEntity(attr.getClassifier()) && + attr.isAggregate()) { + + String attrName = attr.getName(); + String getterName = getJavaBeanMethodName("get", attrName); + if (TopiaGeneratorUtil.isNMultiplicity(attr)) { + body.append("" +/*{ tmp.addAll(entity.<%=getterName%>()); +}*/ + ); + } else { + body.append("" +/*{ tmp.add(entity.<%=getterName%>()); +}*/ + ); + } + } + } + body.append("" +/*{ + // on refait un tour sur chaque entity de tmp pour recuperer leur + // composite + List<TopiaEntity> result = new ArrayList<TopiaEntity>(); + for (TopiaEntity e : tmp) { + result.add(e); + TopiaDao<TopiaEntity> dao = (TopiaDao<TopiaEntity>) topiaDaoSupplier.getDao(e.getClass()); + result.addAll(dao.getAggregate(e)); + } + return result; + }*/ + ); + setOperationBody(operation, body.toString()); + } }
participants (1)
-
tchemit@users.nuiton.org