<?xml version="1.0"?>

<!--
    $RCSfile$
    $Revision$
    $Date$

    LICENSE INFO HERE
-->

<!--
    Build Requirements:

        * Ant 1.6 (including optional tasks)
        * JDK 1.5
        * jUnit in your Ant or Java classpath
-->

<project name="Messenger XMPP Server" default="all" basedir="..">

    <description>
        Jive Messenger build script.
    </description>

    <!-- ======================================================================================= -->
    <!-- GLOBAL PROPERTIES                                                                       -->
    <!-- ======================================================================================= -->

    <property file="${basedir}/build/build.properties" />

    <property name="src.dir" value="${basedir}/src" />
    <property name="src.java.dir" value="${src.dir}/java" />
    <property name="src.i18n.dir" value="${src.dir}/i18n" />
    <property name="src.test.dir" value="${src.dir}/test" />
    <property name="src.test.java.dir" value="${src.test.dir}/java" />
    <property name="web.dir" value="${src.dir}/web" />
    <property name="lib.build.dir" value="${basedir}/build/lib" />
    <property name="lib.merge.dir" value="${lib.build.dir}/merge" />
    <property name="lib.dist.dir" value="${lib.build.dir}/dist" />
    <property name="lib.web.dir" value="${web.dir}/WEB-INF/lib" />
    <property name="target.dir" value="${basedir}/target" />
    <property name="compile.dir" value="${basedir}/target/classes" />
    <property name="jar.name" value="messengerd.jar" />
    <property name="jar.dest.dir" value="${target.dir}/app" />
    <property name="javadoc.src.dir" value="${src.dir}/javadoc" />
    <property name="javadoc.dest.dir" value="${basedir}/target/javadoc" />
    <property name="jspc.dest.dir" value="${target.dir}/jspc" />
    <property name="jspc.java.dest.dir" value="${target.dir}/jspc/java" />
    <property name="jspc.classes.dest.dir" value="${target.dir}/jspc/classes" />
    <property name="test.dest.dir" value="${target.dir}/test" />
    <property name="test.classes.dest.dir" value="${test.dest.dir}/classes" />
    <property name="test.results.dest.dir" value="${test.dest.dir}/results" />
    <property name="webapp.dest.dir" value="${target.dir}/webapp" />
    <property name="release.dest.dir" value="${target.dir}/release" />
    <property name="version.major" value="2" />
    <property name="version.minor" value="0" />
    <property name="version.revision" value="0" />
    <property name="version.extra" value="beta" />
    <property name="version" value="${version.major}.${version.minor}.${version.revision}" />
    <property name="version.filename" value="${version.major}_${version.minor}_${version.revision}" />
    <property name="dist.prefix" value="jive_messenger" />

    <!-- ======================================================================================= -->
    <!-- PATHs / PATTERNSETs                                                                     -->
    <!-- ======================================================================================= -->

    <path id="javadoc.dependencies">
        <fileset dir="${lib.build.dir}" includes="*.jar" excludes="junit.jar" />
        <fileset dir="${lib.merge.dir}" includes="*.jar" />
    </path>

    <path id="compile.dependencies">
        <path refid="javadoc.dependencies" />
    </path>

    <path id="jspc.dependencies">
        <path refid="compile.dependencies" />
        <fileset dir="${lib.web.dir}" includes="*.jar" />
    </path>

    <path id="test.dependencies">
        <path refid="compile.dependencies" />
        <fileset dir="${lib.build.dir}" includes="junit.jar" />
    </path>

    <patternset id="compile.sources">
        <include name="**/*.java" />
    </patternset>

    <patternset id="test.sources">
        <include name="**/*Test.java" />
    </patternset>

    <!-- ======================================================================================= -->
    <!-- TARGETs                                                                                 -->
    <!-- ======================================================================================= -->

    <!-- all =================================================================================== -->
    <target name="all" depends="jar, javadoc" description="Calls jar and javadoc targets" />

    <!-- init ================================================================================== -->
    <target name="init">
        <!-- Check for min build requirements -->
        <condition property="ant.not.ok" value="true"><not><contains string="${ant.version}" substring="1.6" /></not></condition>
        <condition property="java.not.ok" value="true"><not><contains string="${ant.java.version}" substring="1.5" /></not></condition>
        <fail if="ant.not.ok" message="Must use Ant 1.6.x to build Jive Messenger" />
        <fail if="java.not.ok" message="Must use JDK 1.5.x to build Jive Messenger" />

        <tstamp />
        <mkdir dir="${target.dir}" />
    </target>

    <!-- compile =============================================================================== -->
    <target name="compile" depends="init" description="Compiles Messenger app code">
        <mkdir dir="${compile.dir}" />
        <javac
            destdir="${compile.dir}"
            includeAntRuntime="no"
            debug="on"
            source="1.5"
        >
            <src path="${src.java.dir}" />
            <patternset refid="compile.sources" />
            <classpath>
                <path refid="compile.dependencies" />
            </classpath>
        </javac>
    </target>

    <!-- jar =================================================================================== -->
    <target name="jar" depends="compile, jspc" description="Produces a JAR of Messenger app code">
        <mkdir dir="${jar.dest.dir}" />
        <!-- Make main Messenger jar -->
        <jar jarfile="${jar.dest.dir}/${jar.name}">
            <fileset dir="${compile.dir}" includes="**/*.class" />
            <fileset dir="${jspc.classes.dest.dir}" includes="**/*.class" />
            <fileset dir="${src.i18n.dir}" includes="*.properties" />
            <zipgroupfileset dir="${lib.merge.dir}" includes="*.jar"/>
            <manifest>
                <attribute name="Main-Class" value="org.jivesoftware.messenger.starter.XMPPServerStarter" />
                <attribute name="Built-By" value="Jive Software (www.jivesoftware.org)"/>
            </manifest>
        </jar>
        <!-- Copy application dependent jars -->
        <copy todir="${jar.dest.dir}/lib">
            <fileset dir="${lib.dist.dir}" includes="*.jar" />
        </copy>
    </target>

    <!-- war =================================================================================== -->
    <target name="war" description="Creates a WAR of the Messenger app">
    </target>

    <!-- javadoc =============================================================================== -->
    <target name="javadoc" depends="compile" description="Produces Messenger Javadocs">
        <mkdir dir="${javadoc.dest.dir}" />
        <!-- Run javadoc over all source code -->
        <javadoc
            sourcepath="${src.java.dir}"
            packagenames="org.jivesoftware.*"
            destdir="${javadoc.dest.dir}"
            windowtitle="Jive Messenger ${version} ${version.extra} Javadoc"
            overview="${src.java.dir}/overview.html"
            failonerror="yes"
        >
            <doctitle><![CDATA[<font face="arial,helvetica,sans-serif">Jive Messenger ${version} ${version.extra} Javadoc</font>]]></doctitle>
            <header><![CDATA[<b>Jive Messenger ${version} ${version.extra} Javadoc</b>]]></header>
            <bottom><![CDATA[<i>Copyright &copy; 1999-2004 Jive Software.</i>]]></bottom>
            <classpath>
                <path refid="javadoc.dependencies" />
            </classpath>
            <link offline="true" href="http://java.sun.com/j2se/1.5.0/docs/api/" packagelistLoc="${javadoc.src.dir}/jdk15"/>
        </javadoc>
    </target>

    <!-- jspc ================================================================================== -->
    <target name="jspc" depends="compile" description="Compiles all JSP pages in the admin console">
        <mkdir dir="${jspc.dest.dir}" />
        <mkdir dir="${jspc.java.dest.dir}" />
        <mkdir dir="${jspc.classes.dest.dir}" />

        <!-- Have to use Tomcat 5's JspC task, not the default Ant one -->
        <taskdef classname="org.apache.jasper.JspC" name="jasper2" >
            <classpath id="jspc.classpath">
                <pathelement location="${java.home}/../lib/tools.jar" />
                <pathelement path="${compile.dir}" />
                <path refid="jspc.dependencies" />
            </classpath>
        </taskdef>

        <!-- JSP to JAVA -->
        <jasper2
                validateXml="false"
                uriroot="${web.dir}"
                outputDir="${jspc.java.dest.dir}"
                package="org.jivesoftware.messenger.admin"
                webXmlFragment="${jspc.dest.dir}/web.partial.xml" />

        <!-- Compile java source -->
        <javac
            destdir="${jspc.classes.dest.dir}"
            includeAntRuntime="no"
            debug="on"
            source="1.5"
            includes="org/jivesoftware/messenger/admin/**/*.java"
        >
            <src path="${jspc.java.dest.dir}" />
            <classpath>
                <pathelement path="${compile.dir}" />
                <path refid="jspc.dependencies" />
            </classpath>
        </javac>

        <!-- Update the web.xml to include the servlet and servlet mapping defs from jspc -->
        <mkdir dir="${webapp.dest.dir}" />
        <loadfile property="servlet-xml" srcFile="${jspc.dest.dir}/web.partial.xml" />
        <copy file="${web.dir}/WEB-INF/web.xml" toFile="${webapp.dest.dir}/WEB-INF/web.xml">
            <filterset begintoken="&lt;!--@@" endtoken="@@--&gt;">
                <filter token="JSPC-SERVLETS" value="${servlet-xml}" />
            </filterset>
        </copy>

    </target>

    <!-- test ================================================================================== -->
    <target name="test" depends="jar" description="Compiles and runs test cases">
        <!-- Compile all test code -->
        <mkdir dir="${test.classes.dest.dir}" />
        <javac
            destdir="${test.classes.dest.dir}"
            includeAntRuntime="no"
            debug="on"
            source="1.5"
        >
            <src path="${src.test.java.dir}" />
            <patternset refid="test.sources" />
            <classpath>
                <path refid="test.dependencies" />
                <pathelement path="${compile.dir}" />
            </classpath>
        </javac>

        <!-- Run jUnit -->
        <mkdir dir="${test.results.dest.dir}" />
        <junit printsummary="yes" haltonfailure="no" fork="yes" dir="${src.test.dir}">

            <!-- We must add our own classes to the classpath for testing -->
            <classpath>
                <path refid="test.dependencies" />
                <pathelement path="${compile.dir}" />
                <pathelement path="${test.classes.dest.dir}" />
            </classpath>

            <formatter type="plain" />

            <batchtest todir="${test.results.dest.dir}">
                <fileset dir="${src.test.java.dir}">
                    <patternset refid="test.sources" />
                </fileset>
            </batchtest>
        </junit>
    </target>

    <!-- release =============================================================================== -->
    <target name="release" depends="jar,javadoc" description="Creates a distribution">
        <mkdir dir="${release.dest.dir}" />

        <!-- Create a new prop for the final release dir then create the dir -->
        <property name="release.out.dir" value="${release.dest.dir}/${dist.prefix}_${version.filename}" />
        <mkdir dir="${release.out.dir}" />


    </target>

    <!-- clean ================================================================================= -->
    <target name="clean" description="Cleans up all build-generated output">
        <delete dir="${target.dir}" />
    </target>

    <!-- clean-jspc ============================================================================ -->
    <target name="clean-jspc" description="Cleans all JSPC output">
        <delete dir="${jspc.dest.dir}" />
    </target>

    <!-- clean-test ============================================================================ -->
    <target name="clean-test" description="Cleans all compiled test classes">
        <delete dir="${test.classes.dest.dir}" />
    </target>

</project>
