<?xml version="1.0"?>

<project name="Helma" default="usage" basedir=".">

    <!-- =================================================================== -->
    <!-- Initializes some variables                                          -->
    <!-- =================================================================== -->
    <target name="init">
        <property name="Name" value="helma"/>
        <property name="year" value="1998-${year}"/>
        <property name="version" value="1.7.0"/>
        <property name="project" value="helma"/>

        <property name="home.dir" value="."/>
        <property name="build.dir" value="${home.dir}/build"/>
        <property name="build.src" value="${home.dir}/src"/>
        <property name="build.lib" value="${home.dir}/lib"/>
        <property name="build.classes" value="${home.dir}/classes"/>
        <property name="build.docs" value="${home.dir}/docs"/>
        <property name="build.javadocs" value="${home.dir}/docs/api"/>
        <property name="build.externals" value="${build.dir}/externals"/>

        <property name="build.work" value="${home.dir}/work"/>
        <property name="build.dist" value="${home.dir}/dist"/>

        <property name="jar.name" value="${project}"/>
        <property name="package.name" value="${project}-${version}"/>
        <property name="core.name" value="${project}-core-${version}"/>

        <property name="debug" value="on"/>
        <property name="optimize" value="on"/>
        <property name="deprecation" value="off"/>

        <property name="build.jsdocs" value="${home.dir}/docs/framework"/>
        <property name="jsdoc" value="${home.dir}/work/reference/templates/jsdoc.pl"/>

        <path id="build.class.path">
            <fileset dir="${home.dir}/lib">
                <exclude name="**/helma*.jar" />
                <include name="**/*.jar" />
            </fileset>
        </path>

        <tstamp/>

        <filter token="year" value="${year}"/>
        <filter token="version" value="${version}"/>
        <filter token="date" value="${TODAY}"/>
    </target>


    <!-- =================================================================== -->
    <!-- Help on usage                                                       -->
    <!-- =================================================================== -->
    <target name="help" depends="usage" />
    <target name="usage">
        <echo message=""/>
        <echo message=""/>
        <echo message="Helma build instructions"/>
        <echo message="-------------------------------------------------------------"/>
        <echo message=""/>
        <echo message=" available targets are:"/>
        <echo message=""/>
        <echo message=" compile       --> compiles the source code to ./classes"/>
        <echo message=" jar           --> generates the ./lib/helma-YYYYMMDD.jar file"/>
        <echo message=" javadocs      --> generates the API docs"/>
        <echo message=" jsdocs        --> generates the framework docs"/>
    <!--<echo message=" docs           -> tries to retrieve the HTML documentation "/>   -->
    <!--<echo message="                   (may need proxy settings in startscript)"/>    -->
        <echo message=" package       --> generates the distribution (zip and tar.gz)"/>
        <echo message=" app [name]    --> gets an application from svn and zips it"/>
        <echo message=" module [name] --> gets a module from svn and zips it"/>
        <echo message=" core          --> generates core for production updates (zip and tar.gz)"/>
        <echo message=" clean         --> clean up temporary build directories and files"/>
        <echo message=""/>
        <echo message=" usage         --> provides help on using the build tool (default)"/>
        <echo message=""/>
        <echo message=" See comments inside the build.xml file for more details."/>
        <echo message="-------------------------------------------------------------"/>
        <echo message=""/>
        <echo message=""/>
    </target>


    <!-- =================================================================== -->
    <!-- Compiles the source directory                                       -->
    <!-- =================================================================== -->
    <target name="compile" depends="init">
        <mkdir dir="${build.classes}"/>
        <!-- copy the imageio file -->
        <copy file="${build.src}/META-INF/services/javax.imageio.spi.ImageWriterSpi"
            todir="${build.classes}/META-INF/services"/>
        <!-- copy helma db style sheet -->
        <copy file="${build.src}/helma/objectmodel/dom/helma.xsl"
            todir="${build.classes}/helma/objectmodel/dom" />
        <!-- copy source files over to work directory -->
        <delete dir="${build.work}/src" quiet="true"/>
        <mkdir dir="${build.work}/src" />
        <copy todir="${build.work}/src" overwrite="true">
            <fileset dir="${build.src}" includes="**/*.java"/>
        </copy>
        <replace file="${build.work}/src/helma/main/Server.java"
            token="__builddate__" value="${TODAY}"/>
        <javac srcdir="${build.work}/src"
            source="1.4"
            target="1.4"
            destdir="${build.classes}"
            debug="${debug}"
            deprecation="${deprecation}"
            optimize="${optimize}"
            includeAntRuntime="no">
            <classpath refid="build.class.path" />
        </javac>
        <delete dir="${build.work}/src"/>
    </target>


    <!-- =================================================================== -->
    <!-- Creates a helma.jar file (snapshot) in the lib-directory            -->
    <!-- =================================================================== -->
    <target name="jar" depends="compile">
        <jar jarfile="${build.lib}/${jar.name}-${DSTAMP}.jar"
            basedir="${build.classes}"
            excludes="**/package.html,**/main/launcher/**"/>
        <jar jarfile="${home.dir}/launcher.jar"
            basedir="${build.classes}"
            includes="**/main/launcher/**"
            manifest="${build.src}/helma/main/launcher/manifest.txt"/>
        <!-- Copy timestamped helma jar file to lib/helma.jar  -->
        <copy file="${build.lib}/${jar.name}-${DSTAMP}.jar" 
              tofile="${build.lib}/${jar.name}.jar"/>
    </target>


    <!-- =================================================================== -->
    <!-- Creates the javadoc API documentation                               -->
    <!-- =================================================================== -->
    <target name="javadocs" depends="init">
        <mkdir dir="${build.javadocs}"/>
        <javadoc packagenames="helma.*"
            sourcepath="${build.src}"
            destdir="${build.javadocs}"
            author="false"
            private="false"
            version="false"
            windowtitle="${Name} ${version} API"
            doctitle="${Name} ${version} API"
            bottom="Copyright &#169; ${year} Helma.org. All Rights Reserved."
            classpathref="build.class.path"
        />
    </target>


    <!-- =================================================================== -->
    <!-- Create the jsdoc Framework documentation                            -->
    <!-- =================================================================== -->
    <target name="jsdocs" depends="init, package-modules">

        <!-- add a copy of the reference -->
        <mkdir dir="${build.work}/reference"/>
        <copy todir="${build.work}/reference">
            <fileset dir="${build.externals}/reference"/>
        </copy>
 
        <!-- add a copy of the modules -->
        <mkdir dir="${build.work}/reference/modules"/>
        <copy todir="${build.work}/reference/modules">
            <fileset dir="${build.externals}/modules/"/>
        </copy>
 
    	<mkdir dir="${build.jsdocs}"/>
    	<java dir="${home.dir}" fork="true" jar="${build.lib}/rhino.jar">
          <sysproperty key="jsdoc.dir" value="work/reference"/>
          <arg value="work/reference/app/run.js"/>
          <arg value="-t=work/reference/templates"/>
          <arg value="-d=docs/framework"/>
          <arg value="-r=3"/>
          <arg value="work/reference/coreEnvironment"/>
          <arg value="work/reference/coreExtensions"/>
          <arg value="work/reference/modules"/>
        </java>
        <delete dir="${build.work}/reference" />
    </target>


    <!-- =================================================================== -->
    <!-- Get the documentation (currently can fail due to request time-out   -->
    <!-- or missing support for proxies)                                     -->
    <!-- =================================================================== -->
    <!-- <target name="docs" depends="init">                                 -->
    <!--     <get src="http://www.helma.org/docs/reference/print"            -->
    <!--          dest="${build.docs}/reference.html"                        -->
    <!--          ignoreerrors="true"                                        -->
    <!--     />                                                              -->
    <!-- </target>                                                           -->


    <!-- =================================================================== -->
    <!-- Builds and packages only the core for the deployment and updating   -->
    <!-- of production environments                                          -->
    <!-- =================================================================== -->
    <target name="core" depends="init, jar">
        <mkdir dir="${build.work}"/>
        
        <!-- copy all libraries except helma-YYYYMMDD.jar -->
        <copy todir="${build.work}/lib">
            <fileset dir="${home.dir}/lib">
                <exclude name="**/helma-*.jar" />
                <include name="**/*.jar" />
            </fileset>
        </copy>

        <!-- copy the launcher jar and start files-->
        <copy file="${home.dir}/launcher.jar" todir="${build.work}/lib"/>

        <!-- create lib/ext directory -->
        <mkdir dir="${build.work}/lib/ext"/>

        <!-- copy the license files -->
        <copy todir="${build.work}/licenses">
            <fileset dir="${home.dir}/licenses" excludes="**/.svn**"/>
        </copy>
        <copy file="${home.dir}/license.txt" todir="${build.work}/licenses"/>

        <!-- zip up the whole thing -->
        <antcall target="package-zip">
            <param name="filename" value="${core.name}"/>
        </antcall>
        <antcall target="package-tgz">
            <param name="filename" value="${core.name}"/>
        </antcall>

        <!-- clean up -->
        <delete dir="${build.work}"/>
    </target>


    <!-- =================================================================== -->
    <!-- Creates the full helma distribution                                 -->
    <!-- =================================================================== -->
    <target name="package" depends="init">
        <mkdir dir="${build.work}"/>
        
        <!-- checkout the demo apps (and zip manage-app) -->
        <antcall target="package-apps" />

        <!-- generate the framework and modules documentation -->
        <antcall target="jsdocs" />

        <!-- create the main part of helma -->
        <antcall target="package-raw">
            <param name="distribution" value="main" />
        </antcall>

        <chmod perm="755">
            <fileset dir="${build.work}">
                <include name="start.sh"/>
            </fileset>
        </chmod>

        <!-- zip up the whole thing -->
        <antcall target="package-zip">
            <param name="filename" value="${package.name}"/>
        </antcall>
        <antcall target="package-tgz">
            <param name="filename" value="${package.name}"/>
        </antcall>

        <!-- make the src distributions -->
        <antcall target="javadocs"/>
        <antcall target="package-src-zip">
            <param name="filename" value="${package.name}"/>
        </antcall>
        <antcall target="package-src-tgz">
            <param name="filename" value="${package.name}"/>
        </antcall>

        <!-- clean up -->
        <delete dir="${build.work}"/>
    </target>


    <!-- =================================================================== -->
    <!-- Compile Helma and prepare the skeleton in a temporary directory.    -->
    <!-- Used by package             .                                       -->
    <!-- =================================================================== -->
    <target name="package-raw" depends="init, jar">

        <!-- copy the framework (apps.props, server.props, hop/db, hop/static) -->
        <copy todir="${build.work}">
            <fileset dir="${build.dir}/${distribution}" excludes="**/.svn**"/>
        </copy>

        <!-- copy the launcher jar and start files -->
        <copy file="${home.dir}/launcher.jar" todir="${build.work}/"/>
        <copy file="${home.dir}/start.sh" todir="${build.work}"/>
        <copy file="${home.dir}/start.bat" todir="${build.work}"/>

        <!-- copy README.txt -->
        <copy file="${home.dir}/README.txt" todir="${build.work}/"/>

        <!-- copy the whole docs-directory -->
        <copy todir="${build.work}/docs">
            <fileset dir="${build.docs}"/>
        </copy>

        <!-- copy all libraries except helma-YYYYMMDD.jar -->
        <copy todir="${build.work}/lib">
            <fileset dir="${home.dir}/lib">
                <exclude name="**/helma-*.jar" />
                <include name="**/*.jar" />
            </fileset>
        </copy>

        <!-- create lib/ext directory -->
        <mkdir dir="${build.work}/lib/ext"/>

        <!-- copy the license files -->
        <copy todir="${build.work}/licenses">
            <fileset dir="${home.dir}/licenses" excludes="**/.svn**"/>
        </copy>
        <copy file="${home.dir}/license.txt" todir="${build.work}/licenses"/>

        <!-- copy the scripts directory -->
        <copy todir="${build.work}/scripts">
            <fileset dir="${home.dir}/scripts" excludes="**/.svn**"/>
        </copy>

        <!-- zip the sourcecode -->
        <!-- mkdir dir="${build.work}/src"/>
        <tar tarfile="${build.work}/src/helma-src.tar" basedir="${build.src}/">
             <tarfileset dir="${build.src}">
                  <include name="${build.src}/**"/>
             </tarfileset>
        </tar>
        <gzip zipfile="${build.work}/src/helma-src.tar.gz" src="${build.work}/src/helma-src.tar"/>
        <delete file="${build.work}/src/helma-src.tar"/ -->
    </target>


    <!-- =================================================================== -->
    <!-- Checkout demo apps, put them in work directory and zip manage app   -->
    <!-- =================================================================== -->
    <target name="package-apps" depends="init">

        <mkdir dir="${build.work}/apps" />

        <!-- add a copy of the welcome app -->
        <mkdir dir="${build.work}/apps/welcome"/>
        <copy todir="${build.work}/apps/welcome">
            <fileset dir="${build.externals}/welcome"/>
        </copy>
 
        <mkdir dir="${build.work}/apps/manage"/>
        <zip zipfile="${build.work}/apps/manage/manage.zip" basedir="${build.externals}/manage/"
             includes="**" excludes="**/properties,readme/**" />
            <copy todir="${build.work}/apps/manage">
                <fileset dir="${build.externals}/manage" includes="app.properties,class.properties,readme.txt"/>
            </copy>
        <!-- delete dir="${build.work}/manage" /-->
    </target>


    <!-- =================================================================== -->
    <!-- Checkout modules including helmaTools                            -->
    <!-- =================================================================== -->
    <target name="package-modules" depends="init">

        <!-- add a copy of the modules -->
        <mkdir dir="${build.work}/modules"/>
        <copy todir="${build.work}/modules">
            <fileset dir="${build.externals}/modules"/>
        </copy>
 
        <mkdir dir="${build.work}/modules"/>
        <zip zipfile="${build.work}/modules/helmaTools.zip" basedir="${build.externals}/helmaTools/"
             includes="**" excludes="**/*.txt, **/*.html, **/*.bat, **/*.sh" />
        <!--delete dir="${build.work}/helmaTools" /-->
    </target>


    <!-- =================================================================== -->
    <!-- Packages the work directory with TAR-GZIP                           -->
    <!-- needs parameter ${filename} for final dist-file                     -->
    <!-- =================================================================== -->
    <target name="package-tgz" depends="init">
        <mkdir dir="${build.dist}" />
        <fixcrlf srcdir="${build.work}" eol="lf" eof="remove" includes="**/*.txt, **/*.properties, **/*.hac, **/*.js, **/*.skin" />
        <tar tarfile="${build.dist}/${filename}.tar" basedir="${build.work}" excludes="**">
            <tarfileset prefix="${filename}" dir="${build.work}" mode="755">
                <include name="start.sh"/>
            </tarfileset>
            <tarfileset prefix="${filename}" dir="${build.work}">
                <include name="**"/>
                <exclude name="start.sh"/>
                <exclude name="lib/jimi.jar"/>
                <exclude name="lib/apache-dom.jar"/>
                <exclude name="docs/api/**"/>
            </tarfileset>
        </tar>
        <gzip zipfile="${build.dist}/${filename}.tar.gz" src="${build.dist}/${filename}.tar"/>
        <delete file="${build.dist}/${filename}.tar"/>
    </target>


    <!-- =================================================================== -->
    <!-- Packages the work directory with ZIP                                -->
    <!-- needs parameter ${filename} for final dist-file                     -->
    <!-- =================================================================== -->
    <target name="package-zip" depends="init">
        <mkdir dir="${build.dist}" />
        <fixcrlf srcdir="${build.work}" eol="crlf" includes="**/*.txt, **/*.properties, **/*.hac, **/*.js, **/*.skin, **/*.xml" />
        <zip zipfile="${build.dist}/${filename}.zip">
            <zipfileset dir="${build.work}" prefix="${filename}">
              <include name="**"/>
              <exclude name="start.sh"/>
              <exclude name="lib/jimi.jar"/>
              <exclude name="lib/apache-dom.jar"/>
              <exclude name="docs/api/**"/>
            </zipfileset>
        </zip>
    </target>


    <!-- =================================================================== -->
    <!-- Packages Helma src and build directories with TAR-GZIP              -->
    <!-- needs parameter ${filename} for final dist-file                     -->
    <!-- =================================================================== -->
    <target name="package-src-tgz" depends="init">
        <mkdir dir="${build.dist}" />
        <tar tarfile="${build.dist}/${filename}-src.tar">
            <tarfileset prefix="${filename}" dir="${home.dir}">
                <include name="src/**"/>
                <include name="build/**"/>
                <include name="build.xml"/>
                <include name="docs/**"/>
                <include name="licenses/**"/>
                <include name="license.txt"/>
                <include name="lib/jimi.jar"/>
                <include name="lib/apache-dom.jar"/>
                <exclude name="docs/modules/**"/>
            </tarfileset>
        </tar>
        <gzip zipfile="${build.dist}/${filename}-src.tar.gz" src="${build.dist}/${filename}-src.tar"/>
        <delete file="${build.dist}/${filename}-src.tar"/>
    </target>


    <!-- =================================================================== -->
    <!-- Packages Helma src and build directories with ZIP                   -->
    <!-- needs parameter ${filename} for final dist-file                     -->
    <!-- =================================================================== -->
    <target name="package-src-zip" depends="init">
        <mkdir dir="${build.dist}" />
        <zip zipfile="${build.dist}/${filename}-src.zip">
            <zipfileset dir="${home.dir}" prefix="${filename}">
              <include name="src/**"/>
              <include name="build/**"/>
              <include name="build.xml"/>
              <include name="docs/**"/>
              <include name="licenses/**"/>
              <include name="license.txt"/>
              <include name="lib/jimi.jar"/>
              <include name="lib/apache-dom.jar"/>
              <exclude name="docs/modules/**"/>
            </zipfileset>
        </zip>
    </target>

    <!-- =================================================================== -->
    <!-- Cleans up temporary build directories                               -->
    <!-- =================================================================== -->
    <target name="clean" depends="init">
        <delete dir="${build.work}" />
        <delete dir="${build.classes}" />
        <delete dir="${build.docs}"/>
        <delete dir="${build.dist}"/>
        <delete file="${home.dir}/launcher.jar" quiet="true"/>
        <delete>
            <fileset dir="${build.lib}" includes="${jar.name}*.jar"/>
        </delete>
    </target>

</project>