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

<assembly>
    <id>src</id>
    <includeBaseDirectory>true</includeBaseDirectory> 
    <baseDirectory>axis2-${version}</baseDirectory>
    <formats>
        <!--<format>tar.gz</format>  //uncomment,if tar.gz archive needed-->
        <format>zip</format>
    </formats>

    <fileSets>
        <fileSet>
            <directory>../..</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>NOTICE.txt</include>
                <include>LICENSE.txt</include>
                <include>README.txt</include>
            </includes>
            <filtered>true</filtered>
        </fileSet>
        <fileSet>
            <directory>../..</directory>
            <outputDirectory></outputDirectory>
            <useDefaultExcludes>true</useDefaultExcludes>
            <excludes>
                <!-- For PDE support, we need to generate some files outside of the
                     target directory. They are removed during the clean phase, but
                     we also need to exclude them here. -->
                <exclude>modules/tool/axis2-eclipse-service-plugin/META-INF/**</exclude>
                <exclude>modules/tool/axis2-eclipse-service-plugin/lib/**</exclude>
                <exclude>modules/tool/axis2-eclipse-codegen-plugin/META-INF/**</exclude>
                <exclude>modules/tool/axis2-eclipse-codegen-plugin/lib/**</exclude>
                
                <!-- These directories are not excluded by the rules below because of the
                     "src" component in the path. We need to exclude them explicitly. -->
                <exclude>modules/tool/axis2-wsdl2code-maven-plugin/src/test/test1/target/**</exclude>
                <exclude>modules/tool/axis2-java2wsdl-maven-plugin/src/test/test1/target/**</exclude>
                
                <!-- Exclusions from org.apache.resources:apache-source-release-assembly-descriptor.
                     Note that they assume that all sources are located under an "src" directory. This
                     is not the case for Axis2, which doesn't use the standard Maven 2 conventions.
                     Thus we may still encounter some issues here. -->
                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/).*${project.build.directory}.*]</exclude>
                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?maven-eclipse\.xml]</exclude>
                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.project]</exclude>
                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.classpath]</exclude>
                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?[^/]*\.iws]</exclude>
                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?[^/]*\.ipr]</exclude>
                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?[^/]*\.iml]</exclude>
                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.settings(/.*)?]</exclude>
                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.externalToolBuilders(/.*)?]</exclude>
                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.deployables(/.*)?]</exclude>
                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.wtpmodules(/.*)?]</exclude>
                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?cobertura\.ser]</exclude>
                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?pom\.xml\.releaseBackup]</exclude>
                <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?release\.properties]</exclude>
            </excludes>

        </fileSet>

        <!-- copying tools section of xdocs. This is needed by eclipse plugins -->
        <fileSet>
            <directory>../../xdocs</directory>
            <outputDirectory>xdocs</outputDirectory>
            <includes>
                <include>tools/**</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>../../release-docs/readme-files</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>README-std-src.txt</include>
            </includes>
            <filtered>true</filtered>
        </fileSet>
    </fileSets>
    
    <files>
        <file>
            <source>../../src/site/markdown/release-notes/${release_version}.md</source>
            <destName>RELEASE-NOTE.txt</destName>
        </file>
    </files>
</assembly>
