/*
 * 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' ]
  // Available if -PscalaVersion is used, this is necessary because Scala 2.12 requires Java 8 while Kafka is usually
  // built with Java 7
  availableScalaVersions = [ '2.11', '2.12' ]
}

// Add Scala version
def defaultScala211Version = '2.11.12'
def defaultScala212Version = '2.12.4'
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.0",
  apacheds: "2.0.0-M24",
  argparse4j: "0.7.0",
  bcpkix: "1.59",
  easymock: "3.6",
  jackson: "2.9.6",
  jetty: "9.2.24.v20180105",
  jersey: "2.25.1",
  jmh: "1.20",
  log4j: "1.2.17",
  scalaLogging: "3.8.0",
  jaxb: "2.3.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.1",
  kafka_0110: "0.11.0.2",
  kafka_10: "1.0.1",
  lz4: "1.4.1",
  metrics: "2.2.0",
  // PowerMock 1.x doesn't support Java 9, so use PowerMock 2.0.0 beta
  powermock: "2.0.0-beta.5",
  reflections: "0.9.11",
  rocksDB: "5.7.3",
  scalatest: "3.0.5",
  scoverage: "1.3.1",
  slf4j: "1.7.25",
  snappy: "1.1.7.1",
  zkclient: "0.10",
  zookeeper: "3.4.10",
  jfreechart: "1.0.0",
  mavenArtifact: "3.5.3"
]

libs += [
  activation: "javax.activation:activation:$versions.activation",
  argparse4j: "net.sourceforge.argparse4j:argparse4j:$versions.argparse4j",
  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",
  bcpkix: "org.bouncycastle:bcpkix-jdk15on:$versions.bcpkix",
  easymock: "org.easymock:easymock:$versions.easymock",
  jacksonDatabind: "com.fasterxml.jackson.core:jackson-databind:$versions.jackson",
  jacksonJaxrsJsonProvider: "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:$versions.jackson",
  jaxbApi: "javax.xml.bind:jaxb-api:$versions.jaxb",
  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",
  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",
  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",
  log4j: "log4j:log4j:$versions.log4j",
  lz4: "org.lz4:lz4-java:$versions.lz4",
  metrics: "com.yammer.metrics:metrics-core:$versions.metrics",
  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"
]
