<!--
  ~ 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>
                <include>release-notes.html</include>
            </includes>
            <filtered>true</filtered>
        </fileSet>
        <fileSet>
            <directory>../..</directory>
            <outputDirectory></outputDirectory>
            <useDefaultExcludes>true</useDefaultExcludes>
            <includes>
                <include>pom.xml</include>
                <include>etc/**</include>
                <include>modules/**</include>
                <include>legal/**</include>
                <include>release-docs/**</include>
                <include>src/**</include>
            </includes>

            <excludes>
                <!-- Exclude sources for modules that are not part of the build -->
                <exclude>modules/rmi/**</exclude>
                
                <!-- 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>
                
                <!-- TODO: not sure what those are for -->
                <exclude>../../modules/samples/eventing/**</exclude>
                <exclude>../../modules/samples/security/**</exclude>
                <exclude>xdocs/**</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>
</assembly>
