 <!--
   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
    xmlns:j="jelly:core"
    xmlns:ant="jelly:ant">

  <!-- ============== DIST ================== -->
  <!-- Copied from Commons-Collections        -->
  <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="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="*.jar"/>
      </ant:fileset>
    </ant:copy>
    
    <attainGoal name="announcement:generate" />
    <ant:copy todir="${maven.dist.bin.assembly.dir}">
      <ant:fileset file='${basedir}/RELEASE-NOTES.txt'/>
    </ant:copy>

  </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="NOTICE.txt"/>
        <ant:include name="pom.xml"/>
        <ant:include name="RELEASE-NOTES.txt"/>
        <ant:include name="release-notes.jsl"/>
      </ant:fileset>
    </ant:copy>
    
    <!-- Copy XDocs -->
    <ant:copy todir="${maven.dist.src.assembly.dir}/xdocs">
      <ant:fileset dir="xdocs" />
    </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')}"/>

    <!-- create checksum for binary tar.gz -->
    <ant:checksum file="${distDir}/${finalName}.tar.gz" property="tar.gz.md5"/>
    <ant:echo message="${tar.gz.md5} *${finalName}.tar.gz" file="${distDir}/${finalName}.tar.gz.md5" />

    <!-- create checksum for binary zip -->
    <ant:checksum file="${distDir}/${finalName}.zip" property="zip.md5"/>
    <ant:echo message="${zip.md5} *${finalName}.zip" file="${distDir}/${finalName}.zip.md5" />
  </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')}"/>

    <!-- create checksum for source tar.gz -->
    <ant:checksum file="${distDir}/${finalName}-src.tar.gz" property="src.tar.gz.md5"/>
    <ant:echo message="${src.tar.gz.md5} *${finalName}-src.tar.gz" file="${distDir}/${finalName}-src.tar.gz.md5" />

    <!-- create checksum for source zip -->
    <ant:checksum file="${distDir}/${finalName}-src.zip" property="src.zip.md5"/>
    <ant:echo message="${src.zip.md5} *${finalName}-src.zip" file="${distDir}/${finalName}-src.zip.md5" />
  </postGoal>
  
</project>
