<!--
 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" xmlns:artifact="antlib:org.apache.maven.artifact.ant">
  <description>
    This file is designed for importing into a main build file, and not intended
    for standalone use.
  </description>

  <dirname file="${ant.file.common}" property="common.dir"/>
  
  <!-- Initialize property values: allow easy customization via build.properties -->
  <property file="build.properties" />

  <property name="Name" value="Solr" />

  <property name="name" value="${ant.project.name}"/>

  <tstamp>
    <format property="year" pattern="yyyy"/>
    <format property="DSTAMP" pattern="yyyy-MM-dd"/>
    <format property="TSTAMP" pattern="HH:mm:ss"/>
    <!-- datetime format that is safe to treat as part of a dotted version -->
    <format property="dateversion" pattern="yyyy.MM.dd.HH.mm.ss" />
  </tstamp>

  <!-- 
    we attempt to exec svnversion to get details build information
    for jar manifests.  this property can be set at runtime to an
    explicit path as needed, or ant will just try to find it in the
    default PATH. (this is useful for Hudson)
  -->
  <property name="svnversion.exe" value="svnversion" />

  <!-- Java Version we are compatible with -->
  <property name="java.compat.version" value="1.5" />

  <!-- Solr Implementation Version -->
  <!--
       This can be any string value that does not include spaces
       This will be used when creating build artifact file names.

       By default, this should be set to "X.Y.N-dev" where X.Y.N is
       "1 greater" then the last version released (on this branch).
    -->
  <property name="version" value="1.3.0" />
  <!-- The version number to assign to the Maven artifacts.  Usually something like 1.3-SNAPSHOT -->
  <property name="maven_version" value="1.3.0"/>  
  <!-- 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="specversion" value="1.3.0" />


  
    <!-- Type of checksum to compute for distribution files -->
  <property name="checksum.algorithm" value="md5" />
  
  <property name="fullname" value="apache-${ant.project.name}"/>
  <property name="fullnamever" value="apache-${ant.project.name}-${version}"/>

  <!-- Destination for compiled classes and binaries -->
  <property name="dest" value="build" />

  <!-- Javadoc properties -->
  <property name="javadoc.years" value="2006 - ${year}" />
  <property name="javadoc.access" value="protected"/>
  <property name="javadoc.link.java"
            value="http://java.sun.com/j2se/1.5.0/docs/api/"/>
  <property name="javadoc.link.junit"
            value="http://junit.sourceforge.net/javadoc/"/>
  <property name="javadoc.link.lucene"
            value="http://lucene.apache.org/java/docs/api/"/>
  <property name="javadoc.packages" value="org.apache.solr.*"/>
  <property name="build.docs" value="${dest}/docs"/>
  <property name="build.javadoc" value="${common.dir}/${build.docs}/api"/>
  <property name="build.javadoc.solrj" value="${build.docs}/api-solrj"/>
  
  <!-- JUnit properties -->
  <property name="junit.includes" value="**/Test*.java,**/*Test.java"/>
  <property name="junit.output.dir" location="${common.dir}/${dest}/test-results"/>
  <property name="junit.reports" location="${common.dir}/${dest}/test-results/reports"/>

  <!-- Maven properties -->
  <property name="maven.build.dir" value="${basedir}/build/maven"/>
  <property name="maven.dist.dir" value="${basedir}/dist/maven"/>

  <!-- The version suffix of the Lucene artifacts checked into "lib" -->
  <property name="lucene_version" value="2.4-dev"/>


  <!-- By default, "deploy" to a temporary directory (as well as installing
       into your local repository).  If you wish to deploy to a remote
       repository, set this property to the URL of that repository.  In
       addition, if the repository requires authentication, you can set
       properties "m2.repository.username" and "m2.repository.private.key"
       to define your credentials.
  -->
  <property name="m2.repository.url" value="file://${maven.dist.dir}"/>
  <property name="m2.repository.private.key" value="${user.home}/.ssh/id_dsa"/>

  <available property="maven.ant.tasks.present" classname="org.apache.maven.artifact.ant.Pom" />

  <!-- End Maven Properties -->

  <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>
   
   
  <!-- Macro for compilation -->
  <macrodef name="solr-javac">
    <attribute name="destdir" />
    <attribute name="classpathref" />
    <element name="nested" optional="true" implicit="true" />
    <sequential>
      <mkdir dir="@{destdir}" />
      <javac destdir="@{destdir}"
             target="${java.compat.version}"
             source="${java.compat.version}"
             debug="on"
             encoding="utf8"
             sourcepath=""
             classpathref="@{classpathref}">
         <nested />
      </javac>
    </sequential>
  </macrodef>

  <!-- Macro for building Jars -->
  <macrodef name="solr-jar">
    <attribute name="destfile" />
    <attribute name="basedir" default="." />
    <attribute name="includes" default="org/apache/**" />
    <attribute name="excludes" default="" />
    <attribute name="manifest" default="${common.dir}/${dest}/META-INF/MANIFEST.MF" />
    <element name="nested" optional="true" implicit="true" />
    <sequential>
      <jar destfile="@{destfile}"
           basedir="@{basedir}"
           includes="@{includes}"
           excludes="@{excludes}"
           filesetmanifest="skip"
           manifest="@{manifest}">
        <metainf dir="${common.dir}" includes="LICENSE.txt,NOTICE.txt"/>
        <nested />
      </jar>
    </sequential>
  </macrodef>

  <!-- Macro for building checksum files
       This is only needed until the "format" option is supported
       by ant's built in checksum task
   -->
  <macrodef name="solr-checksum">
    <attribute name="file"/>
    <!-- NOTE: we use the value of @{file} in the names any properties
         set because macro's don't have variables, and otherwise we
         wouldn't be able to checksum more then one file per build
      -->
    <sequential>
     <checksum file="@{file}"
               property="@{file}.sum"
               algorithm="${checksum.algorithm}" />
     <basename file="@{file}" property="@{file}.base" />
     <concat destfile="@{file}.${checksum.algorithm}"
             force="yes"
             append="false"
             fixlastline="yes">
       <header trimleading="yes">${@{file}.sum}  </header>
       <!-- empty fileset to trick concat -->
       <fileset dir="." excludes="**" />
       <footer trimleading="yes">${@{file}.base}
       </footer>
     </concat>
    </sequential>
  </macrodef>


  <macrodef name="contrib-crawl">
    <attribute name="target" default=""/>
    <attribute name="failonerror" default="true"/>
    <sequential>
      <subant target="@{target}" failonerror="@{failonerror}">
        <fileset dir="."
                 includes="contrib/*/build.xml"
        />
      </subant>
    </sequential>
  </macrodef>

  <macrodef name="invoke-javadoc">
    <element name="sources" optional="yes"/>
    <attribute name="destdir"/>
  	<attribute name="title" default="${Name} ${version} API (${specversion})"/>
    <sequential>
      <javadoc
          packagenames="org.apache.solr.*"
          failonerror="true"
          destdir="@{destdir}"
          access="${javadoc.access}"
          encoding="utf-8"
          author="true"
          version="true"
          use="true"
          source="${ant.java.version}"
          link="${javadoc.link.java}"
          windowtitle="${Name} ${version} API"
          doctitle="@{title}"
          bottom="Copyright &amp;copy; ${year} Apache Software Foundation.  All Rights Reserved.">
        <tag name="todo" description="To Do:"/>
        <tag name="uml.property" description="UML Property:"/>
      	<link offline="true" packagelistLoc="${build.javadoc}"/>
        <link href="${javadoc.link.java}"/>
        <link href="${javadoc.link.junit}"/>
        <link href="${javadoc.link.lucene}"/>

        <sources />

        <classpath refid="javadoc.classpath"/>
      </javadoc>
   </sequential>
  </macrodef>

  <macrodef name="m2-deploy" description="Builds a Maven artifact">
        <element name="artifact-attachments" optional="yes"/>
    <attribute name="pom.xml" default="${pom.xml}"/>
    <attribute name="jar.file" default="${jar.file}"/>
    <sequential>
      <copy file="@{pom.xml}" tofile="${maven.build.dir}/@{pom.xml}">
        <filterset begintoken="@" endtoken="@">
          <filter token="maven_version" value="${maven_version}"/>
        </filterset>
      </copy>
      <artifact:install-provider artifactId="wagon-ssh" version="1.0-beta-2"/>
      <artifact:pom id="maven.project" file="${maven.build.dir}/@{pom.xml}" />
      <artifact:deploy file="@{jar.file}" uniqueVersion="false">
        <artifact-attachments/>
        <remoteRepository url="${m2.repository.url}">
          <authentication username="${m2.repository.username}" privateKey="${m2.repository.private.key}"/>
        </remoteRepository>
        <pom refid="maven.project"/>
      </artifact:deploy>
    </sequential>
  </macrodef>

  <target name="clean-contrib"
	          description="Cleans all contrib modules and their tests">
	<contrib-crawl target="clean"/>
  </target>

  <target name="build-contrib"
          description="Builds all contrib modules and their tests">
    <contrib-crawl target="build"/>
  </target>

  <target name="test-contrib" depends="build-contrib">
    <contrib-crawl target="test" failonerror="true"/>
  </target>

  <target name="dist-contrib" description="Make the contribs ready for distribution">
  	<contrib-crawl target="dist" failonerror="true" />
  </target>

  <!-- Creates a Manifest file for Jars and WARs -->
  <target name="make-manifest">
     <!-- If possible, include the svnversion -->
     <exec dir="." executable="${svnversion.exe}" outputproperty="svnversion" failifexecutionfails="false">
      <arg line="."/>
     </exec>

     <!-- no description, don't advertise -->
     <mkdir dir="${dest}/META-INF/" />
     <manifest mode="replace" file="${dest}/META-INF/MANIFEST.MF">
        <!--
        http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html#JAR%20Manifest
        http://java.sun.com/j2se/1.5.0/docs/guide/versioning/spec/versioning2.html
        http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Package.html
        http://java.sun.com/j2se/1.5.0/docs/api/java/util/jar/package-summary.html
        http://java.sun.com/developer/Books/javaprogramming/JAR/basics/manifest.html
        -->
        <!-- Don't set 'Manifest-Version' it identifies the version of the
             manifest file format, and should always be 1.0 (the default)

             Don't set 'Created-by' attribute, its purpose is 
             to identify the version of java used to build the jar,
             which ant will do by default.

             Ant will happily override these with bogus strings if you
             tell it to, so don't.

             NOTE: we don't use section info because all of our manifest data
             applies to the entire jar/war ... no package specific info.
        -->
        <attribute name="Extension-Name" 
                   value="org.apache.solr"/>
        <attribute name="Specification-Title" 
                   value="Apache Solr Search Server"/>
        <!-- spec version must match "digit+{.digit+}*" -->
        <attribute name="Specification-Version" 
                   value="${specversion}"/>
        <attribute name="Specification-Vendor" 
                   value="The Apache Software Foundation"/>
        <attribute name="Implementation-Title" 
                   value="org.apache.solr"/>
        <!-- impl version can be any string -->
        <attribute name="Implementation-Version" 
                   value="${version} ${svnversion} - ${user.name} - ${DSTAMP} ${TSTAMP}"/>
        <attribute name="Implementation-Vendor" 
                   value="The Apache Software Foundation"/>
        <attribute name="X-Compile-Source-JDK" 
                   value="${java.compat.version}"/>
        <attribute name="X-Compile-Target-JDK" 
                   value="${java.compat.version}"/>
     </manifest>
  </target>

  <target name="maven.ant.tasks-check">
    <fail unless="maven.ant.tasks.present">
      ##################################################################
      Maven ant tasks not found.
      Please make sure the maven-ant-tasks jar is in ANT_HOME/lib, or made
      available to Ant using other mechanisms like -lib or CLASSPATH.
      ##################################################################
    </fail>
  </target>

</project>
