/*
 * 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.
 */

import groovy.transform.Memoized

buildscript {
  repositories {
    jcenter()
    gradlePluginPortal()
    maven { url "http://palantir.bintray.com/releases" }
    maven { url "https://plugins.gradle.org/m2/" }
  }
  dependencies {
    classpath 'com.github.jengelman.gradle.plugins:shadow:5.0.0'
    classpath 'com.palantir.baseline:gradle-baseline-java:3.36.2'
    classpath 'com.palantir.gradle.gitversion:gradle-git-version:0.12.3'
    classpath 'com.diffplug.spotless:spotless-plugin-gradle:3.14.0'
    classpath 'gradle.plugin.org.inferred:gradle-processors:2.1.0'
    classpath 'me.champeau.gradle:jmh-gradle-plugin:0.4.8'
  }
}

plugins {
  id 'nebula.dependency-recommender' version '9.0.2'
  id 'org.projectnessie' version '0.3.0'
}

try {
  // apply this plugin in a try-catch block so that we can handle cases without .git directory
  apply plugin: 'com.palantir.git-version'
} catch (Exception e) {
  project.logger.error(e.getMessage())
}

if (JavaVersion.current() == JavaVersion.VERSION_1_8) {
  project.ext.jdkVersion = '8'
} else if (JavaVersion.current() == JavaVersion.VERSION_11) {
  project.ext.jdkVersion = '11'
} else {
  throw new GradleException("This build must be run with JDK 8 or 11")
}

dependencyRecommendations {
  propertiesFile file: file('versions.props')
}

allprojects {
  group = "org.apache.iceberg"
  version = getProjectVersion()
  repositories {
    maven { url  "http://palantir.bintray.com/releases" }
    mavenCentral()
    mavenLocal()
  }
}

subprojects {
  apply plugin: 'nebula.dependency-recommender'
  apply plugin: 'java'

  configurations {
    testCompile.extendsFrom compileOnly

    compileClasspath {
      // do not exclude Guava so the bundle project can reference classes.
      if (project.name != 'iceberg-bundled-guava') {
        exclude group: 'com.google.guava', module: 'guava'
      }
      // contains a copy of Guava
      exclude group: 'org.apache.spark', module: 'spark-network-common_2.12'
    }

    all {
      exclude group: 'org.slf4j', module: 'slf4j-log4j12'
      exclude group: 'org.mortbay.jetty'
      exclude group: 'com.sun.jersey'
      exclude group: 'com.sun.jersey.contribs'
      exclude group: 'org.pentaho', module: 'pentaho-aggdesigner-algorithm'

      resolutionStrategy {
        force 'com.fasterxml.jackson.module:jackson-module-scala_2.11:2.10.2'
        force 'com.fasterxml.jackson.module:jackson-module-scala_2.12:2.10.2'
        force 'com.fasterxml.jackson.module:jackson-module-paranamer:2.10.2'
      }
    }

    testArtifacts
  }

  compileJava {
    options.encoding = "UTF-8"
  }

  compileTestJava {
    options.encoding = "UTF-8"
  }

  javadoc {
    options.encoding = 'UTF-8'
  }

  ext {
    jmhVersion = '1.21'
  }

  sourceCompatibility = '1.8'
  targetCompatibility = '1.8'

  dependencies {
    compile 'org.slf4j:slf4j-api'
    compile 'com.github.stephenc.findbugs:findbugs-annotations'

    testCompile 'junit:junit'
    testCompile 'org.slf4j:slf4j-simple'

    testCompile 'org.mockito:mockito-core'
  }

  test {
    def logDir = "${rootDir}/build/testlogs"
    def logFile = "${logDir}/${project.name}.log"
    mkdir("${logDir}")
    delete("${logFile}")
    def buildLog = new File(logFile)
    addTestOutputListener(new TestOutputListener() {
      def lastDescriptor
      @Override
      void onOutput(TestDescriptor testDescriptor, TestOutputEvent testOutputEvent) {
        if (lastDescriptor != testDescriptor) {
          buildLog << "--------\n- Test log for: "<< testDescriptor << "\n--------\n"
          lastDescriptor = testDescriptor
        }
        buildLog << testOutputEvent.destination << " " << testOutputEvent.message
      }
    })

    testLogging {
      events "failed"
      exceptionFormat "full"
    }
  }
}

project(':iceberg-bundled-guava') {
  apply plugin: 'com.github.johnrengelman.shadow'

  tasks.jar.dependsOn tasks.shadowJar

  dependencies {
    compileOnly('com.google.guava:guava') {
      exclude group: 'com.google.code.findbugs'
      // may be LGPL - use ALv2 findbugs-annotations instead
      exclude group: 'com.google.errorprone'
      exclude group: 'com.google.j2objc'
    }
  }

  shadowJar {
    classifier null
    configurations = [project.configurations.compileOnly]
    zip64 true

    // include the LICENSE and NOTICE files for the shaded Jar
    from(projectDir) {
      include 'LICENSE'
      include 'NOTICE'
    }

    dependencies {
      exclude(dependency('com.github.stephenc.findbugs:findbugs-annotations'))
      exclude(dependency('org.slf4j:slf4j-api'))
      exclude(dependency('org.checkerframework:checker-qual'))
    }

    relocate 'com.google.common', 'org.apache.iceberg.relocated.com.google.common'

    minimize()
  }

  jar {
    archiveClassifier = 'empty'
  }
}

project(':iceberg-api') {
  dependencies {
    compile project(path: ':iceberg-bundled-guava', configuration: 'shadow')
    compileOnly "com.google.errorprone:error_prone_annotations:2.3.3"
    testCompile "org.apache.avro:avro"
  }
}

project(':iceberg-common') {
  dependencies {
    compile project(path: ':iceberg-bundled-guava', configuration: 'shadow')
  }
}

project(':iceberg-core') {
  dependencies {
    compile project(':iceberg-api')
    compile project(':iceberg-common')

    compile("org.apache.avro:avro") {
      exclude group: 'org.tukaani' // xz compression is not supported
    }

    compile "com.fasterxml.jackson.core:jackson-databind"
    compile "com.fasterxml.jackson.core:jackson-core"
    compile "com.github.ben-manes.caffeine:caffeine"
    compileOnly("org.apache.hadoop:hadoop-client") {
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    }

    testCompile project(path: ':iceberg-api', configuration: 'testArtifacts')
  }
}

project(':iceberg-data') {
  dependencies {
    compile project(':iceberg-api')
    compile project(':iceberg-core')
    compileOnly project(':iceberg-parquet')
    compileOnly project(':iceberg-orc')
    compileOnly("org.apache.hadoop:hadoop-common") {
      exclude group: 'commons-beanutils'
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    }

    testCompile("org.apache.hadoop:hadoop-client") {
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    }

    testCompile project(path: ':iceberg-api', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-core', configuration: 'testArtifacts')
  }

  test {
    // Only for TestSplitScan as of Gradle 5.0+
    maxHeapSize '1500m'
  }
}

project(':iceberg-aws') {
  dependencies {
    compile project(':iceberg-api')
    compile project(':iceberg-core')

    compileOnly 'software.amazon.awssdk:url-connection-client'
    compileOnly 'software.amazon.awssdk:s3'
    compileOnly 'software.amazon.awssdk:kms'
    compileOnly 'software.amazon.awssdk:glue'
    compileOnly 'software.amazon.awssdk:sts'
    compileOnly 'software.amazon.awssdk:dynamodb'

    compileOnly("org.apache.hadoop:hadoop-common") {
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.slf4j', module: 'slf4j-log4j12'
      exclude group: 'javax.servlet', module: 'servlet-api'
      exclude group: 'com.google.code.gson', module: 'gson'
    }

    testCompile 'software.amazon.awssdk:iam'
    testCompile project(path: ':iceberg-api', configuration: 'testArtifacts')
    testCompile("com.adobe.testing:s3mock-junit4") {
      exclude module: "spring-boot-starter-logging"
      exclude module: "logback-classic"
    }
  }

  sourceSets {
    integration {
      java.srcDir "$projectDir/src/integration/java"
      resources.srcDir "$projectDir/src/integration/resources"
      compileClasspath += main.output + test.output
      runtimeClasspath += main.output + test.output
    }
  }

  configurations {
    integrationImplementation.extendsFrom testImplementation
    integrationRuntime.extendsFrom testRuntime
  }

  task integrationTest(type: Test) {
    testClassesDirs = sourceSets.integration.output.classesDirs
    classpath = sourceSets.integration.runtimeClasspath
  }
}

project(':iceberg-flink') {
  dependencies {
    compile project(':iceberg-api')
    compile project(':iceberg-common')
    compile project(':iceberg-core')
    compile project(':iceberg-data')
    compile project(':iceberg-orc')
    compile project(':iceberg-parquet')
    compile project(':iceberg-hive-metastore')

    compileOnly "org.apache.flink:flink-streaming-java_2.12"
    compileOnly "org.apache.flink:flink-streaming-java_2.12::tests"
    compileOnly "org.apache.flink:flink-table-api-java-bridge_2.12"
    compileOnly "org.apache.flink:flink-table-planner-blink_2.12"
    compileOnly "org.apache.flink:flink-table-planner_2.12"
    compileOnly "org.apache.hadoop:hadoop-hdfs"
    compileOnly "org.apache.hadoop:hadoop-common"
    compileOnly("org.apache.hadoop:hadoop-minicluster") {
      exclude group: 'org.apache.avro', module: 'avro'
    }

    testCompile "org.apache.flink:flink-core"
    testCompile "org.apache.flink:flink-runtime_2.12"
    testCompile "org.apache.flink:flink-table-planner-blink_2.12"
    testCompile "org.apache.flink:flink-test-utils-junit"
    testCompile("org.apache.flink:flink-test-utils_2.12") {
      exclude group: "org.apache.curator", module: 'curator-test'
    }

    testCompile project(path: ':iceberg-hive-metastore', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-api', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-core', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-data', configuration: 'testArtifacts')

    // By default, hive-exec is a fat/uber jar and it exports a guava library
    // that's really old. We use the core classifier to be able to override our guava
    // version. Luckily, hive-exec seems to work okay so far with this version of guava
    // See: https://github.com/apache/hive/blob/master/ql/pom.xml#L911 for more context.
    testCompile("org.apache.hive:hive-exec::core") {
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.slf4j', module: 'slf4j-log4j12'
      exclude group: 'org.pentaho' // missing dependency
      exclude group: 'org.apache.hive', module: 'hive-llap-tez'
      exclude group: 'org.apache.logging.log4j'
      exclude group: 'com.google.protobuf', module: 'protobuf-java'
      exclude group: 'org.apache.calcite'
      exclude group: 'org.apache.calcite.avatica'
      exclude group: 'com.google.code.findbugs', module: 'jsr305'
    }

    testCompile("org.apache.hive:hive-metastore") {
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.slf4j', module: 'slf4j-log4j12'
      exclude group: 'org.pentaho' // missing dependency
      exclude group: 'org.apache.hbase'
      exclude group: 'org.apache.logging.log4j'
      exclude group: 'co.cask.tephra'
      exclude group: 'com.google.code.findbugs', module: 'jsr305'
      exclude group: 'org.eclipse.jetty.aggregate', module: 'jetty-all'
      exclude group: 'org.eclipse.jetty.orbit', module: 'javax.servlet'
      exclude group: 'org.apache.parquet', module: 'parquet-hadoop-bundle'
      exclude group: 'com.tdunning', module: 'json'
      exclude group: 'javax.transaction', module: 'transaction-api'
      exclude group: 'com.zaxxer', module: 'HikariCP'
    }
  }
}

project(':iceberg-flink-runtime') {
  apply plugin: 'com.github.johnrengelman.shadow'

  tasks.jar.dependsOn tasks.shadowJar

  configurations {
    compile {
      exclude group: 'org.apache.flink'
      // included in Flink
      exclude group: 'org.slf4j'
      exclude group: 'org.apache.commons'
      exclude group: 'commons-pool'
      exclude group: 'commons-codec'
      exclude group: 'org.xerial.snappy'
      exclude group: 'javax.xml.bind'
      exclude group: 'javax.annotation'
    }
  }

  dependencies {
    compile project(':iceberg-flink')
    compile project(':iceberg-aws')
    compile(project(':iceberg-nessie')) {
      exclude group: 'com.google.code.findbugs', module: 'jsr305'
    }
  }

  shadowJar {
    configurations = [project.configurations.compile]

    zip64 true

    // include the LICENSE and NOTICE files for the shaded Jar
    from(projectDir) {
      include 'LICENSE'
      include 'NOTICE'
    }

    // Relocate dependencies to avoid conflicts
    relocate 'org.apache.avro', 'org.apache.iceberg.shaded.org.apache.avro'
    relocate 'org.apache.parquet', 'org.apache.iceberg.shaded.org.apache.parquet'
    relocate 'com.google', 'org.apache.iceberg.shaded.com.google'
    relocate 'com.fasterxml', 'org.apache.iceberg.shaded.com.fasterxml'
    relocate 'com.github.benmanes', 'org.apache.iceberg.shaded.com.github.benmanes'
    relocate 'org.checkerframework', 'org.apache.iceberg.shaded.org.checkerframework'
    relocate 'shaded.parquet', 'org.apache.iceberg.shaded.org.apache.parquet.shaded'
    relocate 'org.apache.orc', 'org.apache.iceberg.shaded.org.apache.orc'
    relocate 'io.airlift', 'org.apache.iceberg.shaded.io.airlift'
    relocate 'org.threeten.extra', 'org.apache.iceberg.shaded.org.threeten.extra'

    classifier null
  }

  jar {
    enabled = false
  }
}

project(':iceberg-hive-metastore') {
  dependencies {
    compile project(':iceberg-core')

    compileOnly "org.apache.avro:avro"

    compileOnly("org.apache.hive:hive-metastore") {
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.slf4j', module: 'slf4j-log4j12'
      exclude group: 'org.pentaho' // missing dependency
      exclude group: 'org.apache.hbase'
      exclude group: 'org.apache.logging.log4j'
      exclude group: 'co.cask.tephra'
      exclude group: 'com.google.code.findbugs', module: 'jsr305'
      exclude group: 'org.eclipse.jetty.aggregate', module: 'jetty-all'
      exclude group: 'org.eclipse.jetty.orbit', module: 'javax.servlet'
      exclude group: 'org.apache.parquet', module: 'parquet-hadoop-bundle'
      exclude group: 'com.tdunning', module: 'json'
      exclude group: 'javax.transaction', module: 'transaction-api'
      exclude group: 'com.zaxxer', module: 'HikariCP'
    }

    // By default, hive-exec is a fat/uber jar and it exports a guava library
    // that's really old. We use the core classifier to be able to override our guava
    // version. Luckily, hive-exec seems to work okay so far with this version of guava
    // See: https://github.com/apache/hive/blob/master/ql/pom.xml#L911 for more context.
    testCompile("org.apache.hive:hive-exec::core") {
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.slf4j', module: 'slf4j-log4j12'
      exclude group: 'org.pentaho' // missing dependency
      exclude group: 'org.apache.hive', module: 'hive-llap-tez'
      exclude group: 'org.apache.logging.log4j'
      exclude group: 'com.google.protobuf', module: 'protobuf-java'
      exclude group: 'org.apache.calcite'
      exclude group: 'org.apache.calcite.avatica'
      exclude group: 'com.google.code.findbugs', module: 'jsr305'
    }

    testCompile("org.apache.hive:hive-metastore") {
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.slf4j', module: 'slf4j-log4j12'
      exclude group: 'org.pentaho' // missing dependency
      exclude group: 'org.apache.hbase'
      exclude group: 'org.apache.logging.log4j'
      exclude group: 'co.cask.tephra'
      exclude group: 'com.google.code.findbugs', module: 'jsr305'
      exclude group: 'org.eclipse.jetty.aggregate', module: 'jetty-all'
      exclude group: 'org.eclipse.jetty.orbit', module: 'javax.servlet'
      exclude group: 'org.apache.parquet', module: 'parquet-hadoop-bundle'
      exclude group: 'com.tdunning', module: 'json'
      exclude group: 'javax.transaction', module: 'transaction-api'
      exclude group: 'com.zaxxer', module: 'HikariCP'
    }

    compileOnly("org.apache.hadoop:hadoop-client") {
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    }

    testCompile project(path: ':iceberg-api', configuration: 'testArtifacts')
  }
}

project(':iceberg-mr') {
  configurations {
    testCompile {
      exclude group: 'org.apache.parquet', module: 'parquet-hadoop-bundle'
    }
  }

  dependencies {
    compile project(':iceberg-api')
    compile project(':iceberg-core')
    compile project(':iceberg-data')
    compile project(':iceberg-hive-metastore')
    compile project(':iceberg-orc')
    compile project(':iceberg-parquet')

    compileOnly("org.apache.hadoop:hadoop-client") {
      exclude group: 'org.apache.avro', module: 'avro'
    }

    compileOnly("org.apache.hive:hive-exec::core") {
      exclude group: 'com.google.code.findbugs', module: 'jsr305'
      exclude group: 'com.google.guava'
      exclude group: 'com.google.protobuf', module: 'protobuf-java'
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.apache.calcite.avatica'
      exclude group: 'org.apache.hive', module: 'hive-llap-tez'
      exclude group: 'org.apache.logging.log4j'
      exclude group: 'org.pentaho' // missing dependency
      exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    }
    compileOnly("org.apache.hive:hive-metastore")
    compileOnly("org.apache.hive:hive-serde")

    testCompile project(path: ':iceberg-data', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-api', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-core', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-hive-metastore', configuration: 'testArtifacts')

    testCompile("org.apache.avro:avro:1.9.2")
    testCompile("org.apache.calcite:calcite-core")
    testCompile("com.esotericsoftware:kryo-shaded:4.0.2")
    testCompile("com.fasterxml.jackson.core:jackson-annotations:2.6.5")
    testCompile("org.apache.hive:hive-service") {
      exclude group: 'org.apache.hive', module: 'hive-exec'
    }
    testCompile("org.apache.tez:tez-dag")
    testCompile("org.apache.tez:tez-mapreduce")
  }

  test {
    // testJoinTables / testScanTable
    maxHeapSize '2500m'
  }
}

if (jdkVersion == '8') {
  project(':iceberg-hive3') {

    // run the tests in iceberg-mr with Hive3 dependencies
    sourceSets {
      test {
        java.srcDirs = ['../mr/src/test/java', 'src/test/java']
        resources.srcDirs = ['../mr/src/test/resources', 'src/test/resources']
      }
    }

    // exclude these Hive2-specific tests from iceberg-mr
    test {
      exclude '**/TestIcebergDateObjectInspector.class'
      exclude '**/TestIcebergTimestampObjectInspector.class'
      exclude '**/TestIcebergTimestampWithZoneObjectInspector.class'
    }

    dependencies {
      compile project(':iceberg-api')
      compile project(':iceberg-core')
      compile project(':iceberg-data')
      compile project(':iceberg-hive-metastore')
      compile project(':iceberg-orc')
      compile project(':iceberg-parquet')
      compile project(':iceberg-mr')

      compileOnly("org.apache.hadoop:hadoop-client:3.1.0") {
        exclude group: 'org.apache.avro', module: 'avro'
      }

      compileOnly("org.apache.hive:hive-exec:3.1.2:core") {
        exclude group: 'com.google.code.findbugs', module: 'jsr305'
        exclude group: 'com.google.guava'
        exclude group: 'com.google.protobuf', module: 'protobuf-java'
        exclude group: 'org.apache.avro', module: 'avro'
        exclude group: 'org.apache.calcite.avatica'
        exclude group: 'org.apache.hive', module: 'hive-llap-tez'
        exclude group: 'org.apache.logging.log4j'
        exclude group: 'org.pentaho' // missing dependency
        exclude group: 'org.slf4j', module: 'slf4j-log4j12'
      }
      compileOnly("org.apache.hive:hive-metastore:3.1.2")
      compileOnly("org.apache.hive:hive-serde:3.1.2")

      testCompile project(path: ':iceberg-data', configuration: 'testArtifacts')
      testCompile project(path: ':iceberg-api', configuration: 'testArtifacts')
      testCompile project(path: ':iceberg-core', configuration: 'testArtifacts')
      testCompile project(path: ':iceberg-hive-metastore', configuration: 'testArtifacts')

      testCompile("org.apache.avro:avro:1.9.2")
      testCompile("org.apache.calcite:calcite-core")
      testCompile("com.esotericsoftware:kryo-shaded:4.0.2")
      testCompile("com.fasterxml.jackson.core:jackson-annotations:2.6.5")
      testCompile("org.apache.hive:hive-service:3.1.2") {
        exclude group: 'org.apache.hive', module: 'hive-exec'
      }
      testCompile("org.apache.tez:tez-dag:0.9.1")
      testCompile("org.apache.tez:tez-mapreduce:0.9.1")
    }

    test {
      // testJoinTables / testScanTable
      maxHeapSize '2500m'
    }
  }
}

project(':iceberg-hive-runtime') {
  apply plugin: 'com.github.johnrengelman.shadow'

  tasks.jar.dependsOn tasks.shadowJar

  configurations {
    compile {
      exclude group: 'com.github.stephenc.findbugs'
      exclude group: 'commons-pool'
      exclude group: 'javax.annotation'
      exclude group: 'javax.xml.bind'      
      exclude group: 'org.apache.commons'
      exclude group: 'org.slf4j'
      exclude group: 'org.xerial.snappy'
    }
  }

  dependencies {
    compile project(':iceberg-mr')
    if (jdkVersion == '8') {
      compile project(':iceberg-hive3')
    }
  }
  
  shadowJar {
    configurations = [project.configurations.compile]

    zip64 true

    // include the LICENSE and NOTICE files for the shaded Jar
    from(projectDir) {
      include 'LICENSE'
      include 'NOTICE'
    }

    // Relocate dependencies to avoid conflicts
    relocate 'org.apache.avro', 'org.apache.iceberg.shaded.org.apache.avro'
    relocate 'org.apache.parquet', 'org.apache.iceberg.shaded.org.apache.parquet'  
    relocate 'com.google', 'org.apache.iceberg.shaded.com.google'
    relocate 'com.fasterxml', 'org.apache.iceberg.shaded.com.fasterxml'
    relocate 'com.github.benmanes', 'org.apache.iceberg.shaded.com.github.benmanes'
    relocate 'org.checkerframework', 'org.apache.iceberg.shaded.org.checkerframework'
    relocate 'shaded.parquet', 'org.apache.iceberg.shaded.org.apache.parquet.shaded'
    relocate 'org.apache.orc', 'org.apache.iceberg.shaded.org.apache.orc'
    relocate 'io.airlift', 'org.apache.iceberg.shaded.io.airlift'
    relocate 'org.threeten.extra', 'org.apache.iceberg.shaded.org.threeten.extra'

    classifier null
  }

  jar {
    enabled = false
  }
}

project(':iceberg-orc') {
  dependencies {
    compile project(':iceberg-api')
    compile project(':iceberg-core')

    compile("org.apache.orc:orc-core::nohive") {
      exclude group: 'org.apache.hadoop'
      exclude group: 'commons-lang'
      // These artifacts are shaded and included in the orc-core fat jar
      exclude group: 'com.google.protobuf', module: 'protobuf-java'
      exclude group: 'org.apache.hive', module: 'hive-storage-api'
    }

    compileOnly("org.apache.hadoop:hadoop-common") {
      exclude group: 'commons-beanutils'
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    }
    compileOnly("org.apache.hadoop:hadoop-client") {
      exclude group: 'org.apache.avro', module: 'avro'
    }

    testCompile project(path: ':iceberg-api', configuration: 'testArtifacts')
  }
}

project(':iceberg-parquet') {
  dependencies {
    compile project(':iceberg-api')
    compile project(':iceberg-core')

    compile("org.apache.parquet:parquet-avro") {
      exclude group: 'org.apache.avro', module: 'avro'
      // already shaded by Parquet
      exclude group: 'it.unimi.dsi'
      exclude group: 'org.codehaus.jackson'
    }

    compileOnly "org.apache.avro:avro"
    compileOnly("org.apache.hadoop:hadoop-client") {
      exclude group: 'org.apache.avro', module: 'avro'
    }

    testCompile project(path: ':iceberg-core', configuration: 'testArtifacts')
  }
}

project(':iceberg-arrow') {
  dependencies {
    compile project(':iceberg-api')
    compile project(':iceberg-parquet')

    compile("org.apache.arrow:arrow-vector") {
      exclude group: 'io.netty', module: 'netty-buffer'
      exclude group: 'io.netty', module: 'netty-common'
      exclude group: 'com.google.code.findbugs', module: 'jsr305'
    }
    compile("org.apache.arrow:arrow-memory-netty") {
      exclude group: 'io.netty', module: 'netty-common'
      exclude group: 'com.google.code.findbugs', module: 'jsr305'
    }
  }
}

project(':iceberg-spark') {
  configurations.all {
    resolutionStrategy {
      // Spark 2.4.4 can only use the below datanucleus version, the versions introduced
      // by Hive 2.3.6 will meet lots of unexpected issues, so here force to use the versions
      // introduced by Hive 1.2.1.
      force 'org.datanucleus:datanucleus-api-jdo:3.2.6'
      force 'org.datanucleus:datanucleus-core:3.2.10'
      force 'org.datanucleus:datanucleus-rdbms:3.2.9'
    }
  }

  dependencies {
    compile project(':iceberg-api')
    compile project(':iceberg-common')
    compile project(':iceberg-core')
    compile project(':iceberg-data')
    compile project(':iceberg-orc')
    compile project(':iceberg-parquet')
    compile project(':iceberg-arrow')
    compile project(':iceberg-hive-metastore')

    compileOnly "org.apache.avro:avro"
    compileOnly("org.apache.spark:spark-hive_2.11") {
      exclude group: 'org.apache.avro', module: 'avro'
    }

    testCompile("org.apache.hadoop:hadoop-minicluster") {
      exclude group: 'org.apache.avro', module: 'avro'
    }
    testCompile project(path: ':iceberg-hive-metastore', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-api', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-core', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-data', configuration: 'testArtifacts')
  }

  test {
    // For vectorized reads
    // Allow unsafe memory access to avoid the costly check arrow does to check if index is within bounds
    systemProperty("arrow.enable_unsafe_memory_access", "true")
    // Disable expensive null check for every get(index) call.
    // Iceberg manages nullability checks itself instead of relying on arrow.
    systemProperty("arrow.enable_null_check_for_get", "false")

    // Vectorized reads need more memory
    maxHeapSize '2500m'
  }
}

if (jdkVersion == '8') {
  apply from: 'jmh.gradle'

  project(':iceberg-spark2') {
    configurations.all {
      resolutionStrategy {
        // Spark 2.4.4 can only use the below datanucleus version, the versions introduced
        // by Hive 2.3.6 will meet lots of unexpected issues, so here force to use the versions
        // introduced by Hive 1.2.1.
        force 'org.datanucleus:datanucleus-api-jdo:3.2.6'
        force 'org.datanucleus:datanucleus-core:3.2.10'
        force 'org.datanucleus:datanucleus-rdbms:3.2.9'
      }
    }

    dependencies {
      compile project(':iceberg-api')
      compile project(':iceberg-common')
      compile project(':iceberg-core')
      compile project(':iceberg-data')
      compile project(':iceberg-orc')
      compile project(':iceberg-parquet')
      compile project(':iceberg-arrow')
      compile project(':iceberg-hive-metastore')
      compile project(':iceberg-spark')

      compileOnly "org.apache.avro:avro"
      compileOnly("org.apache.spark:spark-hive_2.11") {
        exclude group: 'org.apache.avro', module: 'avro'
      }

      testCompile project(path: ':iceberg-spark', configuration: 'testArtifacts')

      testCompile("org.apache.hadoop:hadoop-minicluster") {
        exclude group: 'org.apache.avro', module: 'avro'
      }
      testCompile project(path: ':iceberg-hive-metastore', configuration: 'testArtifacts')
      testCompile project(path: ':iceberg-api', configuration: 'testArtifacts')
      testCompile project(path: ':iceberg-data', configuration: 'testArtifacts')
    }

    test {
      // For vectorized reads
      // Allow unsafe memory access to avoid the costly check arrow does to check if index is within bounds
      systemProperty("arrow.enable_unsafe_memory_access", "true")
      // Disable expensive null check for every get(index) call.
      // Iceberg manages nullability checks itself instead of relying on arrow.
      systemProperty("arrow.enable_null_check_for_get", "false")

      // Vectorized reads need more memory
      maxHeapSize '2500m'
    }
  }

  // the runtime jar is a self-contained artifact for testing in a notebook
  project(':iceberg-spark-runtime') {
    apply plugin: 'com.github.johnrengelman.shadow'

    tasks.jar.dependsOn tasks.shadowJar

    configurations {
      compile {
        exclude group: 'org.apache.spark'
        // included in Spark
        exclude group: 'org.slf4j'
        exclude group: 'org.apache.commons'
        exclude group: 'commons-pool'
        exclude group: 'commons-codec'
        exclude group: 'org.xerial.snappy'
        exclude group: 'javax.xml.bind'
        exclude group: 'javax.annotation'
      }
    }

    dependencies {
      compile project(':iceberg-spark2')
      compile project(':iceberg-aws')
      compile 'org.apache.spark:spark-hive_2.11'
      compile(project(':iceberg-nessie')) {
        exclude group: 'com.google.code.findbugs', module: 'jsr305'
      }
    }

    shadowJar {
      configurations = [project.configurations.compile]

      zip64 true

      // include the LICENSE and NOTICE files for the shaded Jar
      from(projectDir) {
        include 'LICENSE'
        include 'NOTICE'
      }

      // Relocate dependencies to avoid conflicts
      relocate 'com.google', 'org.apache.iceberg.shaded.com.google'
      relocate 'com.fasterxml', 'org.apache.iceberg.shaded.com.fasterxml'
      relocate 'com.github.benmanes', 'org.apache.iceberg.shaded.com.github.benmanes'
      relocate 'org.checkerframework', 'org.apache.iceberg.shaded.org.checkerframework'
      relocate 'org.apache.avro', 'org.apache.iceberg.shaded.org.apache.avro'
      relocate 'avro.shaded', 'org.apache.iceberg.shaded.org.apache.avro.shaded'
      relocate 'com.thoughtworks.paranamer', 'org.apache.iceberg.shaded.com.thoughtworks.paranamer'
      relocate 'org.apache.parquet', 'org.apache.iceberg.shaded.org.apache.parquet'
      relocate 'shaded.parquet', 'org.apache.iceberg.shaded.org.apache.parquet.shaded'
      // relocate Avro's jackson dependency to share parquet-jackson locations
      relocate 'org.codehaus.jackson', 'org.apache.iceberg.shaded.org.apache.parquet.shaded.org.codehaus.jackson'
      relocate 'org.apache.orc', 'org.apache.iceberg.shaded.org.apache.orc'
      relocate 'io.airlift', 'org.apache.iceberg.shaded.io.airlift'
      // relocate Arrow and related deps to shade Iceberg specific version
      relocate 'io.netty.buffer', 'org.apache.iceberg.shaded.io.netty.buffer'
      relocate 'org.apache.arrow', 'org.apache.iceberg.shaded.org.apache.arrow'
      relocate 'com.carrotsearch', 'org.apache.iceberg.shaded.com.carrotsearch'
      relocate 'org.threeten.extra', 'org.apache.iceberg.shaded.org.threeten.extra'

      classifier null
    }

    jar {
      enabled = false
    }
  }
}

project(':iceberg-spark3') {
  dependencies {
    compile project(':iceberg-api')
    compile project(':iceberg-common')
    compile project(':iceberg-core')
    compile project(':iceberg-data')
    compile project(':iceberg-orc')
    compile project(':iceberg-parquet')
    compile project(':iceberg-arrow')
    compile project(':iceberg-hive-metastore')
    compile project(':iceberg-spark')

    compileOnly "org.apache.avro:avro"
    compileOnly("org.apache.spark:spark-hive_2.12") {
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.apache.arrow'
    }

    testCompile project(path: ':iceberg-spark', configuration: 'testArtifacts')

    testCompile("org.apache.hadoop:hadoop-minicluster") {
      exclude group: 'org.apache.avro', module: 'avro'
    }
    testCompile project(path: ':iceberg-hive-metastore', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-api', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-data', configuration: 'testArtifacts')
  }

  test {
    // For vectorized reads
    // Allow unsafe memory access to avoid the costly check arrow does to check if index is within bounds
    systemProperty("arrow.enable_unsafe_memory_access", "true")
    // Disable expensive null check for every get(index) call.
    // Iceberg manages nullability checks itself instead of relying on arrow.
    systemProperty("arrow.enable_null_check_for_get", "false")

    // Vectorized reads need more memory
    maxHeapSize '2500m'
  }
}

project(":iceberg-spark3-extensions") {
  apply plugin: 'java'
  apply plugin: 'scala'
  apply plugin: 'antlr'

  configurations {
    /*
     The Gradle Antlr plugin erroneously adds both antlr-build and runtime dependencies to the runtime path. This
     bug https://github.com/gradle/gradle/issues/820 exists because older versions of Antlr do not have separate
     runtime and compile dependencies and they do not want to break backwards compatibility. So to only end up with
     the runtime dependency on the runtime classpath we remove the dependencies added by the plugin here. Then add
     the runtime dependency back to only the runtime configuration manually.
    */
    compile {
      extendsFrom = extendsFrom.findAll { it != configurations.antlr }
    }
  }

  dependencies {
    compileOnly project(':iceberg-spark3')

    compileOnly "org.scala-lang:scala-library"
    compileOnly("org.apache.spark:spark-hive_2.12") {
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.apache.arrow'
    }

    testCompile project(path: ':iceberg-api', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-hive-metastore', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-spark', configuration: 'testArtifacts')
    testCompile project(path: ':iceberg-spark3', configuration: 'testArtifacts')

    // Required because we remove antlr plugin dependencies from the compile configuration, see note above
    runtime "org.antlr:antlr4-runtime:4.7.1"
    antlr "org.antlr:antlr4:4.7.1"
  }

  generateGrammarSource {
    maxHeapSize = "64m"
    arguments += ['-visitor', '-package', 'org.apache.spark.sql.catalyst.parser.extensions']
  }
}

project(':iceberg-spark3-runtime') {
  apply plugin: 'com.github.johnrengelman.shadow'

  tasks.jar.dependsOn tasks.shadowJar

  configurations {
    compile {
      exclude group: 'org.apache.spark'
      // included in Spark
      exclude group: 'org.slf4j'
      exclude group: 'org.apache.commons'
      exclude group: 'commons-pool'
      exclude group: 'commons-codec'
      exclude group: 'org.xerial.snappy'
      exclude group: 'javax.xml.bind'
      exclude group: 'javax.annotation'
    }
  }

  dependencies {
    compile project(':iceberg-spark3')
    compile project(':iceberg-spark3-extensions')
    compile project(':iceberg-aws')
    compile 'org.apache.spark:spark-hive_2.11'
    compile(project(':iceberg-nessie')) {
      exclude group: 'com.google.code.findbugs', module: 'jsr305'
    }
  }

  shadowJar {
    configurations = [project.configurations.compile]

    zip64 true

    // include the LICENSE and NOTICE files for the shaded Jar
    from(projectDir) {
      include 'LICENSE'
      include 'NOTICE'
    }

    // Relocate dependencies to avoid conflicts
    relocate 'com.google', 'org.apache.iceberg.shaded.com.google'
    relocate 'com.fasterxml', 'org.apache.iceberg.shaded.com.fasterxml'
    relocate 'com.github.benmanes', 'org.apache.iceberg.shaded.com.github.benmanes'
    relocate 'org.checkerframework', 'org.apache.iceberg.shaded.org.checkerframework'
    relocate 'org.apache.avro', 'org.apache.iceberg.shaded.org.apache.avro'
    relocate 'avro.shaded', 'org.apache.iceberg.shaded.org.apache.avro.shaded'
    relocate 'com.thoughtworks.paranamer', 'org.apache.iceberg.shaded.com.thoughtworks.paranamer'
    relocate 'org.apache.parquet', 'org.apache.iceberg.shaded.org.apache.parquet'
    relocate 'shaded.parquet', 'org.apache.iceberg.shaded.org.apache.parquet.shaded'
    // relocate Avro's jackson dependency to share parquet-jackson locations
    relocate 'org.codehaus.jackson', 'org.apache.iceberg.shaded.org.apache.parquet.shaded.org.codehaus.jackson'
    relocate 'org.apache.orc', 'org.apache.iceberg.shaded.org.apache.orc'
    relocate 'io.airlift', 'org.apache.iceberg.shaded.io.airlift'
    // relocate Arrow and related deps to shade Iceberg specific version
    relocate 'io.netty.buffer', 'org.apache.iceberg.shaded.io.netty.buffer'
    relocate 'org.apache.arrow', 'org.apache.iceberg.shaded.org.apache.arrow'
    relocate 'com.carrotsearch', 'org.apache.iceberg.shaded.com.carrotsearch'
    relocate 'org.threeten.extra', 'org.apache.iceberg.shaded.org.threeten.extra'

    classifier null
  }

  jar {
    enabled = false
  }
}

project(':iceberg-pig') {
  dependencies {
    compile project(':iceberg-api')
    compile project(':iceberg-common')
    compile project(':iceberg-core')
    compile project(':iceberg-parquet')

    compileOnly("org.apache.pig:pig") {
      exclude group: "junit", module: "junit"
    }
    compileOnly("org.apache.hadoop:hadoop-mapreduce-client-core")
    compileOnly("org.apache.hadoop:hadoop-client") {
      exclude group: 'org.apache.avro', module: 'avro'
    }

    testCompile("org.apache.hadoop:hadoop-minicluster") {
      exclude group: 'org.apache.avro', module: 'avro'
    }
  }
}

project(':iceberg-nessie') {
  apply plugin: 'org.projectnessie'

  dependencies {
    compile project(':iceberg-core')
    compile project(path: ':iceberg-bundled-guava', configuration: 'shadow')
    compile "org.projectnessie:nessie-client"
    quarkusAppRunnerConfig "org.projectnessie:nessie-quarkus:0.2.1"

    compileOnly "org.apache.hadoop:hadoop-common"

    testCompile project(path: ':iceberg-api', configuration: 'testArtifacts')
  }
  quarkusAppRunnerProperties {
    props = ["quarkus.http.test-port": 0]
  }
  tasks.getByName("quarkus-start").dependsOn("compileTestJava")
  tasks.test.dependsOn("quarkus-start").finalizedBy("quarkus-stop")

}

@Memoized
boolean isVersionFileExists() {
  return file('version.txt').exists()
}

@Memoized
String getVersionFromFile() {
  return file('version.txt').text.trim()
}

String getProjectVersion() {
  if (isVersionFileExists()) {
    return getVersionFromFile()
  }

  try {
    return gitVersion()
  } catch (NullPointerException e) {
    throw new Exception("Neither version.txt nor git version exists")
  }
}

String getJavadocVersion() {
  if (isVersionFileExists()) {
    return getVersionFromFile()
  }

  try {
    // use the branch name in place of version in Javadoc
    return versionDetails().branchName
  } catch (NullPointerException e) {
    throw new Exception("Neither version.txt nor git version exists")
  }
}

apply from: 'baseline.gradle'
apply from: 'deploy.gradle'
apply from: 'tasks.gradle'

