<?xml version="1.0"?>

<!-- Smack Build Script ========================================== -->
<!-- Jive Software      ============================================== -->

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

<project name="Smack" default="all" basedir="..">

    <!-- TASKDEFS -->
    <!-- ======================================================================================= -->
    <!-- ======================================================================================= -->

    <taskdef resource="net/sf/antcontrib/antcontrib.properties">
        <classpath>
            <pathelement location="${basedir}/build/ant-contrib.jar"/>
        </classpath>
    </taskdef>

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

    <!-- Smack Version -->
    <property name="version.major" value="3" />
    <property name="version.minor" value="3" />
    <property name="version.revision" value="0" />
    <property name="version.extra" value="SNAPSHOT" /> 

    <if>
        <equals arg1="${version.extra}" arg2=""/>
        <then>
            <property name="version"
                      value="${version.major}.${version.minor}.${version.revision}"/>
            <property name="version.filename"
                      value="${version.major}_${version.minor}_${version.revision}"/>
        </then>
        <else>
            <property name="version"
                      value="${version.major}.${version.minor}.${version.revision}.${version.extra}"/>
            <property name="version.filename"
                      value="${version.major}_${version.minor}_${version.revision}_${version.extra}"/>
        </else>
    </if>
    <tstamp>
        <format property="builddate" pattern="MM/dd/yyyy"/>
    </tstamp>

    <property file="${basedir}/build/build.properties" />
    <property name="compile.dir" value="${basedir}/target/classes" />
    <property name="compile.test.dir" value="${basedir}/target/classes-test" />
    <property name="jar.dest.dir" value="${basedir}/target" />
    <property name="javadoc.dest.dir" value="${basedir}/target/javadoc" />
    <property name="merge.lib.dir" value="${basedir}/build/merge" />
    <property name="test.dir" value="${basedir}/test" />
    <property name="test-unit.dir" value="${basedir}/test-unit" />
    <property name="resources.dir" value="${basedir}/build/resources" />
	<property name="jingle.extension.merge.lib.dir" value="${basedir}/jingle/extension/build/merge" />	
	<property name="jingle.extension.lib.dir" value="${basedir}/jingle/extension/build/lib" />	

    <!-- Test props - override these defaults in the properties file or in command line -->
    <property name="test.host" value="localhost" />
    <property name="test.port" value="5222" />
    <property name="test.admin.username" value="admin" />
    <property name="test.admin.password" value="admin" />
    <property name="test.admin.resource" value="Test" />
    <property name="test.smack.debug" value="false" />

    <!-- PATHS, DEPENDIENCIES, PATTERNS -->
    <!-- ======================================================================================= -->
    <!-- ======================================================================================= -->

    <patternset id="test.cases">
        <include name="org/jivesoftware/smack/**/*Test.java" />
        <exclude name="org/jivesoftware/smack/**/Messenger*Test.java" />
    </patternset>

    <patternset id="messenger.test.cases">
        <include name="org/jivesoftware/smack/**/Messenger*Test.java" />
    </patternset>

    <!-- TARGETS -->
    <!-- ======================================================================================= -->

    <!-- all -->
    <!-- ======================================================================================= -->
    <target name="all" depends="jar" description="Calls 'jar' target by default">
    </target>

    <!-- compile -->
    <!-- ======================================================================================= -->
    <target name="compile" description="Compiles all source to ${compile.dir}.">
        <!-- make target dir -->
        <mkdir dir="${compile.dir}" />
        <javac
            destdir="${compile.dir}"
            includeAntRuntime="no"
            debug="on"
            source="1.6"
            target="1.6"
        >
            <src path="${basedir}/source" />
            <classpath>
                <fileset dir="${merge.lib.dir}">
                    <include name="*.jar"/>
                </fileset>
            </classpath>
        </javac>		
		<mkdir dir="${compile.dir}/jingle/extension" />
		<javac
            destdir="${compile.dir}/jingle/extension"
            includeAntRuntime="no"
            debug="on"
            source="1.6"
            target="1.6"
        >
            <src path="${basedir}/jingle/extension/source" />
            <classpath>
				<fileset dir="${merge.lib.dir}">
                    <include name="*.jar"/>
                </fileset>
                <fileset dir="${jingle.extension.lib.dir}">
                    <include name="*.jar"/>
                </fileset>
				<fileset dir="${jingle.extension.merge.lib.dir}">
                    <include name="*.jar"/>
                </fileset>
				<pathelement path="${compile.dir}"/>
            </classpath>
        </javac>		
    </target>

    <!-- compile-test -->
    <!-- ======================================================================================= -->
    <target name="compile-test" description="Compiles all source to ${compile.dir}.">
        <!-- make target dir -->
        <mkdir dir="${compile.test.dir}" />
        <javac
            destdir="${compile.test.dir}"
            includeAntRuntime="no"
            debug="on"
            source="1.6"
            target="1.6"
        >
            <src path="${basedir}/source" />
            <src path="${test.dir}" />
            <src path="${test-unit.dir}" />
            <classpath>
                <fileset dir="${merge.lib.dir}">
                    <include name="*.jar"/>
                </fileset>
                <fileset dir="${basedir}/build">
                    <include name="junit-4.10.jar"/>
                    <include name="mockito-all-1.8.2.jar"/>
                    <include name="powermock-mockito-1.3.5-full.jar"/>
                </fileset>
                <fileset dir ="${basedir}/build/build">
                	<include name="xmlunit.jar"/>
		    		<include name="java-xmlbuilder-0.3.jar" />
                </fileset>
            	<pathelement location="${compile.dir}" />
            </classpath>
        </javac>
    </target>

    <!-- jar -->
    <!-- ======================================================================================= -->
    <target name="jar" depends="compile" unless="jar.uptodate" description="Produces smack.jar">
        <copy todir="${compile.dir}/META-INF" file="${basedir}/build/resources/META-INF/smack-config.xml" />
        <jar destfile="${jar.dest.dir}/smack.jar"
            basedir="${compile.dir}"
            includes="org/jivesoftware/smack/**/*.class, **/smack-config.xml">
            <zipfileset src="${merge.lib.dir}/xpp.jar"/>
        </jar>
    	<taskdef resource="aQute/bnd/ant/taskdef.properties" classpath="${basedir}/build/build/biz.aQute.bnd.jar"/>
    	<bndwrap jars="${jar.dest.dir}/smack.jar" output="${jar.dest.dir}/smack.jar" />
        <jar file="${jar.dest.dir}/smack.jar" update="true">
            <manifest>
                <attribute name="Bundle-SymbolicName" value="org.igniterealtime.smack" />
            </manifest>
        </jar>
        <copy todir="${compile.dir}/META-INF" file="${basedir}/build/resources/META-INF/smack.providers" />
        <jar destfile="${jar.dest.dir}/smackx.jar"
            basedir="${compile.dir}"
            includes="org/jivesoftware/smackx/**/*.class, **/*.providers"
            excludes="org/jivesoftware/smackx/debugger/*.class">
            <manifest>
                <attribute name="Class-Path" value="smack.jar" />
            </manifest>
            <zipfileset src="${merge.lib.dir}/jzlib.jar"/>
        </jar>
    	<bndwrap jars="${jar.dest.dir}/smackx.jar" output="${jar.dest.dir}/smackx.jar" />
        <jar file="${jar.dest.dir}/smackx.jar" update="true">
            <manifest>
                <attribute name="Bundle-SymbolicName" value="org.igniterealtime.smack-ext" />
            </manifest>
        </jar>
        <copy todir="${compile.dir}/images">
            <fileset dir="${basedir}/build/resources/images">
                <include name="*.png"/>
            </fileset>
        </copy>
        <jar destfile="${jar.dest.dir}/smackx-debug.jar"
            basedir="${compile.dir}"
            includes="org/jivesoftware/smackx/debugger/*.class, **/*.png">
            <manifest>
                <attribute name="Class-Path" value="smack.jar" />
            </manifest>
        </jar>
    	<bndwrap jars="${jar.dest.dir}/smackx-debug.jar" output="${jar.dest.dir}/smackx-debug.jar" />
        <jar file="${jar.dest.dir}/smackx-debug.jar" update="true">
            <manifest>
                <attribute name="Bundle-SymbolicName" value="org.igniterealtime.smack-ext-debug" />
            </manifest>
        </jar>
		<jar destfile="${jar.dest.dir}/smackx-jingle.jar"
            basedir="${compile.dir}/jingle/extension"
            includes="org/jivesoftware/smackx/**/*.class">
            <manifest>
                <attribute name="Class-Path" value="smack.jar, smackx.jar" />
            </manifest>
            <zipfileset src="${jingle.extension.merge.lib.dir}/jstun.jar"/>
        </jar>
    	<bndwrap jars="${jar.dest.dir}/smackx-jingle.jar" output="${jar.dest.dir}/smackx-jingle.jar" />
        <jar file="${jar.dest.dir}/smackx-jingle.jar" update="true">
            <manifest>
                <attribute name="Bundle-SymbolicName" value="org.igniterealtime.smack-ext-jingle" />
            </manifest>
        </jar>
        <delete file="${compile.dir}/META-INF/smack-config.xml" />
        <delete file="${compile.dir}/META-INF/smack.providers" />
        <delete>
            <fileset dir="${compile.dir}/images">
                <include name="*.png"/>
            </fileset>
        </delete>
    </target>

    <!-- jar -->
    <!-- ======================================================================================= -->
    <target name="jar-test" depends="compile-test" description="Produces jar of test code">
        <jar destfile="${jar.dest.dir}/smack-test.jar"
            basedir="${compile.test.dir}"
            includes="org/jivesoftware/smack/**/*.class"
        />
    </target>

    <!-- javadoc -->
    <!-- ======================================================================================= -->
    <target name="javadoc" description="JavaDocs the Smack source code">

        <mkdir dir="${javadoc.dest.dir}" />
        <javadoc
            packagenames="org.jivesoftware.smack.*, org.jivesoftware.smackx.*"
            excludepackagenames="org.jivesoftware.smack.util.collections"
            sourcepath="${basedir}/source"
            destdir="${javadoc.dest.dir}"
            author="true"
            windowtitle="Smack ${version} Documentation"
            overview="${basedir}/source/overview.html"
        >
            <classpath>
                <fileset dir="${merge.lib.dir}">
                    <include name="*.jar"/>
                </fileset>
            </classpath>
            <doctitle><![CDATA[<font face="arial,helvetica">Smack ${version}</font>]]></doctitle>
            <header><![CDATA[<b>Smack</b>]]></header>
            <bottom><![CDATA[<i>Copyright &copy; 2003-2007 Jive Software. </i>]]></bottom>
            <link href="http://java.sun.com/j2se/1.3/docs/api/" />
            <link href="http://java.sun.com/j2ee/sdk_1.2.1/techdocs/api/" />
        </javadoc>
    </target>


    <!-- test -->
    <!-- ======================================================================================= -->
    <target name="func-test" depends="compile, jar-test" unless="no.test">
        <antcall target="test.messenger"/>
        <antcall target="test"/>
    </target>


    <!-- test -->
    <!-- ======================================================================================= -->
    <target name="test" depends="compile, jar-test" unless="no.test">

        <echo>


            **** no.test: ${no.test}


        </echo>

        <property name="test.messenger" value="false" />

        <if>
            <not><equals arg1="test.messenger" arg2="true" /></not>
            <then>
                <property name="test.classes" value="test.cases" />
            </then>
        </if>

        <junit printsummary="on"
            fork="true"
            haltonfailure="false"
            failureproperty="tests.failed"
            showoutput="true">

            <sysproperty key="smack.test.host" value="${test.host}" />
            <sysproperty key="smack.test.port" value="${test.port}" />
            <sysproperty key="smack.test.admin.username" value="${test.admin.username}" />
            <sysproperty key="smack.test.admin.password" value="${test.admin.password}" />
            <sysproperty key="smack.test.admin.resource" value="${test.admin.resource}" />
            <sysproperty key="smack.debug" value="${test.smack.debug}" />

            <classpath>
                <fileset dir="${merge.lib.dir}">
                    <include name="*.jar"/>
                </fileset>
                <fileset dir="${basedir}/build">
                    <include name="junit-4.10.jar"/>
                    <include name="mockito-all-1.8.2.jar"/>
                    <include name="powermock-mockito-1.3.5-full.jar"/>
                </fileset>
                <fileset dir ="${basedir}/build/build">
                	<include name="xmlunit.jar"/>
		    		<include name="java-xmlbuilder-0.3.jar" />
                </fileset>
                <fileset dir="${jar.dest.dir}">
                    <include name="smack-test.jar"/>
                </fileset>
                <pathelement location="${compile.dir}" />
                <pathelement location="${test.dir}" />
                <pathelement location="${resources.dir}" />
            </classpath>

            <formatter type="brief" usefile="false"/>

            <batchtest>
                <fileset dir="${basedir}/test">
                    <patternset refid="${test.classes}" />
                </fileset>
            </batchtest>
        </junit>

        <fail if="tests.failed" message="** Tests failed, see test log. **" />
    </target>

    <!-- test-unit -->
    <!-- ======================================================================================= -->
    <target name="test-unit" depends="compile, jar-test" unless="no.test">

        <junit printsummary="on"
            fork="true"
            haltonfailure="false"
            failureproperty="tests.failed"
            showoutput="true">

            <classpath>
                <fileset dir="${merge.lib.dir}">
                    <include name="*.jar"/>
                </fileset>
                <fileset dir="${basedir}/build">
                    <include name="junit-4.10.jar"/>
                    <include name="mockito-all-1.8.2.jar"/>
                    <include name="powermock-mockito-1.3.5-full.jar"/>
                </fileset>
                <fileset dir ="${basedir}/build/build">
                	<include name="xmlunit.jar"/>
		    		<include name="java-xmlbuilder-0.3.jar" />
                </fileset>
                <fileset dir="${jar.dest.dir}">
                    <include name="smack-test.jar"/>
                </fileset>
                <pathelement location="${compile.dir}" />
                <pathelement location="${test-unit.dir}" />
                <pathelement location="${resources.dir}" />
            </classpath>

            <formatter type="brief" usefile="false"/>

            <batchtest>
                <fileset dir="${basedir}/test-unit">
                    <patternset refid="test.cases" />
                </fileset>
            </batchtest>
        </junit>

        <fail if="tests.failed" message="** Tests failed, see test log. **" />
    </target>

    <!-- test -->
    <!-- ======================================================================================= -->
    <target name="test.messenger" depends="compile, jar-test" unless="no.test">
        <antcall target="test" inheritall="true" inheritrefs="true">
            <param name="test.messenger" value="true" />
            <param name="test.classes" value="messenger.test.cases" />
        </antcall>
    </target>


    <!-- release -->
    <!-- ======================================================================================= -->
    <target name="release" description="Builds a release" if="release.exists" depends="release-exists">
        <antcall target="jar">
            <param name="no.test" value="true" />
        </antcall>
        <antcall target="javadoc">
            <param name="no.test" value="true" />
        </antcall>
        <ant antfile="${basedir}/build/release.xml" />
    </target>

	<!-- checkcode -->
	<!-- ======================================================================================= -->
	<target name="checkcode" >
		<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask">
        	<classpath>
				<pathelement location="${basedir}/build/pmd.jar" />
				<pathelement location="${basedir}/build/asm.jar" />
            	<pathelement location="${basedir}/build/jaxen.jar" />
        	</classpath>
		</taskdef>
		<pmd shortFilenames="true">
			<ruleset>migrating</ruleset>
			<ruleset>finalizers</ruleset>
			<formatter type="html" toFile="target/pmd_report.html" toConsole="true" />
			<fileset dir="source/">
				<include name="**/*.java" />
			</fileset>
		</pmd>		
	</target>
	
    <!-- release-exists -->
    <!-- ======================================================================================= -->
    <target name="release-exists" >
        <available file="${basedir}/build/release.xml" property="release.exists"/>
    </target>


    <!-- clean -->
    <!-- ======================================================================================= -->
    <target name="clean" description="Deletes all generated content.">
    	<delete dir="${javadoc.dest.dir}" />
        <delete dir="${compile.dir}" />
        <delete dir="${compile.test.dir}" />
        <delete file="${basedir}/smack.jar" />
        <delete file="${basedir}/smackx.jar" />
        <delete file="${basedir}/smackx-debug.jar" />
        <delete file="${basedir}/smack-test.jar" />
		<delete file="${basedir}/smackx-jingle.jar" />
        <delete dir="${basedir}/target" />
    </target>

</project>
