// Copyright © 2007 Object Generation AB. // Feel free to modify this script as needed. package com.objectgen.build import com.objectgen.core.* import com.objectgen.codegen.hibernate.* import com.objectgen.codegen.* /** * This Groovy script will modify all classes with stereotype DAO. */ class DAOClassBuilder extends ClassBuilder { static final String HIBERNATE_DAO = "org.springframework.orm.hibernate3.support.HibernateDaoSupport" static final String JPA_DAO = "org.springframework.orm.jpa.support.JpaDaoSupport" private String interfaceName private ClassifierData dataClass private BuildOperation getSession, create, read1, update, delete void init() { Variable dependency = cl.findVariable(PersistentFactory.DAO_TARGET) if(dependency == null) return dataClass = dependency.getType() if(dataClass == null) return if(ClassStereotype.PERSISTENT != dataClass.stereotype) return Project project = cl.project def idVar = dataClass.findVariableWithStereotype('id') String idType = (idVar != null ? idVar.typeFullName : 'long') getSession = buildOperation('org.hibernate.Session', 'getSession') getSession.setAccess(java.lang.reflect.Modifier.PRIVATE) // Long create(Person object) create = buildOperation(idType, "create") create.addParameter(dataClass, Variable.ONE, "object") // Person read(Long id) read1 = buildOperation(dataClass, "read") read1.addParameter(idType, Variable.ONE, "id") // void update(Person object) update = buildOperation(project.getVoidType(), "update") update.addParameter(dataClass, Variable.ONE, "object") // void delete(Person object) delete = buildOperation(project.getVoidType(), "delete") delete.addParameter(dataClass, Variable.ONE, "object") /* // void delete(int id) delete = buildOperation(project.getVoidType(), "delete") delete.addParameter(idType, Variable.ONE, "id") */ } void build() { Project project = cl.project def persistentFactory = PersistentFactory.getInstance(project) def daoFactory = DAOFactory.getInstance(project) boolean jpa = (persistentFactory?.platform == PersistentFactory.JPA) boolean spring = daoFactory?.useSpringTemplates if(daoFactory?.generateInterfaces) { String newInterfaceName = cl.name if(newInterfaceName != interfaceName) { if(interfaceName != null) { removeInterface(interfaceName) } interfaceName = newInterfaceName addInterface(interfaceName) } } else if(interfaceName != null) { removeInterface(interfaceName) interfaceName = null } def constructor = createConstructor() callInitObjects(constructor) if(dataClass == null) return def idVar = dataClass.findVariableWithStereotype('id') String idType = (idVar != null ? idVar.typeName : 'long') String getId = (idVar != null ? 'get' + capitalize(idVar.name) + '()' : 'getId()') // The variables are dynamic, so build them at each update. String helperClass = HibernateHelperBuilder.getFullClassName(project) def className = dataClass.fullName def object = 'object' def id = 'id' def session = AbstractCodeGenerator.SESSION_OBJECT def callGetSession = "getSession" if(jpa) { if(spring) { superClass = JPA_DAO callGetSession = "getJpaTemplate" } else { clearSuperClass() } getSession.type = 'javax.persistence.EntityManager' getSession.methodBody = """ return ${helperClass}.getInstance().getEntityManager(); """ if(idType != null) create.type = idType create.methodBody = """ ${callGetSession}().persist(${object}); return ${object}.${getId}; """ read1.methodBody = """ return ${callGetSession}().find(${className}.class, ${id}); """ update.type = dataClass update.methodBody = """ return ${callGetSession}().merge(${object}); """ delete.methodBody = """ ${callGetSession}().remove(${object}); """ /* // void delete(int id) delete.methodBody = """ ${callGetSession}().remove(${id}); """ */ } else { if(spring) { superClass = HIBERNATE_DAO callGetSession = "getHibernateTemplate" } else { clearSuperClass() } getSession.type = 'org.hibernate.Session' getSession.methodBody = """ return ${helperClass}.getInstance().getSession(); """ if(idType != null) create.type = idType create.methodBody = """ ${callGetSession}().save(${object}); return ${object}.${getId}; """ read1.methodBody = """ return (${className}) ${callGetSession}().get(${className}.class, ${id}); """ update.type = "void" update.methodBody = """ ${callGetSession}().update(${object}); """ delete.methodBody = """ ${callGetSession}().delete(${object}); """ } if(spring) { getSession.remove() } else { getSession.build() } create.build() read1.build() update.build() delete.build() implementInterfaceOperations() } void clear() { if(interfaceName != null) { removeInterface(interfaceName) } clearSuperClass() clearConstructor() getSession.remove() create.remove() read1.remove() update.remove() delete.remove() removeInterfaceOperations() } private void clearSuperClass() { if(HIBERNATE_DAO == superClass || JPA_DAO == superClass) superClass = null } private String capitalize(String s) { String ret = Character.toUpperCase(s[0] as char) if(s.length() > 1) ret += s[1..-1] return ret } }