<?xml version="1.0" encoding="UTF-8"?>

<!--
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.
-->

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <!--
       This pom contains all dependencies required to run an Impala Executor. fe/pom.xml
       has a dependency on the pom file produced by this pom file. If a dependency is
       listed here it will be included in the Impala coordinator, executor, and
       coordinator-executor Docker images. If a jar is not listed here, it will not be
       included in the executor Docker images. This allows Impala to create executor
       images with fewer jar files, which decreases the overall size of the executor
       Docker images.
  -->

  <parent>
    <groupId>org.apache.impala</groupId>
    <artifactId>impala-parent</artifactId>
    <version>5.0.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.apache.impala</groupId>
  <artifactId>impala-executor-deps</artifactId>
  <packaging>pom</packaging>

  <name>Impala Executor Dependencies</name>

  <dependencies>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs-client</artifactId>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.eclipse.jetty</groupId>
          <artifactId>*</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <!--
       hadoop-cloud-storage includes several dependencies that Impala needs:
       Hadoop's AWS support, Azure support, GCS connector, Knox support, etc.
       hadoop-cloud-storage has been carefully tuned to include the right shaded
       dependencies.
    -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-cloud-storage</artifactId>
      <version>${hadoop.version}</version>
      <!-- Exclude the aws-java-sdk-bundle dependency because the Impala minimal
           version of this dependency is used instead. -->
      <exclusions>
        <exclusion>
          <groupId>com.amazonaws</groupId>
          <artifactId>aws-java-sdk-bundle</artifactId>
        </exclusion>
        <exclusion>
          <groupId>com.cloudera</groupId>
          <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.eclipse.jetty</groupId>
          <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-slf4j-impl</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>org.apache.impala</groupId>
      <artifactId>impala-minimal-s3a-aws-sdk</artifactId>
      <version>${project.version}</version>
      <exclusions>
        <exclusion>
          <groupId>*</groupId>
          <artifactId>*</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>com.qcloud.cos</groupId>
      <artifactId>hadoop-cos</artifactId>
      <version>${cos.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-aliyun</artifactId>
      <version>${hadoop.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase-shaded-client-byo-hadoop</artifactId>
      <version>${hbase.version}</version>
    </dependency>

    <!-- This reduced dependency is derived from hive-exec and only contains classes needed
         by Impala. See shaded-deps/pom.xml for more details -->
    <dependency>
      <groupId>org.apache.impala</groupId>
      <artifactId>impala-minimal-hive-exec</artifactId>
      <version>${project.version}</version>
      <exclusions>
        <exclusion>
          <groupId>*</groupId>
          <artifactId>*</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>org.apache.ozone</groupId>
      <artifactId>ozone-filesystem-hadoop3</artifactId>
      <version>${ozone.version}</version>
      <!-- Remove all transitive dependencies from the Apache Ozone dependency.
      ozone-filesystem-hadoop3 is a shaded-jar, which already includes
      all required transitive dependencies. For some reason, Ozone still pulls
      in some transitive dependencies even though they are not needed. -->
      <exclusions>
        <exclusion>
          <groupId>*</groupId>
          <artifactId>*</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
          <execution>
            <id>write-executor-classpath</id>
            <goals>
              <goal>build-classpath</goal>
            </goals>
            <configuration>
              <outputFile>${project.build.directory}/build-executor-deps-classpath.txt</outputFile>
              <includeScope>runtime</includeScope>
              <excludeTypes>pom</excludeTypes>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <!--
        This profile aims to include huawei OBS dependencies.
        This profile is disabled by default.
        To active this profile, set environment variable 'ENABLE_OBS_FILESYSTEM' to 'true',
        or use 'mvn package -Pobs-filesystem'.
      -->
      <id>obs-filesystem</id>
      <activation>
        <property>
          <name>env.ENABLE_OBS_FILESYSTEM</name>
          <value>true</value>
        </property>
      </activation>
      <dependencies>
        <!-- HuaweiCloud SDK. -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-huaweicloud</artifactId>
            <version>${obs.version}</version>
        </dependency>
      </dependencies>
      <repositories>
        <!-- HuaweiCloud SDK repository. -->
        <repository>
          <id>huaweicloud.repo</id>
          <url>https://repo.huaweicloud.com/repository/maven/huaweicloudsdk</url>
          <name>HuaweiCloud SDK Repository</name>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
      </repositories>
    </profile>
  </profiles>
</project>
