 <!--
   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
    default="java:jar"
    xmlns:j="jelly:core"
    xmlns:license="license"
    xmlns:maven="jelly:maven"
    xmlns:util="jelly:util"
    xmlns:ant="jelly:ant">

  <postGoal name="clover:on">
    <j:set var="maven.junit.sysproperties" value="${maven.junit.sysproperties} org.apache.commons.collections:with-clover"/>
    <j:set var="org.apache.commons.collections:with-clover" value="true"/>
  </postGoal>

  <!-- ============== JAR ================== -->
  <postGoal name="jar:jar">
    <ant:ant antfile="build-testframework.xml" target="jar">
      <property name="component.version" value="${pom.currentVersion}"/>
      <property name="test.classes"      value="${maven.build.dir}/test-classes"/>
      <property name="dist.home"         value="${maven.build.dir}"/>
    </ant:ant>
  </postGoal>
  
  <postGoal name="jar:install">
    <j:set var="finalName" value="${pom.getPluginContext('maven-jar-plugin').getVariable('maven.final.name')}"/>
    <j:set var="finalVersion" value="${finalName.substring(20)}" />
    <j:set var="testfwkBase" value="${pom.artifactId}-testframework" />
    <j:set var="testfwkName" value="${testfwkBase}-${finalVersion}" />
    
    <ant:property name="jardir__" value="${maven.repo.local}/${pom.artifactDirectory}/jars"/>
    <ant:mkdir dir="${jardir__}"/>    
    <ant:copy 
        file="${maven.build.dir}/${testfwkName}.jar"
        todir="${jardir__}"
        overwrite="true" />
  </postGoal>

  <postGoal name="jar:install-snapshot">
    <j:set var="finalName" value="${pom.getPluginContext('maven-jar-plugin').getVariable('maven.final.name')}"/>
    <j:set var="finalVersion" value="${finalName.substring(20)}" />
    <j:set var="testfwkBase" value="${pom.artifactId}-testframework" />
    <j:set var="testfwkName" value="${testfwkBase}-${finalVersion}" />

    <ant:property name="jardir__" value="${maven.repo.local}/${pom.artifactDirectory}/jars"/>
    <ant:mkdir dir="${jardir__}"/>
    <ant:copy
        file="${maven.build.dir}/${testfwkName}.jar"
        tofile="${jardir__}/${testfwkBase}-SNAPSHOT.jar"
        overwrite="true" />
    <ant:copy
        file="${maven.build.dir}/${testfwkName}.jar"
        tofile="${jardir__}/${testfwkName}.jar" />
  </postGoal>

  <!-- ============== DIST ================== -->
  <postGoal name="dist:prepare-bin-filesystem">
    <j:set var="maven.dist.bin.assembly.dir" value="${pom.getPluginContext('maven-dist-plugin').getVariable('maven.dist.bin.assembly.dir')}" />
    
    <!-- Copy Files -->
    <ant:copy todir="${maven.dist.bin.assembly.dir}">
      <ant:fileset dir=".">
        <ant:include name="RELEASE-NOTES.html"/>
        <ant:include name="NOTICE.txt"/>
      </ant:fileset>
    </ant:copy>

    <!-- Copy Jars -->
    <ant:copy todir="${maven.dist.bin.assembly.dir}">
      <ant:fileset dir="${maven.build.dir}">
        <ant:include name="*testframework*.jar"/>
      </ant:fileset>
    </ant:copy>

    <!-- Delete tagged old release documentation -->
    <ant:delete includeEmptyDirs="true">
      <ant:fileset dir="${maven.dist.bin.assembly.dir}/docs" includes="apidocs-*/**" />
    </ant:delete>
    
  </postGoal>
  
  <postGoal name="dist:prepare-src-filesystem">
    <j:set var="maven.dist.src.assembly.dir" value="${pom.getPluginContext('maven-dist-plugin').getVariable('maven.dist.src.assembly.dir')}" />
    
    <!-- Copy Files -->
    <ant:copy todir="${maven.dist.src.assembly.dir}">
      <ant:fileset dir=".">
        <ant:include name="build-testframework.xml"/>
        <ant:include name="checkstyle.xml"/>
        <ant:include name="pom.xml"/>
        <ant:include name="NOTICE.txt"/>
        <ant:include name="RELEASE-NOTES.html"/>
        <ant:include name="DEVELOPERS-GUIDE.html"/>
        <ant:include name="PROPOSAL.html"/>
        <ant:include name="STATUS.html"/>
        <ant:include name="build.properties.sample"/>
      </ant:fileset>
    </ant:copy>

    <!-- Copy XDocs -->
    <ant:copy todir="${maven.dist.src.assembly.dir}/xdocs">
      <ant:fileset dir="xdocs" />
    </ant:copy>
    
    <!-- Copy Test Data -->
    <ant:copy todir="${maven.dist.src.assembly.dir}/data">
      <ant:fileset dir="data" />
    </ant:copy>
    
  </postGoal>
  
  <postGoal name="dist:build-bin">
    <j:set var="distDir" value="${pom.getPluginContext('maven-dist-plugin').getVariable('maven.dist.dir')}"/>
    <j:set var="finalName" value="${pom.getPluginContext('maven-dist-plugin').getVariable('maven.final.name')}"/>
    <ant:checksum file="${distDir}/${finalName}.tar.gz"/>
    <ant:checksum file="${distDir}/${finalName}.zip"/>
  </postGoal>
  
  <postGoal name="dist:build-src">
    <j:set var="distDir" value="${pom.getPluginContext('maven-dist-plugin').getVariable('maven.dist.dir')}"/>
    <j:set var="finalName" value="${pom.getPluginContext('maven-dist-plugin').getVariable('maven.final.name')}"/>
    <ant:checksum file="${distDir}/${finalName}-src.tar.gz"/>
    <ant:checksum file="${distDir}/${finalName}-src.zip"/>
  </postGoal>
  
</project>
