<!--
  ~ 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>command_logger_app_pkg</id>
  <formats>
    <format>zip</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>

  <files>
    <file>
      <source>appConfig.json</source>
      <outputDirectory>/</outputDirectory>
      <filtered>true</filtered>
      <fileMode>0755</fileMode>
    </file>
    <file>
      <source>resources.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>
  </files>

  <fileSets>
    <fileSet>
      <directory>${project.build.directory}/${work.dir}</directory>
      <outputDirectory>package/files</outputDirectory>
      <includes>
        <include>command-logger.tar</include>
      </includes>
      <fileMode>0755</fileMode>
      <directoryMode>0755</directoryMode>
    </fileSet>

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

  </fileSets>
</assembly>
