<!--
 -
 - 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="AMQ Java" xmlns:ivy="antlib:org.apache.ivy.ant" default="build">

  <import file="common.xml"/>

  <findSubProjects name="broker-plugins" dir="broker-plugins"/>
  <findSubProjects name="client-plugins" dir="client-plugins"/>
  <findSubProjects name="management" dir="management" excludes="common,example"/>

  <property name="optional" value="false"/>
  <property name="modules.opt.default" value="bdbstore perftests/visualisation-jfc"/>
  <condition property="modules.opt" value="" else="${modules.opt.default}">
    <isfalse value="${optional}"/>
  </condition>

  <property name="modules.core"       value="common management/common amqp-1-0-common broker client amqp-1-0-client amqp-1-0-client-jms tools"/>
  <property name="modules.examples"   value="client/example management/example"/>
  <property name="modules.tests"      value="systests perftests"/>
  <property name="modules.management" value="${management}"/>
  <property name="modules.plugin"     value="${broker-plugins} ${client-plugins}"/>
  <property name="modules.jca"        value="jca"/>
  <property name="modules"            value="${modules.core} ${modules.examples}
   ${modules.management} ${modules.jca} ${modules.tests} ${modules.plugin} ${modules.opt}"/>

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

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

  <map property="release.excludes" value="${modules}">
    <globmapper from="*" to="*/\*\*"/>
  </map>


  <property name="release.zip"          location="${release}/${project.namever}-java.zip"/>
  <property name="release.tar"          location="${release}/${project.namever}-java.tar"/>
  <property name="release.tgz"          location="${release}/${project.namever}-java.tar.gz"/>
  <property name="release.bz2"          location="${release}/${project.namever}-java.tar.bz2"/>

  <macrodef name="iterate">
    <attribute name="target"/>
    <attribute name="modules" default="${modules}"/>
    <element name="elements" implicit="true" optional="true"/>
    <sequential>
      <subant target="@{target}" antfile="build.xml">
        <filelist dir="." files="@{modules}"/>
        <elements/>
      </subant>
    </sequential>
  </macrodef>

  <target name="pom" description="generate poms">
    <iterate target="pom"/>
  </target>

  <target name="release-mvn" description="Install the artifacts into the local repository">
    <iterate target="release-mvn"/>
  </target>

  <target name="compile" description="compile sources">
    <iterate target="compile"/>
  </target>

  <target name="compile-tests" description="compile unit tests">
    <iterate target="compile-tests"/>
  </target>

  <target name="test" description="execute tests" depends="manifest">

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

    <iterate target="test">
      <property name="test.failures.ignore" value="true"/>
    </iterate>

    <condition property="failed">
      <available file="${build.failed}"/>
    </condition>

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

  </target>

  <target name="report-module" description="generate junitreport for modules">
    <iterate target="report-module"/>
  </target>

  <target name="jar" description="create module jars">
    <iterate target="jar"/>
  </target>

  <target name="jar-tests" description="create unit test jars">
    <iterate target="jar-tests"/>
  </target>

  <target name="libs" description="copy dependencies into build tree">
    <iterate target="libs"/>
  </target>

  <target name="doc" description="generate api-doc">
    <iterate target="doc"/>
  </target>

  <target name="test-doc" description="generate api-doc">
    <iterate target="test-doc"/>
  </target>

  <target name="bundle" description="create OSGi bundles">
    <iterate target="bundle"/>
  </target>

  <target name="release-bin" description="build a binary release artifact" depends="build,bundle">
      <iterate  target="release-bin"/>
  </target>


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

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

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

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

  <target name="build" depends="retrieve-dependencies" description="build the project">
    <iterate target="build"/>
    <antcall target="manifest"/>
  </target>

  <target name="prepare">
    <mkdir dir="${release}"/>
  </target>

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

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

      <zipfileset dir="${build}" prefix="${project.namever}" excludes="${release.excludes}" filemode="644" dirmode="755">
        <exclude name="bin/**"/>
	<exclude name="scratch/**"/>
      </zipfileset>

      <zipfileset dir="${resources}" prefix="${project.namever}" filemode="644"/>
    </zip>
  </target>

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

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

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

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

  <target name="release-all" depends="zip,gzip,bzip2" description="build all release archives"/>


  <target name="clean" description="remove build and release artifacts">
    <iterate target="clean"/>
    <delete dir="${build}"/>
    <delete dir="${release}"/>
    <delete dir="${tasks.classes}"/>
  </target>

  <target name="coverage-report" description="generate coverage report" depends="cobertura-init">
    <cobertura-merge datafile="${build.coveragereport}/cobertura.ser">
      <!-- merge all module coverage reports -->
      <fileset dir="${build}">
        <include name="**/*.ser"/>
      </fileset>
    </cobertura-merge>
    <cobertura-report format="xml"
                      destdir="${build.coveragereport}"
		      datafile="${build.coveragereport}/cobertura.ser"
		      >
      <fileset dir="${project.root}/common/src/main/java" includes="**/*.java" />
      <fileset dir="${project.root}/build/scratch/common/src" includes="**/*.java" />
      <fileset dir="${project.root}/broker/src/main/java" includes="**/*.java" />
      <fileset dir="${project.root}/build/scratch/broker/src" includes="**/*.java" />
      <fileset dir="${project.root}/client/src/main/java" includes="**/*.java" />
      <fileset dir="${project.root}/build/scratch/client/src" includes="**/*.java" />
    </cobertura-report>
	<cobertura-report format="html"
                      destdir="${build.coveragereport}"
		      datafile="${build.coveragereport}/cobertura.ser"
		      >
      <fileset dir="${project.root}/common/src/main/java" includes="**/*.java" />
      <fileset dir="${project.root}/build/scratch/common/src" includes="**/*.java" />
      <fileset dir="${project.root}/broker/src/main/java" includes="**/*.java" />
      <fileset dir="${project.root}/build/scratch/broker/src" includes="**/*.java" />
      <fileset dir="${project.root}/client/src/main/java" includes="**/*.java" />
      <fileset dir="${project.root}/build/scratch/client/src" includes="**/*.java" />
    </cobertura-report>
  </target>

  <target name="instrument" description="instrument for artifacts">
    <iterate target="instrument"/>
  </target>

  <target name="cover-test" description="run tests and generate coverage information" depends="build">
    <iterate target="cover-test" modules="broker client common"/>
  </target>

  <target name="test-interop" depends="build,compile-tests"
      description="run JMS examples against the corresponding c++ and python examples">
      <property name="qpid.src.home" location=".."/>
      <echo-prop name="qpid.src.home"/>
      <exec executable="/bin/sh" failonerror="true">
         <env key="QPID_SRC_HOME" value="${qpid.src.home}"/>
         <arg value="-c"/>
         <arg value="${project.root}/client/example/bin/verify_all"/>
      </exec>
  </target>

  <target name="testkit" depends="build,compile-tests">
    <jython path="${mllib.dir}">
      <args>
        <arg value="${mllib.dir}/qpid-python-test"/>
        <arg value="-m ${basedir}/testkit/testkit"/>
      </args>
    </jython>
  </target>

  <target name="findbugs" depends="build,findbugs-init">

    <mkdir dir="${build.findbugs}"/>

    <findbugs home="${findbugs.dir}"
              output="html"
              outputFile="${build.findbugs}/report.html"
              stylesheet="fancy-hist.xsl"
              jvmargs="-Xmx512m"
              projectName="Qpid">
      <!-- The classes for analysis -->
      <fileset dir="${build.lib}" includes="qpid*.jar" excludes="*test*.jar *-sources*.jar *example*.jar qpid-all.jar"/>

      <!--Additional classes, not for analysis -->
      <auxClassPath>
        <fileset dir="${basedir}/lib" includes="**/*.jar"/>
      </auxClassPath>

      <!-- Source, used for improved reporting -->
      <sourcePath>
        <fileset dir="${basedir}" includes="**/src/**/org/.." />
      </sourcePath>
    </findbugs>
  </target>

  <target name="eclipse" description="build eclipse project and classpath files">
    <iterate target="eclipse"/>
  </target>

  <!-- check the following properties which must be specified by the user-->
  <target name="check-upload-props-exist" description="check that the required properties have been set">
    <fail unless="nexus.user" message="You must supply the 'nexus.user' property"/>
    <fail unless="nexus.password" message="You must supply the 'nexus.password' property"/>
    <fail unless="maven.artifact.dir" message="You must supply the 'maven.artifact.dir' property"/>
  </target>

  <target name="perform-nexus-upload">
    <ivy:configure file="ivysettings.nexus.xml"/>
    <ivy:resolve file="ivy.nexus.xml"/>
    <ivy:deliver/>
    <ivy:publish publishivy="false" resolver="nexus"
             artifactspattern="${maven.artifact.dir}/[organisation]/[module]/[artifact]/[revision]/[artifact]-[revision](-[classifier]).[ext]"/>
  </target>

  <target name="upload" depends="load-ivy, check-upload-props-exist, perform-nexus-upload"/>

</project>
