Author: tchemit Date: 2010-07-18 20:02:20 +0200 (Sun, 18 Jul 2010) New Revision: 2080 Url: http://nuiton.org/repositories/revision/topia/2080 Log: - add in TopiaContext a specialized method to obtain a specialized DAO without any cast for user code. - improve DAOHelper generator (separate generation of DAOHelper en EntityEnum) Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java 2010-07-18 16:51:11 UTC (rev 2079) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java 2010-07-18 18:02:20 UTC (rev 2080) @@ -663,12 +663,6 @@ /* -------------------- CHILD CONTEXT AND DAOS --------------------------*/ - /* - * (non-Javadoc) - * - * @see org.nuiton.topia.framework.TopiaContextImplementor#getDAO(java.lang.Class) - */ - @Override public <E extends TopiaEntity> TopiaDAO<E> getDAO(Class<E> entityClass) throws TopiaException { @@ -718,6 +712,12 @@ return result; } + @Override + public <E extends TopiaEntity, D extends TopiaDAO<E>> D getDAO(Class<E> entityClass, + Class<D> daoClass) throws TopiaException { + return (D) getDAO(entityClass); + } + /* * (non-Javadoc) * Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java 2010-07-18 16:51:11 UTC (rev 2079) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java 2010-07-18 18:02:20 UTC (rev 2080) @@ -114,6 +114,19 @@ <E extends TopiaEntity> TopiaDAO<E> getDAO(Class<E> entityClass) throws TopiaException; + /** + * Get DAO for specified class. If Specialized DAO exists then it returned + * otherwize TopiaDAO<entityClass> is returned + * + * @param <E> + * @param entityClass + * @param daoClass + * @return a doa + * @throws TopiaException + */ + <E extends TopiaEntity, D extends TopiaDAO<E>> D getDAO(Class<E> entityClass,Class<D> daoClass) + throws TopiaException; + TopiaFiresSupport getFiresSupport(); void removeChildContext(TopiaContextImplementor child); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java 2010-07-18 16:51:11 UTC (rev 2079) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java 2010-07-18 18:02:20 UTC (rev 2080) @@ -25,7 +25,6 @@ package org.nuiton.topia.generator; -import org.apache.commons.lang.BooleanUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.eugene.models.object.ObjectModelType; @@ -41,10 +40,8 @@ import org.nuiton.topia.persistence.TopiaEntityEnum; import org.nuiton.topia.persistence.util.EntityOperator; import org.nuiton.topia.persistence.util.EntityOperatorStore; -import org.nuiton.util.StringUtil; import java.lang.reflect.Array; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -68,59 +65,109 @@ @Override public void transformFromModel(ObjectModel model) { - ObjectModelClass resultClass; String packageName = getOutputProperties().getProperty(PROP_DEFAULT_PACKAGE); String modelName = model.getName(); String daoHelperClazzName = modelName + "DAOHelper"; - String modelVersion = model.getVersion(); + String entityEnumName = modelName+"EntityEnum"; - resultClass = createClass(daoHelperClazzName, packageName); + List<ObjectModelClass> classes = TopiaGeneratorUtil.getEntityClasses(model, true); - List<ObjectModelClass> classes = TopiaGeneratorUtil.getEntityClasses(model, true); boolean generateOperator = TopiaGeneratorUtil.shouldgenerateOperatorForDAOHelper(null, model); boolean generateStandaloneEnum = TopiaGeneratorUtil.shouldGnerateStandaloneEnumForDAOHelper(null, model); - addImport(resultClass, TopiaContextImplementor.class); - addImport(resultClass, TopiaDAO.class); - addImport(resultClass, TopiaEntity.class); - addImport(resultClass, TopiaContext.class); - addImport(resultClass, Array.class); - addImport(resultClass, Arrays.class); + ObjectModelClass daoHelper = createClass(daoHelperClazzName, packageName); + ObjectModelEnumeration entityEnum; + + if (generateStandaloneEnum) { + if (log.isDebugEnabled()) { + log.debug("Will generate standalone " + entityEnumName + + " in package " + packageName); + } + entityEnum = createEnumeration(entityEnumName, packageName); + addImport(entityEnum, TopiaEntity.class); + addImport(entityEnum, EntityOperatorStore.class); + addImport(entityEnum, Arrays.class); + + } else { + entityEnum = (ObjectModelEnumerationImpl) + addInnerClassifier(daoHelper, + ObjectModelType.OBJECT_MODEL_ENUMERATION, + entityEnumName + ); +// addImport(daoHelper, TopiaEntity.class); + addImport(daoHelper, TopiaEntityEnum.class); + addImport(daoHelper, EntityOperatorStore.class); + addImport(daoHelper, Arrays.class); + } + + // generate DAOHelper + createDAOHelper(model, + daoHelper, + daoHelperClazzName, + entityEnumName, + generateOperator, + classes + ); + + // generate TopiaEntityEnum + createEntityEnum(entityEnum, + daoHelperClazzName, + entityEnumName, + generateOperator, + generateStandaloneEnum, + classes + ); + } + + protected void createDAOHelper(ObjectModel model, + ObjectModelClass daoHelper, + String daoHelperClazzName, + String entityEnumName, + boolean generateOperator, + List<ObjectModelClass> classes) { + + String modelName = model.getName(); + String modelVersion = model.getVersion(); + + addImport(daoHelper, TopiaContextImplementor.class); + addImport(daoHelper, TopiaDAO.class); + addImport(daoHelper, TopiaEntity.class); + addImport(daoHelper, TopiaContext.class); +// addImport(daoHelper, TopiaEntityEnum.class); + addImport(daoHelper, Array.class); +// addImport(daoHelper, Arrays.class); + if (generateOperator) { - addImport(resultClass,EntityOperator.class); - addImport(resultClass, EntityOperatorStore.class); + addImport(daoHelper,EntityOperator.class); + addImport(daoHelper, EntityOperatorStore.class); } - String entityEnumName = modelName+"EntityEnum"; - // add non public constructor ObjectModelOperation constructor = - addConstructor(resultClass, ObjectModelModifier.PROTECTED); + addConstructor(daoHelper, ObjectModelModifier.PROTECTED); setOperationBody(constructor," "); ObjectModelOperation op; - ObjectModelAttributeImpl attr; - // getModelVersion method - op = addOperation(resultClass, "getModelVersion", "String", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); + op = addOperation(daoHelper, "getModelVersion", "String", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); setOperationBody(op, "" - /*{ - return "<%=modelVersion%>"; - }*/ - ); + /*{ + return "<%=modelVersion%>"; + }*/ + ); // getModelName method - op = addOperation(resultClass, "getModelName", "String", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); + op = addOperation(daoHelper, "getModelName", "String", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); setOperationBody(op, "" - /*{ - return "<%=modelName%>"; - }*/ - ); + /*{ + return "<%=modelName%>"; + }*/ + ); for (ObjectModelClass clazz : classes) { @@ -128,142 +175,136 @@ String daoClazzName = clazzName + "DAO"; // specialized getXXXDao method - op = addOperation(resultClass, "get" + daoClazzName, clazz.getPackageName() + '.' + daoClazzName, ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); + op = addOperation(daoHelper, "get" + daoClazzName, clazz.getPackageName() + '.' + daoClazzName, ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); addParameter(op, TopiaContext.class, "context"); - addImport(resultClass, clazz); + addImport(daoHelper, clazz); addException(op, TopiaException.class); setOperationBody(op, "" - /*{ - TopiaContextImplementor ci = (TopiaContextImplementor) context; - <%=daoClazzName%> result = (<%=daoClazzName%>) ci.getDAO(<%=clazzName%>.class); - return result; - }*/ + /*{ + TopiaContextImplementor ci = (TopiaContextImplementor) context; + <%=daoClazzName%> result = ci.getDAO(<%=clazzName%>.class, <%=daoClazzName%>.class); + return result; + }*/ ); } // generic getDao method - op = addOperation(resultClass, "getDAO", "<T extends TopiaEntity, D extends TopiaDAO<? super T>> D", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); + op = addOperation(daoHelper, "getDAO", "<T extends TopiaEntity, D extends TopiaDAO<? super T>> D", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); addParameter(op, TopiaContext.class, "context"); addParameter(op, "Class<T>", "klass"); addException(op, TopiaException.class); setOperationBody(op, "" - /*{ - TopiaContextImplementor ci = (TopiaContextImplementor) context; - <%=entityEnumName%> constant = <%=entityEnumName%>.valueOf(klass); - D dao = (D) ci.getDAO(constant.getContract()); - return dao; - }*/ - ); + /*{ + TopiaContextImplementor ci = (TopiaContextImplementor) context; + <%=entityEnumName%> constant = <%=entityEnumName%>.valueOf(klass); + D dao = (D) ci.getDAO(constant.getContract()); + return dao; + }*/ + ); - op = addOperation(resultClass, "getDAO", "<T extends TopiaEntity, D extends TopiaDAO<? super T>> D", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); + op = addOperation(daoHelper, "getDAO", "<T extends TopiaEntity, D extends TopiaDAO<? super T>> D", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); addParameter(op, TopiaContext.class, "context"); addParameter(op, "T", "entity"); addException(op, TopiaException.class); setOperationBody(op, "" - /*{ - TopiaContextImplementor ci = (TopiaContextImplementor) context; - <%=entityEnumName%> constant = <%=entityEnumName%>.valueOf(entity); - D dao = (D) ci.getDAO(constant.getContract()); - return dao; - }*/ - ); + /*{ + TopiaContextImplementor ci = (TopiaContextImplementor) context; + <%=entityEnumName%> constant = <%=entityEnumName%>.valueOf(entity); + D dao = (D) ci.getDAO(constant.getContract()); + return dao; + }*/ + ); // getContractClass method - op = addOperation(resultClass, "getContractClass", "<T extends TopiaEntity> Class<T>", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); + op = addOperation(daoHelper, "getContractClass", "<T extends TopiaEntity> Class<T>", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); addParameter(op, "Class<T>", "klass"); setOperationBody(op, "" - /*{ - <%=entityEnumName%> constant = <%=entityEnumName%>.valueOf(klass); - return (Class<T>) constant.getContract(); - }*/ - ); + /*{ + <%=entityEnumName%> constant = <%=entityEnumName%>.valueOf(klass); + return (Class<T>) constant.getContract(); + }*/ + ); // getImplementationClass method - op = addOperation(resultClass, "getImplementationClass", "<T extends TopiaEntity> Class<T>", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); + op = addOperation(daoHelper, "getImplementationClass", "<T extends TopiaEntity> Class<T>", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); addParameter(op, "Class<T>", "klass"); setOperationBody(op, "" - /*{ - <%=entityEnumName%> constant = <%=entityEnumName%>.valueOf(klass); - return (Class<T>) constant.getImplementation(); - }*/ - ); + /*{ + <%=entityEnumName%> constant = <%=entityEnumName%>.valueOf(klass); + return (Class<T>) constant.getImplementation(); + }*/ + ); // getContractClasses method - op = addOperation(resultClass, "getContractClasses", "Class<? extends TopiaEntity>[]", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); + op = addOperation(daoHelper, "getContractClasses", "Class<? extends TopiaEntity>[]", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); setOperationBody(op, "" - /*{ - <%=entityEnumName%>[] values = <%=entityEnumName%>.values(); - Class<? extends TopiaEntity>[] result = (Class<? extends TopiaEntity>[]) Array.newInstance(Class.class, values.length); - for (int i = 0; i < values.length; i++) { - result[i] = values[i].getContract(); - } - return result; - }*/ - ); + /*{ + <%=entityEnumName%>[] values = <%=entityEnumName%>.values(); + Class<? extends TopiaEntity>[] result = (Class<? extends TopiaEntity>[]) Array.newInstance(Class.class, values.length); + for (int i = 0; i < values.length; i++) { + result[i] = values[i].getContract(); + } + return result; + }*/ + ); // getImplementationClasses method - op = addOperation(resultClass, "getImplementationClasses", "Class<? extends TopiaEntity>[]", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); + op = addOperation(daoHelper, "getImplementationClasses", "Class<? extends TopiaEntity>[]", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); setOperationBody(op, "" - /*{ - <%=entityEnumName%>[] values = <%=entityEnumName%>.values(); - Class<? extends TopiaEntity>[] result = (Class<? extends TopiaEntity>[]) Array.newInstance(Class.class, values.length); - for (int i = 0; i < values.length; i++) { - result[i] = values[i].getImplementation(); - } - return result; - }*/ - ); + /*{ + <%=entityEnumName%>[] values = <%=entityEnumName%>.values(); + Class<? extends TopiaEntity>[] result = (Class<? extends TopiaEntity>[]) Array.newInstance(Class.class, values.length); + for (int i = 0; i < values.length; i++) { + result[i] = values[i].getImplementation(); + } + return result; + }*/ + ); // getImplementationClassesAsString method - op = addOperation(resultClass, "getImplementationClassesAsString", "String", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); + op = addOperation(daoHelper, "getImplementationClassesAsString", "String", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); setOperationBody(op, "" - /*{ - StringBuilder buffer = new StringBuilder(); - for (Class<? extends TopiaEntity> aClass : getImplementationClasses()) { - buffer.append(',').append(aClass.getName()); - } - return buffer.substring(1); - }*/ - ); + /*{ + StringBuilder buffer = new StringBuilder(); + for (Class<? extends TopiaEntity> aClass : getImplementationClasses()) { + buffer.append(',').append(aClass.getName()); + } + return buffer.substring(1); + }*/ + ); // getContracts method - op = addOperation(resultClass, "getContracts", entityEnumName+"[]", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); + op = addOperation(daoHelper, "getContracts", entityEnumName+"[]", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); setOperationBody(op, "" - /*{ - return <%=entityEnumName%>.values(); - }*/ - ); + /*{ + return <%=entityEnumName%>.values(); + }*/ + ); if (generateOperator) { // getOperator method - op = addOperation(resultClass, "getOperator", "<T extends TopiaEntity> EntityOperator<T>", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); + op = addOperation(daoHelper, "getOperator", "<T extends TopiaEntity> EntityOperator<T>", ObjectModelModifier.PUBLIC, ObjectModelModifier.STATIC); addParameter(op,"Class<T>","klass"); setOperationBody(op, "" - /*{ - <%=entityEnumName%> constant = <%=entityEnumName%>.valueOf(klass); - return (EntityOperator<T>) EntityOperatorStore.getOperator(constant); - }*/ + /*{ + <%=entityEnumName%> constant = <%=entityEnumName%>.valueOf(klass); + return (EntityOperator<T>) EntityOperatorStore.getOperator(constant); + }*/ ); } + } - // add enum + protected void createEntityEnum(ObjectModelEnumeration entityEnum, + String daoHelperClazzName, + String entityEnumName, + boolean generateOperator, + boolean generateStandaloneEnum, + List<ObjectModelClass> classes) { - ObjectModelEnumeration entityEnum; + ObjectModelAttributeImpl attr; + ObjectModelOperation op; - if (generateStandaloneEnum) { - log.info("Will generate standalone " + entityEnumName + " in package " + packageName); - entityEnum = createEnumeration(entityEnumName, packageName); - addImport(entityEnum,TopiaEntity.class); - addImport(entityEnum,EntityOperatorStore.class); - addImport(entityEnum,Arrays.class); - - } else { - entityEnum = (ObjectModelEnumerationImpl) - addInnerClassifier(resultClass, ObjectModelType.OBJECT_MODEL_ENUMERATION, entityEnumName); - } - - addImport(resultClass, TopiaEntityEnum.class); addInterface(entityEnum, TopiaEntityEnum.class); for (ObjectModelClass clazz : classes) { @@ -293,7 +334,6 @@ } } - attr = (ObjectModelAttributeImpl) addAttribute(entityEnum, "contract", "Class<? extends TopiaEntity>"); attr.setDocumentation("the contract of the entity");