<!--
  ~ 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>storm_v${storm.version}</id>
  <formats>
    <format>zip</format>
    <format>dir</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>

  <files>
    <file>
      <source>appConfig-default.json</source>
      <outputDirectory>/</outputDirectory>
      <filtered>true</filtered>
      <fileMode>0755</fileMode>
    </file>
    <file>
      <source>metainfo.xml</source>
      <outputDirectory>/</outputDirectory>
      <filtered>true</filtered>
      <fileMode>0755</fileMode>
    </file>
    <file>
      <source>${pkg.src}/${pkg.name}</source>
      <outputDirectory>package/files</outputDirectory>
      <filtered>false</filtered>
      <fileMode>0755</fileMode>
    </file>
  </files>

  <fileSets>
    <fileSet>
      <directory>${project.basedir}</directory>
      <outputDirectory>/</outputDirectory>
      <excludes>
        <exclude>pom.xml</exclude>
        <exclude>src/**</exclude>
        <exclude>target/**</exclude>
        <exclude>appConfig-default.json</exclude>
        <exclude>metainfo.xml</exclude>
      </excludes>
      <fileMode>0755</fileMode>
      <directoryMode>0755</directoryMode>
    </fileSet>

  </fileSets>
</assembly>
