<?xml version="1.0"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  The ASF licenses this file to You
  under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License.
  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.  For additional information regarding
  copyright in this work, please see the NOTICE file in the top level
  directory of this distribution.-
-->
<!DOCTYPE project [
    <!ENTITY properties            SYSTEM "properties.xmlf"> 
    <!ENTITY custom-ant            SYSTEM "custom/custom-ant.xmlf">
    <!ENTITY custom-jars           SYSTEM "custom/custom-jars.xmlf">
    <!ENTITY custom-gen-business   SYSTEM "custom/custom-gen-business.xmlf">
    <!ENTITY custom-build-business SYSTEM "custom/custom-build-business.xmlf">
    <!ENTITY custom-build-web      SYSTEM "custom/custom-build-web.xmlf">
    <!ENTITY custom-gen-web        SYSTEM "custom/custom-gen-web.xmlf">
    <!ENTITY custom-src-web        SYSTEM "custom/custom-src-web.xmlf">
    <!ENTITY custom-web            SYSTEM "custom/custom-web.xmlf">
    <!ENTITY custom-src-tests      SYSTEM "custom/custom-src-tests.xmlf">
    <!ENTITY custom-dbscripts      SYSTEM "custom/custom-dbscripts.xmlf">
    <!ENTITY custom-pre-dbtest     SYSTEM "custom/custom-pre-dbtest.xmlf">
    <!ENTITY custom-post-dbtest    SYSTEM "custom/custom-post-dbtest.xmlf">
]>
<!-- ********************************************************************* -->
<!-- Ant build script for Roller main branch -->
<!-- Author: David M Johnson -->
<!-- ********************************************************************* -->
<project name="roller" default="usage">

<!-- Because we don't want to allow release builds to be done with Java 1.5 (yet) -->
<available classname="java.lang.ProcessBuilder" property="java15.present" />

<!-- Bring in properties.xml -->
&properties;

<!-- Bring in custom properties and targets -->
&custom-ant;

<target name="usage" description="Print usage for key targets">
<echo>
Key Targets:
                all - Build all: gen wrappers/forms, compile, gen web, gen O/R mappings, stage webapp
              build - Same as 'all' but NO code gen
       stage-webapp - Build almost all: compile, gen web, gen O/R mappings, stage webapp
     apache-release - Build binary and source release files
              clean - Blow away all generated code and all byte code
            rebuild - Clean and build all

              tests - Build and run all JUnit tests
        build-tests - Build all JUnit tests
      test-business - Start DB, run business layer tests, stop DB 
  test-presentation - Run presentation layer tests 
         test-utils - Run utility tests 

           start-db - Start test DB
            init-db - Initialize a running test DB
            stop-db - Stop test DB

               docs - Build all docs 
            javadoc - Build javadocs 
         velocidocs - Build velocidocs 

              usage - Print this help text...
</echo>
</target>

<!-- ================================================ -->
<!-- Meta targets -->
<!-- ================================================ -->
<target name="all" depends="generate,stage-webapp" description="Build all">
</target>

<target name="build" depends="copy-webapp" description="Compile code and copy files, no code generation">
</target>

<target name="rebuild" depends="clean,all" description="Clean and build all">
</target>

<target name="clean" description="Clean out build and dist directory">
    <delete dir="${ro.build}" />
    <delete dir="${ro.dist}" />
</target>

<!-- ********************************************************************* -->
<!-- XDoclet code generation -->
<!-- ********************************************************************* -->

<target name="generate" depends="gen-wrappers,gen-forms" >
</target>

<!-- ============================================== -->
<!-- generate code/files for the business layer -->
<target name="gen-business" description="Generate business layer resources">

    <taskdef name="hibernatedoclet"
        classname="xdoclet.modules.hibernate.HibernateDocletTask"
        classpathref="xdoclet.path" />

    <!-- generate hibernate files -->
    <hibernatedoclet
        destdir="${build.compile.business}"
        mergedir="./metadata/xdoclet"
        excludedtags="@version,@author"
        addedtags="@xdoclet-generated at ${TODAY}"
        force="true">
        
	<fileset dir="${ro.src}" includes="org/apache/roller/pojos/WeblogTemplate.java" />
        <fileset dir="${ro.src}" includes="org/apache/roller/pojos/*Data.java" />
        <fileset dir="${ro.src}" includes="org/apache/roller/pojos/*Assoc.java" />
        
        <hibernate validatexml="true" version="3.0"/>
        
    </hibernatedoclet>
    
    <!-- allow for custom generation work -->
    &custom-gen-business;
    
</target>


<!-- ============================================== -->
<!-- Generate pojo wrappers -->
<target name="gen-wrappers" description="XDoclet generate pojo wrappers">

    <!-- Define the XDoclet task -->
    <taskdef  name="xdoclet" classname="xdoclet.DocletTask"
        classpathref="xdoclet.path" />
    
    <xdoclet destdir="${build.generated.business}">
        
        <packageSubstitution packages="pojos" substituteWith="pojos.wrapper"/>
        
        <fileset dir="${ro.src}">
            <!-- 
                it may be easier to glob using *Data.java at some point, but
                for now that will generate a lot of unneeded classes.
                
                maybe we can extend the process to only wrap classes that have
                methods tagged with @roller.wrapPojoMethod ??
            -->
            <include name="org/apache/roller/pojos/BookmarkData.java"/>
            <include name="org/apache/roller/pojos/CommentData.java"/>
            <include name="org/apache/roller/pojos/EntryAttributeData.java"/>
            <include name="org/apache/roller/pojos/FolderData.java"/>
            <include name="org/apache/roller/pojos/RefererData.java"/>
            <include name="org/apache/roller/pojos/Template.java"/>
            <include name="org/apache/roller/pojos/UserData.java"/>
            <include name="org/apache/roller/pojos/WeblogEntryData.java"/>
            <include name="org/apache/roller/pojos/WeblogEntryTagData.java"/>        	
            <include name="org/apache/roller/pojos/WeblogCategoryData.java"/>
            <include name="org/apache/roller/pojos/SiteTagAggregateData.java"/>          	
            <include name="org/apache/roller/pojos/WebsiteData.java"/>
        </fileset>

        <template 
            destinationFile="{0}Wrapper.java"
            templateFile="metadata/xdoclet/pojo_wrapper.xdt"
            subTaskName="Pojo Wrappers" />
    </xdoclet>
        
</target>


<!-- ============================================== -->
<!-- generate Struts forms -->
<target name="gen-forms" description="XDoclet generate form beans">

    <!-- Define the XDoclet xdoclet task -->
    <taskdef  name="ejbdoclet" classname="xdoclet.modules.ejb.EjbDocletTask"
        classpathref="xdoclet.path" />
        
    <mkdir dir="${build.generated.web}"/>

    <!-- Use EJBDoclet to generate Struts forms -->
    <ejbdoclet destdir="${build.generated}/unused" excludedtags="@version,@author">
        <fileset dir="${ro.src}" includes="org/apache/roller/pojos/WeblogTemplate.java" />
        <fileset dir="${ro.src}" includes="org/apache/roller/pojos/*Data.java" />

        &custom-gen-web;
     
        <!-- Generate Struts forms -->
        <strutsform destdir="${build.generated.web}"
            prefixWithPackageStructure="no"
            templateFile="./metadata/xdoclet/struts_form.xdt">

            <!-- into the org.apache.roller.ui.authoring.struts.forms package -->
            <packageSubstitution packages="pojos"
                substituteWith="ui.authoring.struts.forms"/>
        </strutsform>

        <!-- We are not actually generating data objects, but using the
             dataobject subtask allows the strutsform subtask to add nice
             constructors and setData methods to Struts forms -->
        <dataobject destdir="${ro.build}/unused" pattern="{0}" />

    </ejbdoclet>

    <!-- Change Struts form names from *DataForm.java to *Form.java  -->
    <replace dir="${build.generated.web}/org/apache/roller/ui/authoring/struts/forms"
        token="DataForm" value="Form"/>
    <move      todir="${build.generated.web}/org/apache/roller/ui/authoring/struts/forms">
        <fileset dir="${build.generated.web}/org/apache/roller/ui/authoring/struts/forms" >
            <include name="*DataForm.java"/>
            <include name="*ConfigForm.java" />
        </fileset>
        <mapper type="glob" from="*DataForm.java" to="*Form.java"/>
    </move>
    
</target>


<!-- ============================================== -->
<!-- Generate web deployment descriptors -->
<target name="gen-web" description="XDoclet generate web depoyment descriptors">

    <!-- Define the XDoclet webdoclet task -->
    <taskdef  name="webdoclet" classname="xdoclet.modules.web.WebDocletTask"
        classpathref="xdoclet.path" />

    <!-- Use WebDoclet to web.xml, struts-config.xml, and TLDs -->
    <mkdir dir="${build.webapp}/WEB-INF"/>
    <mkdir dir="${build.compile.web}/META-INF/tlds"/>

    <webdoclet force="true"
        destdir="${build.webapp}/WEB-INF"
        mergedir="./metadata/xdoclet"
        excludedtags="@version,@author">
        
        <fileset dir="${ro.src}">
            <!-- Speed up XDoclet by limiting number of files it has to process -->
            <include name="**/*Action.java" />
            <include name="**/*Filter.java" />
            <include name="**/*Form.java" />
            <include name="**/*FormEx.java" />
            <include name="**/*Servlet.java" />
            <include name="**/*Tag.java" />
            <include name="org/apache/roller/ui/**/actions/*.java" />
            <include name="org/apache/roller/ui/core/RollerContext.java" />
            <include name="org/apache/roller/ui/core/RollerSession.java" />
            <exclude name="**/LinkTag**" />
            <exclude name="**/LinkParamTag**" />
        </fileset>
        <fileset dir="${build.generated.web}">
            <include name="**/*Form.java" />
        </fileset>
        
        &custom-gen-web;
        
        <!-- web.xml config -->
        <deploymentdescriptor servletspec="2.4"
             destdir="${build.webapp}/WEB-INF"
             sessiontimeout="30"
             displayname="Roller Weblogger" />
        
        <!-- jsp taglib descriptor config -->
        <jsptaglib jspversion="1.2" filename="roller.tld" shortname="roller"
            uri="http://www.rollerweblogger.org/tags"
            destdir="${build.webapp}/WEB-INF/classes/META-INF/tlds" />
            
        <!-- struts struts-config.xml -->
        <strutsconfigxml destdir="${build.webapp}/WEB-INF"
            validatexml="true" mergedir="./metadata/xdoclet" version="1.1" />
        
        <!-- struts validation.xml -->
        <strutsvalidationxml/>

    </webdoclet>

</target>

        
<!-- ********************************************************************* -->
<!-- Compile and jar Business Tier classes -->
<!-- ********************************************************************* -->


<target name="build-business">
    
    <mkdir dir="${build.generated.business}"/>
    <mkdir dir="${build.compile.business}"/>
    <mkdir dir="${build.lib}"/>
    
    <tstamp>
        <format property="ro.buildTime" pattern="yyyyMMddhhmmss" />
    </tstamp>

    <echo file="${build.compile.business}/version.properties">
ro.version=${ro.version}
ro.buildTime=${ro.buildTime}
ro.buildUser=${user.name}
    </echo>
    
    <!-- compile roller business classes -->
    <javac destdir="${build.compile.business}"
        excludes="org/apache/roller/ui/**, org/apache/roller/webservices/**, org/apache/roller/planet/**"
        debug="${build.debug}" 
        source="${build.sourcelevel}"
        deprecation="${build.deprecation}">
        
        <src path="${ro.src}" />
        <src path="${build.generated.business}"/>
        
        <classpath>
            <path refid="business.path"/>
            &custom-jars;
        </classpath>
    </javac>
    
    <!-- Copy resources -->
    <copy todir="${build.compile.business}">
        <fileset dir="${ro.src}" 
            excludes="**/*.java, **/*.html, **/*.png, org/apache/roller/ui/**, org/apache/roller/webservices/**, org/apache/roller/planet/**" />
        <fileset dir="${build.generated.business}" excludes="**/*.java" />
    </copy>
    
    <!-- allow for custom build work -->
    &custom-build-business;
    
    <!-- Jar up the business layer -->
    <jar basedir="${build.compile.business}"
        jarfile="${build.lib}/roller-business.jar"/>

</target>


<!-- ********************************************************************* -->
<!-- Compile and jar Presentation Tier classes -->
<!-- ********************************************************************* -->

<target name="build-web" depends="build-business" >

    <mkdir dir="${build.compile.web}" />
    
    <javac debug="${build.debug}" 
        source="${build.sourcelevel}"
        destdir="${build.compile.web}"
        includes="org/apache/roller/ui/**, org/apache/roller/webservices/**, org/apache/roller/planet/**" >
        
        <src path="${ro.src}"  />
        <src path="${build.generated.web}"/>
        &custom-src-web;
        <classpath>
            <path refid="presentation.path"/>
            <fileset dir="${build.lib}" includes="*.jar" />
            &custom-jars;
        </classpath>
    </javac>
    
    <!-- Copy in resources -->
    <copy todir="${build.compile.web}">
        <fileset dir="${ro.src}">
            <include name="**/*.properties"/>
            <include name="**/*.tpl"/>
            <include name="**/*.vm"/>
        </fileset>
    </copy>
	
	&custom-build-web;
    
    <!-- Jar up web classes -->
    <jar jarfile="${build.lib}/roller-web.jar">
        <fileset dir="${build.compile.web}" excludes="**/tomcat/**"/>
    </jar>
    
</target>

    <!-- ============================================== -->
    <!-- create distributable components -->
    <target name="dist" depends="stage-webapp" description="Create Roller Weblogger distributables">
        
        <!-- distributable libraries -->
        <mkdir dir="${ro.dist}/lib" />
        <copy todir="${ro.dist}/lib" >
            <fileset dir="${build.lib}" />
        </copy>
        
        <!-- distributable WAR file -->
        <mkdir dir="${ro.dist}/webapp" />
        <jar destfile="${ro.dist}/webapp/roller-weblogger.war"
             basedir="${build.webapp}" />
             
    </target>
    
    
<!-- ********************************************************************* -->
<!-- Stage web application -->
<!-- ********************************************************************* -->
	
<target name="stage-webapp" depends="gen-business, build-business, build-web, gen-dbscripts, copy-webapp, gen-web" description="Stage webapp, including jars">
</target>
    
<target name="copy-webapp" depends="build-web" description="Stage webapp without code generation">

    <mkdir dir="${build.webapp}/WEB-INF/lib"/>
    <mkdir dir="${build.webapp}/WEB-INF/tlds"/>

    <!-- Copy WEB-INF contents to staging -->
    <copy todir="${build.webapp}/WEB-INF">
        <fileset dir="${tools.struts}/lib" includes="validator-rules.xml"/>
    </copy>

    <!-- Copy other jars -->
    <copy todir="${build.webapp}/WEB-INF/lib">
        <fileset dir="${build.lib}" />
        <fileset dir="./contrib/lib" />
        <fileset refid="base.jars" />
        <fileset refid="presentation.jars" />
        <fileset refid="hibernate.jar" />
        <fileset refid="hibernate.jars" />
        <fileset refid="commons.jars" />
        <fileset refid="struts.jars" />
        <fileset refid="spring.jars" /> 
        <fileset refid="jstl.jars" />
        
        <fileset refid="roller-planet.jars" />
        
        <!-- include custom jars -->
        &custom-jars;
    </copy>

    <!-- Copy DTDs and TLDs  -->
    <copy todir="${build.webapp}/WEB-INF/tlds">
        <fileset dir="${ro.tools}/lib" includes="*.tld"/>
    </copy>

    <!-- Copy web contents to staging, plus README files. -->
    <copy todir="${build.webapp}">
        <fileset dir="./web">
            <include name="**/*"/>
            <exclude name="**/codewright*/**"/>
            <exclude name="**/*.bak"/>
            <exclude name="**/*~"/>
        </fileset>
    </copy>
    
    <!-- Copy docs to staging -->
    <copy todir="${build.webapp}/roller-ui/docs">
        <fileset dir="${basedir}/docs">
            <include name="examples/**" />
            <include name="userguide/**" />
            <exclude name="installguide/**" />
            <exclude name="**/old/**" />
        </fileset>
    </copy>
    
    <!-- copy database script files -->
    <copy todir="${build.webapp}/WEB-INF/dbscripts">
        <fileset dir="${build.dbscripts}" />
    </copy>
    
    <!-- apply custom web task -->
    &custom-web;

</target>


    <!-- ********************************************************************* -->
    <!-- Create different versions of database setup script                    -->
    <!-- With this approach we won't have to expand the script all the time.   -->
    <!-- ********************************************************************* -->
    
    <!-- generate database scripts -->
    <target name="gen-dbscripts">
        
        <mkdir dir="${build.dbscripts}" />
        
        <!-- need a directory for each db to exist before generation can happen -->
        <mkdir dir="${build.dbscripts}/db2" />
        <mkdir dir="${build.dbscripts}/derby" />
        <mkdir dir="${build.dbscripts}/hsqldb" />
        <mkdir dir="${build.dbscripts}/mssql" />
        <mkdir dir="${build.dbscripts}/mysql" />
        <mkdir dir="${build.dbscripts}/oracle" />
        <mkdir dir="${build.dbscripts}/postgresql" />
        
        <taskdef name="texen" 
                 classname="org.apache.velocity.texen.ant.TexenTask"
                 classpath="${ro.tools}/lib/velocity-dep-1.4.jar:${basedir}/metadata/database/:${basedir}/metadata/database/tmpls/" />
                 
        <texen
            controlTemplate="control.vm" 
            contextProperties="${basedir}/metadata/database/dbscripts.properties"
            useClasspath="true"
            outputDirectory="${build.dbscripts}" 
            outputFile="README.txt" />
            
        <!-- just copy over the droptables script -->
        <copy todir="${build.dbscripts}" file="${basedir}/metadata/database/droptables.sql" />
        
    </target>


<!-- ********************************************************************* -->
<!-- Generate Javadocs and Velocidocs -->
<!-- ********************************************************************* -->
	
<target name="docs" depends="javadoc,velocidoc" >
    <copy todir="${build.javadoc}">
        <fileset dir="${build.velocidoc}/docs">
            <include name="*.css"/>
        </fileset>
    </copy>
</target>

<target name="javadoc">
    <mkdir dir="${build.javadoc}"/>
    <javadoc
        doctitle="Javadocs: Apache Roller ${ro.version}"        
        bottom="Copyright 2007 Apache Software Foundation"
        classpathref="javadoc.path"
        destdir="${build.javadoc}"
        private="false"
        version="false"
        verbose="false"
        windowtitle="Javadocs: Apache Roller - Weblogger ${ro.version}">
        <sourcepath>
            <pathelement path="./src"/>
            <pathelement path="${ro.build}/generated/business"/>
            <pathelement path="${ro.build}/generated/presentation"/>
        </sourcepath>
        <packageset dir="src" defaultexcludes="yes">
          <include name="org/apache/roller/**" />
        </packageset>
        <link href="http://java.sun.com/j2se/1.4/docs/api/"/>
        <link href="http://java.sun.com/products/servlet/2.3/javadoc/"/>
        <link href="http://jakarta.apache.org/struts/doc-1.0.2/api"/>
    </javadoc>
    <copy todir="${build.javadoc}">
        <fileset dir="${basedir}/src">
            <include name="**/roller*.png"/>
        </fileset>
    </copy>
</target>
	
<target name="velocidoc">
    <mkdir dir="${build.velocidoc}/temp"/>
    <copy todir="${build.velocidoc}/temp">
        <fileset dir="./web/WEB-INF/velocity/">
            <include name="weblog.vm" />
            <include name="feeds.vm" />
        </fileset>
    </copy>
    <mkdir dir="${build.velocidoc}/docs"/>
    <java fork="true" jar="${ro.tools}/buildtime/velocidoc-app.jar">
        <arg line="-s ${build.velocidoc}/temp \
           -d ${build.velocidoc}/docs \
           -t ${ro.tools}/buildtime/velocidoc-templates/ \
           -c ${ro.tools}/buildtime/velocidoc-templates/control.vm "/>
    </java>
</target>


<!-- ********************************************************************* -->
<!-- Create Binary Releases -->
<!-- ********************************************************************* -->


<target name="apache-release" depends="apache-binary,apache-sources">
</target>


<!-- ********************************************************************* -->
<!-- Create Binary Release -->
<!-- ********************************************************************* -->

<target name="stage-binary" depends="version-check" >
    
    <!-- copy in release documents -->
    <copy todir="${build.dist.binary}">
        <fileset dir="${basedir}">
            <include name="docs/**" />
            <include name="CHANGES.txt" />
            <include name="LICENSE.txt" />
            <include name="NOTICE.txt" />
            <include name="README.txt" />
            
            <exclude name="**/codewright*/**"/>
            <exclude name="docs/installguide/old/**"/>
            <exclude name="docs/userguide/old/**"/>
            <exclude name="docs/testing/**"/>
            <exclude name="**/CVS/**"/>
            <exclude name="**/*.bak"/>
            <exclude name="**/*-hide"/>
            <exclude name="**/*.diff"/>
            <exclude name="**/*.patch"/>
            <exclude name="**/*~"/>
            <exclude name="**/*.#*"/>
            <exclude name="**/WS_FTP.LOG"/>
            <exclude name="**/.nbattrs"/>
        </fileset>
    </copy>
    
    <!-- and of course we'll want the webapp too -->
    <copy todir="${build.dist.binary}/webapp/roller">
        <fileset dir="${build.webapp}" />
    </copy>

</target>


<target name="dist-binary" depends="stage-binary">
    
    <mkdir dir="${ro.dist}" />
    
    <!-- Tar and GZip the binary release -->
    <tar destfile="${ro.dist}/roller-${ro.version}.tar.gz"
         longfile="gnu"
         compression="gzip">
        
        <tarfileset dir="${build.dist.binary}" prefix="apache-roller-${ro.version}" />
    </tar>
    
</target>


<target name="apache-binary" depends="stage-binary">
    
    <mkdir dir="${ro.dist}" />
    
    <!-- Tar and GZip the apache sources release -->
    <tar destfile="${ro.dist}/apache-roller-${ro.version}.tar.gz"
         longfile="gnu"
         compression="gzip">
        
        <!-- don't include unshippables in apache release -->
        <tarfileset dir="${build.dist.binary}"
                    prefix="apache-roller-${ro.version}">
            <exclude name="webapp/roller/WEB-INF/lib/hibernate3.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/asm.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/asm-attrs.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/cglib-2.1.3.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/dom4j-1.6.1.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/ehcache-1.1.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/jdbc2_0-stdext.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/jta.jar" />
        </tarfileset>
    </tar>
    
    <zip destfile="${ro.dist}/apache-roller-${ro.version}.zip">        
        <!-- don't include unshippables in apache release -->
        <zipfileset dir="${build.dist.binary}"
                    prefix="apache-roller-${ro.version}">
            <exclude name="webapp/roller/WEB-INF/lib/hibernate3.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/asm.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/asm-attrs.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/cglib-2.1.3.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/dom4j-1.6.1.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/ehcache-1.1.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/jdbc2_0-stdext.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/jta.jar" />
        </zipfileset>
    </zip>
    
    <!-- Tar and GZip the apache binary unshippables -->
    <tar destfile="${ro.dist}/required-jars-roller-${ro.version}.tar.gz"
         longfile="gnu"
         compression="gzip">
        
        <!-- only include unshippables -->
        <tarfileset dir="${build.dist.binary}"
                    prefix="apache-roller-${ro.version}">
            <include name="webapp/roller/WEB-INF/lib/hibernate3.jar" />
            <include name="webapp/roller/WEB-INF/lib/asm.jar" />
            <include name="webapp/roller/WEB-INF/lib/asm-attrs.jar" />
            <include name="webapp/roller/WEB-INF/lib/cglib-2.1.3.jar" />
            <include name="webapp/roller/WEB-INF/lib/dom4j-1.6.1.jar" />
            <include name="webapp/roller/WEB-INF/lib/ehcache-1.1.jar" />
            <include name="webapp/roller/WEB-INF/lib/jdbc2_0-stdext.jar" />
            <include name="webapp/roller/WEB-INF/lib/jta.jar" />
        </tarfileset>
    </tar>
    
    <zip destfile="${ro.dist}/required-jars-roller-${ro.version}.zip" >
        <zipfileset dir="${build.dist.binary}"
                    prefix="apache-roller-${ro.version}">
            <include name="webapp/roller/WEB-INF/lib/hibernate3.jar" />
            <include name="webapp/roller/WEB-INF/lib/asm.jar" />
            <include name="webapp/roller/WEB-INF/lib/asm-attrs.jar" />
            <include name="webapp/roller/WEB-INF/lib/cglib-2.1.3.jar" />
            <include name="webapp/roller/WEB-INF/lib/dom4j-1.6.1.jar" />
            <include name="webapp/roller/WEB-INF/lib/ehcache-1.1.jar" />
            <include name="webapp/roller/WEB-INF/lib/jdbc2_0-stdext.jar" />
            <include name="webapp/roller/WEB-INF/lib/jta.jar" />  
        </zipfileset>
    </zip>
    
</target>


<!-- ********************************************************************* -->
<!-- Create Source Release -->
<!-- ********************************************************************* -->
	
<target name="stage-sources" depends="version-check">

    <copy todir="${build.dist.sources}">
        <fileset dir="${basedir}">
            <include name="src/**" />
            <include name="tests/**" />
            <include name="testdata/**" />
            <include name="metadata/**" />
            <include name="personal/**" />
            <include name="custom/**" />
            <include name="contrib/**" />
            <include name="web/**" />
            <include name="docs/**" />
            <include name="tools/**" />
            <include name="ant.properties" />
            <include name="build.bat" />
            <include name="build.sh" />
            <include name="build.xml" />
            <include name="properties.xmlf" />
            <include name="CHANGES.txt" />
            <include name="LICENSE.txt" />
            <include name="NOTICE.txt" />
            <include name="README.txt" />
            
            <exclude name="**/codewright*/**"/>
            <exclude name="docs/installguide/old/**"/>
            <exclude name="docs/userguide/old/**"/>
            <exclude name="**/CVS/**"/>
            <exclude name="**/*.bak"/>
            <exclude name="**/*-hide"/>
            <exclude name="**/*.diff"/>
            <exclude name="**/*.patch"/>
            <exclude name="**/*~"/>
            <exclude name="**/*.#*"/>
            <exclude name="**/WS_FTP.LOG"/>
            <exclude name="**/.nbattrs"/>
        </fileset>
    </copy>
    
</target>


<target name="dist-sources" depends="stage-sources">
    
    <mkdir dir="${ro.dist}" />
    
    <!-- Tar and GZip the sources release -->
    <tar destfile="${ro.dist}/roller-src-${ro.version}.tar.gz"
         longfile="gnu"
         compression="gzip">
        
        <tarfileset dir="${build.dist.sources}" prefix="apache-roller-src-${ro.version}" />
    </tar>

</target>


<target name="apache-sources" depends="stage-sources">
    
    <mkdir dir="${ro.dist}" />
    
    <!-- Tar and GZip the apache binary release -->
    <tar destfile="${ro.dist}/apache-roller-src-${ro.version}.tar.gz"
         longfile="gnu"
         compression="gzip">
        
        <!-- don't include unshippables in apache release -->
        <tarfileset dir="${build.dist.sources}"
                    prefix="apache-roller-src-${ro.version}">
            <exclude name="**/hibernate-3.1/**" />
            <exclude name="**/activation.jar" />
            <exclude name="**/mail.jar" />
            <exclude name="**/ejb-1.1.jar" />
        </tarfileset>
    </tar>
    
    <zip destfile="${ro.dist}/apache-roller-src-${ro.version}.zip">
        
        <!-- don't include unshippables in apache release -->
        <zipfileset dir="${build.dist.sources}"
                    prefix="apache-roller-src-${ro.version}">
            <exclude name="**/hibernate-3.1/**" />
            <exclude name="**/activation.jar" />
            <exclude name="**/mail.jar" />
            <exclude name="**/ejb-1.1.jar" />
        </zipfileset>
    </zip>
    
    <!-- Tar and GZip the apache sources unshippables -->
    <tar destfile="${ro.dist}/required-jars-roller-src-${ro.version}.tar.gz"
         longfile="gnu"
         compression="gzip">
        
        <!-- only include unshippables -->
        <tarfileset dir="${build.dist.sources}"
                    prefix="apache-roller-src-${ro.version}">
            <include name="**/hibernate-3.1/**" />
            <include name="**/activation.jar" />
            <include name="**/mail.jar" />
            <include name="**/ejb-1.1.jar" />
        </tarfileset>
    </tar>
    
    <zip destfile="${ro.dist}/required-jars-roller-src-${ro.version}.zip">
        
        <!-- only include unshippables -->
        <zipfileset dir="${build.dist.sources}"
                    prefix="apache-roller-src-${ro.version}">
            <include name="**/hibernate-3.1/**" />
            <include name="**/activation.jar" />
            <include name="**/mail.jar" />
            <include name="**/ejb-1.1.jar" />
        </zipfileset>
    </zip>
    
</target>


<target name="version-check" if="java15.present" >
    <fail message="ERROR: DON'T BUILD RELEASES WITH JAVA 1.5 (yet)" />
</target>


<!-- ********************************************************************* -->
<!-- TEST targets -->
<!-- ********************************************************************* -->
	
<target name="tests" depends="build-tests,test-business,test-presentation,test-utils" description="All unit tests" >
</target>


<target name="clean-tests" description="Removes test build and result artifacts and reports">
  <delete dir="${build.tests}"/>
  <delete dir="${ro.build}/build/reports"/>
</target>


<target name="build-tests" depends="build-web, gen-dbscripts" description="Build unit tests">
    
    <mkdir dir="${build.tests}" />
    <mkdir dir="${build.tests}/logs" />
    <mkdir dir="${build.compile.tests}" />
    
    <!-- compile all test classes -->
    <javac destdir="${build.compile.tests}"
        includeantruntime="false"
        debug="${build.debug}" 
        source="${build.sourcelevel}"
        deprecation="${build.deprecation}">        
        <src path="${ro.tests}" />
        
        &custom-src-tests;
        
        <classpath>
            <path refid="tests.path"/>
            &custom-jars;
        </classpath>
    </javac>
                
    <!-- Copy test resources -->
    <copy todir="${build.compile.tests}">
        <fileset dir="${ro.tests}" 
            excludes="**/*.java, **/*.html, **/*.png" />
    </copy>
    
    <!-- 
    Copy web config files to ${build.tests} to make them available for testing.
    This includes the WEB-INF directory, minus jsps
    -->
    <mkdir dir="${build.tests}/WEB-INF" />
    <copy todir="${build.tests}/WEB-INF">
        <fileset dir="${basedir}/web/WEB-INF">
	    <exclude name="jsps/**" />
        </fileset>
    </copy>

    <!-- 
    Copy custom testing files which will overwrite some config files 
    -->
    <copy todir="${build.tests}">
        <fileset dir="${basedir}/testdata" />
    </copy>
    
    <!-- allow for custom build work -->
    
</target>

<!-- ===================================== -->
<!-- test business -->
	
<target name="test-business" depends="build-tests" description="Back-end tests">

    <mkdir dir="${build.reports}/business/xml"/>
    <mkdir dir="${build.reports}/business/html"/>

    <!-- allow for startup and initialization of test db -->
    <antcall target="${test.db.startTask}" />
    <antcall target="${test.db.initTask}" />
	
    &custom-pre-dbtest;
    
    <junit fork="true" dir="${build.tests}" printsummary="on" showOutput="true">
        <classpath>
            <path refid="tests.run.path"/>
            
            <!-- plus the classpath for jars needed to talk to the test db -->
            <pathelement path="${test.db.cpath}" />
        </classpath>
        
        <!-- needed to satisfy ref in log4j.properties -->
        <jvmarg value="-Dcatalina.base=${build.tests}"/> 
        <jvmarg value="-Dro.build=${ro.build}"/>
        <jvmarg value="-Droller.custom.config=${build.tests}/roller-custom.properties"/>
        <formatter type="xml"/>
        <batchtest toDir="${build.reports}/business/xml" haltonerror="${junit.haltonerror}">
            <fileset dir="${build.compile.tests}">
                
                <!-- core services.  no reliance on users or weblogs -->
                <include name="org/apache/roller/business/CoreBusinessServicesTestSuite.class"/>
                
                <!-- core platform services.  users & weblogs -->
                <include name="org/apache/roller/business/CoreWeblogPlatformTestSuite.class"/>
                
                <!-- core weblog services.  entries, templates, categories, etc -->
                <include name="org/apache/roller/business/CoreWeblogServicesTestSuite.class"/>
                
                <!-- supplemental weblog services.  files, bookmarks, pings, etc -->
                <include name="org/apache/roller/business/SupplementalWeblogServicesTestSuite.class"/>
                
            </fileset>
        </batchtest>
    </junit>
    <junitreport todir="${build.reports}/business/xml">
        <fileset dir="${build.reports}/business/xml">
            <include name="TEST-*.xml"/>
        </fileset>
        <report format="noframes" toDir="${build.reports}/business/html"/>
    </junitreport>
	
    &custom-post-dbtest;
    
    <!-- allow for shutdown of test db -->
    <antcall target="${test.db.stopTask}" />
    
</target>

<!-- ===================================== -->
<!-- test presentation -->
		
<target name="test-presentation" depends="build-tests">
    <mkdir dir="${build.reports}/presentation/xml"/>
    <mkdir dir="${build.reports}/presentation/html"/>
    
    <!-- allow for startup and initialization of test db -->
    <antcall target="${test.db.startTask}" />
    <antcall target="${test.db.initTask}" />

    <junit fork="true" dir="${build.tests}" printsummary="on" showOutput="false">
        <classpath>
            <path refid="tests.run.path"/>
            
            <!-- plus the classpath for jars needed to talk to the test db -->
            <pathelement path="${test.db.cpath}" />
        </classpath>
        
        <!-- needed to satisfy ref in log4j.properties -->
        <jvmarg value="-Dcatalina.base=${build.tests}"/>
        <jvmarg value="-Dro.build=${ro.build}"/>
        <jvmarg value="-Droller.custom.config=${build.tests}/roller-custom.properties"/>
        <formatter type="xml"/>
        <batchtest toDir="${build.reports}/presentation/xml">
            <fileset dir="${build.compile.tests}">
		<include name="org/apache/roller/ui/UIPluginManagerTest.class"/>
                <include name="org/apache/roller/ui/authoring/struts/actions/BookmarksActionTest.class"/>           
                <include name="org/apache/roller/ui/authoring/struts/actions/WeblogEntryActionTest.class"/>           
                <include name="org/apache/roller/webservices/xmlrpc/RollerXmlRpcServerTest.class"/>  
                <include name="org/apache/roller/ui/rendering/velocity/plugins/smileys/SmileysTest.class"/>
            </fileset>
        </batchtest>
    </junit>
    
    <junitreport todir="${build.reports}/presentation/xml">
       <fileset dir="${build.reports}/presentation/xml">
          <include name="TEST-*.xml"/>
       </fileset>
    <report format="noframes" toDir="${build.reports}/presentation/html"/>
    </junitreport>
    
    <!-- allow for shutdown of test db -->
    <antcall target="${test.db.stopTask}" />
    
</target>

<!-- ===================================== -->
<!-- test utils -->

<target name="test-utils" depends="build-tests" >
    <mkdir dir="${build.reports}/utils/xml"/>
    <mkdir dir="${build.reports}/utils/html"/>
    
	<junit fork="true" dir="${build.tests}"  showOutput="true">
        <batchtest toDir="${build.reports}/utils/xml">
            <fileset dir="${build.tests}/WEB-INF/classes">
                <include name="org/apache/roller/util/*Test.class"/>
            </fileset>
        </batchtest>
		<!-- needed to satisfy ref in log4j.properties -->
        <jvmarg value="-Dcatalina.base=."/> 
        <formatter type="xml"/>
        <classpath>
            <path refid="tests.run.path"/>
        </classpath>
    </junit>

	<junitreport todir="${build.reports}/utils/xml">
      <fileset dir="${build.reports}/utils/xml">
        <include name="TEST-*.xml"/>
      </fileset>
      <report format="noframes" toDir="${build.reports}/utils/html"/>
    </junitreport>

</target>

    <target name="test-aapp" depends="test-aapp-sdk, test-aapp-handler"/>
   
    <target name="test-aapp-sdk">
        <mkdir dir="${build.reports}/webservices/adminapi/sdk/xml"/>
        <mkdir dir="${build.reports}/webservices/adminapi/sdk/html"/>

        <junit fork="true" dir="${build.tests}" printsummary="on" showOutput="true">
            <syspropertyset>
                <propertyref builtin="commandline"/>
            </syspropertyset>
            <classpath>
                <path refid="tests.run.path"/>
            </classpath>
            <formatter type="xml"/>
            <batchtest toDir="${build.reports}/webservices/adminapi/sdk/xml">
                <fileset dir="${build.tests}/WEB-INF/classes">
                    <include name="org/apache/roller/webservices/adminapi/sdk/*EntryTest.class"/>
                </fileset>
            </batchtest>
        </junit>
        <junitreport todir="${build.reports}/webservices/adminapi/sdk/xml">
            <fileset dir="${build.reports}/webservices/adminapi/sdk/xml">
                <include name="TEST-*.xml"/>
            </fileset>
            <report format="noframes" toDir="${build.reports}/webservices/adminapi/sdk/html"/>
        </junitreport>
    </target>
    
    <target name="test-aapp-handler">
        <mkdir dir="${build.reports}/webservices/adminapi/xml"/>
        <mkdir dir="${build.reports}/webservices/adminapi/html"/>

        <junit fork="true" dir="${build.tests}" printsummary="on">
            <syspropertyset>
                <propertyref builtin="commandline"/>
            </syspropertyset>
            <classpath>
                <path refid="tests.run.path"/>
            </classpath>
            <formatter type="xml"/>
            <batchtest toDir="${build.reports}/webservices/adminapi/xml">
                <fileset dir="${build.tests}/WEB-INF/classes">
                    <include name="org/apache/roller/webservices/adminapi/*HandlerTest.class"/>
                </fileset>
            </batchtest>
        </junit>
        <junitreport todir="${build.reports}/webservices/adminapi/xml">
            <fileset dir="${build.reports}/webservices/adminapi/xml">
                <include name="TEST-*.xml"/>
            </fileset>
            <report format="noframes" toDir="${build.reports}/webservices/adminapi/html"/>
        </junitreport>
    </target>

<!-- You can specify testClass using -DtestClass=foo -->
<property name="testClass" value="org.apache.roller.business.TaskLockTest"/>
<target name="test-one" depends="build-tests">
    <java classname="junit.textui.TestRunner" fork="yes" failonerror="false">
        <arg value="${testClass}"/>
        <classpath>
            <path refid="tests.run.path"/>
        </classpath>
    </java>
</target>

<!-- ********************************************************************* -->
<!-- EXPERIMENTAL targets -->
<!-- ********************************************************************* -->
	
<!-- EXPERIMENTAL: Run ConsistencyCheck. -->
<target name="consistency-check">
<echo>Use -Ddelete=1 to delete all orphans.
Use -Dverbose=1 to get verbose output.
'delete' and 'verbose' are exclusive, 'delete' wins.
</echo>
    <condition property="command" value="-v">
        <isset property="verbose" />
    </condition>
    <condition property="command" value="-purge">
        <isset property="delete" />
    </condition>
    <java classname="org.apache.roller.business.utils.ConsistencyCheck" fork="yes">
        <arg value="${command}"/>
        <jvmarg value="-Dusername=roller"/>
        <jvmarg value="-Dpassword=tiger"/>
        <classpath>
            <path refid="base.path"/>
            <path location="${ro.build}/lib/rollerbeans.jar"/>
            <path location="${ro.tools}/lib/mm.mysql-2.0.14-bin.jar"/>
        </classpath>
    </java>
</target>
	
<target name="compile-jsps" depends="stage-webapp">
   <mkdir dir="${ro.build}/jspc"/>	
    <taskdef classname="org.apache.jasper.JspC" name="jasper2" > 
    	   <classpath refid="jasper.path"/> 
    </taskdef> 
    <jasper2 validateXml="false" 
        uriroot="${build.webapp}" 
        webXmlFragment="${build.webapp}/WEB-INF/generated_web.xml" 
        outputDir="${ro.build}/jspc" /> 		
    <mkdir dir="${ro.build}/jspc.classes"/>
    <javac source="${build.sourcelevel}" debug="true" srcdir="${ro.build}/jspc" excludes="**/header_jsp.*"
       destdir="${ro.build}/jspc.classes" fork="true">
       <classpath refid="jsp.compile.path"/>
    </javac>
</target>
	    

    <!-- *********************************************************** -->
    <!-- Test db start, init and stop targets -->
    <!-- *********************************************************** -->

    <target name="init-db" description=
            "Initializes built-in database by running drop table and create table">
        
        &custom-post-dbtest;
        
        <sql driver="${test.db.driver}"
             url="${test.db.url}"
             userid="${test.db.username}" 
             password="${test.db.password}"
             src="${build.dbscripts}/droptables.sql" 
             onerror="continue"
             classpath="${test.db.cpath}" />  
        
        <sql driver="${test.db.driver}"
             url="${test.db.url}"
             userid="${test.db.username}" 
             password="${test.db.password}"
             src="${build.dbscripts}/${test.db.name}/createdb.sql"
             onerror="continue"
             classpath="${test.db.cpath}" /> 
        
        &custom-pre-dbtest;
    </target>

    <target name="start-db" description="Starts built-in database">  
        <taskdef name="startdb" classname="org.apache.roller.ant.StartDerbyTask" 
                 classpath="${ro.tools}/buildtime/derby.jar;${ro.tools}/buildtime/derbynet.jar;${build.compile.tests}" />
        <startdb database="${build.tests}/derby-system/roller" port="3219" />
    </target>
    
    <target name="stop-db" description="Stops the built-in database">   
        <taskdef name="stopdb" classname="org.apache.roller.ant.StopDerbyTask" 
                 classpath="${ro.tools}/buildtime/derby.jar;${ro.tools}/buildtime/derbynet.jar;${build.compile.tests}" />
        <stopdb port="3219"/>
    </target>

<!-- ********************************************************************* -->
<!-- Experimental Admin API SDK -->
<!-- ********************************************************************* -->

<!-- build standalone aapp-sdk.jar, for external consumption -->
<target name="aapp-sdk" depends="build">
    <mkdir dir="${build.lib}"/>
    <jar destfile="${build.lib}/roller-aapp-sdk.jar">
        <manifest>
            <attribute name="Manifest-Version" value="${ro.version}"/>
        </manifest>
        <fileset dir="${build.compile.web}">
            <include name="org/apache/roller/webservices/adminapi/sdk/*"/>
        </fileset>        
    </jar>
</target>

    <target name="nothing">
        <!-- this task does nothing and is here so that 
             dynamic task definitions have a no-op choice -->
    </target>

</project>
