 <!--
   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>

  </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:fileset>
    </ant:copy>

    <!-- Copy Jars -->
    <ant:copy todir="${maven.dist.src.assembly.dir}">
      <ant:fileset dir="${maven.build.dir}">
        <ant:include name="*.jar"/>
      </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>
