<!-- This tool is originally based on StrutsGen, created by Erik Hatcher -->
<project name="appgen" default="default">

    <property file="${user.home}/${ant.project.name}-build.properties"/>
    <property file="${user.home}/build.properties"/>
    <property file="../../build.properties"/>
    
    <property name="lib.dir" location="../../lib"/>
    <property file="${lib.dir}/lib.properties"/>

    <import file="../../properties.xml"/>

    <path id="xdoclet.classpath">
        <pathelement location="${log4j.jar}"/>
        <pathelement location="${commons-logging.jar}"/>
        <pathelement location="${commons-collections.jar}"/>
        <fileset dir="${xdoclet.dir}" includes="*.jar"/>
        <path location="../../web/WEB-INF/classes"/>
    </path>

    <property name="overwrite" value="false"/>
    <property name="gen.dir" value="gen"/>

    <property name="model.src.dir" location="../../src/dao"/>
    <property name="module.src.dir" value="src"/>
    <property name="module.test.dir" value="test"/>

    <target name="init">
        <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="${ant-contrib.jar}"/>
        <taskdef name="stringutil" classname="ise.antelope.tasks.StringUtilTask">
            <classpath>
                <fileset dir="${ant-contrib.dir}" includes="*.jar"/>
            </classpath>
        </taskdef>
        <taskdef name="if-ext" classname="ise.antelope.tasks.IfTask">
            <classpath>
                <fileset dir="${ant-contrib.dir}" includes="*.jar"/>
            </classpath>
        </taskdef>
        <mkdir dir="${build.dir}"/>
<echo level="info">
+-------------------------------------------------------+
|             -- Welcome to the AppGen! --              |
|                                                       |
| Use the "install" target to use the generic DAO and   |
| Manager, or use "install-detailed" to general a DAO   |
| and Manager specifically for your model object.       |
+-------------------------------------------------------+
</echo>
        <echo/>
        <input message="Would you like to generate code from a table or POJO? "
            validargs="table,pojo" addproperty="appgen.type"/>
        <input message="What is the name of your ${appgen.type} (i.e. person)?" addproperty="object.name"/>
        <fail unless="object.name">
            You must specify a name for your ${appgen.type}.
        </fail>
        
        <input message="What is the name, if any, of the module for your ${appgen.type} (i.e. organization)?" addproperty="app.module"/>

        <condition property="app.module.dash" value="-${app.module}">
        	<not><equals arg1="${app.module}" arg2="" trim="true"/></not>
        </condition>
        <condition property="app.module.slash.before" value="/${app.module}">
            <not><equals arg1="${app.module}" arg2="" trim="true"/></not>
        </condition>
        <condition property="app.module.slash.after" value="${app.module}/">
            <not><equals arg1="${app.module}" arg2="" trim="true"/></not>
        </condition>
        
        <property name="app.module.dash" value=""/>
        <property name="app.module.slash.before" value=""/>
        <property name="app.module.slash.after" value=""/>        
        <property name="new.pkg.name" value="org.appfuse"/>
        <property name="app.package.base" value="org/appfuse"/>
        <property name="app.package" value="${app.package.base}${app.module.slash.before}"/>

        <if>
            <equals arg1="${appgen.type}" arg2="table"/>
            <then>
                <echo>Running Middlegen to generate POJO...</echo>
                <ant dir="../middlegen" inheritAll="true">
                    <property name="table.name" value="${object.name}"/>
                    <property name="class.module" value="${app.module}"/>
                </ant>
            </then>
        </if>   
            
        <stringutil string="${object.name}" property="remainder">
            <substring beginindex="1"/>
        </stringutil>
        <stringutil string="${object.name}" property="char1">
            <substring endindex="1"/>
        </stringutil>
        <stringutil string="${char1}" property="upperChar1">
            <uppercase/>
        </stringutil>
        <stringutil string="${char1}" property="lowerChar1">
            <lowercase/>
        </stringutil>
        
        <!-- Check for _ in table name -->
        <removeUnderscores string="${object.name}"/>     
        
        <property name="model.name" value="${upperChar1}${remainder}"/>
        <property name="model.name.lowercase" value="${lowerChar1}${remainder}"/>

        <!--<echo>model.name=${model.name}</echo>
        <echo>model.name.lowercase=${model.name.lowercase}</echo>-->
    </target>
        
    <macrodef name="removeUnderscores">
        <attribute name="string"/>
        
        <sequential>
            <stringutil string="@{string}" property="underscore">
                <indexof string="_"/>
            </stringutil>
            <if-ext>
                <bool><isgreaterthan arg1="${underscore}" arg2="-1"/></bool>

                <stringutil string="@{string}" property="remainder">
                    <substring beginindex="${underscore}"/>
                </stringutil>
                <stringutil string="${remainder}" property="remainder">
                    <substring beginindex="1"/>
                </stringutil>
                <stringutil string="${remainder}" property="char1">
                    <substring endindex="1"/>
                </stringutil>
                <stringutil string="${char1}" property="upperChar1">
                    <uppercase/>
                </stringutil>
                <stringutil string="${remainder}" property="remainder">
                    <substring beginindex="1"/>
                </stringutil>
                <stringutil string="@{string}" property="beginning">
                    <substring endindex="${underscore}"/>
                </stringutil>
                <stringutil string="${beginning}" property="firstChar">
                    <substring endindex="1"/>
                    <uppercase/>
                </stringutil>
                <stringutil string="${beginning}" property="beginning">
                    <substring beginindex="1"/>
                </stringutil>
                
                <removeUnderscores string="${firstChar}${beginning}${upperChar1}${remainder}"/>                
                <property name="model.name" value="${firstChar}${beginning}${upperChar1}${remainder}"/>
                
                <stringutil string="${model.name}" property="remainder">
                    <substring beginindex="1"/>
                </stringutil>
                <stringutil string="${model.name}" property="char1">
                    <substring endindex="1"/>
                </stringutil>
                <stringutil string="${char1}" property="upperChar1">
                    <uppercase/>
                </stringutil>
                <stringutil string="${char1}" property="lowerChar1">
                    <lowercase/>
                </stringutil>
                
                <property name="model.name.lowercase" value="${lowerChar1}${remainder}"/>                
            </if-ext>
        </sequential>
    </macrodef>
    
    <!-- For some reason, XDoclet is only happy if the tag handler
         is recompiled, hence the clean dependency *shrug* -->
    <target name="default" depends="clean,gen"/>
        
    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

    <target name="compile" depends="init">
        <mkdir dir="${build.dir}"/>
        <javac srcdir="src"
               destdir="${build.dir}"
               debug="${javac.debug}"
               classpathref="xdoclet.classpath"/>
    </target>

    <target name="gen" depends="compile">
        <taskdef name="xdoclet" classname="xdoclet.DocletTask">
            <classpath>
                <path refid="xdoclet.classpath"/>
                <pathelement location="${build.dir}"/>
            </classpath>
        </taskdef>
        <property name="template.dir" value="src"/>
        
        <xdoclet destdir="${build.dir}"
                 excludedtags="@version,@author"
                 force="${xdoclet.force}">
            <fileset dir="${model.src.dir}" includes="**/${model.name}.java"/>

            <configParam name="basePackageName" value="${new.pkg.name}"/>
            <configParam name="appModuleNameSlash" value="${app.module.slash.after}"/>

            <!-- NOTE: You must have {0} in the destinationFile for the class
                       to be available to templates -->   
            
            <!-- DAO Test -->   
            <template templateFile="${template.dir}/detailed/DaoTest.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.test.dir}/dao/${app.package}/dao/{0}DaoTest.java"/>
            <!-- DAO Interface -->   
            <template templateFile="${template.dir}/detailed/Dao.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.src.dir}/dao/${app.package}/dao/{0}Dao.java"/>
            <!-- Hibernate DAO Implementation -->   
            <template templateFile="${template.dir}/detailed/DaoHibernate.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.src.dir}/dao/${app.package}/dao/hibernate/{0}DaoHibernate.java"/>
            <!-- iBatis DAO Implementation -->   
            <template templateFile="${template.dir}/detailed/DaoiBatis.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.src.dir}/dao/${app.package}/dao/ibatis/{0}DaoiBatis.java"/>
            <!-- iBatis SQL Map Configuration -->   
            <template templateFile="${template.dir}/detailed/sql-map-config.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.src.dir}/dao/${app.package}/dao/ibatis/sql-map-config-{0}.xml"/>
            <!-- iBatis SQL Map Implementation -->   
            <template templateFile="${template.dir}/detailed/SQL.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.src.dir}/dao/${app.package}/dao/ibatis/sql/{0}SQL.xml"/>
            <!-- Spring Hibernate DAO Configuration -->   
            <template templateFile="${template.dir}/detailed/context-hibernate.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.src.dir}/dao/${app.package}/dao/hibernate/context-hibernate-{0}.xml"/> 
            <!-- Spring iBatis DAO Configuration -->   
            <template templateFile="${template.dir}/detailed/context-ibatis.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.src.dir}/dao/${app.package}/dao/ibatis/context-ibatis-{0}.xml"/>
            <!-- Manager Test (uses jMock) -->   
            <template templateFile="${template.dir}/detailed/ManagerTest.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.test.dir}/service/${app.package}/service/{0}ManagerTest.java"/>
            <!-- Manager Interface --> 
            <template templateFile="${template.dir}/detailed/Manager.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.src.dir}/service/${app.package}/service/{0}Manager.java"/>
            <!-- Manager Implementation -->    
            <template templateFile="${template.dir}/detailed/ManagerImpl.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.src.dir}/service/${app.package}/service/impl/{0}ManagerImpl.java"/>
            <!-- Spring Manager Configuration --> 
            <template templateFile="${template.dir}/detailed/context-service.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.src.dir}/service/${app.package}/service/context-service-{0}.xml"/>
            <!-- Constant values -->   
            <template templateFile="${template.dir}/Constants.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.src.dir}/dao/${app.package}/Constants-{0}.java"/>
            <!-- Action Test -->
            <template templateFile="${template.dir}/ActionTest.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.test.dir}/web/${app.package}/webapp/action/{0}ActionTest.java"/>
            <!-- Detailed Action -->
            <template templateFile="${template.dir}/detailed/Action.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.src.dir}/web/${app.package}/webapp/action/{0}Action.java"/>
            <!-- Generic Action -->
            <template templateFile="${template.dir}/generic/Action.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/generic/${module.src.dir}/web/${app.package}/webapp/action/{0}Action.java"/>
            <!-- Sample data for DBUnit -->    
            <template templateFile="${template.dir}/sample-data.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/metadata/sql/sample-data-{0}.xml"/>
            <!-- Tests for Canoo -->    
            <template templateFile="${template.dir}/web-tests.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/${module.test.dir}/web/web-tests-{0}.xml"/>    
            <!-- i18n entries -->
            <template templateFile="${template.dir}/FormKeys.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/web/WEB-INF/classes/{0}.properties"/>
            <!-- Form JSP -->
            <template templateFile="${template.dir}/Form_jsp.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/web/pages/{0}FormTemp.jsp"/>
            <!-- List JSP -->
            <template templateFile="${template.dir}/List_jsp.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/web/pages/{0}ListTemp.jsp"/>
            <!-- Menu Config -->
            <template templateFile="${template.dir}/menu-config.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/web/WEB-INF/menu-config-{0}.xml"/>
            <!-- Menu JSP -->
            <template templateFile="${template.dir}/menu_jsp.xdt"
                      acceptAbstractClasses="false"
                      prefixWithPackageStructure="false"
                      destinationFile="${gen.dir}/web/pages/menu-{0}.jsp"/>
        </xdoclet>

        <!-- Make first character of JSP filenames lowercase -->
        <move file="${build.dir}/${gen.dir}/web/pages/${model.name}ListTemp.jsp"
            tofile="${build.dir}/${gen.dir}/web/pages/${app.module}/${model.name.lowercase}List.jsp"/>
        <move file="${build.dir}/${gen.dir}/web/pages/${model.name}FormTemp.jsp"
            tofile="${build.dir}/${gen.dir}/web/pages/${app.module}/${model.name.lowercase}Form.jsp"/>
    </target>
   
    <property name="generated.dir" value="${build.dir}/${gen.dir}"/>
    
    <target name="merge-generic" depends="merge-common">
        <echo>Copying all .java files into main project, overwrite="${overwrite}"</echo>
        <property name="install.generic" value="true"/>
        <copy todir="../.." overwrite="${overwrite}" includeEmptyDirs="false">
            <fileset dir="${generated.dir}">
                <include name="test/**/web/**/*.java"/>
                <include name="**/*SQL.xml"/>
                <exclude name="**/Constants-*.java"/>
                <exclude name="**/dao/**/dao/*ib*/*.java"/>
            </fileset>
            <fileset dir="${generated.dir}/generic">
                <include name="**/*.java"/>
                <exclude name="**/dao/**/*.java"/>
            </fileset>
        </copy>

        <antcall target="merge-config">
            <param name="gen.sub.dir" value="/generic"/>
        </antcall>
    </target>

    <target name="merge-detailed" depends="merge-common">
        <delete dir="${generated.dir}/generic"/>
        <echo>Copying all .java files into main project, overwrite="${overwrite}"</echo>
        <copy todir="../.." overwrite="${overwrite}" includeEmptyDirs="false">
            <fileset dir="${generated.dir}">
                <include name="**/*.java"/>
                <include name="**/dao/**/${model.name}Dao.java"/>
                <exclude name="**/Constants-*.java"/>
                <exclude name="generic/**"/>
                <exclude name="**/dao/**/dao/*ib*/*.java"/>
            </fileset>
        </copy>
        
        <antcall target="merge-config">
            <param name="gen.sub.dir" value=""/>
        </antcall>
    </target>

    <target name="merge-common" depends="default">
        <echo>Merging constant values into Constants.java</echo>
        <!-- load snippet -->
        <loadfile property="constants" srcfile="${generated.dir}/${module.src.dir}/dao/${app.package}/Constants-${model.name}.java"/>
        <!-- load constants class -->
        <property name="constantsClass" location="../../${module.src.dir}/dao/${app.package.base}/Constants.java"/>
        <!-- remove previous constants -->
        <replace file="${constantsClass}" token="//${model.name}-START" value="REGULAR-START"/>
        <replace file="${constantsClass}" token="//${model.name}-END" value="REGULAR-END"/>
        <replaceregexp file="${constantsClass}" match="REGULAR-START(?s:.)*REGULAR-END" replace="" flags="g"/>
        <!-- Add to the bottom of the list of constants -->
        <replace file="${constantsClass}" value="${constants}" token="}"/>

        <!-- Append contents of .properties file to application resources -->
        <echo>Adding keys to ApplicationResources.properties</echo>
        <!-- load snippet -->
        <loadfile property="i18n.keys" srcfile="${generated.dir}/web/WEB-INF/classes/${model.name}.properties"/>
        <!-- load properties file -->
        <property name="i18nFile" location="../../web/WEB-INF/classes/ApplicationResources.properties"/>
        <replace file="${i18nFile}" token="# -- ${model.name}-START" value="REGULAR-START"/>
        <replace file="${i18nFile}" token="# -- ${model.name}-END" value="REGULAR-END"/>
        <!-- Add to the bottom of the properties file -->
        <replaceregexp file="${i18nFile}" match="REGULAR-START(?s:.)*REGULAR-END" replace="" flags="g"/>
        <echo file="${i18nFile}" append="true" message="${i18n.keys}"/>
        
        <!-- copy jsp files -->
        <echo>Copying all web files into main project, overwrite="${overwrite}"</echo>
        <copy todir="../../web/pages">
            <fileset dir="${generated.dir}/web/pages" includes="**/${model.name.lowercase}*.jsp"/>
        </copy>
    </target>
            
    <target name="merge-config" depends="merge-tests,merge-menu,merge-hibernate,merge-ibatis">
        <if>
            <not><equals arg1="${install.generic}" arg2="true"/></not>
            <then>
                <echo>Adding manager beans to applicationContext-service.xml</echo>
                <!-- load snippet -->
                <loadfile property="service.context" srcfile="${generated.dir}${gen.sub.dir}/${module.src.dir}/service/${app.package}/service/context-service-${model.name}.xml"/>
                <!-- load config -->
                <property name="serviceConfig" location="../../${module.src.dir}/service/${app.package.base}/service/applicationContext-service.xml"/>
                <!-- remove previous definition -->
                <replace file="${serviceConfig}" token="&lt;!--${model.name}-START--&gt;" value="REGULAR-START"/>
                <replace file="${serviceConfig}" token="&lt;!--${model.name}-END--&gt;" value="REGULAR-END"/>
                <replaceregexp file="${serviceConfig}" match="REGULAR-START(?s:.)*REGULAR-END" replace="" flags="g"/>
                <!-- Add to the bottom of the list of beans -->
                <replace file="${serviceConfig}" value="${service.context}" token="&lt;/beans&gt;"/>
            </then>
        </if>
        <!-- End of merge-config check -->
    </target>
    
    <target name="merge-tests">
        <echo>Merging sample-data into metadata/sql/sample-data.xml</echo>   
        <loadfile property="sample.data" srcfile="${generated.dir}/metadata/sql/sample-data-${model.name}.xml"/>
        <property name="sampleData" location="../../metadata/sql/sample-data.xml"/>
        <replace file="${sampleData}" token="&lt;!--${model.name}-START--&gt;" value="REGULAR-START"/>
        <replace file="${sampleData}" token="&lt;!--${model.name}-END--&gt;" value="REGULAR-END"/>
        <replaceregexp file="${sampleData}" match="REGULAR-START(?s:.)*REGULAR-END" replace="" flags="g"/>
        <!-- Add to the bottom of the list of tables -->
        <replace file="${sampleData}" value="${sample.data}" token="&lt;/dataset&gt;"/>

        <echo>Merging web-tests into test/web/web-tests.xml</echo>   
        <loadfile property="web.tests" srcfile="${generated.dir}/${module.test.dir}/web/web-tests-${model.name}.xml"/>
        <property name="webTests" location="../../${module.test.dir}/web/web-tests.xml"/>
        <replace file="${webTests}" token="&lt;!--${model.name}-START--&gt;" value="REGULAR-START"/>
        <replace file="${webTests}" token="&lt;!--${model.name}-END--&gt;" value="REGULAR-END"/>
        <replaceregexp file="${webTests}" match="REGULAR-START(?s:.)*REGULAR-END" replace="" flags="g"/>

        <!-- Add to the bottom of the list of tests -->
        <replace file="${webTests}" value="${web.tests}" token="&lt;/project&gt;"/>

        <!-- Add to run-all-tests target -->
        <replace file="${webTests}" token=",FileUpload" value=",FileUpload,${model.name}Tests"/>
    </target>
        
    <target name="merge-menu">
        <!-- Add links to main menu and side menu -->
        <echo>Adding links to menus</echo>   
        <loadfile property="menu.config" srcfile="${generated.dir}/web/WEB-INF/menu-config-${model.name}.xml"/>
        <property name="menuConfig" location="../../web/WEB-INF/menu-config.xml"/>
        <replace file="${menuConfig}" token="&lt;!--${model.name}-START--&gt;" value="REGULAR-START"/>
        <replace file="${menuConfig}" token="&lt;!--${model.name}-END--&gt;" value="REGULAR-END"/>
        <replaceregexp file="${menuConfig}" match="REGULAR-START(?s:.)*REGULAR-END" replace="" flags="g"/>
        <!-- Add to the bottom of the list of tests -->   
        <replace file="${menuConfig}" value="${menu.config}" token="    &lt;/Menus&gt;"/>

        <loadfile property="menu.jsp" srcfile="${generated.dir}/web/pages/menu-${model.name}.jsp"/>
        <property name="menuFile" location="../../web/pages/menu.jsp"/>
        <replace file="${menuFile}" token="&lt;!--${model.name}-START--&gt;" value="REGULAR-START"/>
        <replace file="${menuFile}" token="&lt;!--${model.name}-END--&gt;" value="REGULAR-END"/>
        <replaceregexp file="${menuFile}" match="REGULAR-START(?s:.)*REGULAR-END" replace="" flags="g"/>
        <!-- Add to the bottom of the list of menus -->   
        <replace file="${menuFile}" value="${menu.jsp}" token="&lt;/menu:useMenuDisplayer&gt;"/>
    </target>
            
    <target name="merge-hibernate" if="hibernate.jar" unless="install.generic">
        <echo>Copying Hibernate DAOs...</echo>
        <copy todir="../.." overwrite="${overwrite}">
            <fileset dir="${generated.dir}">
                <include name="**/dao/hibernate/**/*.java"/>
            </fileset>
        </copy>
        
        <echo>Adding Hibernate beans to applicationContext-hibernate.xml</echo>
        <!-- load snippet -->
        <loadfile property="hibernate.context" srcfile="${generated.dir}${gen.sub.dir}/${module.src.dir}/dao/${app.package}/dao/hibernate/context-hibernate-${model.name}.xml"/>
        <!-- load config -->
        <property name="hibernateConfig" location="../../${module.src.dir}/dao/${app.package.base}/dao/hibernate/applicationContext-hibernate.xml"/>
        <!-- remove previous definition -->
        <replace file="${hibernateConfig}" token="&lt;!--${model.name}-START--&gt;" value="REGULAR-START"/>
        <replace file="${hibernateConfig}" token="&lt;!--${model.name}-END--&gt;" value="REGULAR-END"/>
        <replaceregexp file="${hibernateConfig}" match="REGULAR-START(?s:.)*REGULAR-END" replace="" flags="g"/>
        <!-- Add to the bottom of the list of beans -->
        <replace file="${hibernateConfig}" value="${hibernate.context}" token="&lt;/beans&gt;"/>
    </target>
    
    <target name="merge-ibatis-config" if="ibatis.jar">
        <echo>Adding iBATIS SqlMap resources to sql-map-config.xml</echo>
        <!-- load snippet -->
        <loadfile property="sqlmap" srcfile="${generated.dir}/${module.src.dir}/dao/${app.package}/dao/ibatis/sql-map-config-${model.name}.xml"/>
        <!-- load config -->
        <property name="sqlmapConfig" location="../../${module.src.dir}/dao/${app.package.base}/dao/ibatis/sql-map-config.xml"/>
        <!-- remove previous definition -->
        <replace file="${sqlmapConfig}" token="&lt;!--${model.name}-START--&gt;" value="REGULAR-START"/>
        <replace file="${sqlmapConfig}" token="&lt;!--${model.name}-END--&gt;" value="REGULAR-END"/>
        <replaceregexp file="${sqlmapConfig}" match="REGULAR-START(?s:.)*REGULAR-END" replace="" flags="g"/>
        <!-- Add to the bottom of the list of resources -->
        <replace file="${sqlmapConfig}" value="${sqlmap}" token="&lt;/sqlMapConfig&gt;"/>
    </target>
    
    <target name="merge-ibatis" depends="merge-ibatis-config" if="ibatis.jar" unless="install.generic">
        <echo>Copying iBATIS DAOs...</echo>
        <copy todir="../.." overwrite="${overwrite}">
            <fileset dir="${generated.dir}">
                <include name="**/*SQL.xml"/>
                <include name="**/dao/ibatis/**/*.java"/>
            </fileset>
        </copy>

        <echo>Adding iBATIS DAO beans to applicationContext-ibatis.xml</echo>
        <!-- load snippet -->
        <loadfile property="ibatis.context" srcfile="${generated.dir}${gen.sub.dir}/${module.src.dir}/dao/${app.package}/dao/ibatis/context-ibatis-${model.name}.xml"/>
        <!-- load config -->
        <property name="ibatisConfig" location="../../${module.src.dir}/dao/${app.package.base}/dao/ibatis/applicationContext-ibatis.xml"/>
        <!-- remove previous definition -->
        <replace file="${ibatisConfig}" token="&lt;!--${model.name}-START--&gt;" value="REGULAR-START"/>
        <replace file="${ibatisConfig}" token="&lt;!--${model.name}-END--&gt;" value="REGULAR-END"/>
        <replaceregexp file="${ibatisConfig}" match="REGULAR-START(?s:.)*REGULAR-END" replace="" flags="g"/>
        <!-- Add to the bottom of the list of beans -->
        <replace file="${ibatisConfig}" value="${ibatis.context}" token="&lt;/beans&gt;"/>
    </target>

    <target name="install" depends="merge-generic"
        description="Generates generic code and copies into main project">
        <echo>Installation completed successfully!</echo>
    </target>   
          
    <target name="install-detailed" depends="merge-detailed"
        description="Generates detailed source code and copies into main project">
        <echo>Installation completed successfully!</echo>
    </target>  
        
    <target name="test-replace" depends="default">
        <echo>Merging constant values into Constants.java</echo>
        <loadfile property="constants"
            srcfile="${generated.dir}/src/dao/${app.package}/Constants-${model.name}.java"/>
            
        <replace file="../../src/dao/${app.package}/Constants.java" 
            token="//${model.name}-START" value="REGULAR-START"/>

        <replace file="../../src/dao/${app.package}/Constants.java" 
            token="//${model.name}-END" value="REGULAR-END"/>

        <replaceregexp file="../../src/dao/${app.package}/Constants.java"
            match="REGULAR-START(?s:.)*REGULAR-END"
            replace="" flags="g"/>

        <replace file="../../src/dao/${app.package}/Constants.java" token="}"/>

        <echo file="../../src/dao/${app.package}/Constants.java" append="true" 
            message="${constants}"/>
    </target>

    <property name="web.framework" value=""/>
    <property name="db.name" value="appfuse"/>
    <property name="new.pkg.name" value="org.appfuse"/>
    <!-- =================================================================== -->
    <!-- Creates new project, copies Person.java to model directory,         -->
    <!-- generates generic persistence code and runs tests.                  -->
    <!-- =================================================================== -->
    <target name="test-detailed" description="Creates new project and generates detailed code">
        <property name="app.name" value="appfuse-appgen2"/>
        <delete dir="../../../${app.name}"/>
        <ant dir="../.." target="new" inheritAll="false">
            <property name="app.name" value="${app.name}"/>
            <property name="db.name" value="${db.name}"/>
            <property name="new.pkg.name" value="${new.pkg.name}"/>
            <property name="web.framework" value="${web.framework}"/>
        </ant>
 
        <!-- Copy test model object into new project -->   
        <copy todir="../../../${app.name}/src">
            <fileset dir="test" includes="**/Person.java"/>
        </copy> 
        <!-- Add the mapping file for Person to applicationContext-hibernate.xml -->
        <replace dir="../../../${app.name}/src">
            <include name="**/applicationContext-hibernate.xml"/>
            <replacetoken><![CDATA[<value>org/appfuse/model/Role.hbm.xml</value>]]></replacetoken>
            <replacevalue><![CDATA[<value>org/appfuse/model/Person.hbm.xml</value>
                <value>org/appfuse/model/Role.hbm.xml</value>]]></replacevalue>
        </replace>  
    
        <!-- New project created, gen code and run tests -->
        <ant dir="../../../${app.name}/extras/appgen" target="install-detailed" inheritAll="false">
            <property name="web.framework" value=""/>
            <property name="appgen.type" value="pojo"/>
            <property name="object.name" value="Person"/>
            <property name="app.module" value=""/>   
        </ant>   
        <ant dir="../../../${app.name}" target="setup-db" inheritAll="false"/>   
        <ant dir="../../../${app.name}" target="test-all" inheritAll="false"/>
    </target>      

    <!-- =================================================================== -->
    <!-- Creates new project, copies Person.java to model directory,         -->
    <!-- generates generic persistence code and runs tests.                  -->
    <!-- =================================================================== -->
    <target name="test" description="Creates new project and generates generic persistence code">
        <property name="app.name" value="appfuse-appgen"/>
        <delete dir="../../../${app.name}"/>
        <ant dir="../.." target="new" inheritAll="false">
            <property name="app.name" value="${app.name}"/>
            <property name="db.name" value="${db.name}"/>
            <property name="new.pkg.name" value="${new.pkg.name}"/>
            <property name="web.framework" value="${web.framework}"/>
        </ant>

        <!-- Copy test model object into new project -->   
        <copy todir="../../../${app.name}/src">
            <fileset dir="test" includes="**/Person.java"/>
        </copy>   
        <!-- Add the mapping file for Person to applicationContext-hibernate.xml -->
        <replace dir="../../../${app.name}/src">
            <include name="**/applicationContext-hibernate.xml"/>
            <replacetoken><![CDATA[<value>org/appfuse/model/Role.hbm.xml</value>]]></replacetoken>
            <replacevalue><![CDATA[<value>org/appfuse/model/Person.hbm.xml</value>
                <value>org/appfuse/model/Role.hbm.xml</value>]]></replacevalue>
        </replace>   
        
        <!-- New project created, gen code and run tests -->
        <ant dir="../../../${app.name}/extras/appgen" target="install" inheritAll="false">
            <property name="web.framework" value=""/>
            <property name="appgen.type" value="pojo"/>
            <property name="object.name" value="Person"/> 
            <property name="app.module" value=""/>               
        </ant>   
        <ant dir="../../../${app.name}" target="setup-db" inheritAll="false"/>   
        <ant dir="../../../${app.name}" target="test-all" inheritAll="false"/>
    </target> 
    
    <!-- =================================================================== -->
    <!-- Creates new project, copies PersonExtended.java to model directory, -->
    <!-- generates generic persistence code and runs tests.                  -->
    <!-- =================================================================== -->
    <target name="test-2wordpojo" 
        description="Creates new project and generates detailed persistence code">
        <property name="app.name" value="appfuse-appgenx"/>
        <delete dir="../../../${app.name}"/>
        <ant dir="../.." target="new" inheritAll="false">
            <property name="app.name" value="${app.name}"/>
            <property name="db.name" value="${db.name}"/>
            <property name="new.pkg.name" value="${new.pkg.name}"/>
            <property name="web.framework" value="${web.framework}"/>
        </ant>

        <!-- Copy test model object into new project -->   
        <copy todir="../../../${app.name}/src">
            <fileset dir="test" includes="**/PersonPlus.java"/>
        </copy>
        <!-- Add the mapping file for Person to applicationContext-hibernate.xml -->
        <replace dir="../../../${app.name}/src">
            <include name="**/applicationContext-hibernate.xml"/>
            <replacetoken><![CDATA[<value>org/appfuse/model/Role.hbm.xml</value>]]></replacetoken>
            <replacevalue><![CDATA[<value>org/appfuse/model/PersonPlus.hbm.xml</value>
                <value>org/appfuse/model/Role.hbm.xml</value>]]></replacevalue>
        </replace>   
        
        <!-- New project created, gen code and run tests -->
        <ant dir="../../../${app.name}/extras/appgen" target="install-detailed" inheritAll="false">
            <property name="web.framework" value=""/>
            <property name="appgen.type" value="pojo"/>
            <property name="object.name" value="PersonPlus"/>   
            <property name="app.module" value=""/>   
        </ant>   
        <ant dir="../../../${app.name}" target="setup-db" inheritAll="false"/>   
        <ant dir="../../../${app.name}" target="test-all" inheritAll="false"/>
    </target>     
 
     <!-- =================================================================== -->
    <!-- Creates new project, copies Department.java to model directory,     -->
    <!-- generates generic persistence code and runs tests. The key element  -->
    <!-- being tested here is the app.module functionality                   -->
    <!-- =================================================================== -->
    <target name="test-appmodule" 
        description="Creates new project and generates detailed persistence code testing the app.module functionality">
        <property name="app.name" value="appfuse-appmodule"/>
        <delete dir="../../../${app.name}"/>
        <ant dir="../.." target="new" inheritAll="false">
            <property name="app.name" value="${app.name}"/>
            <property name="db.name" value="${db.name}"/>
            <property name="new.pkg.name" value="${new.pkg.name}"/>
            <property name="web.framework" value="${web.framework}"/>
        </ant>

        <!-- Copy test model object into new project -->   
        <copy todir="../../../${app.name}/src">
            <fileset dir="test" includes="**/Department.java"/>
        </copy>   
        <!-- Add the mapping file for Department to applicationContext-hibernate.xml -->
        <replace dir="../../../${app.name}/src">
            <include name="**/applicationContext-hibernate.xml"/>
            <replacetoken><![CDATA[<value>org/appfuse/model/Role.hbm.xml</value>]]></replacetoken>
            <replacevalue><![CDATA[<value>org/appfuse/organization/model/Department.hbm.xml</value>
                <value>org/appfuse/model/Role.hbm.xml</value>]]></replacevalue>
        </replace>     
        
        <!-- New project created, gen code and run tests -->
        <ant dir="../../../${app.name}/extras/appgen" target="install-detailed" inheritAll="false">
            <property name="web.framework" value="${web.framework}"/>
            <property name="appgen.type" value="pojo"/>
            <property name="object.name" value="Department"/>   
            <property name="app.module" value="organization"/>
        </ant>   
        <ant dir="../../../${app.name}" target="setup-db" inheritAll="false"/>   
        <ant dir="../../../${app.name}" target="test-all" inheritAll="false"/>
    </target>     
 
    <target name="test-all" depends="test"
        description="Tests generic and detailed code generation methods">  
        <antcall target="test-detailed" inheritAll="false"/>
        <antcall target="test-appmodule" inheritAll="false"/>
    </target>
</project>




