<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<project name="common-solr" default="default">
  <description>
    This file is designed for importing into a main build file, and not intended
    for standalone use.
  </description>

  <dirname file="${ant.file.common-solr}" property="common-solr.dir"/>
  
  <property name="Name" value="Solr" />
  <property name="version" value="3.5-SNAPSHOT"/>
  <property name="fullname" value="apache-${ant.project.name}"/>
  <property name="fullnamever" value="${fullname}-${version}"/>
  <property name="final.name" value="${fullnamever}"/>
  
  <property name="dest" value="${common-solr.dir}/build" />
  <property name="build.dir" location="${dest}/${ant.project.name}"/>
  <property name="dist" location="${common-solr.dir}/dist"/>
  <property name="package.dir" location="${common-solr.dir}/package"/>
  <property name="maven.dist.dir" location="${package.dir}/maven"/>
  <property name="lucene-libs" location="${dest}/lucene-libs" />
  <property name="manifest.file" location="${dest}/META-INF/MANIFEST.MF"/>
  <property name="tests.userdir" value="src/test-files"/>
  <property name="example" value="${common-solr.dir}/example" />
  <property name="javadoc.dir" location="${build.dir}/docs/api"/>
  <property name="javadoc.link" value="http://java.sun.com/javase/6/docs/api/"/>
  <property name="tests.loggingfile" value="${common-solr.dir}/testlogging.properties"/>
  <property name="tests.threadspercpu" value="2"/>
  <property name="tests.cleanthreads.sysprop" value="perClass"/>

  <property name="clover.db.dir" location="${dest}/tests/clover/db"/>
  <property name="clover.report.dir" location="${dest}/tests/clover/reports"/>
  <available property="clover.present" classname="com.cenqua.clover.tasks.CloverReportTask"/>
  <condition property="clover.enabled">
    <and>
      <isset property="run.clover"/>
      <isset property="clover.present"/>
    </and>
  </condition>

  <path id="additional.dependencies">
  	<fileset dir="${common-solr.dir}/lib" includes="**/*.jar"/>
  	<fileset dir="${common-solr.dir}/example/lib" includes="**/*.jar"/>
  	<fileset dir="lib" includes="**/*.jar" erroronmissingdir="false"/>
  </path>

  <pathconvert property="project.classpath" targetos="unix" refid="additional.dependencies"/>

  <import file="${common-solr.dir}/../lucene/contrib/contrib-build.xml"/>

  <!-- Solr Specification Version

       This will be used in the Manifest file, and therefore must
       match the pattern "digit+{.digit+}*"

       By default, this should be set to "X.Y.M.${dateversion}"
       where X.Y.M is the last version released (on this branch).
    -->
  <property name="solr.spec.version" value="3.5.0.${dateversion}" />

  <path id="solr.base.classpath">
  	<pathelement path="${analyzers-common.jar}"/>
  	<pathelement path="${highlighter.jar}"/>
  	<pathelement path="${memory.jar}"/>
  	<pathelement path="${misc.jar}"/>
  	<pathelement path="${spatial.jar}"/>
    <pathelement path="${spellchecker.jar}"/>
    <pathelement path="${grouping.jar}"/>
    <pathelement path="${queries.jar}"/>
    <pathelement location="${common-solr.dir}/build/solr-solrj/classes/java"/>
    <pathelement location="${common-solr.dir}/build/solr-core/classes/java"/>
    <path refid="base.classpath"/>
  </path>

  <path id="classpath" refid="solr.base.classpath"/>

  <path id="solr.test.base.classpath">
    <pathelement path="${common-solr.dir}/build/solr-test-framework/classes/java"/>
  	<pathelement path="${tests.userdir}"/>
  	<path refid="test.base.classpath"/>
  </path>
 
  <path id="test.classpath" refid="solr.test.base.classpath"/>

  <macrodef name="solr-contrib-uptodate">
    <attribute name="name"/>
    <attribute name="property" default="@{name}.uptodate"/>
    <attribute name="classpath.property" default="@{name}.jar"/>
    <!-- set jarfile only, if the target jar file has no generic name -->
    <attribute name="jarfile" default="${common-solr.dir}/build/contrib/solr-@{name}/apache-solr-@{name}-${version}.jar"/>
    <sequential>
      <!--<echo message="Checking '@{jarfile}' against source folder '${common.dir}/contrib/@{name}/src/java'"/>-->
      <property name="@{classpath.property}" location="@{jarfile}"/>
      <uptodate property="@{property}" targetfile="@{jarfile}">
        <srcfiles dir="${common-solr.dir}/contrib/@{name}/src/java" includes="**/*.java"/>
      </uptodate>
    </sequential>
  </macrodef>

  <target name="validate" depends="validate-solr"/>
  <target name="validate-solr" depends="check-legal-solr" unless="validated-solr.uptodate"/>

  <target name="check-legal-solr" depends="compile-tools">
    <java classname="org.apache.lucene.validation.DependencyChecker" failonerror="true" fork="true">
      <classpath>
        <path refid="tools.runtime.classpath" />
      </classpath>
      <!-- TODO: it might be better to just automatically find all directories that contain jar files, but that could take a
       long time.  This should be faster, but we could miss a directory
       -->
      <!-- Solr -->
      <arg value="-c" />
      <arg value="${common-solr.dir}/lib" />
      <arg value="-c" />
      <arg value="${common-solr.dir}/contrib/analysis-extras/lib" />
      <arg value="-c" />
      <arg value="${common-solr.dir}/contrib/clustering/lib" />
      <arg value="-c" />
      <arg value="${common-solr.dir}/contrib/dataimporthandler/lib" />
      <arg value="-c" />
      <arg value="${common-solr.dir}/contrib/dataimporthandler-extras/lib" />
      <arg value="-c" />
      <arg value="${common-solr.dir}/contrib/extraction/lib" />
      <arg value="-c" />
      <arg value="${common-solr.dir}/contrib/uima/lib" />
      <arg value="-c" />
      <arg value="${common-solr.dir}/example/example-DIH/solr/db/lib" />
      <arg value="-c" />
      <arg value="${common-solr.dir}/example/example-DIH/solr/mail/lib" />
      <arg value="-c" />
      <arg value="${common-solr.dir}/example/example/lib" />
      <arg value="-c" />
      <arg value="${common-solr.dir}/core/src/test-files/solr/lib" />
    </java>
    <property name="validated-solr.uptodate" value="true"/>
  </target>
  <path id="tools.runtime.classpath">
    <pathelement location="${common.dir}/build/classes/tools"/>
  </path>

  <target name="init-dist" >
    <mkdir dir="${build.dir}"/>
    <mkdir dir="${package.dir}"/>
    <mkdir dir="${dist}"/>
    <mkdir dir="${maven.dist.dir}"/>
  </target>

  <target name="prep-lucene-jars" 
  	      depends="jar-lucene-core, jar-analyzers-common, jar-spellchecker, jar-highlighter,
  	               jar-memory, jar-misc, jar-spatial, jar-grouping, jar-queries"/>

  <target name="lucene-jars-to-solr" depends="prep-lucene-jars">
    <sequential>
    <copy todir="${lucene-libs}" preservelastmodified="true" flatten="true" failonerror="true" overwrite="true">
      <fileset file="${lucene-core.jar}" />
      <fileset file="${analyzers-common.jar}" />
      <fileset file="${spellchecker.jar}" />
      <fileset file="${grouping.jar}" />
      <fileset file="${queries.jar}" />
      <fileset file="${highlighter.jar}" />
      <fileset file="${memory.jar}" />
      <fileset file="${misc.jar}" />
      <fileset file="${spatial.jar}" />
    </copy>
    </sequential>
  </target>

  <!-- Shared core/solrj/test-framework/contrib targets -->
  <target name="jar-core" depends="compile-core">
    <mkdir dir="${dest}/META-INF/"/>
    <jarify title="Apache Solr Search Server: ${ant.project.name}"
            metainf.source.dir="${common-solr.dir}"
            implementation.title="org.apache.solr"
            spec.version="${solr.spec.version}"/>
  </target>

  <target name="compile-core" depends="prep-lucene-jars,common.compile-core"/>
  <target name="compile-test" depends="compile-solr-test-framework,common.compile-test"/>

  <target name="dist" depends="jar-core">
    <copy file="${build.dir}/${fullnamever}.jar" todir="${dist}"/>
  </target>

  <target name="javadocs" depends="compile-core">
   	<sequential>
      <mkdir dir="${javadoc.dir}"/>
      <mkdir dir="${dest}/META-INF/"/>
      <invoke-javadoc destdir="${javadoc.dir}"
                      title="${Name} ${version} ${name} API">
        <sources>
          <link href=""/>
          <packageset dir="${src.dir}"/>
        </sources>
      </invoke-javadoc>
      <jarify basedir="${javadoc.dir}"
              destfile="${build.dir}/${final.name}-javadoc.jar"
              title="Apache Solr Search Server: ${ant.project.name}"
              metainf.source.dir="${common-solr.dir}"
              implementation.title="org.apache.solr"
              spec.version="${solr.spec.version}"/>
     </sequential>
  </target>

  <target name="jar-src" depends="init">
  	<jarify basedir="${src.dir}"
            destfile="${build.dir}/${final.name}-src.jar"
            implementation.title="org.apache.solr"
            metainf.source.dir="${common-solr.dir}"
            spec.version="${solr.spec.version}"/>
  </target>

  <!-- Solr core targets -->
  <target name="compile-solr-core" description="Compile Solr core." unless="solr.core.compiled">
    <ant dir="${common-solr.dir}/core" target="compile-core" inheritAll="false">
      <propertyset refid="uptodate.and.compiled.properties"/>
    </ant>
    <property name="solr.core.compiled" value="true"/>
  </target>
  <target name="compile-test-solr-core" description="Compile solr core tests">
    <ant dir="${common-solr.dir}/core" target="compile-test" inheritAll="false">
      <propertyset refid="uptodate.and.compiled.properties"/>
    </ant>
    <property name="solr.core.compiled" value="true"/>
  </target>
  <target name="dist-core" depends="init-dist"
          description="Creates the Solr JAR Distribution file.">
    <ant dir="${common-solr.dir}/core" target="dist" inheritall="false">
      <propertyset refid="uptodate.and.compiled.properties"/>
    </ant>
  </target>

  <!-- Solrj targets -->
  <target name="compile-solrj" description="Compile the java client." unless="solrj.compiled">
    <ant dir="${common-solr.dir}/solrj" target="compile-core" inheritAll="false">
      <propertyset refid="uptodate.and.compiled.properties"/>
    </ant>
    <property name="solrj.compiled" value="true"/>
  </target>
  <target name="compile-test-solrj" description="Compile java client tests">
    <ant dir="${common-solr.dir}/solrj" target="compile-test" inheritAll="false">
      <propertyset refid="uptodate.and.compiled.properties"/>
    </ant>
    <property name="solrj.compiled" value="true"/>
  </target>
  <target name="dist-solrj" depends="init-dist"
          description="Creates the Solr-J JAR Distribution file.">
    <ant dir="${common-solr.dir}/solrj" target="dist" inheritall="false">
      <propertyset refid="uptodate.and.compiled.properties"/>
    </ant>
  </target>

  <!-- Solr test-framework targets -->
  <target name="compile-solr-test-framework" description="Compile the Solr test-framework" unless="solr.test.framework.compiled">
    <ant dir="${common-solr.dir}/test-framework" target="compile-core" inheritAll="false">
      <propertyset refid="uptodate.and.compiled.properties"/>
    </ant>
  	<property name="solr.core.compiled" value="true"/>
    <property name="solr.test.framework.compiled" value="true"/>
  </target>

  <!-- Solr contrib targets -->
  <target name="compile-contrib" description="Compile contrib modules">
  	<contrib-crawl target="compile-core"/>
  </target>
  <target name="compile-test-contrib" description="Compile contrib modules' tests">
  	<contrib-crawl target="compile-test"/>
  </target>

  <target name="contribs-add-to-war">
    <mkdir dir="${dest}/web"/>
    <delete dir="${dest}/web" includes="**/*" failonerror="false"/>
    <contrib-crawl target="add-to-war"/>
  </target>
</project>
