/*
 * 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 = [:]
}

versions += [
  apacheda: "1.0.0-M33",
  apacheds: "2.0.0-M21",
  argparse4j: "0.7.0",
  bcpkix: "1.55",
  easymock: "3.4",
  jackson: "2.8.5",
  jetty: "9.2.15.v20160210",
  jersey: "2.24",
  log4j: "1.2.17",
  jopt: "5.0.3",
  junit: "4.12",
  lz4: "1.3.0",
  metrics: "2.2.0",
  powermock: "1.6.4",
  reflections: "0.9.10",
  rocksDB: "5.0.1",
  scalaTest: "3.0.1",
  scalaParserCombinators: "1.0.4",
  scoverage: "1.3.0",
  slf4j: "1.7.21",
  snappy: "1.1.2.6",
  zkclient: "0.10",
  zookeeper: "3.4.9",
  jfreechart: "1.0.0",
]

// Add Scala version
def defaultScala210Version = '2.10.6'
def defaultScala211Version = '2.11.8'
def defaultScala212Version = '2.12.1'
if (hasProperty('scalaVersion')) {
  if (scalaVersion == '2.10') {
    versions["scala"] = defaultScala210Version
  } else if (scalaVersion == '2.11') {
    versions["scala"] = defaultScala211Version
  } else if (scalaVersion == '2.12') {
    versions["scala"] = defaultScala212Version
  } else {
    versions["scala"] = scalaVersion
  }
} else {
  versions["scala"] = defaultScala210Version
}

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

libs += [
  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",
  jettyServer: "org.eclipse.jetty:jetty-server:$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",
  junit: "junit:junit:$versions.junit",
  log4j: "log4j:log4j:$versions.log4j",
  joptSimple: "net.sf.jopt-simple:jopt-simple:$versions.jopt",
  lz4: "net.jpountz.lz4:lz4:$versions.lz4",
  metrics: "com.yammer.metrics:metrics-core:$versions.metrics",
  powermock: "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",
  scala: "org.scala-lang:scala-library:$versions.scala",
  scalaCompiler: "org.scala-lang:scala-compiler:$versions.scala",
  scalaTest: "org.scalatest:scalatest_$versions.baseScala:$versions.scalaTest",
  scalaParserCombinators: "org.scala-lang.modules:scala-parser-combinators_$versions.baseScala:$versions.scalaParserCombinators",
  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"
]
