<!--
 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.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
  <id>bin</id>
  <formats>
    <format>tar.gz</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <fileSets>
    <fileSet>
      <directory>${basedir}/src/main/resources/bin</directory>
      <outputDirectory>bin</outputDirectory>
      <includes/>
      <fileMode>775</fileMode>
    </fileSet>
    <fileSet>
      <directory>${basedir}/src/main/resources/etc</directory>
      <outputDirectory>data/met</outputDirectory>
      <includes/>
    </fileSet>    
    <fileSet>
      <directory>target</directory>
      <outputDirectory>logs</outputDirectory>
      <excludes>
        <exclude>**/*</exclude>
      </excludes>
    </fileSet>
    <fileSet>
      <directory>target</directory>
      <outputDirectory>data</outputDirectory>
      <excludes>
        <exclude>**/*</exclude>
      </excludes>
    </fileSet>
    <fileSet>
      <directory>target</directory>
      <outputDirectory>data/archive</outputDirectory>
      <excludes>
        <exclude>**/*</exclude>
      </excludes>
    </fileSet>
    <fileSet>
      <directory>target</directory>
      <outputDirectory>data/staging</outputDirectory>
      <excludes>
        <exclude>**/*</exclude>
      </excludes>
    </fileSet>
    <fileSet>
      <directory>target</directory>
      <outputDirectory>data/work</outputDirectory>
      <excludes>
        <exclude>**/*</exclude>
      </excludes>
    </fileSet>
    <fileSet>
      <directory>target</directory>
      <outputDirectory>data/met</outputDirectory>
      <excludes>
        <exclude>**/*</exclude>
      </excludes>
    </fileSet>
    <fileSet>
      <directory>target</directory>
      <outputDirectory>data/failure</outputDirectory>
      <excludes>
        <exclude>**/*</exclude>
      </excludes>
    </fileSet>
    <fileSet>
      <directory>${project.build.directory}/apache-tomcat-${tomcat.version}</directory>
      <outputDirectory>tomcat</outputDirectory>
      <excludes>
        <exclude>**/webapps/docs/**</exclude>
        <exclude>**/webapps/examples/**</exclude>
        <exclude>**/webapps/host-manager/**</exclude>
        <exclude>**/webapps/manager/**</exclude>
        <exclude>**/webapps/servlets-examples/**</exclude>
        <exclude>**/webapps/jsp-examples/**</exclude>
        <exclude>**/webapps/webdav/**</exclude>
      </excludes>
    </fileSet>
  </fileSets>
  <dependencySets>
    <dependencySet>
      <outputDirectory>.</outputDirectory>
      <unpack>true</unpack>
      <useProjectArtifact>false</useProjectArtifact>
      <useTransitiveDependencies>false</useTransitiveDependencies>
      <excludes>
        <exclude>${groupId}:${parent.artifactId}-opsui</exclude>
        <exclude>${groupId}:${parent.artifactId}-pcs-services</exclude>
        <exclude>${groupId}:${parent.artifactId}-fmprod</exclude>
        <exclude>${groupId}:${parent.artifactId}-solr-webapp</exclude>
      </excludes>
    </dependencySet>
  </dependencySets>
</assembly>
