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

// This file contains all of the dependencies required for the build.
// Centrally locating all of the dependencies ensures each subproject
// uses the same dependency version for all dependencies used.

ext {
  versions = [:]
  libs = [:]
}

versions += [
    async          : "1.4.1",
    avro           : "1.8.2",
    checkstyle     : "8.29",
    clojure        : "1.9.0",
    clojureToolsCli: "0.4.1",
    commonsIo      : "2.6",
    errorProne     : "2.3.3",
    errorProneJavac: "9+181-r4173-1",
    gradle         : "6.2.2",
    guava          : "29.0-jre",
    hadoop         : "3.2.1",
    hamcrest       : "2.2",
    hdrhistogram   : "2.1.12",
    hive           : "3.1.2",
    httpClient     : "4.5.12",
    jepsen         : "0.1.5",
    jetty          : "9.4.28.v20200408",
    jmh            : "1.23",
    jsr305         : "3.0.2",
    junit          : "4.13",
    log4j          : "2.15.0",
    micrometer     : "1.5.1",
    mockito        : "3.3.3",
    murmur         : "1.0.0",
    netty          : "4.1.49.Final",
    osdetector     : "1.6.2",
    parquet        : "1.11.0",
    protobuf       : "3.11.4",
    ranger         : "2.0.0",
    scala          : "2.11.12",
    scalatest      : "3.0.8",
    scopt          : "3.7.1",
    slf4j          : "1.7.30",
    spark          : "2.4.5",
    spotBugs       : "4.0.0-beta1",
    yetus          : "0.12.0"
]

// Log the Gradle version used vs defined.
if (gradle.gradleVersion != versions.gradle) {
  println "Using gradle version $gradle.gradleVersion (Build defines $versions.gradle)"
}

// Add base Scala version
versions["scalaBase"] = versions.scala.substring(0, versions.scala.lastIndexOf("."))

// Add base Spark version
versions["sparkBase"] = versions.spark.substring(0, versions.spark.indexOf("."))

libs += [
    async                : "com.stumbleupon:async:$versions.async",
    avro                 : "org.apache.avro:avro:$versions.avro",
    clojure              : "org.clojure:clojure:$versions.clojure",
    clojureToolsCli      : "org.clojure:tools.cli:$versions.clojureToolsCli",
    commonsIo            : "commons-io:commons-io:$versions.commonsIo",
    errorProne           : "com.google.errorprone:error_prone_core:$versions.errorProne",
    errorProneJavac      : "com.google.errorprone:javac:$versions.errorProneJavac",
    guava                : "com.google.guava:guava:$versions.guava",
    hadoopClient         : "org.apache.hadoop:hadoop-client:$versions.hadoop",
    hadoopCommon         : "org.apache.hadoop:hadoop-common:$versions.hadoop",
    hadoopMiniCluster    : "org.apache.hadoop:hadoop-minicluster:$versions.hadoop",
    hadoopMRClientCommon : "org.apache.hadoop:hadoop-mapreduce-client-common:$versions.hadoop",
    hadoopMRClientCore   : "org.apache.hadoop:hadoop-mapreduce-client-core:$versions.hadoop",
    hamcrest             : "org.hamcrest:hamcrest:$versions.hamcrest",
    hdrhistogram         : "org.hdrhistogram:HdrHistogram:$versions.hdrhistogram",
    hiveMetastore        : "org.apache.hive:hive-metastore:$versions.hive",
    hiveTestUtils        : "org.apache.hive:hive-testutils:$versions.hive",
    httpClient           : "org.apache.httpcomponents:httpclient:$versions.httpClient",
    httpMime             : "org.apache.httpcomponents:httpmime:$versions.httpClient",
    jepsen               : "jepsen:jepsen:$versions.jepsen",
    jetty                : "org.eclipse.jetty:jetty-server:$versions.jetty",
    jettyServlet         : "org.eclipse.jetty:jetty-servlet:$versions.jetty",
    jmhCore              : "org.openjdk.jmh:jmh-core:$versions.jmh",
    jmhGenerator         : "org.openjdk.jmh:jmh-generator-annprocess:$versions.jmh",
    jsr305               : "com.google.code.findbugs:jsr305:$versions.jsr305",
    junit                : "junit:junit:$versions.junit",
    log4j                : "org.apache.logging.log4j:log4j-1.2-api:$versions.log4j",
    log4jSlf4jImpl       : "org.apache.logging.log4j:log4j-slf4j-impl:$versions.log4j",
    micrometerCore       : "io.micrometer:micrometer-core:$versions.micrometer",
    mockitoCore          : "org.mockito:mockito-core:$versions.mockito",
    murmur               : "com.sangupta:murmur:$versions.murmur",
    netty                : "io.netty:netty-all:$versions.netty",
    osdetector           : "com.google.gradle:osdetector-gradle-plugin:$versions.osdetector",
    parquetHadoop        : "org.apache.parquet:parquet-hadoop:$versions.parquet",
    protobufJava         : "com.google.protobuf:protobuf-java:$versions.protobuf",
    protobufJavaUtil     : "com.google.protobuf:protobuf-java-util:$versions.protobuf",
    protoc               : "com.google.protobuf:protoc:$versions.protobuf",
    rangerPlugin         : "org.apache.ranger:ranger-plugins-common:$versions.ranger",
    scalaLibrary         : "org.scala-lang:scala-library:$versions.scala",
    scalap               : "org.scala-lang:scalap:$versions.scala",
    scalatest            : "org.scalatest:scalatest_$versions.scalaBase:$versions.scalatest",
    scopt                : "com.github.scopt:scopt_$versions.scalaBase:$versions.scopt",
    slf4jApi             : "org.slf4j:slf4j-api:$versions.slf4j",
    sparkAvro            : "org.apache.spark:spark-avro_$versions.scalaBase:$versions.spark",
    sparkCore            : "org.apache.spark:spark-core_$versions.scalaBase:$versions.spark",
    sparkSql             : "org.apache.spark:spark-sql_$versions.scalaBase:$versions.spark",
    sparkSqlTest         : "org.apache.spark:spark-sql_$versions.scalaBase:$versions.spark:tests",
    yetusAnnotations     : "org.apache.yetus:audience-annotations:$versions.yetus"
]
