<!--
   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="fortress" default="test" basedir="../../">

   <target name="init">

      <!-- ########### Project specific properties ########################### -->
      <property name="name" value="fortress"/>
      <property name="version" value="1.0.0-rc1"/>
      <property name="title" value="Fortress Access Management Samples LDAP SDK ${version}"/>
      <property name="package.samples" value="org.apache.directory.fortress.*"/>
      <property name="project.name" value="Fortress Access Management SDK"/>

      <!-- ########### Env specific properties ########################### -->
      <property name="lib.dir" value="${basedir}/lib"/>
      <property name="src.dir" value="${basedir}/src"/>
      <property name="src.test.dir" value="${src.dir}/test/java"/>
      <property name="build.dir" value="${basedir}/build"/>
      <property name="build.test-classes.dir" value="${build.dir}/test-classes"/>
      <property name="dist.dir" value="${basedir}/dist"/>
      <property name="dist.jar" value="${dist.dir}/${name}-${version}.jar"/>
      <property name="dist.test.jar" value="${dist.dir}/${name}Tst-${version}.jar"/>

      <!-- ########### Fortress Dependencies ########################### -->
      <property name="config.dir" value="${basedir}/config"/>
      <property name="commons-config.jar" value="${lib.dir}/commons-configuration-1.6.jar"/>
      <property name="commons-lang.jar" value="${lib.dir}/commons-lang-2.4.jar"/>
      <property name="commons-collections.jar" value="${lib.dir}/commons-collections-3.2.1.jar"/>
      <property name="commons-pool.jar" value="${lib.dir}/commons-pool-1.5.2.jar"/>
      <property name="commons-logging.jar" value="${lib.dir}/commons-logging-1.1.1.jar"/>
      <property name="commons-beanutils.jar" value="${lib.dir}/commons-beanutils-1.8.0.jar"/>
      <property name="jgraph.jar" value="${lib.dir}/jgrapht-jdk1.6.jar"/>
      <property name="log4j.jar" value="${lib.dir}/log4j-1.2.8.jar"/>
      <property name="junit.jar" value="${lib.dir}/junit-4.4.jar"/>

      <!-- ########### Test properties ########################### -->
      <property name="test.sample.entry" value="org.apache.directory.fortress.core.samples.AllSamplesJUnitTest"/>
      <property name="test.failonerror" value="false" />
      <property name="test.showoutput" value="yes" />

      <property name="javac.optimize" value="false"/>
      <property name="javac.debug" value="true"/>
      <property name="javac.deprecation" value="true"/>

      <!-- ########### Define classpaths ########################### -->

       <!-- This is used for the JUnit Tests -->
       <path id="test.class.path">
           <path location="${config.dir}"/>
           <pathelement location="${build.test-classes.dir}"/>
           <pathelement location="${dist.jar}"/>
           <pathelement location="${jgraph.jar}"/>
           <pathelement location="${junit.jar}"/>
           <pathelement location="${log4j.jar}"/>
           <pathelement location="${commons-config.jar}"/>
           <pathelement location="${commons-lang.jar}"/>
           <pathelement location="${commons-pool.jar}"/>
           <pathelement location="${commons-logging.jar}"/>
           <pathelement location="${commons-collections.jar}"/>
           <pathelement location="${commons-beanutils.jar}"/>
       </path>

   </target>

   <!-- ###########  Clean the distribution packages  ##################### -->
   <target name="clean" depends="init" description="removes generated files">
      <delete dir="${build.test-classes.dir}"/>
   </target>

    <target name="compile-test" depends="init">
       <mkdir dir="${build.dir}"/>
       <mkdir dir="${build.test-classes.dir}"/>
       <javac destdir="${build.test-classes.dir}"
              srcdir="${src.test.dir}"
              classpath="${test.class.path}"
              debug="${javac.debug}"
              deprecation="${javac.deprecation}"
              optimize="${javac.optimize}">
              <classpath refid="build.class.path"/>
       </javac>
    </target>

   <!-- ###############  run junit samples tests ############################### -->
    <target name="test" depends="compile-test" description="runs (junit) sample unit tests">
        <echo message="Run the Fortress sample JUnit tests..."/>
        <junit fork="yes" haltonfailure="${test.failonerror}" showoutput="${test.showoutput}">
            <classpath refid="test.class.path"/>
            <formatter type="plain" usefile="false"/>
            <test name="${test.sample.entry}"/>
        </junit>
    </target>

    <target name="build-jar-test" depends="compile-test">
       <mkdir dir="${dist.dir}"/>
       <jar jarfile="${dist.test.jar}">
          <fileset dir="${build.test-classes.dir}"/>
          <metainf dir="${basedir}" includes="LICENSE.txt,NOTICE.txt"/>
          <manifest>
             <attribute name="Created-By" value="${vendor} - ${project.name} dev team"/>
             <attribute name="Implementation-Vendor" value="${vendor}"/>
             <attribute name="Implementation-Version" value="${version}"/>
             <attribute name="Specification-Title" value="${title}"/>
             <attribute name="Package" value="${package}"/>
             <attribute name="Extension-Name" value="${name}"/>
             <attribute name="Built-By" value="${user.name}"/>
             <attribute name="Compile-JDK" value="${java.runtime.version}"/>
             <attribute name="Test-VM" value="${java.vm.version}"/>
          </manifest>
       </jar>
    </target>

</project>
