<project name="Hello" default="dist" basedir=".">
    <property name="project.artifact.id"        value="com.example.hello/server/trunk/ear" />
    <property name="project.basename"           value="Hello" />
    <property name="project.sql.prefix"         value="hello" />
    <property name="project.sql.schema"         value="hello" />
    <property name="project.testclient"         value="com.example.hello.test.HelloTestClient" />

    <property name="project.build.path"         location="build" />
    <property name="project.dist.path"          location="dist" />
    <property name="project.javadoc.path"       location="doc/javadoc" />
    <property name="project.src.path"           location="src" />
    <property name="project.sql.path"           location="sql" />

    <property file="build.properties" />


    <path id="lib.path">
        <fileset dir="${geronimo.path}/repository/org/apache/geronimo/specs" includes="**/*.jar" />
        <fileset dir="${lib.spring.framework.path}/dist" includes="**/*.jar" />
        <fileset dir="${lib.spring.security.path}/dist" includes="**/*.jar" />
        <fileset dir="${lib.apache.commons.codec.path}" includes="*.jar">
            <exclude name="*-javadoc.jar" />
            <exclude name="*-sources.jar" />
        </fileset>
        <fileset dir="${lib.apache.xmlrpc.path}/lib" includes="*.jar">
            <exclude name="*-javadoc.jar" />
            <exclude name="*-sources.jar" />
        </fileset>
    </path>


    <!-- boilerplate -->

    <target name="init">
        <tstamp />
    </target>


    <!-- building -->

    <target name="dist" depends="compile,javadoc">
        <mkdir dir="${project.dist.path}" />

        <jar destfile="${project.dist.path}/${project.basename}.jar"
             basedir="${project.build.path}">
            <metainf file="${project.src.path}/META-INF/persistence.xml" />
            <exclude name="**/*Servlet*.class" />
            <exclude name="**/site/*.class" />
        </jar>

        <war destfile="${project.dist.path}/${project.basename}.war"
             webxml="${project.src.path}/WEB-INF/web.xml">
            <webinf file="${project.src.path}/WEB-INF/geronimo-web.xml" />
            <webinf file="${project.src.path}/WEB-INF/${project.basename}-servlet.xml" />
            <webinf file="${project.src.path}/WEB-INF/applicationContext-security.xml" />

            <classes dir="${project.build.path}">
                <include name="**/*Servlet*.class" />
                <include name="**/site/*.class" />
            </classes>

            <zipfileset dir="jsp" prefix="WEB-INF/jsp/" />
        </war>

        <ear destfile="${project.dist.path}/${project.basename}.ear"
             appxml="${project.src.path}/META-INF/application.xml">
            <metainf file="${project.src.path}/META-INF/geronimo-application.xml" />
            <fileset file="${project.dist.path}/${project.basename}.jar" />
            <fileset file="${project.dist.path}/${project.basename}.war" />

            <zipfileset prefix="lib/" dir="${lib.apache.xmlrpc.path}/lib" includes="*.jar">
                <exclude name="*-javadoc.jar" />
                <exclude name="*-sources.jar" />
            </zipfileset>
            <zipfileset prefix="lib/" dir="${lib.apache.commons.codec.path}" includes="*.jar">
                <exclude name="*-javadoc.jar" />
                <exclude name="*-sources.jar" />
            </zipfileset>
        </ear>
    </target>

    <target name="compile" depends="init">
        <mkdir dir="${project.build.path}" />
        <javac srcdir="${project.src.path}"
               destdir="${project.build.path}"
               debug="on" debuglevel="lines,vars,source"
               includeantruntime="false"
               encoding="utf8">
            <classpath>
                <path refid="lib.path" />
            </classpath>
        </javac>
    </target>

    <target name="javadoc-check">
        <condition property="uptodate.javadoc">
            <or>
                <and>
                    <isset property="javadoc.use" />
                    <isfalse value="${javadoc.use}" />
                </and>
                <and>
                    <uptodate targetfile="${project.javadoc.path}/index.html">
                        <srcfiles dir="${project.src.path}">
                            <include name="**/*.java" />
                            <include name="**/*.html" />
                        </srcfiles>
                    </uptodate>
                </and>
            </or>
        </condition>
    </target>

    <target name="javadoc" depends="javadoc-check" unless="uptodate.javadoc">
        <javadoc destdir="${project.javadoc.path}" linksource="yes" encoding="utf8">
            <sourcepath>
                <pathelement location="${project.src.path}" />
            </sourcepath>
            <classpath>
                <path refid="lib.path" />
            </classpath>
            <link href="http://java.sun.com/javase/6/docs/api/" />
            <link href="http://java.sun.com/javaee/6/docs/api/" />
        </javadoc>
    </target>

    <target name="clean">
        <delete dir="${project.build.path}" />
        <delete dir="${project.dist.path}" />
        <delete dir="${project.javadoc.path}" />
    </target>


    <!-- testing -->

    <target name="rpctest" depends="compile">
        <java classname="${project.testclient}" fork="true">
            <classpath>
                <pathelement location="${project.build.path}" />
                <path refid="lib.path" />
            </classpath>

            <arg value="${client.server}" />
        </java>
    </target>


    <!-- deployment -->

    <target name="deploy" depends="dist">
        <exec executable="${geronimo.path}/bin/${geronimo.deploy.cmd}">
            <arg value="-u" />
            <arg value="${geronimo.user}" />
            <arg value="-p" />
            <arg value="${geronimo.password}" />
            <arg value="deploy" />
            <arg value="${project.dist.path}/${project.basename}.ear" />
        </exec>
    </target>

    <target name="undeploy">
        <exec executable="${geronimo.path}/bin/${geronimo.deploy.cmd}">
            <arg value="-u" />
            <arg value="${geronimo.user}" />
            <arg value="-p" />
            <arg value="${geronimo.password}" />
            <arg value="undeploy" />
            <arg value="${project.artifact.id}" />
        </exec>
    </target>

    <target name="redeploy" depends="dist">
        <exec executable="${geronimo.path}/bin/${geronimo.deploy.cmd}">
            <arg value="-u" />
            <arg value="${geronimo.user}" />
            <arg value="-p" />
            <arg value="${geronimo.password}" />
            <arg value="redeploy" />
            <arg value="${project.dist.path}/${project.basename}.ear" />
        </exec>
    </target>


    <!-- database -->

    <target name="provision-schema">
        <exec executable="psql">
            <arg value="-q" />
            <arg value="-d" />
            <arg value="${database.name}" />
            <arg value="-f" />
            <arg value="${project.sql.path}/${project.sql.prefix}-schema.sql" />
        </exec>
    </target>

    <target name="provision-data">
        <exec executable="psql">
            <arg value="-q" />
            <arg value="-d" />
            <arg value="${database.name}" />
            <arg value="-f" />
            <arg value="${project.sql.path}/${project.sql.prefix}-data.sql" />
        </exec>
    </target>

    <target name="provision" depends="provision-schema,provision-data" />

    <target name="unprovision">
        <exec executable="psql">
            <arg value="-q" />
            <arg value="-d" />
            <arg value="${database.name}" />
            <arg value="-c" />
            <arg value="drop schema if exists ${project.sql.schema} cascade;" />
        </exec>
    </target>

    <target name="reprovision" depends="unprovision,provision" />
</project>
