<?xml version="1.0" encoding="UTF-8"?>
<!--

    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>jclouds-cli</id>

    <formats>
        <format>zip</format>
    </formats>

    <fileSets>
        <!-- Strip the Karaf distribution -->
        <fileSet>
            <directory>target/dependencies/win/apache-karaf-${karaf.version}</directory>
            <outputDirectory>/</outputDirectory>
            <excludes>
                <exclude>**/demos/**</exclude>
                <exclude>lib/karaf-version.jar</exclude>
                <exclude>bin/**</exclude>
                <exclude>etc/org.apache.karaf.features.cfg</exclude>
                <exclude>etc/org.apache.karaf.features.repos.cfg</exclude>
                <exclude>etc/custom.properties</exclude>
                <exclude>etc/startup.properties</exclude>
                <exclude>etc/shell.init.script</exclude>
                <exclude>etc/org.apache.karaf.management.cfg</exclude>
                <exclude>etc/org.apache.karaf.shell.cfg</exclude>
                <exclude>etc/org.apache.karaf.jaas.cfg</exclude>
                <exclude>readme.txt</exclude>
                <exclude>LICENSE</exclude>
                <exclude>NOTICE</exclude>
                <exclude>README</exclude>
                <exclude>RELEASE-NOTES</exclude>
                <exclude>karaf-manual*</exclude>
                <!-- further exclude bundles -->
                <exclude>system/org/apache/karaf/diagnostic/**</exclude>
                <exclude>system/org/apache/karaf/management/**</exclude>
                <exclude>system/org/apache/aries/jmx/**</exclude>
                <exclude>system/org/eclipse/**</exclude>
            </excludes>
        </fileSet>

        <!-- Copy over bin/* scripts separately to get the correct file mode -->
        <fileSet>
            <directory>target/dependencies/win/apache-karaf-${karaf.version}</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>bin/*</include>
            </includes>
            <excludes>
                <exclude>bin/shell.bat</exclude>
                <exclude>bin/karaf.bat</exclude>
                <exclude>bin/start.bat</exclude>
                <exclude>bin/stop.bat</exclude>
                <exclude>bin/admin.bat</exclude>
            </excludes>
            <lineEnding>dos</lineEnding>
            <fileMode>0644</fileMode>
        </fileSet>

        <!-- Copy over license and the like -->
        <fileSet>
            <directory>target/classes/META-INF</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>DEPENDENCIES</include>
                <include>LICENSE</include>
                <include>NOTICE</include>
            </includes>
            <lineEnding>dos</lineEnding>
            <fileMode>0644</fileMode>
        </fileSet>

        <!-- Copy over resources -->
        <fileSet>
            <directory>target/classes/etc</directory>
            <outputDirectory>/etc/</outputDirectory>
            <includes>
                <include>*.*</include>
            </includes>
            <lineEnding>dos</lineEnding>
            <fileMode>0644</fileMode>
        </fileSet>

        <fileSet>
            <directory>target/classes/win/bin</directory>
            <outputDirectory>/bin/</outputDirectory>
            <includes>
                <include>**</include>
            </includes>
            <lineEnding>dos</lineEnding>
            <fileMode>0644</fileMode>
        </fileSet>

        <!-- Add jclouds features to system repository -->
        <fileSet>
            <outputDirectory>system</outputDirectory>
            <directory>target/features-repo</directory>
        </fileSet>
    </fileSets>

    <files>
        <file>
            <source>${basedir}/target/dependencies/win/apache-karaf-${karaf.version}/bin/karaf.bat</source>
            <outputDirectory>/bin/</outputDirectory>
            <destName>jclouds-cli.bat</destName>
            <lineEnding>dos</lineEnding>
            <fileMode>0644</fileMode>
        </file>
        <file>
            <source>${basedir}/../DISCLAIMER</source>
            <outputDirectory>/</outputDirectory>
            <destName>DISCLAIMER</destName>
            <lineEnding>dos</lineEnding>
            <fileMode>0644</fileMode>
        </file>
    </files>

    <dependencySets>
        <dependencySet>
            <outputDirectory>/lib</outputDirectory>
            <outputFileNameMapping>jclouds-version.jar</outputFileNameMapping>
            <fileMode>0644</fileMode>
            <includes>
                <include>org.apache.jclouds.cli:branding</include>
            </includes>
            <useTransitiveDependencies>false</useTransitiveDependencies>
        </dependencySet>
        <dependencySet>
            <outputDirectory>/system/org/apache/jclouds/cli/runner/${project.version}/</outputDirectory>
            <fileMode>0644</fileMode>
            <includes>
                <include>org.apache.jclouds.cli:runner</include>
            </includes>
        </dependencySet>
        <dependencySet>
            <outputDirectory>lib/other/</outputDirectory>
            <fileMode>0644</fileMode>
            <includes>
                <include>org.slf4j:slf4j-api</include>
                <include>org.slf4j:slf4j-log4j12</include>
                <include>log4j:log4j</include>
            </includes>
        </dependencySet>
    </dependencySets>

</assembly>
