/*
 * 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.60",
  httpclient: "4.5.7",
  easymock: "4.0.2",
  jackson: "2.10.0",
  jetty: "9.4.14.v20181114",
  jersey: "2.27",
  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.12",
  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",
  lz4: "1.5.0",
  mavenArtifact: "3.6.0",
  metrics: "2.2.0",
  mockito: "2.23.4",
  powermock: "2.0.0",
  reflections: "0.9.11",
  rocksDB: "5.15.10",
  scalatest: "3.0.5",
  scoverage: "1.3.1",
  slf4j: "1.7.25",
  snappy: "1.1.7.2",
  zkclient: "0.11",
  zookeeper: "3.4.13",
  zstd: "1.3.8-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",
  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",
  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"
]
