<!--
 -
 - 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="module" xmlns:artifact="antlib:org.apache.maven.artifact.ant">

  <import file="common.xml"/>

  <property file="${project.root}/build.deps"/>

  <path id="maven-ant-tasks.classpath" path="${project.root}/${maven-ant-tasks}" />
  <typedef resource="org/apache/maven/artifact/ant/antlib.xml"
           uri="antlib:org.apache.maven.artifact.ant"
           classpathref="maven-ant-tasks.classpath" />

  <map property="module" value="${basedir}" split="${path.separator}">
    <globmapper from="${project.root}${file.separator}*" to="*"/>
  </map>

  <map property="module.name" value="${module}">
    <filtermapper>
        <replacestring from="${file.separator}" to="-"/>
    </filtermapper>
  </map>
	
  <echo message="Running ant for module : ${module}" level="info"/>

  <property name="module.build"        location="${build.scratch}/${module}"/>
  <property name="module.classes"      location="${module.build}/classes"/>
  <property name="module.instrumented" location="${module.build}/classes-instrumented"/>
  <property name="module.precompiled"  location="${module.build}/src"/>
  <property name="module.api"          location="${build.api}/${module}/"/>
  <property name="module.test.api"     location="${build.test.api}/${module}"/>
  <property name="module.test.classes" location="${module.build}/test/classes"/>
  <property name="module.test.resources" location="src/test/resources"/>
  <property name="module.results"      location="${build.results}/${module}"/>
  <property name="module.failed"       location="${module.results}/FAILED"/>
  <property name="module.src"          location="src/main/java"/>
  <property name="module.test.src"     location="src/test/java"/>
  <property name="module.bin"          location="bin"/>
  <property name="module.etc"          location="etc"/>

  <property name="module.src.resources" location="src/main/resources"/>
  <property name="module.src.resources.metainf" location="${module.src.resources}/META-INF"/>
  <property name="module.resources.dir" location="resources/"/>
  <property name="module.metainf"      location="${module.build}/META-INF"/>

  <property name="module.namever"      value="${project.name}-${module.name}-${project.version}"/>
  <property name="module.namever.osgi" value="${project.name}-${module.name}_${project.version}.0.osgi"/>
  <property name="module.release.base" value="${basedir}/release"/>
  <property name="module.release"      value="${module.release.base}/${module.namever}"/>
  <property name="module.release.lib"  value="${module.release}/lib"/>
  <property name="module.release.zip"  location="${module.release.base}/${module.namever}.zip"/>
  <property name="module.release.tar"  location="${module.release.base}/${module.namever}.tar"/>
  <property name="module.release.tgz"  location="${module.release.base}/${module.namever}.tar.gz"/>
  <property name="module.release.bz2"  location="${module.release}/${module.namever}.tar.bz2"/>

  <property name="module.genpom.args"  value=""/>
  <property name="module.maven.depends"  value=""/>
  <property name="maven.remote.repo"     value="file://${module.release.base}/maven"/>

  <property name="broker.log.prefix" value="BROKER: "/> 
  <property name="broker.log.interleave" value="true"/>

  <property name="module.jar"          location="${build.lib}/${project.name}-${module.name}-${project.version}.jar"/>
  <property name="module.qpid.jar"     location="${module.release.lib}/qpid-all.jar"/>
  <basename property="qpid.jar.name"  file="${module.qpid.jar}"/>

  <property name="module.coverage"     location="${module.build}/coverage"/>
  <property name="cobertura.datafile"  location="${module.instrumented}/cobetura.ser"/>


  <available property="module.test.src.exists" file="${module.test.src}"/>
  <available property="module.etc.exists" file="${module.etc}"/>
  <available property="module.bin.exists" file="${module.bin}"/>
  <available property="module.src.resources.exists" file="${module.src.resources}"/>
  <available property="module.test.src.resources.exists" file="${module.test.resources}"/>
  <available property="module.src.resources.metainf.exists" file="${module.src.resources.metainf}"/>
  <available property="module.resources.dir.exists" file="${module.resources.dir}"/>

  <property name="module.source.jar"
            location="${build.lib}/${project.name}-${module.name}-${project.version}-sources.jar"/>

  <!-- module.depends and module.test.depends are supplied by the importing file -->
  <property name="module.depends"       value=""/>
  <property name="module.test.depends"  value=""/>
  <property name="module.test.excludes" value=""/>

   <!-- Add depenencies dependencies to path -->
   <map property="module.depends.libs" value="${module.depends}" join=" ">
       <chainedmapper>
           <filtermapper>
               <replacestring from="${file.separator}" to="-"/>
           </filtermapper>
           <propertymapper from="*" to="*.libs"/>
       </chainedmapper>
   </map>
    <condition property="module.depends.libs.includes" value="__EMPTY__" else="${module.depends.libs}">
      <equals trim="true" arg1="${module.depends.libs}" arg2=""/>
    </condition>


    <!-- Add depenencies test dependencies to path -->
    <map property="module.test.depends.libs" value="${module.test.depends}" join=" ">
        <chainedmapper>
            <filtermapper>
                <replacestring from="${file.separator}" to="-"/>
            </filtermapper>
            <propertymapper from="*" to="*.libs"/>
        </chainedmapper>
    </map>
    <condition property="module.test.depends.libs.includes" value="__EMPTY__" else="${module.test.depends.libs}">
      <equals trim="true" arg1="${module.test.depends.libs}" arg2=""/>
    </condition>


  <indirect name="module.libs"         variable="${module.name}.libs"/>
  <condition property="module.libs.includes" value="__EMPTY__" else="${module.libs}">
    <equals trim="true" arg1="${module.libs}" arg2=""/>
  </condition>
    
  <indirect name="module.test.libs"    variable="${module.name}.test.libs"/>
  <condition property="module.test.libs.includes" value="__EMPTY__" else="${module.test.libs}">
    <equals trim="true" arg1="${module.test.libs}" arg2=""/>
  </condition>

  <path id="module.libs">
    <fileset dir="${project.root}" includes="${module.libs.includes}"/>
    <fileset dir="${project.root}" includes="${module.depends.libs.includes}"/>
  </path>

  <path id="module.test.libs">
    <fileset dir="${project.root}" includes="${module.test.libs.includes}"/>
    <fileset dir="${project.root}" includes="${module.test.depends.libs.includes}"/>
  </path>

  <path id="module.src.path">
    <pathelement location="${module.src}"/>
    <pathelement location="${module.precompiled}"/>
  </path>
	
  <path id="module.test.src.path">
    <pathelement location="${module.test.src}"/>
  </path>

  <property name="module.test.jar"
            location="${build.lib}/${project.name}-${module.name}-tests-${project.version}.jar"/>

  <map property="module.depends.jars" value="${module.depends}" join=",">
    <globmapper from="*" to="${project.name}-*-${project.version}.jar"/>
    <filtermapper>
        <replacestring from="/" to="-"/>
    </filtermapper>
  </map>

  <map property="module.depends.jars.path" value="${module.depends}" join="${path.separator}">
    <filtermapper>
        <replacestring from="/" to="-"/>
    </filtermapper>

    <globmapper from="*" to="${build.lib}/${project.name}-*-${project.version}.jar"/>
  </map>

  <map property="module.test.depends.jars.path" value="${module.test.depends}" join="${path.separator}">
    <filtermapper>
        <replacestring from="/" to="-"/>
    </filtermapper>
    <globmapper from="*" to="${build.lib}/${project.name}-*-${project.version}.jar"/>
  </map>

  <!-- used for building the module -->
  <path id="module.class.path">
    <pathelement path="${module.depends.jars.path}"/>
    <path refid="module.libs"/>
  </path>

  <!-- used at runtime -->
  <path id="module.runtime.class.path">
    <pathelement location="${module.jar}"/>
    <pathelement path="${module.depends.jars.path}"/>
    <path refid="module.libs"/>
  </path>

  <!-- used to build the tests -->
  <path id="module.test.path">
    <path refid="module.runtime.class.path"/>
    <pathelement path="${module.test.depends.jars.path}"/>
    <path refid="module.test.libs"/>
  </path>

  <!-- used to run the tests -->
  <path id="module.test.runtime.path">
    <pathelement path="${module.test.jar}"/>
    <path refid="module.runtime.class.path"/>
    <pathelement path="${module.test.depends.jars.path}"/>
    <path refid="module.test.libs"/>
  </path>

  <property name="javac.deprecation" value="off"/>

  <target name="debug">
    <echo-prop name="basedir"/>
    <echo-prop name="project.root"/>
    <echo-prop name="module"/>
    <echo-prop name="module.libs"/>
    <echo-prop name="module.test.libs"/>
    <echo-prop name="module.name"/>
    <echo-prop name="module.jar"/>
    <echo-prop name="module.depends"/>

    <echo-prop name="module.test.depends"/>

    <echo-prop name="module.depends.libs"/>
    <echo-prop name="module.test.depends.libs"/>      

    <echo-prop name="module.depends.jars"/>
    <echo-prop name="module.depends.jars.path"/>
    <echo-prop name="module.test.depends.jars.path"/>

    <echo-path refid="module.src.path"/>
    <echo-path refid="module.class.path"/>
    <echo-path refid="module.runtime.class.path"/>
    <echo-path refid="module.test.path"/>
    <echo-path refid="module.test.runtime.path"/>
  </target>

  <target name="prepare">
    <mkdir dir="${build.bin}"/>
    <mkdir dir="${build.etc}"/>
    <mkdir dir="${build.lib}"/>
    <mkdir dir="${build.results}"/>
    <mkdir dir="${build.scratch.broker.plugins.lib}"/>
    <mkdir dir="${module.classes}"/>
    <mkdir dir="${module.precompiled}"/>
    <mkdir dir="${module.api}"/>
    <mkdir dir="${module.test.api}"/>
    <mkdir dir="${module.test.classes}"/>
    <mkdir dir="${module.results}"/>
  </target>

  <!--Overridden by (but still used in) the JCA module -->
  <target name="pom" depends="prepare" if="module.genpom">
    <jython path="${mllib.dir}">
      <args>
        <arg line='"${project.root}/genpom"'/>
        <arg line='-s "${project.root}/lib/poms${path.separator}lib/poms"'/>
        <arg line='-o "${build.scratch}/qpid-${module.name}.pom"'/>
        <arg line="-u ${project.url}"/>
        <arg line="-g ${project.groupid}"/>
        <arg line="-v ${project.version.maven}${maven.version.suffix}"/>
        <arg line="-p qpid"/>
        <arg line='-m "${module.depends} ${module.maven.depends}"'/>
        <arg line="-a ${module.name}"/>
        <arg line="${module.genpom.args}"/>
        <arg line="${module.libs}"/>
      </args>
    </jython>
  </target>

  <!--Overridden by (but still used in) the JCA module -->
  <target name="release-mvn" depends="build,pom" if="module.genpom" description="Install the artifacts into the local repository and prepare the release artifacts">
    <artifact:pom id="module.pom" file="${build.scratch}/qpid-${module.name}.pom"/>

    <artifact:install file="${module.jar}" pomRefId="module.pom" settingsFile="${maven.settings.xml}">
        <localRepository path="${maven.local.repo}"/>
    </artifact:install>

    <artifact:deploy file="${module.jar}" pomRefId="module.pom" uniqueVersion="${maven.unique.version}" settingsFile="${maven.settings.xml}">
      <attach file="${module.source.jar}" classifier="sources"/>
      <localRepository path="${maven.local.repo}"/>
      <remoteRepository url="${maven.remote.repo}"/>
    </artifact:deploy>
  </target>

  <!--Overridden by (but still used in) the JCA module -->
  <target name="deploy-snapshot" depends="build,pom" if="module.genpom" description="deploy a snapshot build to nexus">
    <!-- In order to use this target you need to have predefined a username and password for the
    server with id ${maven.snapshots.repo.id} in your m2 settings file, e.g ~/.m2/settings.xml -->
    <artifact:pom id="module.pom" file="${build.scratch}/qpid-${module.name}.pom"/>

    <fail message="The pom version must include -SNAPSHOT. Version found was: ${module.pom.version}">
      <condition>
        <not>
          <contains substring="-SNAPSHOT" string="${module.pom.version}" />
        </not>
      </condition>
    </fail>

    <artifact:install file="${module.jar}" pomRefId="module.pom" settingsFile="${maven.settings.xml}">
        <localRepository path="${maven.local.repo}"/>
    </artifact:install>

    <artifact:deploy file="${module.jar}" pomRefId="module.pom">
      <localRepository path="${maven.local.repo}"/>
      <remoteRepository id="${maven.snapshots.repo.id}" url="${maven.snapshots.repo.url}"/>
    </artifact:deploy>
  </target>

  <target name="precompile"/>

  <target name="compile" depends="prepare,precompile" description="compile sources">

    <echo message="Targeting : ${java.target}" level="info"/>

    <javac source="${java.source}" target="${java.target}" 
           destdir="${module.classes}" debug="on" debuglevel="lines,vars,source" includeantruntime="false"
           deprecation="${javac.deprecation}">
      <compilerarg line="${javac.compiler.args}"/>
      <src refid="module.src.path"/>
      <classpath refid="module.class.path"/>
    </javac>

    <!-- copy any non java src files into the build tree, e.g. properties files -->
    <copy todir="${module.classes}" verbose="true">
      <fileset dir="${module.src}">
        <exclude name="**/*.java"/>
        <exclude name="**/package.html"/>
      </fileset>
    </copy>
  </target>

  <target name="precompile-tests" if="module.test.src.exists"/>

  <target name="copy-test-resources" if="module.test.src.resources.exists">
      <echo message="Copying test resources from ${module.test.resources} to ${module.test.classes}..."/>
      <copy todir="${module.test.classes}" failonerror="true">
        <fileset dir="${module.test.resources}"/>
      </copy>
  </target>

  <target name="compile-tests" depends="compile,precompile-tests" if="module.test.src.exists"
          description="compilte unit tests">
    <javac target="${java.target}" source="${java.source}"
           destdir="${module.test.classes}" debug="on"
           deprecation="${javac.deprecation}"
           srcdir="${module.test.src}"
           includeantruntime="false">
      <classpath refid="module.test.path"/>
    </javac>

    <!-- copy any non java src files into the build tree, e.g. properties files -->
    <copy todir="${module.test.classes}" verbose="true">
      <fileset dir="${module.test.src}">
        <exclude name="**/*.java"/>
        <exclude name="**/package.html"/>
      </fileset>
    </copy>
  </target>


  <property name="profile" value="java-mms.0-10"/>
  <property name="testprofile.file" value="${test.profiles}/${profile}.testprofile"/>
  
  <available file="${testprofile.file}" property="testprofile.file.present"/>
  <fail unless="testprofile.file.present" message="The requested test profile was not found: ${testprofile.file}"/>

  <property file="${testprofile.file}" prefix="preload"/>
  <property name="preload.include" value=""/>
  <property name="profiles" value="${preload.include} ${profile}"/>
  <map property="_profile_files" value="${profiles}" join=" ">
    <globmapper from="*" to="*.testprofile"/>
  </map>

  <concat destfile="${build.scratch}/test-${profile}.properties" force="yes" append="no" fixlastline="yes">
    <filelist dir="${test.profiles}" files="testprofile.defaults"/>
    <filelist dir="${test.profiles}" files="${_profile_files}"/>
  </concat>
  <property file="${build.scratch}/test-${profile}.properties"/>

  <map property="test.excludefiles" value="${test.excludes}">
    <globmapper from="*" to="${test.profiles}/*;"/>
  </map>

  <condition property="dontruntest" value="dontruntest" else="runtest">
         <contains substring="${module.name}" string="${exclude.modules}" />
  </condition>

  <!-- JVM args pass to forked Junit JVM -->
  <property name="jvm.args" value=""/>
  <!-- Following properties are used by the tests -->
  <property name="test.output" value="${module.results}"/>
  <property name="QPID_HOME" value="${qpid.home}"/>
  <property name="QPID_WORK" value="${qpid.work}"/>
  <property name="broker.existing.qpid.work" value=""/>

  <propertyset id="all.test.systemproperties">
    <propertyref prefix="test"/>
    <propertyref prefix="profile"/>
    <propertyref prefix="javax.net.ssl"/>
    <propertyref prefix="broker"/>
    <propertyref prefix="qpid"/>

    <propertyref name="amqj.logging.level"/>
    <propertyref name="amqj.server.logging.level"/>
    <propertyref name="amqj.protocol.logging.level"/>

    <propertyref name="log4j.debug"/>
    <propertyref name="log4j.configuration"/>
    <propertyref name="log4j.configuration.file"/>

    <propertyref name="root.logging.level"/>
    <propertyref name="java.naming.factory.initial"/>
    <propertyref name="java.naming.provider.url"/>
    <propertyref name="messagestore.class.name" />
    <propertyref name="max_prefetch"/>

    <propertyref name="QPID_HOME"/>
    <propertyref name="QPID_WORK"/>
    <propertyref name="example.plugin.target"/>
  </propertyset>

  <target name="test" depends="build,compile-tests" if="module.test.src.exists"
         unless="${dontruntest}" description="execute unit tests">

    <delete file="${module.failed}"/>

    <echo message="Using profile:${profile}" level="info"/>
    <junit fork="yes" forkmode="once" maxmemory="${test.mem}" reloading="no"
           haltonfailure="${haltonfailure}" haltonerror="${haltonerror}"
           failureproperty="test.failures" printsummary="on" timeout="6000000"
           dir="${project.root}" >

      <jvmarg line="${jvm.args}" />

      <syspropertyset refid="all.test.systemproperties"/>

      <formatter type="plain"/>
      <formatter type="xml"/>

      <classpath refid="module.test.runtime.path"/>

      <batchtest todir="${module.results}">
        <fileset dir="${module.test.src}" excludes="${module.test.excludes}">
          <include name="**/${test}.java"/>
        </fileset>
      </batchtest>
    </junit>

    <antcall target="touch-failed"/>

    <condition property="failed">
      <and>
        <isfalse value="${test.failures.ignore}"/>
        <available file="${module.failed}"/>
      </and>
    </condition>

    <fail if="failed" message="TEST SUITE FAILED"/>

  </target>

  <target name="report-module" description="generate junit reports for each module">
    <junitreport todir="${module.results}">
        <fileset dir="${module.results}">
            <include name="TEST-*.xml"/>
        </fileset>
        <report format="frames" todir="${module.results}/report/html"/>
    </junitreport> 
  </target>

  <target name="touch-failed" if="test.failures">
    <touch file="${module.failed}"/>
    <touch file="${build.failed}"/>
  </target>

  <target name="copy-bin" if="module.bin.exists" description="copy bin directory if it exists to build tree">
    <copy todir="${build.bin}" failonerror="false">
      <fileset dir="${module.bin}"/>
    </copy>
    <chmod dir="${build.bin}" perm="ugo+rx" includes="**/*"/>
  </target>

  <target name="copy-bin-release" if="module.bin.exists" description="copy dependencies into module release">
    <copy todir="${module.release}/bin" failonerror="true">
      <fileset dir="${module.bin}" />
    </copy>
    <chmod dir="${module.release}/bin" perm="ugo+rx" includes="**/*"/>
  </target>

  <target name="copy-etc" if="module.etc.exists" description="copy etc directory if it exists to build tree">
    <copy todir="${build.etc}" failonerror="false">
      <fileset dir="${module.etc}"/>
    </copy>
  </target>

  <target name="copy-etc-release" if="module.etc.exists" description="copy etc directory if it exists to build tree">
    <copy todir="${module.release}/etc" failonerror="false" flatten="true">
        <fileset dir="${module.etc}"/>
    </copy>
  </target>

  <target name="postbuild" description="run after a build"/>

  <target name="build" depends="jar,jar-tests,jar-sources,libs,copy-bin,copy-etc,postbuild,copy-broker-plugin-jars" description="compile and copy resources into build tree"/>

  <target name="jar.manifest" depends="compile,copy-resources,copy-files-to-module-metainf" if="module.manifest">
    <jar destfile="${module.jar}" basedir="${module.classes}" manifest="${module.manifest}">
       <metainf dir="${module.metainf}" />
    </jar>
  </target>

  <target name="jar.nomanifest" depends="compile,copy-resources,copy-files-to-module-metainf" unless="module.manifest">
    <jar destfile="${module.jar}" basedir="${module.classes}">
       <metainf dir="${module.metainf}" />
    </jar>
  </target>

  <target name="copy-broker-plugin-jars" if="broker.plugin" description="copy broker plugins for use in release packaging">
    <copy file="${module.jar}" todir="${build.scratch.broker.plugins.lib}" failonerror="true"/>
  </target>

  <target name="copy-files-to-module-metainf" depends="copy-project-resources-metainf, copy-module-resources-metainf, copy-module-src-resources-metainf"/>

  <target name="copy-project-resources-metainf">
    <copy todir="${module.metainf}" failonerror="true">
        <fileset dir="${project.root}/resources/"/>
    </copy>
  </target>

  <target name="copy-resources" if="module.src.resources.exists">
      <echo message="Copying resources from ${module.src.resources} to ${module.classes}..."/>
      <copy todir="${module.classes}" failonerror="true">
        <fileset dir="${module.src.resources}" excludes="META-INF/**"/>
      </copy>
  </target>

  <target name="copy-module-resources-metainf" if="module.resources.dir.exists">
    <copy todir="${module.metainf}" failonerror="false" overwrite="true">
        <fileset dir="${module.resources.dir}"/>
    </copy>
  </target>

  <target name="copy-module-src-resources-metainf" if="module.src.resources.metainf.exists">
    <copy todir="${module.metainf}" failonerror="true">
        <fileset dir="${module.src.resources.metainf}"/>
    </copy>
  </target>

  <target name="jar" depends="jar.manifest,jar.nomanifest" description="create jar"/>

  <target name="jar-tests" depends="compile-tests, copy-test-resources" description="create unit test jar">
    <jar destfile="${module.test.jar}" basedir="${module.test.classes}"/>
  </target>

  <target name="jar-sources" depends="prepare" description="create sources jar">
    <jar destfile="${module.source.jar}">
      <fileset dir="${project.root}/resources">
        <include name="LICENSE"/>
        <include name="NOTICE"/>
      </fileset>
      <fileset dir="${module.src}" includes="**/*.java"/>
      <fileset dir="${module.precompiled}" includes="**/*.java"/>
    </jar>
  </target>

  <target name="libs" description="copy dependencies into build tree">
    <copylist todir="${build.lib}" dir="${project.root}" files="${module.libs}"/>
  </target>


  <target name="libs-release" description="copy dependencies into module release">
    <!-- Copy the module dependencies -->
      <echo message="${module.libs}"/>
    <copylist todir="${module.release}/lib" dir="${project.root}" files="${module.libs}"/>
    <copylist todir="${module.release}/lib" dir="${project.root}" files="${module.depends.libs}"/>

    <!-- Copy the jar for this module -->
    <copy todir="${module.release}/lib" failonerror="true">
        <fileset file="${module.jar}"/>
        <fileset dir="${build.lib}" includes="${module.depends.jars}"/>
    </copy>
  </target>

  <target name="resources" description="copy resources into build tree">
    <copy todir="${build}" failonerror="false" flatten="true">
      <fileset dir="${basedir}${file.separator}.." includes="${resources}"/>
    </copy>
  </target>

  <target name="resources-release" description="copy resources into module release">
    <copy todir="${module.release}" failonerror="false" flatten="true">
      <fileset dir="${resources}" excludes="META-INF"/>
    </copy>
  </target>

  <uptodate property="doc.done" targetfile="${module.api}/index.html">
    <srcfiles dir="${module.src}" includes="**/*.java"/>
  </uptodate>

  <property name="module.doc.access" value="package"/>
  <target name="doc" depends="prepare" unless="doc.done" description="generate api-doc">
    <javadoc access="${module.doc.access}" destdir="${module.api}" author="false" version="true" use="true"
        windowtitle="${project.name} - ${module.name} - API Documentation"
   		sourcepathref="module.src.path" classpathref="module.class.path" packagenames="*">
      <arg value="-J-Dhttp.proxyHost=${http.proxyHost}"/>
      <arg value="-J-Dhttp.proxyPort=${http.proxyPort}"/>
      <bottom><![CDATA[<em><a href="http://www.apache.org/licenses/LICENSE-2.0">Licensed to the Apache Software Foundation</a></em>]]></bottom>
      <link href="http://java.sun.com/j2se/1.5.0/docs/api/"/>
      <link href="http://download.oracle.com/docs/cd/E17477_01/javaee/5/api/"/>
      <link href="http://commons.apache.org/configuration/apidocs/"/>
      <tag name="todo" scope="all" description="Todo:" />
    </javadoc>
  </target>

  <uptodate property="test-doc.done" targetfile="${module.test.api}/index.html">
    <srcfiles dir="${module.test.src}" includes="**/*.java"/>
  </uptodate>

  <property name="module.test.doc.access" value="public"/>
  <target name="test-doc" depends="prepare" unless="testdoc.done" if="module.test.src.exists" description="generate test api-doc">
    <javadoc access="${module.test.doc.access}" destdir="${module.test.api}" author="false" version="true" use="true"
        windowtitle="${project.name} - ${module.name} - Test API Documentation"
   		sourcepathref="module.test.src.path" classpathref="module.test.path" packagenames="*">
      <arg value="-J-Dhttp.proxyHost=${http.proxyHost}"/>
      <arg value="-J-Dhttp.proxyPort=${http.proxyPort}"/>
      <bottom><![CDATA[<em><a href="http://www.apache.org/licenses/LICENSE-2.0">Licensed to the Apache Software Foundation</a></em>]]></bottom>
      <link href="http://java.sun.com/j2se/1.5.0/docs/api/"/>
      <link href="http://download.oracle.com/docs/cd/E17477_01/javaee/5/api/"/>
      <link href="http://commons.apache.org/configuration/apidocs/"/>
      <tag name="todo" scope="all" description="Todo:" />
    </javadoc>
  </target>
  
  <target name="release-bin-prepare">
    <mkdir dir="${module.release}"/>
    <available property="module.release.exists" file="${module.release}"/>
  </target>

  <target name="check-module-manifest">
    <uptodate property="module-manifest.done" targetfile="${qpid.jar}">
      <srcfiles dir="${build.lib}" includes="**/*.jar" excludes="**/${qpid.jar.name}"/>
    </uptodate>
  </target>

  <target name="module-manifest" depends="check-module-manifest" unless="module-manifest.done">
    <path id="class.path">
      <fileset dir="${module.release.lib}" >
        <include name="*.jar"/>
        <exclude name="${qpid.jar.name}"/>
      </fileset>
    </path>
    <pathconvert property="qpid.jar.classpath" pathsep=" " dirsep="/">
      <path refid="class.path"/>
      <globmapper from="${module.release.lib}${file.separator}*" to="*"/>
    </pathconvert>

    <jar destfile="${module.qpid.jar}">
      <manifest>
        <attribute name="Class-Path" value="${qpid.jar.classpath}"/>
      </manifest>
      <metainf dir="${project.root}/resources/"/>
    </jar>

    <touch file="${module.qpid.jar}"/>
  </target>


  <target name="zip-release"  depends="build-release-bin" description="build module release archive">
    <zip destfile="${module.release.zip}">
      <zipfileset dir="${module.release}" prefix="${module.namever}" filemode="755">
        <include name="bin/*"/>
	<exclude name="bin/*.txt"/>
      </zipfileset>

      <zipfileset dir="${module.release}" prefix="${module.namever}" filemode="644">
        <include name="bin/*.txt"/>
      </zipfileset>

      <zipfileset dir="${module.release}" prefix="${module.namever}" excludes="${module.release.excludes}" filemode="644" dirmode="755">
        <exclude name="bin/**"/>
	    <exclude name="**/*.class"/>          
      </zipfileset>
    </zip>
  </target>

  <target name="bundle" description="Build module osgi artifact. Override and depend on bundle-tasks to use"/>

  <target name="bundle-tasks" depends="jar">
   <taskdef resource="aQute/bnd/ant/taskdef.properties" classpath="${project.root}/${bnd}"/>
   <echo message="Bundling ${build}/lib/${module.namever}.jar with ${module.src}/${module.name}.bnd"/>
   <bnd 
      classpath="${build}/lib/${module.namever}.jar"
      eclipse="false" 
      failok="false" 
      exceptions="true"
      output="${build}/lib/${module.namever.osgi}.jar"
      files="${module.src}/${module.name}.bnd"/>
  </target>    

    <target name="tar-release" depends="zip-release" description="build release archive">
      <tar destfile="${module.release.tar}" longfile="gnu" >
        <zipfileset src="${module.release.zip}"/>
      </tar>
    </target>

    <target name="gzip-release" depends="tar-release" description="build release archive">
      <gzip src="${module.release.tar}" destfile="${module.release.tgz}"/>
    </target>

    <target name="bzip2-release" depends="tar-release" description="build release archive">
      <bzip2 src="${module.release.tar}" destfile="${module.release.bz2}"/>
    </target>

    <target name="doc-release" description="no-op override if a doc step is requried "/>


    <target name="build-release-bin" depends="release-bin-prepare,libs-release,copy-bin-release,
                                              copy-etc-release,doc-release,resources-release,release-bin-other,module-manifest"
            description="Task that includes all tasks required to create a module binary release"/>

    <!-- ,zip-release,gzip-release -->
  <target name="release-bin-tasks" depends="gzip-release" description="build all release archives except .bz2"/>

  <target name="release-bin-all-tasks" depends="bzip2-release" description="build all release archives"/>

  <!-- Dummy targets to no-op for most modules. Override if a module package is required -->
  <target name="release-bin-other" description="Override if there is tasks required for the module bin release to occur last"/>
  <target name="release-bin" description="Override and depend on release-bin-tasks to generate"/>
  <target name="release-bin-all" description="Override and depend on release-bin-tasks to generate"/>

  <target name="clean" description="remove build artifacts">
    <delete dir="${module.build}"/>
    <delete dir="${module.results}"/>
    <delete dir="${module.release.base}"/>
    <delete dir="${module.instrumented}"/>
  </target>

  <target name="instrument" depends="cobertura-init">
    <cobertura-instrument todir="${module.instrumented}"
                          datafile="${cobertura.datafile}">
      <fileset dir="${module.classes}">
        <include name="**/*.class"/>
      </fileset>
    </cobertura-instrument>
  </target>

  <target name="cover-test" depends="instrument" if="module.test.src.exists">

    <junit fork="yes" forkmode="once" maxmemory="${test.mem}" reloading="no"
           haltonfailure="${haltonfailure}" haltonerror="${haltonerror}"
           failureproperty="test.failures" printsummary="on" timeout="600000"
           dir="${project.root}" >
      <jvmarg line="${jvm.args}" />

      <syspropertyset refid="all.test.systemproperties"/>

      <sysproperty key="net.sourceforge.cobertura.datafile" file="${cobertura.datafile}" />

      <formatter type="plain"/>
      <formatter type="xml"/>

      <classpath path="${module.instrumented}"/>
      <classpath>
        <fileset dir="${build}">
          <include name="**/classes-instrumented/*.class"/>
        </fileset>
      </classpath>
      <classpath refid="module.test.runtime.path"/>
      <classpath refid="cobertura.classpath"/>      

      <batchtest todir="${module.results}">
        <fileset dir="${module.test.src}" excludes="${module.test.excludes}">
          <include name="**/${test}.java"/>
        </fileset>
      </batchtest>
    </junit>
  </target>

  <target name="coverage-report" depends="cobertura-init">
      <cobertura-report format="html"
                        destdir="${module.coverage}"
                        datafile="${cobertura.datafile}">
      <fileset dir="${module.src}" includes="**/*.java" />
    </cobertura-report>
  </target>

  <property name="version.file" location="${module.classes}/qpidversion.properties"/>
  <property file="${version.file}" prefix="old."/>

  <target name="check-version">
    <exec executable="svnversion" spawn="false" failifexecutionfails="false"
        dir="${project.root}" outputproperty="svnversion.output">
      <arg line="."/>
    </exec>
    <condition property="version.stale">
      <not>
        <equals arg1="${svnversion.output}" arg2="${old.qpid.svnversion}"/>
      </not>
    </condition>
  </target>

  <target name="create-version" depends="check-version" if="version.stale">
    <!-- Write the version.properties out.-->
    <!-- Echos exactly as shown, so leave no spaces before/after lines -->
    <echo file="${version.file}" append="false">qpid.version=${project.version}
qpid.svnversion=${svnversion.output}
qpid.name=${project.name}
</echo>
  </target>

   <!-- Additions to perform LogMessage generation
    To activate for your plugin add the following to your plugin build.xml

    <target name="precompile" depends="gen_logging"/>

   -->

    <property name="gentools.home" location="${project.root}/common/gentools" />
    <property name="gentools.build" location="${build.scratch}/common/gentools" />
    <property name="generated.dir" location="${module.precompiled}" />
    <property name="velocity.compile.dir" value="${build.scratch}/broker/velocity"/>
    <property name="velocity.timestamp" location="${generated.dir}/velocity.timestamp" />

    <target name="compile_velocity" >
        <mkdir dir="${velocity.compile.dir}" />
        <!-- Compile LogMessages Velocity Generator -->
        <javac source="${java.source}" target="${java.target}"
               destdir="${velocity.compile.dir}" debug="on" includeantruntime="false"
               deprecation="${javac.deprecation}"
               srcdir="${project.root}/broker/src/velocity/java" >
          <classpath>
            <pathelement path="${project.root}/${velocity.jar}" />
          </classpath>
          <compilerarg line="${javac.compiler.args}"/>
        </javac>
    </target>


    <target name="check_velocity_deps">
      <uptodate property="velocity.notRequired" targetfile="${velocity.timestamp}">
        <srcfiles dir="${module.src}" includes="**/*_logmessages.properties" />
        <srcfiles dir="${project.root}/broker/src/velocity/" includes="**/*.java **/*.vm" />
      </uptodate>
    </target>


    <target name="gen_logging" depends="compile_velocity,check_velocity_deps" unless="velocity.notRequired">
      <mkdir dir="${generated.dir}"/>

      <path id="logmessages.path">
        <fileset  dir="${module.src}">
          <include name="**/*_logmessages.properties"/>
        </fileset>
      </path>

      <pathconvert property="logmessages"
                   refid="logmessages.path"
                   pathsep="' '"/>

      <echo message="logmessages is ${logmessages}"/>

      <java classname="org.apache.qpid.server.logging.GenerateLogMessages" fork="true" dir="${gentools.build}/classes" failonerror="true">
        <arg line="'${logmessages}'"/>
          <arg value="-j"/>
          <arg value="-o"/>
          <arg value="${generated.dir}"/>
          <arg value="-t"/>
          <arg value="${project.root}/broker/src/velocity/templates/org/apache/qpid/server/logging/messages"/>
          <arg value="-s"/>
          <arg value="${module.src}"/>


        <classpath>
          <pathelement path="${module.src}"/>
          <pathelement path="${velocity.compile.dir}" />
          <fileset dir="${project.root}/lib/required">
            <include name="**/*.jar"/>
          </fileset>
          <pathelement path="${project.root}/${velocity.jar}" />
        </classpath>
      </java>
      <touch file="${velocity.timestamp}" />
    </target>

    <target name="eclipse" depends="eclipse-setup,eclipse-project,eclipse-source-only,eclipse-source-and-test"/>

    <target name="eclipse-setup">
      <taskdef name="eclipse" classname="prantl.ant.eclipse.EclipseTask" />

      <!-- Build set of directories representing the dependencies -->

      <dirset id="eclipse.required.projectdirs.path" dir="${project.root}" includes="${module.depends} ${module.test.depends} neverBeEmpty">
        <!-- Select only those projects from module.depends that contain a build.xml.  This serves to exclude dependencies that
             don't become Eclipse projects e.g. broker-plugins and common-tests -->
        <present targetdir="${project.root}">
          <mapper type="glob" from="*" to="*/build.xml"/>
        </present>
      </dirset>

      <!-- Convert from the set of directories into Eclipse project names proceeded by forward slashes -->

      <pathconvert property="eclipse.required.projectnames" refid="eclipse.required.projectdirs.path" pathsep=" " dirsep="-">
        <map from="${project.root}${file.separator}" to=''/>
      </pathconvert>
      <map property="eclipse.required.slashedprojectnames" value="${eclipse.required.projectnames}" join="${path.separator}">
        <globmapper from="*" to="/*"/>
      </map>

      <echo message="Ant module dependencies : ${module.depends} ${module.test.depends} converted to Eclipse required project(s): ${eclipse.required.slashedprojectnames}"/>
      <path id="eclipse.required.slashedprojectnames.path">
        <pathelement path="${eclipse.required.slashedprojectnames}"/>
      </path>
    </target>

    <!-- Create the Eclipse .project -->
    <target name="eclipse-project">
      <eclipse updatealways="${eclipse.updatealways}">
        <project name="${module.name}"/>

        <!-- If the Eclipse task were to ever support the generation of
             linked resources, we would configure it to generate
             the following:

             scratch_src -> ${module.precompiled}

             in each project.   This would avoid the 'linked sources'
             manual step documented on the Wiki.
        -->
      </eclipse>
    </target>
    
    <!-- Create the Eclipse .classpath -->
    <target name="eclipse-source-only" unless="module.test.src.exists">
      <eclipse updatealways="${eclipse.updatealways}">
        <settings>
          <jdtcore compilercompliance="${eclipse.compilercompliance}" />
        </settings>
        <classpath>
          <container path="${eclipse.container}" />
          <source path="${module.src}" />
          <source pathref="eclipse.required.slashedprojectnames.path" />
          <library pathref="module.libs"/>
          <output path="classes" />
        </classpath>
      </eclipse>
    </target>

    <!-- Create the Eclipse .classpath -->
    <target name="eclipse-source-and-test" if="module.test.src.exists">
      <eclipse updatealways="${eclipse.updatealways}">
        <settings>
          <jdtcore compilercompliance="${eclipse.compilercompliance}" />
        </settings>
        <classpath>
          <container path="${eclipse.container}" />
          <source path="${module.src}" />
          <source path="${module.test.src}" />
          <source pathref="eclipse.required.slashedprojectnames.path" />
          <library pathref="module.libs"/>
          <library pathref="module.test.libs"/>
          <output path="classes" />
        </classpath>
      </eclipse>
    </target>
</project>
