<!--
    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.
-->
<!--
   Commons Build:  Copy NOTICE and LICENSE files to -javadoc.jar.
 -->
<project name="Commons Build: Copy NOTICE and LICENSE files to -javadoc.jar" default="copy-javadoc-files" basedir=".">

    <property name="commonsMojoId"      value="Commons:javadoc-nl-copy" />

    <target name="copy-javadoc-files" description="Copy NOTICE/LICENSE files for javadoc jar">

        <echo level="info" message="**** commons-build:copy-javadoc-files - Copying NOTICE and LICENSE files ****" />

        <!-- Copy pages, filtering parameter values -->
        <copy todir="target/apidocs/META-INF">
            <fileset dir=".">
                 <include name="NOTICE.txt"/>
                 <include name="LICENSE.txt"/>
            </fileset>
        </copy>

    </target>

</project>
