<?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-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 code, compile code, stage webapp directory
              build - Same as 'all' but no code gen
       stage-webapp - Build all Java code, 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="stage-webapp" description="Compile only, 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/WeblogCategoryData.java"/>
            <include name="org/apache/roller/pojos/WebsiteData.java"/>
            <include name="org/apache/roller/pojos/PlanetEntryData.java"/>
            <include name="org/apache/roller/pojos/PlanetSubscriptionData.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" depends="gen-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/**"
        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/**" />
        <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/util/rome/**" >
        
        <src path="${ro.src}"  />
        <src path="${build.generated.web}"/>
        &custom-src-web;
        <classpath>
            <path refid="presentation.path"/>
            <path location="${build.compile.business}"/>
            &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>
    
    <!-- Jar up web classes -->
    <jar jarfile="${build.lib}/roller-web.jar">
        <fileset dir="${build.compile.web}" excludes="**/tomcat/**"/>
    </jar>
    
</target>


<!-- ********************************************************************* -->
<!-- Stage web application -->
<!-- ********************************************************************* -->
	
<target name="stage-webapp" depends="build-web,gen-web" description="Stage webapp, including jars">

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

    <!-- Copy database configs to classpath in staging -->
    <copy todir="${build.webapp}/WEB-INF/classes">
        <fileset dir="${basedir}/metadata/database/hibernate" includes="hibernate.cfg.xml"/>
    </copy>

    <!-- 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" />
        
        <!-- 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 database related files -->
    <antcall target="stage-dbscripts" />
    
    <!-- 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>
    
    <!-- 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.   -->
<!-- ********************************************************************* -->
	
<target name="stage-dbscripts">
    
    <property name="dbscripts" value="${build.webapp}/WEB-INF/dbscripts"/>

    <!-- Create database creation script directory -->
     <mkdir dir="${dbscripts}"/>
     <copy todir="${dbscripts}">
         <fileset dir="./metadata/database" includes="droptables.sql"/>
     </copy>
    
     <taskdef name="texen" classname="org.apache.velocity.texen.ant.TexenTask"
         classpath="${basedir}/tools/lib/velocity-dep-1.4.jar" />
     <texen 
         controlTemplate="control.vm" 
         contextProperties="${basedir}/metadata/database/mysql.properties"
         templatePath="${basedir}/metadata/database/" 
         outputDirectory="${build.webapp}/WEB-INF/dbscripts/mysql/" 
         outputFile="README.txt" />
     <texen 
         controlTemplate="control.vm" 
         contextProperties="${basedir}/metadata/database/postgresql.properties"
         templatePath="${basedir}/metadata/database/" 
         outputDirectory="${build.webapp}/WEB-INF/dbscripts/postgresql/" 
         outputFile="README.txt" />
     <texen 
         controlTemplate="control.vm" 
         contextProperties="${basedir}/metadata/database/hsqldb.properties"
         templatePath="${basedir}/metadata/database/" 
         outputDirectory="${build.webapp}/WEB-INF/dbscripts/hsqldb/" 
         outputFile="README.txt" />
     <texen 
         controlTemplate="control.vm" 
         contextProperties="${basedir}/metadata/database/derby.properties"
         templatePath="${basedir}/metadata/database/" 
         outputDirectory="${build.webapp}/WEB-INF/dbscripts/derby/" 
         outputFile="README.txt" />
     <texen 
         controlTemplate="control.vm" 
         contextProperties="${basedir}/metadata/database/db2.properties"
         templatePath="${basedir}/metadata/database/" 
         outputDirectory="${build.webapp}/WEB-INF/dbscripts/db2/" 
         outputFile="README.txt" />
     <texen 
         controlTemplate="control.vm" 
         contextProperties="${basedir}/metadata/database/oracle.properties"
         templatePath="${basedir}/metadata/database/" 
         outputDirectory="${build.webapp}/WEB-INF/dbscripts/oracle/" 
         outputFile="README.txt" />
    <texen 
        controlTemplate="control.vm" 
        contextProperties="${basedir}/metadata/database/mssql.properties"
        templatePath="${basedir}/metadata/database/" 
        outputDirectory="${build.webapp}/WEB-INF/dbscripts/mssql/" 
        outputFile="README.txt" />
</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
        bottom="Copyright (C) David M Johnson"
        classpathref="javadoc.path"
        destdir="${build.javadoc}"
        doctitle="Javadocs: Roller Weblogger ${ro.version}"        
        private="false"
        version="false"
        windowtitle="Javadocs: Roller Weblogger ${ro.version}">
        <sourcepath>
            <pathelement path="./src"/>
            <pathelement path="${ro.build}/generated/src.business"/>
            <pathelement path="${ro.build}/generated/src.presentation"/>
        </sourcepath>
        <packageset dir="src" defaultexcludes="yes">
          <include name="org/apache/roller/**" />
          <exclude name="org/apache/roller/business/prevayler/**" />
        </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"/>
        <link href="http://hibernate.bluemars.net/hib_docs/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/mail.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/activation.jar" />
            <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/mail.jar" />
            <exclude name="webapp/roller/WEB-INF/lib/activation.jar" />
            <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/mail.jar" />
            <include name="webapp/roller/WEB-INF/lib/activation.jar" />
            <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/mail.jar" />
            <include name="webapp/roller/WEB-INF/lib/activation.jar" />
            <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="build-tests" depends="build" description="Build unit tests" >
    
    <delete dir="${build.tests}" failonerror="false" />

    <mkdir dir="${build.tests}" />
    <mkdir dir="${build.tests}/logs" />
    <mkdir dir="${build.tests}/search-index" />
    <mkdir dir="${build.tests}/planet-cache" />
    <mkdir dir="${build.tests}/WEB-INF/classes" />
    <mkdir dir="${build.tests}/WEB-INF/classes/themes" />
    
    <javac srcdir="${ro.tests}"
        source="${build.sourcelevel}"
        destdir="${build.tests}/WEB-INF/classes"
        includeantruntime="false"
        debug="true" optimize="false" verbose="false" deprecation="false">
        &custom-src-tests;
        <classpath>
            <path refid="junit.path"/>
        </classpath>
    </javac>
    
    <!-- register Ant tasks that were just built -->
    <taskdef name="startdb" classname="org.apache.roller.ant.StartHsqldbTask" 
        classpath="${ro.tools}/buildtime/hsqldb.jar;${build.tests}/WEB-INF/classes" />
    <taskdef name="stopdb" classname="org.apache.roller.ant.StopHsqldbTask" 
        classpath="${ro.tools}/buildtime/hsqldb.jar;${build.tests}/WEB-INF/classes" />
    
    <!-- Copy custom testing files -->
    <copy todir="${build.tests}">
        <fileset dir="${basedir}/testdata">
            <include name="**/**"/>
        </fileset>
    </copy>

    <!-- 
    Copy required files to ${build.tests} to make them available for 
    testing without interfering with the "real" build in ${build.webapp}
    -->
    <copy todir="${build.tests}/WEB-INF/classes">
        <fileset dir="${basedir}/web/WEB-INF/classes">
            <include name="App*.properties"/>
            <include name="**/*.vm"/>
	    <exclude name="hibernate.cfg.xml"/>
        </fileset>
    </copy>
    <copy file="${basedir}/web/WEB-INF/classes/roller.properties"
        todir="${build.tests}/WEB-INF/classes/"/>
    <copy file="${build.webapp}/WEB-INF/web.xml"
        todir="${build.tests}/WEB-INF/"/>
    <copy file="${basedir}/web/WEB-INF/classes/rollerRuntimeConfigDefs.xml"
        todir="${build.tests}/WEB-INF/classes/"/>
    <copy file="${basedir}/web/WEB-INF/velocity.properties"
        tofile="${build.tests}/WEB-INF/velocity.properties" />
    <copy file="${basedir}/web/WEB-INF/classes/rome.properties"
        tofile="${build.tests}/WEB-INF/classes/rome.properties" />
    <copy file="${basedir}/web/WEB-INF/classes/blacklist.txt"
        tofile="${build.tests}/WEB-INF/classes/blacklist.txt" />
        	
</target>

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

    <antcall target="start-db" /> 
    <antcall target="init-db" /> 
	
    &custom-pre-dbtest;

    <junit fork="true" dir="${build.tests}" printsummary="on" showOutput="true">
        <classpath>
            <path refid="junit.path"/>
        </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">
            <fileset dir="${build.tests}/WEB-INF/classes">
		<include name="org/apache/roller/business/BookmarkTest.class"/>
		<include name="org/apache/roller/business/UserTest.class"/> 
	        <include name="org/apache/roller/business/WeblogTest.class"/>
	        <include name="org/apache/roller/business/PermissionTest.class"/>
	        <include name="org/apache/roller/business/WeblogPageTest.class"/>
	        <include name="org/apache/roller/business/PingsTest.class"/>
	        <include name="org/apache/roller/business/PropertiesTest.class"/>
	        <include name="org/apache/roller/business/WeblogEntryTest.class"/>
	        <include name="org/apache/roller/business/WeblogCategoryTest.class"/>
	        <include name="org/apache/roller/business/CommentTest.class"/>
		<include name="org/apache/roller/business/FileManagerTest.class"/>
		<include name="org/apache/roller/business/IndexManagerTest.class"/>
	        <include name="org/apache/roller/business/PlanetManagerTest.class"/>
		<include name="org/apache/roller/business/RefererTest.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;
    
    <antcall target="stop-db" /> 

    <echo>Suggested: Run "ant consistency-check".</echo>
</target>

<!-- ===================================== -->
<!-- test presentation -->
		
<target name="test-presentation" depends="build-tests">
    <mkdir dir="${build.reports}/presentation/xml"/>
    <mkdir dir="${build.reports}/presentation/html"/>
    
    <antcall target="start-db" /> 
    <antcall target="init-db" /> 

    <junit fork="true" dir="${build.tests}" showOutput="true">
        <batchtest toDir="${build.reports}/presentation/xml">
            <fileset dir="${build.tests}/WEB-INF/classes">
                <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"/>           
                <!--
                <include name="org/apache/roller/ui/rendering/velocity/plugins/textile/TextileTest.class" /> 
                -->
            </fileset>
        </batchtest>
        <jvmarg value="-Dro.build=${ro.build}"/>
        <jvmarg value="-Dcatalina.base=${build.tests}"/> <!-- needed to satisfy ref in log4j.properties -->
        <jvmarg value="-Droller.custom.config=${build.tests}/roller-custom.properties"/>
        <formatter type="xml"/>
        <classpath>
            <path refid="junit.path"/>
        </classpath>
    </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>
    
    <antcall target="stop-db" /> 
    
</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="junit.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" depends="build-tests">
        <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="junit.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" depends="build-tests">
        <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="junit.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.presentation.velocity.plugins.smileys.SmileysTest"/>
<target name="test-one" depends="build-tests">
    <java classname="junit.textui.TestRunner" fork="yes" failonerror="false">
        <arg value="${testClass}"/>
        <classpath>
            <path refid="junit.path"/>
        </classpath>
    </java>
</target>

<!-- ********************************************************************* -->
<!-- EXAMPLE targets -->
<!-- ********************************************************************* -->
	
<target name="deploy-tomcat" depends="stage-webapp" >
    <ant dir="./personal" target="deploy-tomcat" />
</target>
<target name="deploy-resin" depends="stage-webapp" >
    <ant dir="./personal" target="deploy-resin" />
</target>
<target name="deploy-isp" depends="stage-webapp" >
    <ant dir="./personal" target="deploy-isp" />
</target>
<target name="clean-isp">
    <ant dir="./personal" target="clean-isp" />
</target>
<target name="official-release" depends="tests,apache-release" > 
    <ant dir="./personal" target="official-release" />
</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>
	    
<!-- ********************************************************************* -->
<!-- HSQLDB 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="org.hsqldb.jdbcDriver"
         url="jdbc:hsqldb:hsql://localhost:3219"
         userid="sa" password=""
         src="${build.webapp}/WEB-INF/dbscripts/droptables.sql" onerror="continue"
         classpath="${ro.tools}/buildtime/hsqldb.jar" />    
    <sql driver="org.hsqldb.jdbcDriver"
         url="jdbc:hsqldb:hsql://localhost:3219"
         userid="sa" password=""
         src="${build.webapp}/WEB-INF/dbscripts/hsqldb/createdb.sql"
         classpath="${ro.tools}/buildtime/hsqldb.jar" />    
    &custom-pre-dbtest;
</target>

<target name="start-db" description="Starts built-in database">  
    <startdb database="${build.tests}/testdb" port="3219" />
    <!-- 
    Not sure we need that custom 'startdb' task if this plain old Ant works:
    <java classname="org.hsqldb.Server"  
        fork="yes" spawn="true" classpath="./tools/buildtime/hsqldb.jar">
        <arg value="-database"/>
        <arg value="${build.tests}/testdb"/>
        <arg value="-port"/>
        <arg value="3219"/>
    </java>
    -->
</target>
        
<target name="stop-db" description="Drop tables and stops the built-in database">   
    <stopdb port="3219"/>
    <!--
    This below code does the same thing as 'stopdb' but the 'sql' task throws 
    an exception when HSQLDB disconnects and that causes a build failure, so 
    for now I'm keeping the custom 'startdb' and 'stopdb' Ant tasks.
    <sql driver="org.hsqldb.jdbcDriver" onerror="continue" 
         url="jdbc:hsqldb:hsql://localhost:3219"
         userid="sa" password=""
         classpath="${ro.tools}/buildtime/hsqldb.jar" >
         SHUTDOWN
    </sql>  
    -->
</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>

</project>
