<!--
  ~ 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>../../etc/**</include>
                <include>modules/**</include>
            </includes>

	    <excludes>
		<exclude>../../SameServiceAddingTest.java</exclude>
		<exclude>**/target/**</exclude>
		<exclude>../../modules/samples/eventing/**</exclude>
		<exclude>../../modules/samples/security/**</exclude>
		<exclude>xdocs/**</exclude>
		<!-- 
		<exclude>**/*class*/**</exclude> 
		Above prevents following class being copied.
		/modules/kernel/src/org/apache/axis2/classloader/MultiParentClassLoader.java
		-->
		<exclude>**/.svn/**</exclude>
		<exclude>**/bin/**</exclude>
		<exclude>**/*.log</exclude>
		<exclude>**/.*</exclude>
		<exclude>**/.settings/**</exclude>
		<exclude>**/*.license</exclude>
		<exclude>**/*.iml</exclude>
	    </excludes>

        </fileSet>


        <fileSet>
            <directory>../../etc</directory>
            <outputDirectory>etc</outputDirectory>
            <includes>
                <include>*.*</include>
            </includes>
	    <excludes>
		<exclude>.svn/**</exclude>
	    </excludes>
        </fileSet>
        <fileSet>
            <directory>target/tmp-doc-distro/docs</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>NOTICE.txt</include>
            </includes>
        </fileSet>

        <fileSet>
            <directory>target/tmp-doc-distro/docs</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>LICENSE.txt</include>
            </includes>
        </fileSet>

        <fileSet>
            <directory>../..</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>project.xml</include>
                <include>maven.xml</include>
                <include>pom.xml</include>
            </includes>
        </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>
	<!-- copying licenses -->
        <fileSet>
            <directory>../../legal</directory>
            <outputDirectory>legal</outputDirectory>
            <excludes>
                <exclude>.svn/**</exclude>
            </excludes>
        </fileSet>
    <!-- copying release docs -->
        <fileSet>
             <directory>../../release-docs</directory>
             <outputDirectory>release-docs</outputDirectory>
             <excludes>
                 <exclude>.svn/**</exclude>
             </excludes>
         </fileSet>    
        <fileSet>
            <directory>target/tmp-doc-distro/docs</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>README-std-src.txt</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>
