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

  <files>
    <file>
      <source>appConfig-default.json</source>
      <outputDirectory>/</outputDirectory>
      <filtered>true</filtered>
      <fileMode>0755</fileMode>
    </file>
    <file>
      <source>appConfig-secured-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>${project.build.directory}/${work.dir}/${pkg.name}</source>
      <outputDirectory>package/files</outputDirectory>
      <filtered>false</filtered>
      <fileMode>0755</fileMode>
    </file>
    <file>
      <source>${project.build.directory}/slider-accumulo-app-package-${project.version}.jar</source>
      <outputDirectory>package/files</outputDirectory>
      <destName>SliderAccumuloUtils.jar</destName>
      <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>appConfig-secured-default.json</exclude>
        <exclude>metainfo.xml</exclude>
      </excludes>
      <fileMode>0755</fileMode>
      <directoryMode>0755</directoryMode>
    </fileSet>
  </fileSets>
</assembly>
