Build the JSTL from source

Sunday, July 19th, 2009

<?xml version="1.0"?>

<project name="Example Application Build" default="build-both" basedir=".">
  
  <property file="build.properties"/>

  <!– CVSROOT for the JSTL –>
  <property name="cvsroot" value=":pserver:anoncvs@cvs.apache.org:/home/cvspublic" />

  <!– CVSROOT for the MySQL connector –>
  <property name="mysql.cvsroot" value=":pserver:anonymous@cvs.sourceforge.net:/cvsroot/mmmysql" />

  <!– The master build classpath          –> 
  <path id="build.classpath">
    <pathelement location="${servlet24.jar}"/>
    <pathelement location="${jsp20.jar}"/>
    <pathelement location="${mysql.jar}"/>
    <pathelement path="${appName.jar}"/>
  </path>

  <!– Initialization target –> 
  <!– Create the working directories –>
  <target name="dir" description="Create the working directories">
    <echo message="Creating the working directories"/>
    <mkdir dir="${build.stand-alone.root}"/>
    <mkdir dir="${build.web.classes}"/>
    <mkdir dir="${dist}"/>
    <mkdir dir="${lib}"/>
  </target>

  <!– CVS and build tasks for the JSTL and MySQL connector –>

  <!– Update or check out required sources from CVS for the JSTL –>
  <target name="checkout-jstl" depends="dir" 
          description="Update or check out required sources
                       from CVS for the JSTL">

    <echo message="Checking out the required JSTL sources from CVS"/>

    <cvs cvsroot="${cvsroot}" quiet="true"
         command="checkout -P ${jstl.build}" 
         dest="${build}" compression="true" />

  </target>
  
  
  <!– Update or check out required sources from CVS for the MySQL connector –>
  <target name="checkout-mysql-connector" depends="dir" 
          description="Update or check out required sources
          from CVS for the MySQL connector">

    <echo message="Checking out the required sources from CVS for the MySQL connector" />

    <cvs cvsroot="${mysql.cvsroot}" quiet="true"
         command="checkout" package="${mysql.build}"
         dest="${build}" compression="true" />

  </target>

  <!– Build the JSTL from source –>
  <target name="build-jstl" depends="checkout-jstl" 
          description="Build the JSTL from source">
    <echo message="Building the JSTL from source"/>

    <ant antfile="build.xml" dir="${build}/${jstl.build}"/>

    <copy todir="${lib}">
      <fileset dir="${build}/${jstl.build}/${build}/lib">
        <include name="*.jar"/>
      </fileset>
    </copy>
  </target>

  <!– Build the MySQL connector from source –>
  <target name="build-mysql-connector" depends="checkout-mysql-connector" 
          description="Build the MySQL connector from source">
    <echo message="Building the MySQL connector from source"/>

    <!– The MySQL connector file needs this directory to exist –>
    <!– Therefore we need to create it –>
    <mkdir dir="${build}/dist-mysql-jdbc"/>

    <ant antfile="build.xml" dir="${build}/${mysql.build}"/>

    <copy tofile="${mysql.jar}">
      <fileset dir="${build}/build-mysql-jdbc">
        <include name="mysql-connector*/*.jar"/>
      </fileset>
    </copy>
  </target>

  <!– Compile the stand-alone application –>
  <target name="compile-stand-alone" depends="dir" 
          description="Compile stand-alone application">
    <echo message="Compiling the stand-alone application"/>
    <javac srcdir="${src.shared.java}" destdir="${build.stand-alone.root}"/>
    <javac srcdir="${src.stand-alone.java}" 
           destdir="${build.stand-alone.root}"/>  
  </target>

<!–
  <target name="stand-alone-complete" 
          description="Compile stand-alone application, 
          using CVS version of the MySQL connector">
    <echo message="Compiling stand-alone application, using CVS versions of the MySQL connector"/>
    <antcall target="build-mysql-connector"/>
    <antcall target="package-stand-alone"/>
  </target>

  <target name="stand-alone-complete" 
          depends="build-mysql-connector, package-stand-alone" 
          description="Compile stand-alone application, 
          using CVS version of the MySQL connector">
    <echo message="Compiling stand-alone application, using CVS versions of the MySQL connector"/>
  </target> 
–>

  <target name="stand-alone-complete" 
          depends="build-mysql-connector, package-stand-alone" 
          description="Compile stand-alone application, 
                       using CVS version of the MySQL connector">
    <echo message="Compiling stand-alone application, using CVS versions of the MySQL connector"/>
  </target>

  <!– Package the stand-alone application –>
  <target name="package-stand-alone" depends="compile-stand-alone" 
          description="Package the stand-alone application">
    <echo message="Creating the stand-alone JAR file"/>
    <copy file="${database.properties}" todir="${build.stand-alone.root}"/>
    <jar destfile="${appName.jar}" basedir="${build.stand-alone.root}"/>
  </target>

  <!– Compile the web application –>
  <target name="compile-web" depends="dir" description="Compile web application">
    <echo message="Compiling the web application"/>
    <javac destdir="${build.web.classes}">
      <src path="${src.shared.java}"/>
    </javac>
    <javac srcdir="${src.web.java}" destdir="${build.web.classes}">
      <classpath refid="build.classpath"/>
    </javac>
  </target>

<!–
  <target name="web-complete" 
          description="Compile web application, 
                       using CVS versions of the MySQL connector and the JSTL">
    <echo message="Compiling web application, using CVS versions of the MySQL connector and the JSTL"/>
    <antcall target="build-mysql-connector"/>
    <antcall target="build-jstl"/>
    <antcall target="package-web"/>
  </target>

  <target name="web-complete" 
          depends="build-mysql-connector, build-jstl, package-web" 
          description="Compile web application, 
                       using CVS versions of the MySQL connector and the JSTL">
    <echo message="Compiled web application, using CVS versions of the MySQL connector and the JSTL"/>
  </target>
–>

  <target name="web-complete" 
          depends="build-mysql-connector, build-jstl, package-web" 
          description="Compile web application, 
                       using CVS versions of the MySQL connector and the JSTL">
    <echo message="Compiling web application, using CVS versions of the MySQL connector and the JSTL"/>
  </target>

  <!– Copy the web pages and configuration files –>
  <target name="copy-web" depends="compile-web" description="Copy the web files">
    <echo message="Copying the web pages and configuration files"/>
    <copy todir="${build.web.root}">
      <fileset dir="${src.web.pages}"/>
    </copy>
    <!– Copy the tags –>
    <copy todir="${build.web.tags}">
      <fileset dir="${src.web.tags}"/>
    </copy>
    <copy todir="${build.web.web-inf}">
      <fileset dir="${src.web.conf}">
        <include name="*.tld"/>
      </fileset>
    </copy>
    <!– Copy the JAR files –>
    <copy todir="${build.web.lib}">
      <fileset dir="${lib}"/>
    </copy>
    <!– Copy the properties file –>
    <copy file="${database.properties}" todir="${build.web.classes}"/>
    <!– No need to copy web.xml, as the WAR task does this for us –>
  </target>

  <!– Build the WAR file –>
  <target name="package-web" depends="copy-web" description="Build the WAR">
    <echo message="Building the WAR file"/> 
    <war destfile="${appName.war}" basedir="${build.web.root}" 
         webxml="${src.web.conf}/web.xml"/>
  </target>

  <!– Targets that work with both applications –>
<!–
  <target name="build-both" 
          description="Compile both applications, 
                       without CVS versions of the MySQL connector and the JSTL">
    <echo message="Compiling both applications, without CVS versions of the MySQL connector and the JSTL"/>
    <antcall target="package-stand-alone"/>
    <antcall target="package-web"/>
  </target>

  <target name="build-all" 
          description="Compile both applications, 
                       using CVS versions of the MySQL connector and the JSTL">
    <echo message="Compiling both applications, using CVS versions of the MySQL connector and the JSTL"/>
    <antcall target="stand-alone-complete"/>
    <antcall target="web-complete"/>
  </target>
–>

  <target name="build-both" 
          depends="package-stand-alone, package-web" 
          description="Compile both applications, 
                       without CVS versions of the MySQL connector and the JSTL">
    <echo message="Compiled both applications, without CVS versions of the MySQL connector and the JSTL"/>
  </target>

  <target name="build-all" 
          depends="stand-alone-complete, web-complete" 
          description="Compile both applications, 
                       using CVS versions of the MySQL connector and the JSTL">
    <echo message="Compiled both applications, using CVS versions of the MySQL connector and the JSTL"/>
  </target>

  <!– Download the servlet JAR –>
  <target name="download-servlet-jar" depends="dir" 
          description="Download the servlet JAR">
    <echo message="Downloading the servlet JAR"/>

    <get src="http://www.ibiblio.org/maven/servletapi/jars/servletapi-2.4.jar"
         dest="${servlet24.jar}"
         verbose="true"/>
  </target>

  <!– Download the JSP JAR –>
  <target name="download-jsp-jar" depends="dir" 
          description="Download the JSP JAR">
    <echo message="Downloading the JSP JAR"/>

    <get src="http://www.ibiblio.org/maven/jspapi/jars/jsp-api-2.0.jar"
         dest="${jsp20.jar}"
         verbose="true"/>
  </target>

  <target name="clean" description="Clean up the working directories">
    <echo message="Cleaning up"/>
    <delete dir="${build}"/>
  </target>

</project>

           
       

Ant task: jar

Monday, July 6th, 2009

<?xml version="1.0"?>

<project name="sample" default="test" basedir=".">

    <!–  NOTE: THE FOLLOWING LINES SHOULD BE EDITED FOR YOUR PROJECT:  –>
    <property name="root.project.name" value="demo2"/>
    <property name="test.class" value="test.TestSample"/>

   <!– NOTE: THE REST OF THIS FILE CAN PROBABLY REMAIN UNCHANGED FOR YOUR NEW PROJECTS –>

   <property name="jar.module" value="${root.project.name}.jar"/>

    <path id="test.classpath">
        <pathelement location="dist/${jar.module}"/>
        <pathelement location="dist/test.jar"/>
    </path>

   <target name="compile">
      <mkdir dir="build"/>
      <javac destdir="build"
             debug="on"
             optimize="on">
         <src path="src"/>
      </javac>
   </target>

   <target name="makejar" depends="compile">
      <mkdir dir="dist"/>
      <jar jarfile="dist/${jar.module}">
         <fileset dir="build">
             <include name="**/*.class"/>
       <exclude name="test/*.class"/>
         </fileset>
       </jar>
      <jar jarfile="dist/test.jar">
         <fileset dir="build">
             <include name="test/*.class"/>
         </fileset>
       </jar>
      <delete dir="build"/>
   </target>

   <target name="test" depends="makejar">
      <java fork="no" failonerror="yes"
            classname="${test.class}">
          <classpath refid="test.classpath"/> 
          <arg line=""/>
      </java>
   </target>

   <target name="clean">
      <delete dir="build"/>
      <delete dir="dist"/>
   </target>

</project>

           
       

Check Properties

Tuesday, June 30th, 2009

<?xml version="1.0"?>
<project name="Template Buildfile" default="compile" basedir=".">
  <property name="dir.src" value="src"/>
  <property name="dir.build" value="build"/>
  <property environment="env"/>
  

  <target name="checkProperties">
    <fail unless="env.TOMCAT_HOME">TOMCAT_HOME must be set</fail>
    <fail unless="env.JUNIT_HOME">JUNIT_HOME must be set</fail>
    <fail unless="env.JBOSS_HOME">JBOSS_HOME must be set</fail>
  </target>

  <!– Creates the output directories –>
  <target name="prepare" depends="checkProperties">
    <mkdir dir="${dir.build}"/>
  </target>

  <target name="clean"
          description="Remove all generated files.">
    <delete dir="${dir.build}"/>
  </target>

  <target name="compile" depends="prepare"
          description="Compile all source code.">
    <echo>Compile code…</echo>
  </target>

</project>

           
       

Creates the output directories

Saturday, June 27th, 2009

<?xml version="1.0"?>
<project name="Template Buildfile" default="compile" basedir=".">
  <property name="dir.src" value="src"/>
  <property name="dir.build" value="build"/>
  <property name="dir.dist" value="dist"/>

  <!– Creates the output directories –>
  <target name="prepare">
    <mkdir dir="${dir.build}"/>
    <mkdir dir="${dir.dist}"/>
  </target>

  <target name="clean"
          description="Remove all generated files.">
    <delete dir="${dir.build}"/>
    <delete dir="${dir.dist}"/>
  </target>

  <target name="compile" depends="prepare"
          description="Compile all source code.">
    <javac srcdir="${dir.src}" destdir="${dir.build}"/>
  </target>

  <target name="jar" depends="compile"
          description="Generates java2s.jar in the ’dist’ directory.">
    <jar jarfile="${dir.dist}/java2s.jar" 
         basedir="${dir.build}"/>
  </target>
</project>

           
       

Generate Javadocs for the application

Saturday, June 27th, 2009

<?xml version="1.0"?>

<project name="Example Application Build" default="build-both" basedir=".">
  
  <property file="build.properties"/>

  <!– CVSROOT for the JSTL –>
  <property name="cvsroot" 
            value=":pserver:anoncvs@cvs.apache.org:/home/cvspublic" />

  <!– CVSROOT for the MySQL connector –>
  <property name="mysql.cvsroot" 
            value=":pserver:anonymous@cvs.sourceforge.net:/cvsroot/mmmysql" />

  <!– The master build classpath          –> 
  <path id="build.classpath">
    <pathelement location="${servlet24.jar}"/>
    <pathelement location="${jsp20.jar}"/>
    <pathelement location="${mysql.jar}"/>
    <pathelement path="${appName.jar}"/>
  </path>

  <!– Javadoc file sets                   –> 
  <fileset id="javadoc" dir="${src}">
    <exclude name="*/conf/**"/>
    <exclude name="*/docs/*"/>
    <include name="shared/**"/>
    <include name="stand-alone/**"/>
    <include name="web/java/**"/>
  </fileset>  

  <!– Properties and pattern sets for the packaging targets –> 

  <!– The value of each property in this section is the setting –>
  <!– for the ‘dir‘ attribute of file sets and tar file sets –> 

  <!– Property and pattern set for the documentation –>
  <property name="docs.all.dir" value="${build}"/>
  <!– Tar file sets cannot use file sets, so we must use a pattern set –>
  <patternset id="docs.all">
    <include name="docs/**"/>
  </patternset>

  <!– Property and pattern set for the license and README –>
  <property name="docs.misc.dir" value="${src}/shared/docs"/>
  <!– Tar file sets cannot use file sets, so we must use a pattern set –>
  <patternset id="docs.misc">
    <include name="README"/>
    <include name="LICENSE"/>
  </patternset>
  
  <!– Property and pattern set for the source, –>
  <!– build.xml, and build.properties –>
  <property name="src.files.dir" value="."/>
  <!– Tar file sets cannot use file sets, so we must use a pattern set –>
  <patternset id="src.files">
    <include name="${src}/**"/>
    <include name="build.*"/>
  </patternset>

  <!– Pattern set for the binary JAR –>
  <!– Nothing else is needed because the directory that contains it –>
  <!– is already in the ${dist} property and it’s used in a zip file set –>
  <!– as well as a tar file set –> 
  <patternset id="bin.jar">
    <include name="*.jar"/>
  </patternset>

  <!– Pattern set for the binary WAR –>
  <!– Nothing else is needed because the directory that contains it –>
  <!– is already in the ${dist} property and it’s used in a zip file set –>
  <!– as well as a tar file set –> 
  <patternset id="bin.war">
    <include name="*.war"/>
  </patternset>

  <!– Initialization target               –> 

  <!– Create the working directories –>
  <target name="dir" description="Create the working directories">
    <echo message="Creating the working directories"/>
    <mkdir dir="${build.stand-alone.root}"/>
    <mkdir dir="${build.web.classes}"/>
    <mkdir dir="${dist}"/>
    <mkdir dir="${lib}"/>
  </target>

  <!– CVS and build tasks for the JSTL and MySQL connector –>

  <!– Update or check out required sources from CVS for the JSTL –>
  <target name="checkout-jstl" depends="dir" 
          description="Update or check out required sources
                       from CVS for the JSTL">

    <echo message="Checking out the required JSTL sources from CVS"/>

    <cvs cvsroot="${cvsroot}" quiet="true"
         command="checkout -P ${jstl.build}" 
         dest="${build}" compression="true" />

  </target>
  <!– Update or check out required sources from CVS for the MySQL connector –>
  <target name="checkout-mysql-connector" depends="dir" 
          description="Update or check out required sources
          from CVS for the MySQL connector">

    <echo message="Checking out the required sources from CVS for the MySQL connector" />

    <cvs cvsroot="${mysql.cvsroot}" quiet="true"
         command="checkout" package="${mysql.build}"
         dest="${build}" compression="true" />

  </target>

  <!– Build the JSTL from source –>
  <target name="build-jstl" depends="checkout-jstl" 
          description="Build the JSTL from source">
    <echo message="Building the JSTL from source"/>

    <ant antfile="build.xml" dir="${build}/${jstl.build}"/>

    <copy todir="${lib}">
      <fileset dir="${build}/${jstl.build}/${build}/lib">
        <include name="*.jar"/>
      </fileset>
    </copy>
  </target>

  <!– Build the MySQL connector from source –>
  <target name="build-mysql-connector" depends="checkout-mysql-connector" 
          description="Build the MySQL connector from source">
    <echo message="Building the MySQL connector from source"/>

    <!– The MySQL connector file needs this directory to exist –>
    <!– Therefore we need to create it –>
    <mkdir dir="${build}/dist-mysql-jdbc"/>

    <ant antfile="build.xml" dir="${build}/${mysql.build}"/>

    <copy tofile="${mysql.jar}">
      <fileset dir="${build}/build-mysql-jdbc">
        <include name="mysql-connector*/*.jar"/>
      </fileset>
    </copy>
  </target>

  <!– Compile the stand-alone application –>
  <target name="compile-stand-alone" depends="dir" 
          description="Compile stand-alone application">
    <echo message="Compiling the stand-alone application"/>
    <javac srcdir="${src.shared.java}" destdir="${build.stand-alone.root}"/>
    <javac srcdir="${src.stand-alone.java}" 
           destdir="${build.stand-alone.root}"/>  
  </target>

<!–
  <target name="stand-alone-complete" 
          description="Compile stand-alone application, 
          using CVS version of the MySQL connector">
    <echo message="Compiling stand-alone application, using CVS versions of the MySQL connector"/>
    <antcall target="build-mysql-connector"/>
    <antcall target="package-stand-alone"/>
  </target>

  <target name="stand-alone-complete" 
          depends="build-mysql-connector, package-stand-alone" 
          description="Compile stand-alone application, 
          using CVS version of the MySQL connector">
    <echo message="Compiling stand-alone application, using CVS versions of the MySQL connector"/>
  </target> 
–>

  <target name="stand-alone-complete" 
          depends="build-mysql-connector, package-stand-alone" 
          description="Compile stand-alone application, 
                       using CVS version of the MySQL connector">
    <echo message="Compiling stand-alone application, using CVS versions of the MySQL connector"/>
  </target>

  <!– Package the stand-alone application –>
  <target name="package-stand-alone" depends="compile-stand-alone" 
          description="Package the stand-alone application">
    <echo message="Creating the stand-alone JAR file"/>
    <copy file="${database.properties}" todir="${build.stand-alone.root}"/>
    <jar destfile="${appName.jar}" basedir="${build.stand-alone.root}"/>
  </target>

  <!– Compile the web application –>
  <target name="compile-web" depends="dir" description="Compile web application">
    <echo message="Compiling the web application"/>
    <javac destdir="${build.web.classes}">
      <src path="${src.shared.java}"/>
    </javac>
    <javac srcdir="${src.web.java}" destdir="${build.web.classes}">
      <classpath refid="build.classpath"/>
    </javac>
  </target>

<!–
  <target name="web-complete" 
          description="Compile web application, 
                       using CVS versions of the MySQL connector and the JSTL">
    <echo message="Compiling web application, using CVS versions of the MySQL connector and the JSTL"/>
    <antcall target="build-mysql-connector"/>
    <antcall target="build-jstl"/>
    <antcall target="package-web"/>
  </target>

  <target name="web-complete" 
          depends="build-mysql-connector, build-jstl, package-web" 
          description="Compile web application, 
                       using CVS versions of the MySQL connector and the JSTL">
    <echo message="Compiled web application, using CVS versions of the MySQL connector and the JSTL"/>
  </target>
–>

  <target name="web-complete" 
          depends="build-mysql-connector, build-jstl, package-web" 
          description="Compile web application, 
                       using CVS versions of the MySQL connector and the JSTL">
    <echo message="Compiling web application, using CVS versions of the MySQL connector and the JSTL"/>
  </target>

  <!– Copy the web pages and configuration files –>
  <target name="copy-web" depends="compile-web" description="Copy the web files">
    <echo message="Copying the web pages and configuration files"/>
    <copy todir="${build.web.root}">
      <fileset dir="${src.web.pages}"/>
    </copy>
    <!– Copy the tags –>
    <copy todir="${build.web.tags}">
      <fileset dir="${src.web.tags}"/>
    </copy>
    <copy todir="${build.web.web-inf}">
      <fileset dir="${src.web.conf}">
        <include name="*.tld"/>
      </fileset>
    </copy>
    <!– Copy the JAR files –>
    <copy todir="${build.web.lib}">
      <fileset dir="${lib}"/>
    </copy>
    <!– Copy the properties file –>
    <copy file="${database.properties}" todir="${build.web.classes}"/>
    <!– No need to copy web.xml, as the WAR task does this for us –>
  </target>

  <!– Build the WAR file –>
<!–
  <target name="package-web" depends="copy-web" description="Build the WAR">
    <echo message="Building the WAR file"/> 
    <war destfile="${appName.war}" basedir="${build.web.root}" 
         webxml="${src.web.conf}/web.xml"/>
  </target>
–>

  <!– Build the WAR file in one step –>
  <target name="package-web" depends="compile-web" 
          description="Build the WAR file in one step">
    <echo message="Building the WAR file in one step"/> 
    <war destfile="${appName.war}" basedir="${src.web.pages}" 
         webxml="${src.web.conf}/web.xml">
      <lib dir="${lib}"/>
      <classes dir="${build.web.root}"/>
      <zipfileset dir="${src.web.tags}" prefix="WEB-INF/tags"/>
      <zipfileset file="${database.properties}" prefix="WEB-INF/classes"/>
      <zipfileset dir="${src.web.conf}" prefix="WEB-INF">
        <include name="*.tld"/>
      </zipfileset>
    </war>
  </target>

  <!– Targets that work with both applications –>
<!–
  <target name="build-both" 
          description="Compile both applications, 
                       without CVS versions of the MySQL connector and the JSTL">
    <echo message="Compiling both applications, without CVS versions of the MySQL connector and the JSTL"/>
    <antcall target="package-stand-alone"/>
    <antcall target="package-web"/>
  </target>

  <target name="build-all" 
          description="Compile both applications, 
                       using CVS versions of the MySQL connector and the JSTL">
    <echo message="Compiling both applications, using CVS versions of the MySQL connector and the JSTL"/>
    <antcall target="stand-alone-complete"/>
    <antcall target="web-complete"/>
  </target>
–>

  <target name="build-both" 
          depends="package-stand-alone, package-web" 
          description="Compile both applications, 
                       without CVS versions of the MySQL connector and the JSTL">
    <echo message="Compiled both applications, without CVS versions of the MySQL connector and the JSTL"/>
  </target>

  <target name="build-all" 
          depends="stand-alone-complete, web-complete" 
          description="Compile both applications, 
                       using CVS versions of the MySQL connector and the JSTL">
    <echo message="Compiled both applications, using CVS versions of the MySQL connector and the JSTL"/>
  </target>

  <!– Download the servlet JAR –>
  <target name="download-servlet-jar" depends="dir" 
          description="Download the servlet JAR">
    <echo message="Downloading the servlet JAR"/>

    <get src="http://www.ibiblio.org/maven/servletapi/jars/servletapi-2.4.jar"
         dest="${servlet24.jar}"
         verbose="true"/>
  </target>

  <!– Download the JSP JAR –>
  <target name="download-jsp-jar" depends="dir" 
          description="Download the JSP JAR">
    <echo message="Downloading the JSP JAR"/>

    <get src="http://www.ibiblio.org/maven/jspapi/jars/jsp-api-2.0.jar"
         dest="${jsp20.jar}"
         verbose="true"/>
  </target>

  <!– Building the documentation bundle        –>
  <!– Checking that the documentation is up to date –>
  <target name="check-docs" 
          description="Check that the documentation is up to date">
    <echo message="Checking that the documentation is up to date"/>
    <condition property="docs.notRequired">
      <and>
        <uptodate targetfile="${dist}/${appName}-${package.docs}.zip">
          <srcfiles dir="${src}" includes="**"/>
        </uptodate>
        <uptodate targetfile="${dist}/${appName}-${package.docs}.tar.gz">
          <srcfiles dir="${src}" includes="**"/>
        </uptodate>
      </and>
    </condition>
  </target>  

  <!– Generate Javadocs for the application –>
  <target name="javadocs" depends="dir,check-docs" 
          description="Generate Javadocs for the application" 
          unless="docs.notRequired">
    <echo message="Generating Javadocs for the application"/>
    <javadoc destdir="${docs}/api" windowtitle="${javadoc.windowtitle}">
      <fileset refid="javadoc"/>
      <doctitle>
        ${javadoc.doctitle}
      </doctitle>
      <classpath refid="build.classpath"/>
      <link href="http://java.sun.com/j2se/${javadoc.j2se.version}/docs/api"/>  
      <link href="http://java.sun.com/j2ee/${javadoc.j2ee.version}/docs/api"/> 
    </javadoc>
  </target>

   <!– Generate Javadocs for the application, 
        using offline package-list files –>
  <target name="javadocs-offline" depends="dir,check-docs"
          description="Generate Javadocs for the application, 
                       using offline package-list files"
          unless="docs.notRequired">
    <echo message="Generating Javadocs for the application, 
                   using offline package-list files"/>
    <javadoc destdir="${docs}/api" windowtitle="${javadoc.windowtitle}">
      <fileset refid="javadoc"/>
      <doctitle>
        ${javadoc.doctitle}
      </doctitle>
      <classpath refid="build.classpath"/>
<!–
      <link href="http://java.sun.com/j2se/${javadoc.j2se.version}/docs/api" 
            offline="true" packagelistLoc="${javadoc.j2se.offline}"/>  
      <link href="http://java.sun.com/j2ee/${javadoc.j2ee.version}/docs/api"
            offline="true" packagelistLoc="${javadoc.j2ee.offline}"/> 
–>
      <link href="${javadoc.j2se.offline}" resolveLink="true"/>  
      <link href="${javadoc.j2ee.offline}" resolveLink="true"/> 
    </javadoc>
  </target>

  <!– Assemble the documentation –>
  <target name="docs" depends="javadocs" 
          description="Assemble the documentation" unless="docs.notRequired">
    <echo message="Assembling the documentation"/>
    <copy todir="${docs}">
      <fileset dir="${src.shared.docs}">
        <include name="*.html"/>
      </fileset>
    </copy>
    <copy todir="${docs}/stand-alone">
      <fileset dir="${src.stand-alone.docs}">
        <include name="*.html"/>
      </fileset>
    </copy>
    <copy todir="${docs}/web">
      <fileset dir="${src.web.docs}">
        <include name="*.html"/>
      </fileset>
    </copy>
  </target>

  <!– Zip the distribution                     –>
  <!– Zip the documentation –>
  <target name="zip-docs" depends="docs" description="Zip the documentation">
    <echo message="Zipping the documentation"/>
    <zip destfile="${dist}/${appName}-${package.docs}.zip">
      <!– Include the documentation –>
      <fileset dir="${docs.all.dir}">
        <patternset refid="docs.all"/>
      </fileset>
      <!– Include the license and the README –>
      <fileset dir="${docs.misc.dir}">
        <patternset refid="docs.misc"/>
      </fileset>
    </zip> 
    <checksum file="${dist}/${appName}-${package.docs}.zip" 
              forceOverwrite="true"/>
    <checksum file="${dist}/${appName}-${package.docs}.zip" forceOverwrite="true"  
              algorithm="SHA1"/>
  </target>

  <!– Zip the source and documentation together –>
  <target name="zip-src" depends="zip-docs" 
          description="Zip the source and documentation together">
    <echo message="Zipping the source and documentation together"/>
    <zip destfile="${dist}/${appName}-src.zip">
      <!– Include the source code and the build files –>
      <zipfileset src="${dist}/${appName}-${package.docs}.zip"/>
      <fileset dir="${src.files.dir}">
        <patternset refid="src.files"/>
      </fileset>
    </zip> 
    <checksum file="${dist}/${appName}-src.zip" forceOverwrite="true"/>
    <checksum file="${dist}/${appName}-src.zip" forceOverwrite="true" 
              algorithm="SHA1"/>
  </target>

  <!– Zip the binary stand-alone distribution with the documentation –>
  <target name="zip-bin-stand-alone" depends="package-stand-alone,zip-docs" 
          description="Zip the binary stand-alone distribution 
                       with the documentation">
    <echo message="Zipping the binary stand-alone distribution with the documentation"/>
    <zip destfile="${dist}/${appName}-${package.stand-alone}-bin.zip">
      <!– Include the documentation –>
      <zipfileset src="${dist}/${appName}-${package.docs}.zip"/>
      <!– Include the binary JAR files –>
      <zipfileset dir="${dist}" prefix="lib">
        <patternset refid="bin.jar"/>
      </zipfileset>
      <fileset dir=".">
        <include name="${mysql.jar}"/>
      </fileset>
    </zip> 
    <checksum file="${dist}/${appName}-${package.stand-alone}-bin.zip" 
              forceOverwrite="true"/>
    <checksum file="${dist}/${appName}-${package.stand-alone}-bin.zip" 
              forceOverwrite="true" algorithm="SHA1"/>
  </target>

  <!– Zip the binary web distribution with the documentation –>
  <target name="zip-bin-web" depends="package-web,zip-docs" 
          description="Zip the binary web distribution with the documentation">
    <echo message="Zipping the binary web distribution with the documentation"/>
    <zip destfile="${dist}/${appName}-${package.web}-bin.zip">
      <!– Include the documentation –>
      <zipfileset src="${dist}/${appName}-${package.docs}.zip"/>
      <!– Include the binary WAR files –>
      <fileset dir="${dist}">
        <patternset refid="bin.war"/>
      </fileset>
    </zip> 
    <checksum file="${dist}/${appName}-${package.web}-bin.zip" 
              forceOverwrite="true"/>
    <checksum file="${dist}/${appName}-${package.web}-bin.zip" 
              forceOverwrite="true" algorithm="SHA1"/>
  </target>

  <!– Zip the binary distribution with the documentation –>
  <target name="zip-bin" depends="zip-bin-stand-alone,zip-bin-web" 
          description="Zip the binary distribution with the documentation">
    <echo message="Zipping the binary distribution with the documentation"/>
    <zip destfile="${dist}/${appName}-bin.zip" 
         duplicate="preserve" update="true">
      <zipgroupfileset dir="${dist}" includes="*.zip"/>
    </zip>
    <checksum file="${dist}/${appName}-bin.zip" forceOverwrite="true"/>
    <checksum file="${dist}/${appName}-bin.zip" forceOverwrite="true" 
              algorithm="SHA1"/>
  </target>

  <!– Zip the binary and source distributions –>
  <target name="zip-all" depends="zip-src,zip-bin" 
          description="Zip the binary and source distributions">
    <echo message="Zipped the binary and source distributions"/>
  </target>

  <!– Tar and gz the distribution              –>

  <!– Tar the documentation –>
  <target name="tar-docs" depends="docs" description="Tar the documentation">
    <echo message="Tarring the documentation"/>
    <tar destfile="${dist}/${appName}-${package.docs}.tar.gz" compression="gzip">
      <!– Include the documentation –>
      <tarfileset dir="${docs.all.dir}">
        <patternset refid="docs.all"/>
      </tarfileset>
      <!– Include the license and the README –>
      <tarfileset dir="${docs.misc.dir}">
        <patternset refid="docs.misc"/>
      </tarfileset>
    </tar> 
    <checksum file="${dist}/${appName}-${package.docs}.tar.gz" 
              forceOverwrite="true"/>
    <checksum file="${dist}/${appName}-${package.docs}.tar.gz" 
              forceOverwrite="true" algorithm="SHA1"/>
  </target>

  <!– Tar the source and documentation together –>
  <target name="tar-src" depends="tar-docs"
          description="Tar the documentation">
    <echo message="Tarring the documentation"/>
    <tar destfile="${dist}/${appName}-src.tar.gz" compression="gzip">
      <!– Include the documentation –>
      <tarfileset dir="${docs.all.dir}">
        <patternset refid="docs.all"/>
      </tarfileset>
      <!– Include the license and the README –>
      <tarfileset dir="${docs.misc.dir}">
        <patternset refid="docs.misc"/>
      </tarfileset>
      <!– Include the source code and the build files –>
      <tarfileset dir="${src.files.dir}">
        <patternset refid="src.files"/>
      </tarfileset>
    </tar> 
    <checksum file="${dist}/${appName}-src.tar.gz" forceOverwrite="true"/>
    <checksum file="${dist}/${appName}-src.tar.gz" forceOverwrite="true" 
              algorithm="SHA1"/>
  </target>

  <!– Tar the binary stand-alone distribution with the documentation –>
  <target name="tar-bin-stand-alone" depends="package-stand-alone,tar-docs" 
          description="Tar the binary stand-alone distribution 
                       with the documentation">
    <echo message="Tarring the binary stand-alone distribution with the documentation"/>
    <tar destfile="${dist}/${appName}-${package.stand-alone}-bin.tar.gz" 
         compression="gzip">
      <!– Include the documentation –>
      <tarfileset dir="${docs.all.dir}">
        <patternset refid="docs.all"/>
      </tarfileset>
      <!– Include the license and the README –>
      <tarfileset dir="${docs.misc.dir}">
        <patternset refid="docs.misc"/>
      </tarfileset>
      <!– Include the binary JAR files –>
      <tarfileset dir="${dist}" prefix="lib">
        <patternset refid="bin.jar"/>
      </tarfileset>
      <tarfileset dir=".">
        <include name="${mysql.jar}"/>
      </tarfileset>    </tar> 
    <checksum file="${dist}/${appName}-${package.stand-alone}-bin.tar.gz" 
              forceOverwrite="true"/>
    <checksum file="${dist}/${appName}-${package.stand-alone}-bin.tar.gz" 
              forceOverwrite="true" algorithm="SHA1"/>
  </target>

  <!– Tar the binary web distribution with the documentation –>
  <target name="tar-bin-web" depends="package-web,tar-docs" 
          description="Tar the binary web distribution with the documentation">
    <echo message="Tarring the binary web distribution with the documentation"/>
    <tar destfile="${dist}/${appName}-${package.web}-bin.tar.gz" 
         compression="gzip">
      <!– Include the documentation –>
      <tarfileset dir="${docs.all.dir}">
        <patternset refid="docs.all"/>
      </tarfileset>
      <!– Include the license and the README –>
      <tarfileset dir="${docs.misc.dir}">
        <patternset refid="docs.misc"/>
      </tarfileset>
      <!– Include the binary WAR files –>
      <tarfileset dir="${dist}">
        <patternset refid="bin.war"/>
      </tarfileset>
    </tar> 
    <checksum file="${dist}/${appName}-${package.web}-bin.tar.gz" 
              forceOverwrite="true"/>
    <checksum file="${dist}/${appName}-${package.web}-bin.tar.gz" 
              forceOverwrite="true" algorithm="SHA1"/>
  </target>

  <!– Tar the binary distribution with the documentation –>
  <target name="tar-bin" depends="tar-bin-stand-alone,tar-bin-web" 
          description="Tar the binary distribution with the documentation">
    <echo message="Tarring the binary distribution with the documentation"/>
    <tar destfile="${dist}/${appName}-bin.tar.gz" compression="gzip">
      <!– Include the documentation –>
      <tarfileset dir="${docs.all.dir}">
        <patternset refid="docs.all"/>
      </tarfileset>
      <!– Include the license and the README –>
      <tarfileset dir="${docs.misc.dir}">
        <patternset refid="docs.misc"/>
      </tarfileset>
      <!– Include the source code and the build files –>
      <tarfileset dir="${src.files.dir}">
        <patternset refid="src.files"/>
      </tarfileset>
      <!– Include the binary JAR files –>
      <tarfileset dir="${dist}" prefix="lib">
        <patternset refid="bin.jar"/>
      </tarfileset>
      <tarfileset dir=".">
        <include name="${mysql.jar}"/>
      </tarfileset>
      <!– Include the binary WAR files –>
      <tarfileset dir="${dist}">
        <patternset refid="bin.war"/>
      </tarfileset>
    </tar>
    <checksum file="${dist}/${appName}-bin.tar.gz" forceOverwrite="true"/>
    <checksum file="${dist}/${appName}-bin.tar.gz" forceOverwrite="true" 
              algorithm="SHA1"/>
  </target>

  <!– Tasks that use the zip files to construct tar files –>
  <!– Tar the binary web distribution with the documentation –>
  <target name="tar-bin-web-new" depends="package-web,tar-docs,zip-bin-web" 
          description="Tar the binary web distribution with the documentation">
    <echo message="Tarring the binary web distribution with the documentation"/>
    <unzip src="${dist}/${appName}-${package.web}-bin.zip" dest="${tmp}/web"/>
    <tar destfile="${dist}/${appName}-${package.web}-bin.tar.gz" 
         compression="gzip">
      <tarfileset dir="${tmp}/web"/>
    </tar>
    <checksum file="${dist}/${appName}-${package.web}-bin.tar.gz" 
              forceOverwrite="true"/>
    <checksum file="${dist}/${appName}-${package.web}-bin.tar.gz" 
              forceOverwrite="true" algorithm="SHA1"/>
  </target>

  <!– Tar the binary distribution with the documentation –>
  <target name="tar-bin-new" 
          depends="zip-bin,tar-bin-stand-alone,tar-bin-web-new"
          description="Tar the binary distribution with the documentation">
    <echo message="Tarring the binary distribution with the documentation"/>
    <delete failonerror="false" includeemptydirs="true">
      <fileset dir="${tmp}" includes="**"/>
    </delete>
    <unzip src="${dist}/${appName}-bin.zip" dest="${tmp}"/>
    <tar destfile="${dist}/${appName}-bin.tar.gz" compression="gzip">
      <tarfileset dir="${tmp}"/>
    </tar>
    <checksum file="${dist}/${appName}-bin.tar.gz" forceOverwrite="true"/>
    <checksum file="${dist}/${appName}-bin.tar.gz" forceOverwrite="true" 
              algorithm="SHA1"/>
  </target>

  <!– Tar the binary and source distributions –>
  <target name="tar-all" depends="tar-src,tar-bin" 
          description="Tar the binary and source distributions">
    <echo message="Tarred the binary and source distributions"/>
  </target>

  <!– Distribution targets –>
  <!– FTP targets         –>

  <!– Place the documentation on FTP –>
<!–
  <target name="ftp-docs" depends="zip-docs,tar-docs" 
          description="Place the documentation on FTP">
    <echo message="Placing the documentation on FTP"/>
    <ftp server="${ftp.server}"
         userid="${ftp.user}"
         password="${ftp.password}"
         remotedir="${ftp.src.dir}"
         action="send">
      <fileset dir="${dist}">
        <include name="${appName}-${package.docs}.*"/>
      </fileset>
    </ftp>
  </target>
–>

  <!– Place the documentation on FTP –>
  <target name="ftp-docs" depends="zip-docs,tar-docs" 
          description="Place the documentation on FTP">
    <echo message="Placing the documentation on FTP"/>
    <ftp server="${ftp.server}"
         userid="${ftp.user}"
         password="${ftp.password}"
         remotedir="${ftp.src.dir}"
         action="send"
         newer="true"
         timediffauto="true">
      <fileset dir="${dist}">
        <include name="${appName}-${package.docs}.*"/>
      </fileset>
    </ftp>
  </target>

  <!– Place the source code on FTP –>
  <target name="ftp-src" depends="zip-src,tar-src" 
          description="Place the source code on FTP">
    <echo message="Placing the source code on FTP"/>
    <ftp server="${ftp.server}"
         userid="${ftp.user}"
         password="${ftp.password}"
         remotedir="${ftp.src.dir}"
         action="send"
         newer="true"
         timediffauto="true">
      <fileset dir="${dist}">
        <include name="${appName}-src.*"/>
      </fileset>
    </ftp>
  </target>

  <!– Place the binaries on FTP –>
  <target name="ftp-bin" depends="zip-bin,tar-bin" 
          description="Place the binaries on FTP">
    <echo message="Placing the binaries on FTP"/>
    <ftp server="${ftp.server}"
         userid="${ftp.user}"
         password="${ftp.password}"
         remotedir="${ftp.bin.dir}"
         action="send"
         newer="true"
         timediffauto="true">
      <fileset dir="${dist}">
        <include name="${appName}*bin*"/>
      </fileset>
    </ftp>
  </target>

  <!– Place everything on FTP –>
  <target name="ftp" description="Place everything on FTP">
    <echo message="Placing everything on FTP"/>
    <antcall target="ftp-docs"/>
    <antcall target="ftp-src"/>
    <antcall target="ftp-bin"/>
  </target>

  <!– Place everything on FTP –>
<!–
  <target name="ftp" description="Place everything on FTP">
    <echo message="Placing everything on FTP"/>
    <input message="Please enter your username." addproperty="ftp.user"/>
    <input message="Please enter your password." addproperty="ftp.password"/>
    <splash showduration="0"/>
    <antcall target="ftp-docs"/>
    <antcall target="ftp-src"/>
    <antcall target="ftp-bin"/>
  </target>
–>

  <!– Email targets       –>

  <!– E-mail the documentation –>
  <target name="email-docs" depends="zip-docs,tar-docs" 
          description="E-mailing the documentation">
    <echo message="E-mailing the documentation"/>
    <mail from="${mail.from}"
          tolist="${mail.tolist}"
          mailhost="${mail.mailhost}"
          user="${mail.user}"
          password="${mail.password}"
          subject="${mail.subject}">
      <message>
        ${mail.message.docs}
      </message>
      <fileset dir="${dist}">
        <include name="${appName}-${package.docs}.*"/>
      </fileset>
    </mail>
  </target>

  <!– Deploy the web application       –>

  <!– 1. Copy the expanded web application –>
  <target name="deploy-copy-files" depends="copy-web" 
          description="Deploy the application by copying it to Tomcat">
    <echo message="Copying the expanded web application to CATALINA_HOME"/>
    <property environment="env"/>
    <copy todir="${build.web.web-inf}" file="${src.web.conf}/web.xml"/>
    <copy todir="${env.CATALINA_HOME}/webapps/${appName}">
      <fileset dir="${build.web.root}"/>
    </copy>
  </target>

  <!– 2. Copy the WAR –>
  <target name="deploy-copy-war" depends="package-web" 
          description="Deploy the WAR by copying it to Tomcat">
    <echo message="Copying the WAR to CATALINA_HOME"/>
    <property environment="env"/>
    <copy file="${appName.war}" todir="${env.CATALINA_HOME}/webapps"/>
  </target>

  <!– 3. Deploy the web application using a context XML file –>
  <target name="deploy-context" depends="copy-web" 
          description="Deploy the web application using a context XML file">
    <echo message="Deploying the web application using a context XML file"/>
    <property environment="env"/>
    <copy todir="${build.web.web-inf}" file="${src.web.conf}/web.xml"/>
    <copy todir="${env.CATALINA_HOME}/conf/Catalina/localhost" 
          file="${src.web.conf}/${appName}.xml"/>
  </target>

  <!– The deploy task for web applications on Tomcat –>
  <taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask"/>

  <!– 4. Deploy the WAR using the manager application –>
  <target name="deploy" depends="package-web" 
          description="Hot deploy the application">
    <echo message="Deploying the WAR to Tomcat"/>
    <deploy url="${manager.url}"
            username="${manager.user}"
            password="${manager.password}"  
            path="/${appName}"
            war="file:${appName.war}"
            update="true"/>
  </target>

  <!– The undeploy task for web applications on Tomcat –>
  <taskdef name="undeploy" classname="org.apache.catalina.ant.UndeployTask"/>

  <!– Undeploy the web application –>
  <target name="undeploy" description="Undeploy the application">
    <echo message="Undeploying the WAR"/>
    <undeploy url="${manager.url}"
              username="${manager.user}"   
              password="${manager.password}"
              path="/${appName}"/>
  </target>

  <target name="clean" description="Clean up the working directories">
    <echo message="Cleaning up"/>
    <delete dir="${build}"/>
  </target>

</project>