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

ext {
  versions = [:]
  libs = [:]
  
  // Enabled by default when commands like `testAll` are invoked
  defaultScalaVersions = [ '2.11', '2.12' ]
  // Available if -PscalaVersion is used. This is useful when we want to support a Scala version that has
  // a higher minimum Java requirement than Kafka. This was previously the case for Scala 2.12 and Java 7.
  availableScalaVersions = [ '2.11', '2.12' ]
}

// Add Scala version
def defaultScala211Version = '2.11.12'
def defaultScala212Version = '2.12.8'
if (hasProperty('scalaVersion')) {
  if (scalaVersion == '2.11') {
    versions["scala"] = defaultScala211Version
  } else if (scalaVersion == '2.12') {
    versions["scala"] = defaultScala212Version
  } else {
    versions["scala"] = scalaVersion
  }
} else {
  versions["scala"] = defaultScala211Version
}

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

versions += [
  activation: "1.1.1",
  apacheda: "1.0.2",
  apacheds: "2.0.0-M24",
  argparse4j: "0.7.0",
  bcpkix: "1.61",
  checkstyle: "8.20",
  gradle: "5.4.1",
  gradleVersionsPlugin: "0.21.0",
  grgit: "3.1.1",
  httpclient: "4.5.8",
  easymock: "4.0.2",
  jackson: "2.10.0",
  jacoco: "0.8.3",
  jetty: "9.4.18.v20190429",
  jersey: "2.28",
  jmh: "1.21",
  hamcrest: "2.1",
  log4j: "1.2.17",
  scalaLogging: "3.9.0",
  jaxb: "2.3.0",
  jaxrs: "2.1.1",
  jfreechart: "1.0.0",
  jopt: "5.0.4",
  junit: "4.13-beta-2",
  kafka_0100: "0.10.0.1",
  kafka_0101: "0.10.1.1",
  kafka_0102: "0.10.2.2",
  kafka_0110: "0.11.0.3",
  kafka_10: "1.0.2",
  kafka_11: "1.1.1",
  kafka_20: "2.0.1",
  kafka_21: "2.1.1",
  kafka_22: "2.2.0",
  lz4: "1.6.0",
  mavenArtifact: "3.6.1",
  metrics: "2.2.0",
  mockito: "2.27.0",
  owaspDepCheckPlugin: "4.0.2",
  powermock: "2.0.2",
  reflections: "0.9.11",
  rocksDB: "5.18.3",
  scalafmt: "1.5.1",
  scalatest: "3.0.7",
  scoverage: "1.3.1",
  scoveragePlugin: "2.5.0",
  shadowPlugin: "4.0.4",
  slf4j: "1.7.26",
  snappy: "1.1.7.3",
  spotbugs: "3.1.12",
  spotbugsPlugin: "1.6.9",
  spotlessPlugin: "3.23.0",
  zkclient: "0.11",
  zookeeper: "3.4.14",
  zstd: "1.4.0-1"
]

libs += [
  activation: "javax.activation:activation:$versions.activation",
  apacheda: "org.apache.directory.api:api-all:$versions.apacheda",
  apachedsCoreApi: "org.apache.directory.server:apacheds-core-api:$versions.apacheds",
  apachedsInterceptorKerberos: "org.apache.directory.server:apacheds-interceptor-kerberos:$versions.apacheds",
  apachedsProtocolShared: "org.apache.directory.server:apacheds-protocol-shared:$versions.apacheds",
  apachedsProtocolKerberos: "org.apache.directory.server:apacheds-protocol-kerberos:$versions.apacheds",
  apachedsProtocolLdap: "org.apache.directory.server:apacheds-protocol-ldap:$versions.apacheds",
  apachedsLdifPartition: "org.apache.directory.server:apacheds-ldif-partition:$versions.apacheds",
  apachedsMavibotPartition: "org.apache.directory.server:apacheds-mavibot-partition:$versions.apacheds",
  apachedsJdbmPartition: "org.apache.directory.server:apacheds-jdbm-partition:$versions.apacheds",
  argparse4j: "net.sourceforge.argparse4j:argparse4j:$versions.argparse4j",
  bcpkix: "org.bouncycastle:bcpkix-jdk15on:$versions.bcpkix",
  easymock: "org.easymock:easymock:$versions.easymock",
  jacksonDatabind: "com.fasterxml.jackson.core:jackson-databind:$versions.jackson",
  jacksonDataformatCsv: "com.fasterxml.jackson.dataformat:jackson-dataformat-csv:$versions.jackson",
  jacksonModuleScala: "com.fasterxml.jackson.module:jackson-module-scala_$versions.baseScala:$versions.jackson",
  jacksonJDK8Datatypes: "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$versions.jackson",
  jacksonJaxrsJsonProvider: "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:$versions.jackson",
  jaxbApi: "javax.xml.bind:jaxb-api:$versions.jaxb",
  jaxrsApi: "javax.ws.rs:javax.ws.rs-api:$versions.jaxrs",
  jettyServer: "org.eclipse.jetty:jetty-server:$versions.jetty",
  jettyClient: "org.eclipse.jetty:jetty-client:$versions.jetty",
  jettyServlet: "org.eclipse.jetty:jetty-servlet:$versions.jetty",
  jettyServlets: "org.eclipse.jetty:jetty-servlets:$versions.jetty",
  jerseyContainerServlet: "org.glassfish.jersey.containers:jersey-container-servlet:$versions.jersey",
  jerseyHk2: "org.glassfish.jersey.inject:jersey-hk2:$versions.jersey",
  jmhCore: "org.openjdk.jmh:jmh-core:$versions.jmh",
  jmhCoreBenchmarks: "org.openjdk.jmh:jmh-core-benchmarks:$versions.jmh",
  jmhGeneratorAnnProcess: "org.openjdk.jmh:jmh-generator-annprocess:$versions.jmh",
  joptSimple: "net.sf.jopt-simple:jopt-simple:$versions.jopt",
  junit: "junit:junit:$versions.junit",
  hamcrest: "org.hamcrest:hamcrest:$versions.hamcrest",
  kafkaStreams_0100: "org.apache.kafka:kafka-streams:$versions.kafka_0100",
  kafkaStreams_0101: "org.apache.kafka:kafka-streams:$versions.kafka_0101",
  kafkaStreams_0102: "org.apache.kafka:kafka-streams:$versions.kafka_0102",
  kafkaStreams_0110: "org.apache.kafka:kafka-streams:$versions.kafka_0110",
  kafkaStreams_10: "org.apache.kafka:kafka-streams:$versions.kafka_10",
  kafkaStreams_11: "org.apache.kafka:kafka-streams:$versions.kafka_11",
  kafkaStreams_20: "org.apache.kafka:kafka-streams:$versions.kafka_20",
  kafkaStreams_21: "org.apache.kafka:kafka-streams:$versions.kafka_21",
  kafkaStreams_22: "org.apache.kafka:kafka-streams:$versions.kafka_22",
  log4j: "log4j:log4j:$versions.log4j",
  lz4: "org.lz4:lz4-java:$versions.lz4",
  metrics: "com.yammer.metrics:metrics-core:$versions.metrics",
  mockitoCore: "org.mockito:mockito-core:$versions.mockito",
  powermockJunit4: "org.powermock:powermock-module-junit4:$versions.powermock",
  powermockEasymock: "org.powermock:powermock-api-easymock:$versions.powermock",
  reflections: "org.reflections:reflections:$versions.reflections",
  rocksDBJni: "org.rocksdb:rocksdbjni:$versions.rocksDB",
  scalaLibrary: "org.scala-lang:scala-library:$versions.scala",
  scalaLogging: "com.typesafe.scala-logging:scala-logging_$versions.baseScala:$versions.scalaLogging",
  scalaReflect: "org.scala-lang:scala-reflect:$versions.scala",
  scalatest: "org.scalatest:scalatest_$versions.baseScala:$versions.scalatest",
  scoveragePlugin: "org.scoverage:scalac-scoverage-plugin_$versions.baseScala:$versions.scoverage",
  scoverageRuntime: "org.scoverage:scalac-scoverage-runtime_$versions.baseScala:$versions.scoverage",
  slf4jApi: "org.slf4j:slf4j-api:$versions.slf4j",
  slf4jlog4j: "org.slf4j:slf4j-log4j12:$versions.slf4j",
  snappy: "org.xerial.snappy:snappy-java:$versions.snappy",
  zkclient: "com.101tec:zkclient:$versions.zkclient",
  zookeeper: "org.apache.zookeeper:zookeeper:$versions.zookeeper",
  jfreechart: "jfreechart:jfreechart:$versions.jfreechart",
  mavenArtifact: "org.apache.maven:maven-artifact:$versions.mavenArtifact",
  zstd: "com.github.luben:zstd-jni:$versions.zstd",
  httpclient: "org.apache.httpcomponents:httpclient:$versions.httpclient"
]
