<project name="MEMESuite" default="compile" basedir=".">
  <description>
    A build file for the website components of the MEME Suite.
    This is responsible for creating the meme war file.
  </description>

  <property file="MemeSuite.properties"/>

  <target name="check_prop">
    <fail message="Make sure that catalina.home points to a valid Tomcat installation">
      <condition>
        <not>
          <and>
            <isset property="catalina.home"/>
            <length string="${catalina.home}" when="greater" length="0"/>
            <available file="${catalina.home}/webapps" type="dir"/>
            <available file="${catalina.home}/lib" type="dir"/>
          </and>
        </not>
      </condition>
    </fail>
  </target>

  <!-- list of libraries -->
  <path id="all.libs">
    <fileset dir="website/lib">
      <include name="**/*.jar"/>
    </fileset>
    <fileset file="${catalina.home}/lib/servlet-api.jar"/>
    <fileset file="${catalina.home}/lib/catalina.jar"/>
  </path>

  <path id="updater.libs">
    <fileset dir="website/lib">
      <include name="axis.jar"/> <!-- used by RSATWS -->
      <include name="commons-discovery-0.5.jar"/> <!-- used by commons-logging -->
      <include name="commons-logging-1.1.3.jar"/> <!-- used by axis -->
      <include name="commons-io-2.4.jar"/> <!-- various file IO functions used -->
      <include name="commons-net-3.3.jar"/> <!-- ftp -->
      <include name="javamail-1.4.3.jar"/> <!-- used by axis (I think) -->
      <include name="jaxrpc.jar"/> <!-- remote procedure calls -->
      <include name="JSAP-2.1.jar"/> <!-- command line processing -->
      <include name="jsoup-1.7.3.jar"/> <!-- html scraping -->
      <include name="sqlite-jdbc-3.7.2.jar"/> <!-- database -->
      <include name="jtar-1.1.jar"/> <!-- untar files -->
      <include name="RSATWS.jar"/> <!-- RSA Tools webservices -->
      <include name="wsdl4j-1.6.3.jar"/> <!-- used by RSATWS -->
    </fileset>
  </path>

  <pathconvert property="updater.classpath" pathsep=" ">
    <path refid="updater.libs"/>
    <flattenmapper/>
  </pathconvert>

  <target name="compile" depends="check_prop" description="compile the source">
    <javac srcdir="website/src" debug="true" includeantruntime="false">
      <compilerarg value="-Xlint:unchecked"/>
      <classpath refid="all.libs"/>
    </javac>
  </target>

  <!-- The release distribution does not include the unit tests because
       they need bulky files we don't want to keep around. -->
  <target name="check_for_tests">
    <available file="website/src/au/edu/uq/imb/memesuite/tests/TestAll.class"
      type="file" property="testable"/>
  </target>

  <target name="test" depends="compile,check_for_tests" if="testable">
    <java classname="au.edu.uq.imb.memesuite.tests.TestAll" failonerror="true">
      <classpath>
        <path refid="all.libs"/>
        <pathelement location="website/src"/>
      </classpath>
    </java>
  </target>

  <target name="clean_war" description="remove war file" if="version">
    <delete file="meme_${version}.war"/>
  </target>

  <target name="clean" depends="clean_war" description="remove built files">
    <delete verbose="true">
      <fileset dir="website/src">
        <include name="**/*.class"/>
      </fileset>
    </delete>
  </target>

  <target name="build_sequencedb_updater" depends="compile">
    <available file="MemeSuite.properties" type="file" property="configured"/>
    <fail unless="configured" message="Can not build jar as the MemeSuite.properties file has not been generated. Please run make."/>

    <jar destfile="updatedb.jar">
      <fileset file="MemeSuite.properties"/>
      <fileset dir="website/src">
        <include name="au/edu/uq/imb/memesuite/data/Alph.class"/>
        <include name="au/edu/uq/imb/memesuite/data/Alph$*.class"/>
        <include name="au/edu/uq/imb/memesuite/data/AlphStd.class"/>
        <include name="au/edu/uq/imb/memesuite/data/AlphStd$*.class"/>
        <include name="au/edu/uq/imb/memesuite/data/SequenceInfo.class"/>
        <include name="au/edu/uq/imb/memesuite/data/SequenceInfo$*.class"/>
        <include name="au/edu/uq/imb/memesuite/db/*.class"/>
        <include name="au/edu/uq/imb/memesuite/io/alph/*.class"/>
        <include name="au/edu/uq/imb/memesuite/updatedb/*.class"/>
        <include name="au/edu/uq/imb/memesuite/updatedb/*.properties"/>
        <include name="au/edu/uq/imb/memesuite/util/GlobFilter.class"/>
        <include name="au/edu/uq/imb/memesuite/util/GlobFilter$*.class"/>
        <include name="au/edu/uq/imb/memesuite/util/JsonWr.class"/>
        <include name="au/edu/uq/imb/memesuite/util/JsonWr$*.class"/>
        <include name="au/edu/uq/imb/memesuite/util/MultiSourceStatus.class"/>
        <include name="au/edu/uq/imb/memesuite/util/MultiSourceStatus$*.class"/>
        <include name="au/edu/uq/imb/memesuite/util/Progress.class"/>
        <include name="au/edu/uq/imb/memesuite/util/Progress$*.class"/>
        <include name="au/edu/uq/imb/memesuite/util/SemanticVersion.class"/>
        <include name="au/edu/uq/imb/memesuite/util/SemanticVersion$*.class"/>
      </fileset>
      <manifest>
        <attribute name="Main-Class" value="au.edu.uq.imb.memesuite.updatedb.UpdateSequenceDB"/>
        <attribute name="Class-Path" value="${updater.classpath}"/>
      </manifest>
    </jar>
  </target>

  <target name="build_war" depends="compile">
    <available file="MemeSuite.properties" type="file" property="configured"/>
    <fail unless="configured" message="Can not build jar as the MemeSuite.properties file has not been generated. Please run make."/>
    <war destfile="meme_${version}.war" webxml="website/web.xml">
      <metainf dir="website" file="context.xml"/>
      <lib dir="website/lib">
        <include name="*.*"/>
        <exclude name="sqlite-jdbc*"/>
      </lib>
      <classes dir="website/src">
        <include name="**/*.class"/>
        <include name="**/*.properties"/>
        <exclude name="**/tests/*.*"/>
      </classes>
      <classes file="MemeSuite.properties"/>
      <webinf dir="website">
        <include name="templates/*.*"/>
      </webinf>
      <fileset dir="website">
        <include name="*.html"/>
        <include name="js/*.js"/>
        <include name="css/*.css"/>
        <include name="images/*.png"/>
        <include name="images/*.jpg"/>
      </fileset>
      <fileset dir="website/alternate">
        <include name="doc/js/menu-path.js"/>
      </fileset>
      <fileset dir=".">
        <include name="doc/*.pdf"/>
        <include name="doc/*.html"/>
        <include name="doc/js/*.js"/>
        <exclude name="doc/js/menu-path.js"/>
        <include name="doc/css/*.css"/>
        <include name="doc/images/*.png"/>
        <include name="doc/images/*.jpg"/>
        <include name="doc/images/*.gif"/>
        <include name="doc/images/*.ico"/>
        <include name="doc/examples/*.glam2"/>
        <include name="doc/examples/*.meme"/>
        <include name="doc/examples/*/*.*"/>
        <include name="doc/examples/*/**/*.*"/>
      </fileset>
    </war>
  </target>

  <target name="build" depends="build_war,build_sequencedb_updater"/>

  <target name="install" depends="build,check_prop">
    <!-- install the libraries needed by the updatedb.jar -->
    <copy todir="${lib.dir}/java" preservelastmodified="true">
      <path refid="updater.libs"/>
    </copy>
    <!-- install the updatedb.jar -->
    <copy file="updatedb.jar" todir="${lib.dir}/java" preservelastmodified="true"/>
    <!-- install the SQLite library -->
    <copy todir="${catalina.home}/lib" preservelastmodified="true">
      <fileset dir="website/lib">
        <include name="sqlite-jdbc-*.jar"/>
      </fileset>
    </copy>
    <!-- install the WAR file -->
    <copy file="meme_${version}.war" todir="${catalina.home}/webapps" preservelastmodified="true"/>
  </target>

  <target name="generate-web-file-list">
    <echo message="Generating list of website files for Automake" level="info"/>
    <property name="website.dir" value="${basedir}${file.separator}website"/>
    <fileset id="web-dist-set" dir="website">
      <include name="web.xml"/>
      <include name="context.xml.in"/>
      <include name="*.html"/>
      <include name="js/*.js"/>
      <include name="css/*.css"/>
      <include name="alternate/**/*.*"/>
      <include name="images/*.png"/>
      <include name="images/*.jpg"/>
      <include name="lib/*.*"/>
      <include name="src/**/*.java"/>
      <include name="src/**/*.properties"/>
      <exclude name="src/**/Test*.java"/>
      <exclude name="src/**/Test*.properties"/>
      <include name="templates/*.*"/>
    </fileset>
    <pathconvert pathsep=" \${line.separator}  " property="web-dist-files" refid="web-dist-set">
      <map from="${website.dir}" to="website"/>
    </pathconvert>
    <echo file="website.mk">WEBSITE_FILES = ${web-dist-files}</echo>
  </target>

</project>
