<?xml version="1.0" encoding="utf-8"?>
<project name="main" default="build-default" basedir="."  xmlns:ivy="antlib:org.apache.ivy.ant">
<!--
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# $Id$
#
# Copyright 2008 Glencoe Software, Inc. All rights reserved.
# Use is subject to license terms supplied in LICENSE.txt
#
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Written by:  Josh Moore, josh at glencoesoftware.com
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Rewrite of the OMERO build system to allow for building
individual components. Use "ant -p" to see the individual
build-* targets.

-->

    <property name="import.dir" value="${basedir}/components/antlib/resources"/>
    <import file="${basedir}/deprecated.xml"/>
    <import file="${import.dir}/global.xml"/>

    <target name="ivy-init" unless="ivy.done">

        <!-- Prevent future invocations and PermGen errors-->
        <property name="ivy.done" value="done"/>

        <!-- Top-level ivy setup. Also defined in antlib/resources/dependencies.xml -->
        <path id="ivy.classpath">
            <fileset dir="${omero.home}/lib/repository" includes="ivy*.jar"/>
        </path>
        <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.classpath"/>
        <property name="deps.buildlist.dir" value="${omero.home}/components"/>

        <ivy:settings id="ivy.toplevel"  file="${etc.dir}/ivysettings.xml" override="true"/>
        <ivy:buildlist reference="all.buildpath" settingsRef="ivy.toplevel">
            <fileset dir="${deps.buildlist.dir}" includes="*/build.xml" excludes="**/policy/**,**/tools/**"/>
        </ivy:buildlist>
        <ivy:buildlist reference="blitzserver.buildpath" settingsRef="ivy.toplevel">
            <fileset dir="${deps.buildlist.dir}" includes="*/build.xml" excludes="**/app/**,**/policy/**,**/tools/**"/>
        </ivy:buildlist>
        <ivy:buildlist reference="appserver.buildpath" settingsRef="ivy.toplevel">
            <fileset dir="${deps.buildlist.dir}" includes="*/build.xml" excludes="**/blitz/**,**/policy/**,**/tools/**"/>
        </ivy:buildlist>
        <!-- Single file paths defined in antlib/resources/directories.xml -->
    </target>

    <target name="quick" description="Disable tests">
        <property name="test.skip" value="true"/>
    </target>

    <target name="clean" description="Calls 'clean' on all components" depends="ivy-init">
        <iterate buildpathref="all.buildpath"   target="clean"/>
        <iterate buildpathref="tools.buildpath" target="clean"/>
        <delete dir="${dist.dir}"/>
        <delete dir="${lib.dir}/cache"/>
        <delete includeemptydirs="true">
            <fileset dir="${lib.dir}/repository/omero" includes="**/*"/>
        </delete>
    </target>

    <target name="build-default" description="Build all components except for C++ (testing disabled)" depends="ivy-init">
        <property name="env.NOMAKE" value="1"/>
        <iterate buildpathref="blitzserver.buildpath" target="dist"/>
        <iterate buildpathref="app.buildpath" target="dist"/>
        <antcall target="prepare-dist" inheritRefs="true" inheritAll="true"/>
        <iterate buildpathref="OmeroImporter.buildpath" target="tools-dist"/>
        <iterate buildpathref="WebAdmin.buildpath" target="tools-dist"/>
        <iterate buildpathref="OmeroPy.buildpath" target="tools-dist"/>
        <iterate buildpathref="OmeroJava.buildpath" target="tools-dist"/>
        <iterate buildpathref="licenses.buildpath" target="tools-dist"/>
        <iterate buildpathref="tools.buildpath" target="dist"/>
    </target>

    <target name="build-all" description="Build everything and copy to dist" depends="ivy-init">
        <iterate buildpathref="all.buildpath" target="dist"/>
        <antcall target="prepare-dist" inheritRefs="true" inheritAll="true"/>
        <iterate buildpathref="tools.buildpath" target="build"/>
        <iterate buildpathref="tools.buildpath" target="dist"/>
    </target>

    <target name="build-blitz" description="Build blitz and copy to dist/blitz" depends="ivy-init">
        <iterate buildpathref="blitzserver.buildpath" target="dist"/>
        <antcall target="prepare-dist" inheritRefs="true" inheritAll="true"/>
        <!-- Must also build python since it provides our command lines -->
        <iterate buildpathref="OmeroPy.buildpath" target="tools-dist"/>
        <iterate buildpathref="tools.buildpath" target="dist"/>
    </target>

    <target name="build-ear" description="Build ear and copy to dist" depends="ivy-init">
        <iterate buildpathref="appserver.buildpath" target="dist"/>
        <!-- WORKAROUND: creating the blitz jar to make prepare-dist work-->
        <iterate buildpathref="blitzserver.buildpath" target="install"/>
        <antcall target="prepare-dist" inheritRefs="true" inheritAll="true"/>
    </target>

    <target name="build-webadmin" description="Build WebAdmin and copy to dist">
        <antcall target="build-ear" inheritRefs="true" inheritAll="true"/>
        <iterate buildpathref="WebAdmin.buildpath" target="tools-dist"/>
        <iterate buildpathref="tools.buildpath" target="dist"/>
    </target>

    <target name="build-importer" description="Build importer and copy to dist/client">
        <antcall target="build-ear" inheritRefs="true" inheritAll="true"/>
        <iterate buildpathref="OmeroImporter.buildpath" target="tools-dist"/>
        <iterate buildpathref="tools.buildpath" target="dist"/>
    </target>

    <target name="build-cpp" description="Build OmeroCpp bindings and copy to dist/lib">
        <antcall target="build-blitz" inheritRefs="true" inheritAll="true"/>
        <iterate buildpathref="OmeroCpp.buildpath" target="tools-dist"/>
        <iterate buildpathref="tools.buildpath" target="dist"/>
    </target>

    <target name="build-java" description="Build OmeroJava bindings and copy to dist/client">
        <antcall target="build-blitz" inheritRefs="true" inheritAll="true"/>
        <iterate buildpathref="OmeroCpp.buildpath" target="tools-dist"/>
        <iterate buildpathref="tools.buildpath" target="dist"/>
    </target>

    <target name="build-py" description="Build OmeroPy bindings and copy to dist/lib">
        <antcall target="build-blitz" inheritRefs="true" inheritAll="true"/>
        <!-- Currently has no logic, since build-blitz requires all of this -->
    </target>

    <target name="build-schema" description="Build new DB schema and copy to sql/" depends="ivy-init">
        <iterate buildpathref="model.buildpath" target="clean"/>
        <iterate buildpathref="dsl.buildpath" target="install"/>
        <iterate buildpathref="model.buildpath" target="install"/>
        <iterate buildpathref="model.buildpath" target="publish-schema"/>
    </target>

    <!--
    Packaging
    -->
    <target name="zip" description="Zip the dist directory into ${product.name}-${omero.version}.zip">
        <zip destfile="${product.name}-${omero.version}.zip">
            <zipfileset dir="${dist.dir}" prefix="${product.name}-${omero.version}"
                excludes="bin/omero"/>
            <zipfileset dir="${dist.dir}" prefix="${product.name}-${omero.version}"
                includes="bin/omero"
                filemode="755"/>
        </zip>
    </target>

    <target name="tar" description="Tar the dist directory into ${product-name}-${omero.version}.tar.bz2">
        <tar destfile="${product.name}-${omero.version}.tar.bz2" compress="bzip2">
            <zipfileset dir="${dist.dir}" prefix="${product.name}-${omero.version}"
                excludes="bin/omero"/>
            <zipfileset dir="${dist.dir}" prefix="${product.name}-${omero.version}"
                includes="bin/omero"
                filemode="755"/>
        </tar>
    </target>

    <target name="deploy" description="Copy the dist/${product.name}.ear to $JBOSS_HOME/server/default/deploy" depends="ivy-init">
        <iterate buildpathref="app.buildpath" target="deploy"/>
    </target>

    <!-- Internal target -->
    <target name="prepare-dist" depends="ivy-init">
            <mkdir dir="${dist.dir}/bin"/>
            <copy todir="${dist.dir}/etc" overwrite="true">
                <fileset dir="${omero.home}/etc">
                    <exclude name="local.properties"/>
                </fileset>
            </copy>
            <copy todir="${dist.dir}">
                <fileset dir="${omero.home}">
                    <include name="omero.class"/>
                    <include name="components/antlib/**"/>
                    <include name="sql/**"/>
                </fileset>
            </copy>

            <mkdir dir="${dist.dir}/client"/>
            <ivy:resolve file="${import.dir}/omero.ivy" type="jar" conf="client" settingsRef="ivy.toplevel"/>
            <ivy:retrieve conf="client" pattern="${dist.dir}/client/[module]-[revision].[ext]" sync="true" log="quiet" settingsRef="ivy.toplevel"/>
            <mkdir dir="${dist.dir}/lib/repository"/>
            <ivy:resolve file="${import.dir}/omero.ivy" type="jar" conf="server" settingsRef="ivy.toplevel"/>
            <ivy:retrieve conf="server" pattern="${dist.dir}/lib/repository/[module]-[revision].[ext]" sync="true" log="quiet" settingsRef="ivy.toplevel"/>
            <ivy:resolve organisation="apache" module="ant" revision="${versions.ant}" inline="true" settingsRef="ivy.toplevel"/>
            <ivy:retrieve pattern="${dist.dir}/lib/repository/[module]-[revision].[ext]" sync="true" log="quiet" settingsRef="ivy.toplevel"/>

            <copy
                file="${import.dir}/omero.xml"
                tofile="${dist.dir}/build.xml"
                overwrite="true" />
            <copy
                file="${import.dir}/omero.ivy"
                tofile="${dist.dir}/omero.ivy"
                overwrite="true" />

    </target>

    <target name="prepare-eclipse" description="Symlink (or copy) all lib/repository jars needed by each component" depends="ivy-init">
        <ivy:resolve file="${import.dir}/omero.ivy" type="jar" conf="server" settingsRef="ivy.toplevel"/>
        <ivy:retrieve pattern="${omero.home}/target/libs/[artifact].[ext]" log="quiet" symlink="true" settingsRef="ivy.toplevel"/>
        <ivy:resolve file="${import.dir}/omero.ivy" type="jar" conf="client" settingsRef="ivy.toplevel"/>
        <ivy:retrieve pattern="${omero.home}/target/libs/[artifact].[ext]" log="quiet" symlink="true" settingsRef="ivy.toplevel"/>
        <ivy:resolve file="${import.dir}/omero.ivy" type="jar" conf="testing" settingsRef="ivy.toplevel"/>
        <ivy:retrieve pattern="${omero.home}/target/libs/[artifact].[ext]" log="quiet" symlink="true" settingsRef="ivy.toplevel"/>
        <iterate buildpathref="all.buildpath" target="prepare"/>
        <iterate buildpathref="OmeroImporter.buildpath" target="prepare"/>
        <iterate buildpathref="licenses.buildpath" target="prepare"/>
    </target>

    <target name="findbugs" description="Generates findbugs.xml and checkstyle.xml for all components" depends="ivy-init">
       <iterate buildpathref="all.buildpath"   target="findbugs"/>
       <iterate buildpathref="tools.buildpath" target="findbugs"/>
    </target>

    <target name="coverage" depends="prepare-eclipse"
        description="Merge code coverage reports into single top-level report">
        <path id="omero.classpath">
                <fileset dir="${omero.home}/target/libs" />
        </path>
        <taskdef resource="emma_ant.properties" classpathref="omero.classpath" />
        <emma>
            <merge outfile="${target.dir}/coverage.es" >
                <fileset dir="components" includes="**/target/coverage.emma,**/target/metadata.emma"/>
            </merge>
            <report sourcepath="${src.dir}" >
                <fileset dir="${target.dir}" includes="coverage.es"/>
                <html outfile="${target.dir}/coverage.html" />
                <xml outfile="${target.dir}/coverage.xml" />
            </report>
        </emma>
    </target>

    <target name="setup">
        <ant antfile="${omero.home}/components/antlib/resources/setup.xml" target="setup"/>
    </target>

    <target name="javadoc" description="Generate Javadocs for all components under dist/docs/api">
        <mkdir dir="${dist.dir}/docs/api"/>
        <patternset id="all.java.files">
            <!-- Includes prefixed with "**" in order to pick up
            tools/ components -->
            <include name="src/**/*.java"/>
            <include name="target/generated/src/**/*.java"/>
            <exclude name="xxx/**"/>
        </patternset>

        <javadoc
            failonerror="true"
            Verbose="true"
            maxmemory="${javadoc.maxmem}"
            destdir="dist/docs/api"
            author="true"
            version="true"
            use="true"
            breakiterator="true"
            windowtitle="OMERO (OME Remote Objects) Server">

            <classpath>
                <fileset dir="lib">
                    <include name="**/*.jar"/>
                </fileset>
            </classpath>

            <fileset dir="components/common/" defaultexcludes="yes">
                <patternset refid="all.java.files"/>
            </fileset>
            <fileset dir="components/server/" defaultexcludes="yes">
                <patternset refid="all.java.files"/>
            </fileset>
            <fileset dir="components/romio/" defaultexcludes="yes">
                <patternset refid="all.java.files"/>
            </fileset>
            <fileset dir="components/rendering/" defaultexcludes="yes">
                <patternset refid="all.java.files"/>
            </fileset>
                <fileset dir="components/client/" defaultexcludes="yes">
                <patternset refid="all.java.files"/>
            </fileset>
            <!-- Skipping generated files for blitz. Just too many -->
            <fileset dir="components/blitz/src" defaultexcludes="yes" includes="**/*.java"/>
            <fileset dir="components/tools/WebAdmin" defaultexcludes="yes">
                <patternset refid="all.java.files"/>
            </fileset>
            <fileset dir="components/tools/admin" defaultexcludes="yes">
                <patternset refid="all.java.files"/>
            </fileset>
            <fileset dir="components/tools/licenses" defaultexcludes="yes">
                <patternset refid="all.java.files"/>
            </fileset>
            <fileset dir="components/tools/OmeroJava" defaultexcludes="yes">
                <patternset refid="all.java.files"/>
            </fileset>

            <doctitle><![CDATA[<h1> Omero API </h1>]]></doctitle>
            <bottom><![CDATA[
            <p><b><i>Copyright &#169; 2007 The University of Dundee. All Rights Reserved.</i></b></p>
            ]]></bottom>

            <tag name="DEV.TODO" scope="all" description="To do:"/>

            <group title="A. Core System"
                    packages="ome.api:ome.conditions*:ome.parameters*:ome.system*"/>
            <group title="B. Model"
                    packages="ome.model*"/>
            <group title="C. Client Packages"
                    packages="ome.client*:ome.adapters*:pojos*"/>
            <group title="D. Server Packages"
                    packages="ome.api.local*:ome.services*:ome.logic*:ome.tools*:ome.security*:ome.io*:ome.annotations*"/>
            <group title="E. Blitz Server"
                    packages="ome.services.blitz*"/>
            <group title="E. Blitz Client"
                    packages="omero*:omeroj*"/>
            <group title="G. Rendering Engine"
                    packages="omeis*"/>
            <group title="H. Utilities"
                    packages="ome.util*:ome.testing*"/>
            <group title="I. Deprecated"
                    packages="ome.dynamic*:ome.rules*"/>

            <link href="http://java.sun.com/j2se/1.5/docs/api/"/>
            <link href="http://www.springframework.org/docs/api/"/>
            <link href="http://www.hibernate.org/hib_docs/v3/api/"/>
            <link href="http://aopalliance.sourceforge.net/doc/"/>
            <link href="http://lucene.apache.org/java/2_2_0/api"/>

        </javadoc>

    </target>

    <target name="ivy-hudson" depends="ivy-init">
        <ivy:resolve settingsRef="ivy.toplevel"
            file="${omero.home}/ivy.xml" type="zip" log="quiet"/>
        <ivy:publish settingsRef="ivy.toplevel"
            artifactspattern="${omero.home}/OMERO.server-${omero.version}.zip"
            srcivypattern="${omero.home}/ivy.xml"
            resolver="omero-resolver"
            pubrevision="${omero.version}"
            pubdate="${now}"
            status="integration"
            overwrite="true"/>
            <!-- This causes the ivy file to be modified -->
            <!--forcedeliver="true"-->
        <ivy:install settingsRef="ivy.toplevel"
            organisation="omero" module="main" revision="${omero.version}"
            from="omero-resolver" to="hudson-repository"
            transitive="true" overwrite="true"/>
    </target>

</project>
