<project name="YaCy" default="all" basedir=".">
  <description>
    YaCy - a Peer to Peer Web Search Engine
  </description>

  <!-- 
# THIS IS THE YACY BUILD SCRIPT
# YOU CAN USE IT TO COMPILE YOUR OWN RELEASE
# THE TARGET OF THE COMPILATION CAN BE FOUND
# IN THE 'RELEASE' DIRECTORY AFTERWARDS
# YOU NEED APACHE ANT TO USE THIS SCRIPT
# ==========================================
# This Software is Copyrighted
# (C) by Michael Peter Christen; mc@yacy.net
# first published on http://yacy.net
# Frankfurt, Germany, 2005-2007
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-->

  <!-- defining the timestamp format -->
  <tstamp>
    <format property="REPL_DATE_FORMAT" pattern="yyyymmdd" />
  </tstamp>

  <!-- defining all needed directory names -->
  <property name="yacyroot" location="."/>
  <property name="addon" location="addon"/>
  <property name="src" location="source"/>
  <property name="data" location="DATA"/>
  <property name="lib" location="lib"/>
  <property name="libx" location="libx"/>
  <property name="libt" location="libt"/>
  <property name="libbuild" location="libbuild"/>
  <property name="build" location="classes"/>
  <property name="htroot" location="htroot"/>
  <property name="locales" location="locales"/>
  <property name="skins" location="skins"/>
  <property name="ranking" location="ranking"/>
  <property name="release" location="RELEASE"/>
  <property name="htdocsWWW" location="${data}/HTDOCS/www"/>
  <property name="release_main" location="${release}/MAIN"/>
  <property name="release_ext" location="${release}/EXT"/>
  <property name="release_windows" location="${release}/WINDOWS"/>
  <property name="svnEntriesFile" location=".svn/entries"/>
  <property name="defaults" location="defaults"/>
  <property name="DESTDIR" value="DESTDIR"/>

  <!-- determining if the sourcecode of the yacybar is available -->
  <condition property="yacyBarDirExists">
    <available file="./yacybar" />
  </condition>

  <condition property="singleExtFile">
    <equals arg1="${extensionTarget}" arg2="copy"/>
  </condition>

  <!-- determining if the .svn directory exists -->
  <condition property="svnEntriesFileExists">
    <available file="${svnEntriesFile}" />
  </condition>

  <!-- 
    if the .svn directory exists we try to determine the real
    svn revision number of the working base now
-->

  <target name="buildSvnRevNr">
    <delete file="${libbuild}/svnRevNr.jar" failonerror="false" />
    <javac srcdir="${libbuild}/svnRevNr" />
    <jar destfile="${libbuild}/svnRevNr.jar" basedir="${libbuild}/svnRevNr">
      <manifest>
        <attribute name="Main-Class" value="svnRevNrParser"/>
      </manifest>
    </jar>
  </target>

  <target name="determineRevisionNr" if="svnEntriesFileExists" depends="buildSvnRevNr">
    <!-- define a custom ant task to read the revision number from file -->
    <taskdef resource="svnRevNrParser.properties" classpath="${libbuild}/svnRevNr.jar"/>

    <!-- determine the revision number -->
    <echo message="Trying to read Revision number from file ${svnEntriesFile}"/>
    <svnrevnr file="${svnEntriesFile}" property="baseRevisionNr"/>

    <!-- replacing the old with the new revision number -->
    <copy file="build.properties" tofile="build.properties.new">
      <filterchain>
        <tokenfilter>
          <replaceregex pattern="^releaseNr=(.*)"
                        replace="releaseNr=$Revision: ${baseRevisionNr} $" />
        </tokenfilter>
      </filterchain>
    </copy>
    <delete file="build.properties"/>
    <move file="build.properties.new" tofile="build.properties"/>
  </target>

  <!-- reading the build properties from file -->
  <target name="readBuildProperties" depends="determineRevisionNr">
    <!-- loading some property values from file -->
    <loadproperties srcFile="build.properties">
      <filterchain>
        <tokenfilter>
          <replaceregex pattern="^releaseNr=\$Revision:\s(.*)\s\$"
                        replace="releaseNr=\1"/>
        </tokenfilter>
      </filterchain>
    </loadproperties>
  </target>

  <!-- determining the extension target -->
  <target name="determineExtensionTarget" depends="readBuildProperties">
    <condition property="extensionTarget" value="copy">
      <equals arg1="${extensionMode}" arg2="singleZip"/>
    </condition>
    <condition property="extensionTarget" value="copy">
      <equals arg1="${extensionMode}" arg2="copyToMain"/>
    </condition>
    <condition property="extensionTarget" value="zip">
      <equals arg1="${extensionMode}" arg2="multiZip"/>
    </condition>

    <condition property="singleExtFile">
      <equals arg1="${extensionMode}" arg2="singleZip"/>
    </condition>
  </target>

  <!-- initializing all needed variables -->
  <target name="init" depends="determineExtensionTarget">
    <mkdir dir="${build}/de/anomic/crawler"/>
    <mkdir dir="${build}/de/anomic/data"/>
    <mkdir dir="${build}/de/anomic/htmlFilter"/>
    <mkdir dir="${build}/de/anomic/http"/>
    <mkdir dir="${build}/de/anomic/kelondro"/>
    <mkdir dir="${build}/de/anomic/net"/>
    <mkdir dir="${build}/de/anomic/index"/>
    <mkdir dir="${build}/de/anomic/plasma"/>
    <mkdir dir="${build}/de/anomic/plasma/parser"/>
    <mkdir dir="${build}/de/anomic/server"/>
    <mkdir dir="${build}/de/anomic/tools"/>
    <mkdir dir="${build}/de/anomic/ymage"/>
    <mkdir dir="${build}/de/anomic/yacy"/>
    <mkdir dir="${build}/de/anomic/yacy/seedUpload"/>
    <mkdir dir="${data}"/>
    <mkdir dir="${release}"/>

    <!-- YaCy Release Date -->
    <filter token="REPL_DATE" value="${DSTAMP}"/>
    <filter token="REPL_RELEASE" value="${stdReleaseFile}"/>

    <!-- YaCy Release Version number -->
    <echo message="YaCy Version number: ${releaseVersion}" />
    <filter token="REPL_VERSION" value="${releaseVersion}" />

    <!-- YaCy SVN Revision number -->
    <echo message="YaCy Revision number: ${releaseNr}" />
    <filter token="REPL_REVISION_NR" value="${releaseNr}"/>

    <!-- YaCy root directory -->
    <filter token="REPL_YACY_ROOT_DIR" value="${yacyroot}"/>

    <!-- deleting old file -->
    <delete file="${build}/yacy.java" failonerror="false"/>
    <copy file="${src}/yacy.java" tofile="${build}/yacy.java" overwrite="true" filtering="true" />

  </target>

  <target name="compileMain" depends="init" description="Compiling the yacy sources ...">
    <!-- defining the classpath that should be used for compiling -->
    <path id="project.class.path">
      <pathelement location="${build}" />
      <pathelement location="${htroot}" />

      <!-- standard libs -->
      <pathelement location="${lib}/tar.jar" />
      <pathelement location="${lib}/commons-fileupload-1.2.1.jar" />
      <pathelement location="${lib}/commons-httpclient-3.1.jar" />
      <pathelement location="${lib}/commons-logging-1.1.1.jar" />
      <pathelement location="${lib}/commons-io-1.4.jar" />
      <pathelement location="${lib}/servlet-api.jar" />
      <!-- upnp (+ commons-logging) -->
      <pathelement location="${lib}/sbbi-upnplib-1.0.4.jar" />
      <pathelement location="${lib}/commons-jxpath-1.1.jar" />
    </path>

    <!-- compiling yacy.java -->
    <javac srcdir="${build}" destdir="${build}" sourcepath="${src}"
           includes="yacy.java"
           classpathref="project.class.path"
           debug="true" debuglevel="lines,vars,source"
           source="${javacSource}" target="${javacTarget}" />

    <!-- compiling the main sources -->
    <javac srcdir="${src}/" destdir="${build}"
           excludes="de/anomic/plasma/parser/*/*,de/anomic/yacy/seedUpload/**,yacy.java,de/anomic/data/rssReader.java"
           debug="true" debuglevel="lines,vars,source"
           source="${javacSource}" target="${javacTarget}">
      <classpath refid="project.class.path" />
    </javac>

    <!-- compiling the two standard seed uploader methods -->
    <javac srcdir="${src}" destdir="${build}"
           classpathref="project.class.path"
           debug="true" debuglevel="lines,vars,source"
           source="${javacSource}" target="${javacTarget}">
      <include name="de/anomic/yacy/seedUpload/yacySeedUploadFile.java" />
      <include name="de/anomic/yacy/seedUpload/yacySeedUploadFtp.java"/>
    </javac>


    <!-- compiling htroot, htroot/yacy and htroot/htdocsdefault -->
    <javac srcdir="${htroot}/"
    	   excludes="processing/**"
           classpathref="project.class.path"
           debug="true" debuglevel="lines,vars,source"
           source="${javacSource}" target="${javacTarget}"/>
  </target>

  <target name="compileHtdocsWWW" depends="compileMain" description="Compiling and zipping userspecific servlets">
    <!-- defining the classpath that should be used for compiling -->
    <path id="htdocsWWW.class.path">
      <pathelement location="${build}"/>
      <pathelement location="${htroot}"/>

      <!-- libs needed for the yacy thread/object-pools -->
      <pathelement location="${lib}/tar.jar" />
      <!-- userspecific libs -->
      <pathelement location="${htdocsWWW}/lib/*.jar" />
      <pathelement location="${htdocsWWW}/" />
    </path>

    <!-- compiling htroot, htroot/yacy and htroot/htdocsdefault -->
    <javac srcdir="${htdocsWWW}/"
           classpathref="htdocsWWW.class.path"
           debug="true" debuglevel="lines,vars,source"
           source="${javacSource}" target="${javacTarget}" />
  </target>

  <!-- compiling optional content parsers and building install packages -->
  <target name="compileParsers" depends="compileMain" description="Compiling and zipping all additional parsers">
    <subant target="${extensionTarget}">
      <property name="src" location="${src}"/>
      <property name="build" location="${build}"/>
      <property name="lib" location="${lib}"/>
      <property name="libx" location="${libx}"/>
      <property name="release" location="${release_ext}"/>
      <property name="javacSource" value="${javacSource}"/>
      <property name="javacTarget" value="${javacTarget}"/>
      <!-- each optional parser must have its own build file -->
      <fileset dir="${src}/" includes="de/anomic/plasma/parser/*/build.xml"/>
    </subant>
  </target>

  <!-- compiling optional seed uploaders and building install packages -->
  <target name="compileSeedUploaders" depends="compileMain" description="Compiling and zipping additional seed uploaders">
    <subant target="${extensionTarget}">
      <property name="src" location="${src}"/>
      <property name="build" location="${build}"/>
      <property name="libx" location="${libx}"/>
      <property name="htroot" value="${htroot}"/>
      <property name="release" location="${release_ext}"/>
      <property name="javacSource" value="${javacSource}"/>
      <property name="javacTarget" value="${javacTarget}"/>
      <!-- each optionl uploader module must have its own build file -->
      <fileset dir="${src}/" includes="de/anomic/yacy/seedUpload/yacySeedUpload*.xml"/>
    </subant>
  </target>

  <!-- compile optional classs that were not compiled elsewhere -->
  <target name="compileExtensions" depends="compileMain,compileParsers,compileSeedUploaders">
    <!-- compile rss Reader -->
    <javac srcdir="${src}" destdir="${build}"
           debug="true" debuglevel="lines,vars,source" 
           source="${javacSource}" target="${javacTarget}">
      <classpath>
        <path refid="project.class.path"/>
      </classpath>
      <include name="de/anomic/data/rssReader.java" />
    </javac>
  </target>

  <target name="all" depends="compileMain,compileExtensions">
    <delete file="${build}/yacy.java" />
  </target>

  <!-- compiling the yacybar -->
  <target name="buildYacyBar" if="yacyBarDirExists" depends="init" description="Building the yacyBar XPI file">
    <!-- building yacybar xpi -->
    <subant target="" buildpath="./yacybar" />

    <!-- move xpi file into addon folder -->
    <move file="./yacybar/yacybar.xpi" tofile="${addon}/yacybar.xpi"/>
  </target>

  <!-- =======================================================================================================
       putting all extensions together into a single zip file 
       ======================================================================================================= -->
  <target name="distExt" if="singleExtFile" depends="copyExt4Dist">
    <tar destfile="${release}/${extensionFile}" compression="gzip" defaultexcludes="yes" longfile="gnu">
      <tarfileset dir="${release_ext}" prefix="${releaseFileParentDir}/" dirmode="${accessRightsDir}" mode="${accessRightsFile}">
        <include name="**/*.*"/>
      </tarfileset>
    </tar>

    <delete dir="${release_ext}"/>
  </target>

  <!-- copy extension files that are not copied elsewhere -->
  <target name="copyExt4Dist" depends="compileExtensions">
    <!-- copy extension classes -->
    <copy todir="${release_ext}/classes" failonerror="false">
      <fileset dir="${build}">
        <include name="de/anomic/data/rssReader.class"/>
      </fileset>
    </copy>

    <!-- copy extension source files -->
    <copy todir="${release_ext}/source">
      <fileset dir="${src}">
        <include name="de/anomic/data/rssReader.java"/>
      </fileset>
    </copy>
  </target>

  <target name="copyMain4Dist" depends="compileMain,buildYacyBar">
    <!-- copy main class files -->
    <copy todir="${release_main}/classes" failonerror="false">
      <fileset dir="${build}">
        <include name="**/*.*"/>
        <!-- excluding all additional content parsers -->
        <exclude name="de/anomic/plasma/parser/*/*"/>
        <!-- excluding all additional seed uploaders -->
        <exclude name="de/anomic/yacy/seedUpload/**"/>
        <!-- ecluding rss Reader class -->
        <exclude name="de/anomic/data/rssReader.*"/>
      </fileset>

      <!-- copy standard seed uploaders -->
      <fileset dir="${build}">
        <include name="de/anomic/yacy/seedUpload/yacySeedUploadFile.class"/>
        <include name="de/anomic/yacy/seedUpload/yacySeedUploadFtp.class"/>
      </fileset>
    </copy>

    <!-- copy yacy.jar (if available) -->
    <copy todir="${release_main}" file="yacy.jar" failonerror="false"/>

    <!-- copy libs -->
    <copy todir="${release_main}/lib">
      <fileset dir="${lib}" 
               includes="**/*"/>
               
    </copy>

    <!-- copy build libs -->
    <copy todir="${release_main}/libbuild">
      <fileset dir="${libbuild}" 
               includes="**/*"/>
               
    </copy>

    <!-- copy configuration files -->
    <copy todir="${release_main}">
      <fileset dir=".">
        <include name="yacy.logging"/>
        <include name="yacy.yellow"/>
        <include name="yacy.badwords.example"/>
        <include name="yacy.stopwords"/>
        <include name="yacy.parser"/>
        <include name="httpd.mime"/>
      </fileset>
    </copy>

  	<!-- copy defaults -->
  	    <copy todir="${release_main}/defaults">
  	      <fileset dir="${defaults}" 
  	               includes="**/*"/>
  	    </copy>

  	<!-- copy Unix wrappers -->
    <copy todir="${release_main}">
      <fileset dir=".">
        <include name="startYACY.sh"/>
        <include name="stopYACY.sh"/>
        <include name="killYACY.sh"/>
        <include name="restart.sh"/>
        <include name="startYACY.command"/>
        <include name="stopYACY.command"/>
      </fileset>
    </copy>

    <!-- copy other wrappers -->
    <copy todir="${release_main}">
      <fileset dir=".">
        <include name="startYACY.bat"/>
        <include name="startYACY_debug.bat"/>
        <include name="stopYACY.bat"/>
      	<include name="getWin32MaxHeap.bat"/>
      	<!--
        <include name="startYACY_Win9x.bat"/>
        <include name="startYACY_noconsole_Win9x.bat"/>
        <include name="stopYACY_Win9x.bat"/>
        -->
      </fileset>
    </copy>
    <copy todir="${release_main}" file="yacy.exe" failonerror="false"/>

    <!-- copy locales  -->
    <copy todir="${release_main}/locales">
      <fileset dir="${locales}">
        <include name="*"/>
      </fileset>
    </copy>

    <!-- copy skins  -->
    <copy todir="${release_main}/skins">
      <fileset dir="${skins}">
        <include name="*"/>
      </fileset>
    </copy>

    <!-- copy documentation -->
    <copy todir="${release_main}">
      <fileset dir=".">
        <include name="readme.txt"/>
        <include name="gpl.txt"/>
        <include name="ChangeLog"/>
      	<include name="AUTHORS"/>
      	<include name="COPYRIGHT"/>
      	<include name="NOTICE"/>
      </fileset>
    </copy>

    <!-- copy source code -->
    <copy todir="${release_main}/source">
      <fileset dir="${src}">
        <include name="**/*.*"/>
        <!-- excluding sources for additional content parsers -->
        <exclude name="de/anomic/plasma/parser/*/*"/>
        <!-- excluding sources for additional seed uploaders -->
        <exclude name="de/anomic/yacy/seedUpload/yacySeedUpload**"/>
        <!-- ecluding rss Reader class -->
        <exclude name="de/anomic/data/rssReader.*"/>
      </fileset>
      <fileset dir="${src}">
        <include name="de/anomic/yacy/seedUpload/yacySeedUploadFile.java"/>
        <include name="de/anomic/yacy/seedUpload/yacySeedUploadFtp.java"/>
      </fileset>
    </copy>

    <!-- copy server pages -->
    <copy todir="${release_main}/htroot">
      <fileset dir="${htroot}">
        <include name="**/*"/>
        <exclude name="yacy/seedUpload/**"/>
      </fileset>
      <fileset dir="${htroot}">
        <include name="yacy/seedUpload/yacySeedUploadFile.html"/>
        <include name="yacy/seedUpload/yacySeedUploadFtp.html"/>
      </fileset>
    </copy>

    <!-- copy add-on's -->
    <copy todir="${release_main}/addon">
      <fileset dir="${addon}">
        <include name="**/*"/>
      </fileset>
    </copy>

    <!-- copy ranking files -->
    <copy todir="${release_main}/ranking">
      <fileset dir="${ranking}">
        <include name="**/*"/>
      </fileset>
    </copy>

    <!-- copy development tools -->
    <copy todir="${release_main}">
      <fileset dir=".">
        <include name="build.xml"/>
        <include name="build.properties"/>
      </fileset>
    </copy>
  	
    <!-- copy searchtest -->
    <copy todir="${release_main}/bin">
      <fileset dir="bin">
        <include name="searchtest.*"/>
        <include name="localsearch.sh"/>
      </fileset>
    </copy>

  </target>

  <target name="copyMain4SourceDist" depends="init,clean">
    <!-- copy main class files -->
    <copy todir="${release_source}/classes" failonerror="false">
      <fileset dir="${build}">
        <include name="**/*.*"/>
        <!-- excluding all additional content parsers -->
        <exclude name="de/anomic/plasma/parser/*/*"/>
        <!-- excluding all additional seed uploaders -->
        <exclude name="de/anomic/yacy/seedUpload/**"/>
        <!-- ecluding rss Reader class -->
        <exclude name="de/anomic/data/rssReader.*"/>
      </fileset>

      <!-- copy standard seed uploaders -->
      <fileset dir="${build}">
        <include name="de/anomic/yacy/seedUpload/yacySeedUploadFile.class"/>
        <include name="de/anomic/yacy/seedUpload/yacySeedUploadFtp.class"/>
      </fileset>
    </copy>

    <!-- copy libs -->
    <copy todir="${release_source}/lib">
      <fileset dir="${lib}" 
               includes="**/*"/>
               
    </copy>
    <copy todir="${release_source}/libx">
      <fileset dir="${libx}" 
               includes="**/*"/>
               
    </copy>
    <copy todir="${release_source}/libt">
      <fileset dir="${libt}" 
               includes="**/*"/>
               
    </copy>
    <copy todir="${release_source}/libbuild">
      <fileset dir="${libbuild}" 
               includes="**/*"/>
               
    </copy>

    <!-- copy configuration files -->
    <copy todir="${release_source}">
      <fileset dir=".">
        <include name="yacy.logging"/>
        <include name="yacy.yellow"/>
        <include name="yacy.badwords.example"/>
        <include name="yacy.stopwords"/>
        <include name="yacy.parser"/>
        <include name="httpd.mime"/>
        <include name="superseed.txt"/>
      </fileset>
    </copy>

  	<!-- copy defaults -->
  	    <copy todir="${release_source}/defaults">
  	      <fileset dir="${defaults}" 
  	               includes="**/*"/>
  	    </copy>

  	<!-- copy Unix wrappers -->
    <copy todir="${release_source}">
      <fileset dir=".">
        <include name="startYACY.sh"/>
        <include name="stopYACY.sh"/>
        <include name="killYACY.sh"/>
        <include name="restart.sh"/>
        <include name="startYACY.command"/>
        <include name="stopYACY.command"/>
      </fileset>
    </copy>

    <!-- copy other wrappers -->
    <copy todir="${release_source}">
      <fileset dir=".">
        <include name="startYACY.bat"/>
        <include name="startYACY_noconsole.bat"/>
        <include name="stopYACY.bat"/>
      	<include name="getWin32MaxHeap.bat"/>
      	<!--
        <include name="startYACY_Win9x.bat"/>
        <include name="startYACY_noconsole_Win9x.bat"/>
        <include name="stopYACY_Win9x.bat"/>
        -->
      </fileset>
    </copy>
    <copy todir="${release_source}" file="yacy.exe" failonerror="false"/>

    <!-- copy locales  -->
    <copy todir="${release_source}/locales">
      <fileset dir="${locales}">
        <include name="*"/>
      </fileset>
    </copy>

    <!-- copy skins  -->
    <copy todir="${release_source}/skins">
      <fileset dir="${skins}">
        <include name="*"/>
      </fileset>
    </copy>

    <!-- copy documentation -->
    <copy todir="${release_source}">
      <fileset dir=".">
        <include name="readme.txt"/>
        <include name="gpl.txt"/>
        <include name="ChangeLog"/>
      	<include name="AUTHORS"/>
      	<include name="COPYRIGHT"/>
      	<include name="NOTICE"/>
      </fileset>
    </copy>

    <!-- copy source code -->
    <copy todir="${release_source}/source">
      <fileset dir="${src}">
        <include name="**/*.*"/>
        <!-- excluding sources for additional content parsers -->
        <exclude name="de/anomic/plasma/parser/*/*"/>
        <!-- excluding sources for additional seed uploaders -->
        <exclude name="de/anomic/yacy/seedUpload/yacySeedUpload**"/>
        <!-- ecluding rss Reader class -->
        <exclude name="de/anomic/data/rssReader.*"/>
      </fileset>
      <fileset dir="${src}">
        <include name="de/anomic/yacy/seedUpload/yacySeedUploadFile.java"/>
        <include name="de/anomic/yacy/seedUpload/yacySeedUploadFtp.java"/>
      </fileset>
    </copy>

    <!-- copy server pages -->
    <copy todir="${release_source}/htroot">
      <fileset dir="${htroot}">
        <include name="**/*"/>
        <exclude name="yacy/seedUpload/**"/>
      </fileset>
      <fileset dir="${htroot}">
        <include name="yacy/seedUpload/yacySeedUploadFile.html"/>
        <include name="yacy/seedUpload/yacySeedUploadFtp.html"/>
      </fileset>
    </copy>

    <!-- copy add-on's -->
    <copy todir="${release_source}/addon">
      <fileset dir="${addon}">
        <include name="**/*"/>
      </fileset>
    </copy>

    <!-- copy ranking files -->
    <copy todir="${release_source}/ranking">
      <fileset dir="${ranking}">
        <include name="**/*"/>
      </fileset>
    </copy>

    <!-- copy development tools -->
    <copy todir="${release_source}">
      <fileset dir=".">
        <include name="build.xml"/>
        <include name="build.properties"/>
      </fileset>
    </copy>
  	
    <!-- copy searchtest -->
    <copy todir="${release_main}/bin">
      <fileset dir="bin">
        <include name="searchtest.*"/>
        <include name="localsearch.sh"/>
      </fileset>
    </copy>

  </target>

  <!-- ======================================================================================================= 
       making a release file for yacy 
       ======================================================================================================= -->
  <target name="distEmb" depends="copyMain4Dist" description="make for embedded YaCy (no extra parsers)">

    <tar destfile="${release}/${embReleaseFile}" compression="gzip" defaultexcludes="yes" longfile="fail">

      <!-- packing all files into a gzipped tar -->
      <tarfileset dir="${release_main}" prefix="${releaseFileParentDir}/" dirmode="${accessRightsDir}" mode="${accessRightsExecutable}">
        <include name="**/*.sh"/>
        <include name="**/*.command"/>
      </tarfileset>
      <tarfileset dir="${release_main}" prefix="${releaseFileParentDir}/" dirmode="${accessRightsDir}" mode="${accessRightsFile}" >
        <include name="**/*"/>
        <exclude name="**/*.sh"/>
        <exclude name="**/*.command"/>
      </tarfileset>
    </tar>

    <!-- deleting unneeded files -->
    <delete dir="${release_main}"/>
  </target>

  <target name="dist" depends="compileExtensions,copyMain4Dist,copyExt4Dist" description="make for standard YaCy">
    <tar destfile="${release}/${stdReleaseFile}" compression="gzip" defaultexcludes="yes" longfile="fail">

      <!-- packing all files into a gzipped tar -->
      <tarfileset dir="${release_main}" prefix="${releaseFileParentDir}/" dirmode="${accessRightsDir}" mode="${accessRightsExecutable}">
        <include name="**/*.sh"/>
        <include name="**/*.command"/>
      </tarfileset>
      <tarfileset dir="${release_main}" prefix="${releaseFileParentDir}/" dirmode="${accessRightsDir}" mode="${accessRightsFile}" >
        <include name="**/*"/>
        <exclude name="**/*.sh"/>
        <exclude name="**/*.command"/>
      </tarfileset>

      <tarfileset dir="${release_ext}" prefix="${releaseFileParentDir}/" dirmode="${accessRightsDir}" mode="${accessRightsFile}" >
        <include name="**/*.*"/>
      </tarfileset>
    </tar>

    <delete dir="${release_main}"/>
    <delete dir="${release_ext}"/>
    <delete dir="${release_windows}" failonerror="false" />
    <delete dir="${release}/SPECS" failonerror="false" />
  </target>

  <target name="sdist" depends="copyMain4SourceDist" description="make for standard source YaCy">
    <tar destfile="${release}/${sourceReleaseFile}" compression="gzip" defaultexcludes="yes" longfile="fail">

      <!-- packing all files into a gzipped tar -->
      <tarfileset dir="${release_source}" prefix="${releaseFileParentDir}/" dirmode="${accessRightsDir}" mode="${accessRightsExecutable}">
        <include name="**/*.sh"/>
        <include name="**/*.command"/>
      </tarfileset>
      <tarfileset dir="${release_source}" prefix="${releaseFileParentDir}/" dirmode="${accessRightsDir}" mode="${accessRightsFile}" >
        <include name="**/*"/>
        <exclude name="**/*.sh"/>
        <exclude name="**/*.command"/>
      </tarfileset>
    </tar>

    <delete dir="${release_source}"/>
  </target>

  <!-- make clean -->
  <target name="clean" description="make clean">
    <delete dir="${release_main}" failonerror="false"/>
    <delete dir="${release_ext}" failonerror="false"/>
    <delete file="${build}/yacy.java" failonerror="false"/>
    <delete file="yacy.jar" failonerror="false"/>
    <delete file="yacy.exe" failonerror="false"/>
    <delete file="${lib}/svnRevNr.jar" failonerror="false"/>
    <delete file="${libbuild}/svnRevNr.jar" failonerror="false"/>
    <delete failonerror="false">
      <fileset dir="${src}" includes="**/*.class" />
      <fileset dir="${build}" includes="**/*.class" />
      <fileset dir="${htroot}" includes="**/*.class" />
      <fileset dir="${libbuild}/svnRevNr" includes="**/*.class" />
    </delete>
  </target>

  <target name="installonlinux">
    <!-- check for jar-file -->
    <available file="yacy.jar" property="built"/>
    <fail message="Please build yacy with 'ant clean build-jar'" unless="built"/>
    <!-- copy main class files -->
    <copy todir="${DESTDIR}/usr/share/java/">
      <fileset dir=".">
        <include name="yacy.jar"/>
      </fileset>
    </copy>

    <!-- copy configuration files -->
    <copy todir="${DESTDIR}/usr/share/yacy">
      <fileset dir=".">
        <include name="yacy.logging"/>
        <include name="yacy.yellow"/>
        <include name="yacy.badwords.example"/>
        <include name="yacy.stopwords"/>
        <include name="yacy.parser"/>
        <include name="httpd.mime"/>
        <include name="build.properties"/>
      </fileset>
    </copy>

  	<!-- copy defaults -->
	<copy todir="${DESTDIR}/usr/share/yacy/defaults">
  	      <fileset dir="${defaults}" 
  	               includes="**/*"/>
  	    </copy>

    <!-- copy locales  -->
    <copy todir="${DESTDIR}/usr/share/yacy/locales">
      <fileset dir="${locales}">
        <include name="*"/>
      </fileset>
    </copy>

    <!-- copy skins  -->
    <copy todir="${DESTDIR}/usr/share/yacy/skins">
      <fileset dir="${skins}">
        <include name="*"/>
      </fileset>
    </copy>

    <!-- copy documentation -->
    <copy todir="${DESTDIR}/usr/share/doc/yacy">
      <fileset dir=".">
        <include name="readme.txt"/>
        <include name="ChangeLog"/>
      	<include name="AUTHORS"/>
      	<include name="COPYRIGHT"/>
      	<include name="NOTICE"/>
      </fileset>
    </copy>

    <!-- copy server pages -->
    <copy todir="${DESTDIR}/usr/share/yacy/htroot">
      <fileset dir="${htroot}">
        <include name="**/*"/>
        <exclude name="yacy/seedUpload/**"/>
      </fileset>
      <fileset dir="${htroot}">
        <include name="yacy/seedUpload/yacySeedUploadFile.html"/>
        <include name="yacy/seedUpload/yacySeedUploadFtp.html"/>
      </fileset>
    </copy>

    <!-- copy ranking files -->
    <copy todir="${DESTDIR}/usr/share/yacy/ranking">
      <fileset dir="${ranking}">
        <include name="**/*"/>
      </fileset>
    </copy>

    <!-- work around a feature/bug :( -->
    <mkdir dir="${DESTDIR}/usr/share/yacy/xlib" />

    <!-- prepare /var/lib/yacy -->

    <mkdir dir="${DESTDIR}/var/lib/yacy" />
    <mkdir dir="${DESTDIR}/var/lib/yacy/LOG" />
    <mkdir dir="${DESTDIR}/var/lib/yacy/SETTINGS" />
    <mkdir dir="${DESTDIR}/etc" />
    <mkdir dir="${DESTDIR}/var/log" />
    <symlink link="${DESTDIR}/usr/share/yacy/DATA"
	    resource="../../../var/lib/yacy"/>
    <symlink link="${DESTDIR}/etc/yacy"
	    resource="../var/lib/yacy/SETTINGS"/>
    <symlink link="${DESTDIR}/var/log/yacy"
	    resource="../lib/yacy/LOG"/>

  </target>

  <!-- run YaCy (needed for NetBeans4) -->
  <target name="run" description="Run YaCy">
    <!-- debug options:
     java -Xrunhprof:help
     Hprof usage: -Xrunhprof[:help]|[:<option>=<value>, ...]

     Option Name and Value  Description                Default
     _____________________  ___________                _______
     heap=dump|sites|all    heap profiling             all
     cpu=samples|times|old  CPU usage                  off
     monitor=y|n            monitor contention         n
     format=a|b             ascii or binary output     a
     file=<file>            write data to file         java.hprof(.txt for ascii)
     net=<host>:<port>      send data over a socket    write to file
     depth=<size>           stack trace depth          4
     cutoff=<value>         output cutoff point        0.0001
     lineno=y|n             line number in traces?     y
     thread=y|n             thread in traces?          n
     doe=y|n                dump on exit?              y
     gc_okay=y|n            GC okay during sampling    y

     Example: java -Xrunhprof:cpu=samples,file=log.txt,depth=3 FooClass

     Note: format=b cannot be used with cpu=old|times
-->
    <java classname="yacy" fork="yes">
      <classpath>
        <pathelement location="${build}"/>
        <pathelement location="${htroot}"/>
        <pathelement location="${lib}/tar.jar" />
        <pathelement location="${lib}/commons-fileupload-1.2.1.jar" />
        <pathelement location="${lib}/commons-httpclient-3.1.jar" />
        <pathelement location="${lib}/commons-logging-1.1.1.jar" />
        <pathelement location="${lib}/commons-io-1.4.jar" />
        <pathelement location="${lib}/servlet-api.jar" />
        <pathelement location="${lib}/sbbi-upnplib-1.0.4.jar" />
        <pathelement location="${lib}/commons-jxpath-1.1.jar" />
        <pathelement location="${libx}" />
        <fileset dir="${libx}" includes="**/*.jar" />
      </classpath>
      <!--<arg value="-Xrunhprof"/>-->
      <arg line="-start"/>
      <!-- <arg line="-migratewords"/>-->
      <!-- <arg line="-start ${user.dir}"/>-->
    </java>
  </target>

  <!-- run a single file (selected in NetBeans4) -->
  <target name="run-single" depends="compileMain" description="Run Single File">
    <fail unless="classname">Must set property 'classname'</fail>
    <java classname="yacy" fork="yes">
      <classpath refid="run.classpath"/>
      <classpath>
        <pathelement location="${build}"/>
        <pathelement location="${htroot}"/>
        <pathelement location="${lib}/tar.jar" />
        <pathelement location="${libx}" />
        <fileset dir="${libx}" includes="**/*.jar" />
      </classpath>
      <arg line=""/>
    </java>
  </target>

  <!-- run YaCy with remote debugging enabled on port 8000 -->
  <target name="debug" description="Debug YaCy">
    <java classname="yacy" fork="yes">
      <classpath>
        <pathelement location="${build}"/>
        <pathelement location="${htroot}"/>
        <pathelement location="${libx}" />
        <fileset dir="${lib}" includes="**/*.jar" />
        <fileset dir="${libx}" includes="**/*.jar" />
      </classpath>
      <arg line="-start"/>
      <jvmarg line="-Xdebug"/>
      <jvmarg line="-Xnoagent"/>
      <jvmarg line="-Djava.compiler=none"/>
      <jvmarg line="-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"/>
    </java>
  </target>

  <!-- stop YaCy again -->
  <target name="stop" description="Stop YaCy">
    <java classname="yacy" fork="yes">
      <classpath>
        <pathelement location="${build}"/>
        <pathelement location="${htroot}"/>
        <pathelement location="${lib}/tar.jar" />
        <pathelement location="${libx}" />
        <fileset dir="${lib}" includes="**/*.jar" />
        <fileset dir="${libx}" includes="**/*.jar" />
      </classpath>
      <arg line="-stop"/>
    </java>
  </target>


  <!-- create the html-documentation from javadoc  -->
  <target name="create-doc" description="Create the javadoc-HTML-Pages">
    <javadoc destdir="doc/api"
             author="true"
             version="true"
             use="false"
             encoding="iso-8859-1"
             windowtitle="YaCy API Documentation">
      <classpath>
        <fileset dir="${lib}">
          <include name="**/*.jar"/>
        </fileset>
        <fileset dir="${libx}">
          <include name="**/*.jar"/>
        </fileset>
        <pathelement location="${build}"/>
      </classpath>
      <fileset dir="source" defaultexcludes="yes">
        <include name="**/*.java" />
      </fileset>
    </javadoc>
  </target>


  <!-- creates an image of this build.xml with ant2svg, see http://www.spiritedsw.com/ant2svg/ for details -->
  <target name="ant2svg" description="Creates an image of the build.xml with ant2svg">
    <taskdef name="ant2svg"
        classname="org.apache.tools.ant.taskdefs.optional.ant2svg.Ant2SvgTask"/>
    <ant2svg/>
    <ant2svg srcfile="build.xml"/>
    <ant2svg destfile="doc/build_dependencies.svg"/>
  </target>

  <target name="build-jar" depends="compileMain,compileExtensions">
    <jar destfile="yacy.jar" basedir="${build}/">
      <manifest>
        <attribute name="Main-Class" value="yacy"/>
      </manifest>
    </jar>
  </target>

  <target name="makeWinStartExe" depends="build-jar">
    <!-- Creates a Windows Executable using JSmooth (http://jsmooth.sf.net) -->
    <taskdef name="jsmoothgen"
             classname="net.charabia.jsmoothgen.ant.JSmoothGen"
             classpath="addon/jsmooth/lib/jsmoothgen-ant.jar" />
    <jsmoothgen project="addon/jsmooth/yacy.jsmooth" skeletonroot="addon/jsmooth/skeletons" />

    <delete>
      <fileset dir="${build}" includes="**/*.class" />
    </delete>
  </target>

<!--
    Explanation of the confusing Exe Targets:
    -makeWinStartExe creates a windows-program, which starts yacy instead
    of the startYACY.bat file.
    -distWithWinStartExe creates a tarball with the program included

    This needs jsmoothgen

    -distWininstaller and
    winInstallerExe build a installer-programm for windows, instead of a tar.gz.

    This needs nsis-ant-1.2.jar in the yacyfolder.
-->

  <target name="distWithWinStartExe" depends="makeWinStartExe,dist">
  </target>

  <target name="rpm" depends="all" description="Creates the main rpm-package and another for libx">
    <mkdir dir="${release}/RPMS/noarch" />
    <mkdir dir="${release}/BUILD" />
    <copy file="yacy-svn-4.spec" tofile="${release}/SPECS/yacy-svn.spec" overwrite="true" filtering="true" />

    <rpm specFile="yacy-svn.spec" topDir="${release}" />

    <move file="${release}/RPMS/noarch/yacy-${releaseVersion}_${releaseNr}-3.noarch.rpm"
          tofile="${release}/yacy-${releaseVersion}_${releaseNr}-3.noarch.rpm" />
    <move file="${release}/RPMS/noarch/yacy-libx-${releaseVersion}_${releaseNr}-3.noarch.rpm"
          tofile="${release}/yacy-libx-${releaseVersion}_${releaseNr}-3.noarch.rpm" />

    <delete dir="${release}/SPECS" failonerror="false" />
    <delete dir="${release}/RPMS" failonerror="false" />
    <delete dir="${release_windows}" failonerror="false" />
    <delete dir="${release_ext}" failonerror="false" />
  </target>

  <!-- Alias -->
  <target name="distWinInstaller" depends="winInstallerExe">
  </target>
	
  <target name="winInstallerExe" depends="compileExtensions,copyMain4Dist,copyExt4Dist" description="Creates the windows installer.exe">
    <!-- http://nsisant.sourceforge.net/ -->
    <mkdir dir="${release_windows}" />
    <copy file="build.nsi" tofile="${release_windows}/build.nsi" overwrite="true" filtering="true" />
    <taskdef name="nsis" classname="net.sf.nsisant.Task">
	    <classpath location="${libbuild}/nsisant-1.2.jar"/>
    </taskdef>
    <nsis script="${release_windows}/build.nsi" nocd="yes" verbosity="2" />
    <move file="${release_windows}/yacy_v${releaseVersion}_${DSTAMP}_${releaseNr}.exe"
          tofile="${release}/yacy_v${releaseVersion}_${DSTAMP}_${releaseNr}.exe" />
  	
    <delete dir="${release_main}"/>
    <delete dir="${release_ext}"/>
    <delete dir="${release_windows}" failonerror="false" />
  </target>

  <target name="deb" depends="init" description="Creates a debian package">
    <!-- replacing the old with the new revision number -->
    <replaceregexp file="debian/changelog"
                  match="yacy \(.*\) unstable; urgency=low"
                  replace="yacy (${releaseVersion}svn${baseRevisionNr}) unstable; urgency=low" />

    <!-- build debian package -->
    <exec executable="dpkg-buildpackage">
      <arg value="-b"/>
      <arg value="-rfakeroot"/>
      <arg value="-uc"/>
    </exec>
    <replaceregexp file="debian/changelog"
                  match="yacy \(.*\) unstable; urgency=low"
                  replace="yacy (*auto-svn-version*) unstable; urgency=low" />
  </target>

  <target name="sign" depends="readBuildProperties" description="sign all files in RELEASE/ with $privateKey">
    <java classname="de.anomic.tools.CryptoLib" failonerror="true">
      <classpath>
        <pathelement location="${build}"/>
      </classpath>
      <arg line="--sign ${privateKeyFile} ${release}/${stdReleaseFile}"/>
    </java>
  </target>
</project>