<!--
   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>hadoop-mapreduce-dist</id>
  <formats>
    <format>dir</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <fileSets>
    <fileSet>
      <directory>bin</directory>
      <outputDirectory>bin</outputDirectory>
      <includes>
        <include>mapred</include>
        <include>mapred.cmd</include>
      </includes>
      <fileMode>0755</fileMode>
    </fileSet>
    <fileSet>
      <directory>bin</directory>
      <outputDirectory>libexec</outputDirectory>
      <includes>
        <include>mapred-config.sh</include>
        <include>mapred-config.cmd</include>
      </includes>
      <fileMode>0755</fileMode>
    </fileSet>
    <fileSet>
      <directory>bin</directory>
      <outputDirectory>sbin</outputDirectory>
      <includes>
        <include>mr-jobhistory-daemon.sh</include>
      </includes>
      <fileMode>0755</fileMode>
    </fileSet>
    <fileSet>
      <directory>conf</directory>
      <outputDirectory>etc/hadoop</outputDirectory>
      <includes>
        <include>**/*</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>${basedir}</directory>
      <outputDirectory>/share/doc/hadoop/${hadoop.component}</outputDirectory>
      <includes>
        <include>*.txt</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>${project.build.directory}/webapps</directory>
      <outputDirectory>/share/hadoop/${hadoop.component}/webapps</outputDirectory>
    </fileSet>
    <fileSet>
      <directory>${basedir}/src/main/conf</directory>
      <outputDirectory>/share/hadoop/${hadoop.component}/templates</outputDirectory>
      <includes>
        <include>*-site.xml</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>${basedir}/src/main/packages/templates/conf</directory>
      <outputDirectory>/share/hadoop/${hadoop.component}/templates/conf</outputDirectory>
      <includes>
        <include>*</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>${basedir}/dev-support/jdiff</directory>
      <outputDirectory>/share/hadoop/${hadoop.component}/jdiff</outputDirectory>
    </fileSet>
    <fileSet>
      <directory>${project.build.directory}/site/jdiff/xml</directory>
      <outputDirectory>/share/hadoop/${hadoop.component}/jdiff</outputDirectory>
    </fileSet>
    <fileSet>
      <directory>${project.build.directory}/site</directory>
      <outputDirectory>/share/doc/hadoop/${hadoop.component}</outputDirectory>
    </fileSet>
    <fileSet>
      <directory>hadoop-mapreduce-client/hadoop-mapreduce-client-app/target</directory>
      <outputDirectory>/share/hadoop/${hadoop.component}/sources</outputDirectory>
      <includes>
        <include>*-sources.jar</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>hadoop-mapreduce-client/hadoop-mapreduce-client-common/target</directory>
      <outputDirectory>/share/hadoop/${hadoop.component}/sources</outputDirectory>
      <includes>
        <include>*-sources.jar</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>hadoop-mapreduce-client/hadoop-mapreduce-client-core/target</directory>
      <outputDirectory>/share/hadoop/${hadoop.component}/sources</outputDirectory>
      <includes>
        <include>*-sources.jar</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>hadoop-mapreduce-client/hadoop-mapreduce-client-hs/target</directory>
      <outputDirectory>/share/hadoop/${hadoop.component}/sources</outputDirectory>
      <includes>
        <include>*-sources.jar</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>hadoop-mapreduce-client/hadoop-mapreduce-client-hs-plugins/target</directory>
      <outputDirectory>/share/hadoop/${hadoop.component}/sources</outputDirectory>
      <includes>
        <include>*-sources.jar</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/target</directory>
      <outputDirectory>/share/hadoop/${hadoop.component}/sources</outputDirectory>
      <includes>
        <include>*-sources.jar</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/target</directory>
      <outputDirectory>/share/hadoop/${hadoop.component}/sources</outputDirectory>
      <includes>
        <include>*-sources.jar</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>hadoop-mapreduce-examples/target</directory>
      <outputDirectory>/share/hadoop/${hadoop.component}/sources</outputDirectory>
      <includes>
        <include>*-sources.jar</include>
      </includes>
    </fileSet>
  </fileSets>
  <moduleSets>
    <moduleSet>
      <binaries>
        <outputDirectory>share/hadoop/${hadoop.component}</outputDirectory>
        <includeDependencies>false</includeDependencies>
        <unpack>false</unpack>
      </binaries>
    </moduleSet>
    <moduleSet>
      <includes>
        <include>org.apache.hadoop:hadoop-mapreduce-client-jobclient</include>
        <include>org.apache.hadoop:hadoop-yarn-server-tests</include>
      </includes>
      <binaries>
        <attachmentClassifier>tests</attachmentClassifier>
        <outputDirectory>share/hadoop/${hadoop.component}</outputDirectory>
        <includeDependencies>false</includeDependencies>
        <unpack>false</unpack>
      </binaries>
    </moduleSet>
  </moduleSets>
  <dependencySets>
    <dependencySet>
      <useProjectArtifact>false</useProjectArtifact>
      <outputDirectory>/share/hadoop/${hadoop.component}/lib</outputDirectory>
      <!-- Exclude hadoop artifacts. They will be found via HADOOP* env -->
      <excludes>
        <exclude>org.apache.hadoop:hadoop-common</exclude>
        <exclude>org.apache.hadoop:hadoop-hdfs</exclude>
        <!-- use slf4j from common to avoid multiple binding warnings -->
        <exclude>org.slf4j:slf4j-api</exclude>
        <exclude>org.slf4j:slf4j-log4j12</exclude>
        <exclude>org.hsqldb:hsqldb</exclude>
      </excludes>
    </dependencySet>
    <dependencySet>
      <useProjectArtifact>false</useProjectArtifact>
      <outputDirectory>/share/hadoop/${hadoop.component}/lib-examples</outputDirectory>
      <includes>
        <include>org.hsqldb:hsqldb</include>
      </includes>
    </dependencySet>
  </dependencySets>
</assembly>
