<!--
 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 xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>bin</id>
    <formats>
        <format>tar.gz</format>
        <format>zip</format>
    </formats>

    <!-- put deps in the lib folder -->
    <dependencySets>
        <dependencySet>
            <useProjectArtifact>false</useProjectArtifact>
            <outputDirectory>lib</outputDirectory>
            <unpack>false</unpack>
        </dependencySet>
    </dependencySets>

    <fileSets>
        <!--
            $STORM_HOME/bin
        -->
        <fileSet>
            <directory>${project.basedir}/../../bin</directory>
            <outputDirectory>bin</outputDirectory>
            <includes>
                <include>storm*</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.basedir}/../../storm-core/src/ui/public</directory>
            <outputDirectory>public</outputDirectory>
            <includes>
                <include>*/**</include>
            </includes>
            <excludes/>
        </fileSet>
        <fileSet>
            <directory>${project.basedir}/../../examples</directory>
            <outputDirectory>examples</outputDirectory>
            <excludes>
                <exclude>**/target/**</exclude>
            </excludes>
        </fileSet>

        <!-- EXTERNAL -->
        <fileSet>
            <directory>${project.basedir}/../../external/storm-kafka/target</directory>
            <outputDirectory>external/storm-kafka</outputDirectory>
            <includes>
                <include>storm*jar</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.basedir}/../../external/storm-kafka</directory>
            <outputDirectory>external/storm-kafka</outputDirectory>
            <includes>
                <include>README.*</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.basedir}/../../external/storm-hdfs/target</directory>
            <outputDirectory>external/storm-hdfs</outputDirectory>
            <includes>
                <include>storm*jar</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.basedir}/../../external/storm-hdfs</directory>
            <outputDirectory>external/storm-hdfs</outputDirectory>
            <includes>
                <include>README.*</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.basedir}/../../external/storm-hbase/target</directory>
            <outputDirectory>external/storm-hbase</outputDirectory>
            <includes>
                <include>storm*jar</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.basedir}/../../external/storm-hbase</directory>
            <outputDirectory>external/storm-hbase</outputDirectory>
            <includes>
                <include>README.*</include>
            </includes>
        </fileSet>


    </fileSets>

    <files>
        <!-- EXAMPLES -->
        <file>
            <source>${project.basedir}/../../examples/storm-starter/target/storm-starter-${project.version}-jar-with-dependencies.jar</source>
            <outputDirectory>/examples/storm-starter/</outputDirectory>
            <destName>storm-starter-topologies-${project.version}.jar</destName>
        </file>


        <!--
            $STORM_HOME/conf
        -->
        <file>
            <source>${project.basedir}/../../conf/storm.yaml.example</source>
            <outputDirectory>/conf</outputDirectory>
            <destName>storm.yaml</destName>
        </file>
        <file>
            <source>${project.basedir}/../../conf/storm_env.ini</source>
            <outputDirectory>/conf</outputDirectory>
            <destName>storm_env.ini</destName>
        </file>
        <!-- TODO this should be a generated file from "target" -->
        <file>
            <source>${project.basedir}/../../VERSION</source>
            <outputDirectory>/</outputDirectory>
            <destName>RELEASE</destName>
            <filtered>true</filtered>
        </file>

        <file>
            <source>${project.basedir}/../../logback/cluster.xml</source>
            <outputDirectory>/logback</outputDirectory>
        </file>


        <file>
            <source>${project.basedir}/LICENSE</source>
            <outputDirectory>/</outputDirectory>
        </file>

        <file>
            <source>${project.basedir}/NOTICE</source>
            <outputDirectory>/</outputDirectory>
        </file>
        <file>
            <source>${project.basedir}/../../README.markdown</source>
            <outputDirectory>/</outputDirectory>
        </file>
        <file>
            <source>${project.basedir}/../../DISCLAIMER</source>
            <outputDirectory>/</outputDirectory>
        </file>

        <file>
            <source>${project.basedir}/../../CHANGELOG.md</source>
            <outputDirectory>/</outputDirectory>
        </file>

        <file>
            <source>${project.basedir}/../../SECURITY.md</source>
            <outputDirectory>/</outputDirectory>
        </file>
    </files>
</assembly>
