<!--
  ~ 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>bin</id>
    <includeBaseDirectory>true</includeBaseDirectory> 
    <baseDirectory>axis2-${version}</baseDirectory>
    <formats>
        <!--<format>tar.gz</format>  //uncomment,if tar.gz archive needed-->
        <format>zip</format>
    </formats>

    <fileSets>
        <!--********************** creating the repository ********************** -->
        <fileSet>
            <directory>target/tmp-repository</directory>
            <outputDirectory>repository</outputDirectory>
            <includes>
                <include>**/*</include>
            </includes>
        </fileSet>

        <!--********************** creating the bin ********************** -->
        <!-- Copy bin scripts -->
        <fileSet>
            <directory>../../modules/tool/script</directory>
            <outputDirectory>bin</outputDirectory>
            <includes>
                <include>*.bat</include>
            </includes>
        </fileSet>

        <fileSet>
            <directory>../../modules/tool/script</directory>
            <outputDirectory>bin</outputDirectory>
            <includes>
                <include>*.sh</include>
            </includes>
            <fileMode>755</fileMode>
        </fileSet>

        <!--********************** creating the conf ********************** -->
        <!-- copy the axis2.xml into conf directoy -->
        <fileSet>
            <directory>../../modules/kernel/conf</directory>
            <outputDirectory>conf</outputDirectory>
            <includes>
                <include>axis2.xml</include>
            </includes>
        </fileSet>

        <!--********************** creating the webappp ********************** -->
        <!-- copy the build.xml into webapp directory -->
        <fileSet>
            <directory>../../modules/webapp/scripts</directory>
            <outputDirectory>webapp</outputDirectory>
            <includes>
                <include>build.xml</include>
            </includes>
        </fileSet>

        <fileSet>
            <directory>../../legal</directory>
            <outputDirectory>lib</outputDirectory>
            <includes>
                <include>**/*.txt</include>
            </includes>
        </fileSet>

        <!-- TODO: Need to rename this file to INSTALL.txt -->
        <fileSet>
            <directory>../../release-docs/readme-files</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>README-std-bin.txt</include>
                <include>installation-std-bin.txt</include>
            </includes>
            <filtered>true</filtered>
        </fileSet>

        <fileSet>
            <directory>../../modules/kernel/conf</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>log4j.properties</include>
                <include>commons-logging.properties</include>
            </includes>
        </fileSet>

        <fileSet>
            <directory>../..</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>LICENSE.txt</include>
                <include>NOTICE.txt</include>
                <include>README.txt</include>
                <include>release-notes.html</include>
            </includes>
            <filtered>true</filtered>
        </fileSet>

        <!-- copy samples -->
        <fileSet>
            <directory>../../modules/samples</directory>
            <outputDirectory>samples</outputDirectory>
            <includes>
                <include>databinding/**/*</include>
                <include>faulthandling/**/*</include>
                <include>jaxws-calculator/**/*</include>
                <include>jaxws-addressbook/**/*</include>
                <include>jaxws-samples/**/*</include>
                <include>java_first_jaxws/**/*</include>
                <include>jaxws-interop/**/*</include>
                <include>jaxws-dynamic/**/*</include>
                <include>jaxws-version/**/*</include>
                <include>mtom/**/*</include>
                <include>pojo/**/*</include>
                <include>pojoguide/**/*</include>
                <include>pojoguidespring/**/*</include>
                <include>quickstart/**/*</include>
                <include>quickstartadb/**/*</include>
                <include>quickstartaxiom/**/*</include>
                <include>quickstartjibx/**/*</include>
                <include>quickstartxmlbeans/**/*</include>
                <include>servicelifecycle/**/*</include>
                <include>soapwithattachments/**/*</include>
                <include>userguide/**/*</include>
                <include>version/**/*</include>
                <include>wsdl/**/*</include>
                <include>yahoojsonsearch/**/*</include>
                <include>yahoorestsearch/**/*</include>            
            </includes>
            <excludes>
                <exclude>**/*.iml</exclude>
            </excludes>
        </fileSet>
    </fileSets>
    
    <dependencySets>
        <dependencySet>
            <useProjectArtifact>false</useProjectArtifact>
            <outputDirectory>lib</outputDirectory>
            <includes>
                <include>*:*:jar</include>
            </includes>
            <excludes>
                 <exclude>org.apache.geronimo.specs:geronimo-activation_1.1_spec:jar</exclude>
                 <exclude>org.apache.geronimo.specs:geronimo-javamail_1.4_spec:jar</exclude>
                 <exclude>org.springframework:spring-beans:jar</exclude>
                 <exclude>org.springframework:spring-context:jar</exclude>
                 <exclude>org.springframework:spring-core:jar</exclude>
                 <exclude>org.springframework:spring-web:jar</exclude>
                 <exclude>org.apache.ant:ant:jar</exclude>
                 <exclude>org.apache.ant:ant-launcher:jar</exclude>
                 <exclude>aopalliance:aopalliance:jar</exclude>
                 <exclude>bsf:bsf:jar</exclude>
                 <exclude>com.sun.xml.fastinfoset:FastInfoset:jar</exclude>
                 <exclude>rhino:js:jar</exclude>
                 <exclude>javax.servlet:servlet-api</exclude>
            </excludes>
        </dependencySet>
        <dependencySet>
            <useProjectArtifact>false</useProjectArtifact>
            <includes>
                <include>org.apache.axis2:axis2-webapp</include>
            </includes>
            <unpack>true</unpack>
            <outputDirectory>webapp</outputDirectory>
            <unpackOptions>
                <includes>
                    <include>WEB-INF/classes/**/*</include>
                    <include>WEB-INF/web.xml</include>
                    <include>axis2-web/**/*</include>
                </includes>
            </unpackOptions>
        </dependencySet>
    </dependencySets>
</assembly>
