<!--
  ~ 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>
            <useDefaultExcludes>true</useDefaultExcludes>
            <includes>
                <include>pom.xml</include>
                <include>etc/**</include>
                <include>modules/**</include>
                <include>legal/**</include>
                <include>release-docs/**</include>
                <include>NOTICE.txt</include>
                <include>LICENSE.txt</include>
                <include>README.txt</include>
                <include>release-notes.html</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>
