/*
 * 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.5.0",
  bcpkix: "1.54",
  easymock: "3.4",
  jackson: "2.6.3",
  jetty: "9.2.15.v20160210",
  jersey: "2.22.2",
  jopt: "4.9",
  junit: "4.12",
  lz4: "1.3.0",
  metrics: "2.2.0",
  powermock: "1.6.4",
  reflections: "0.9.10",
  rocksDB: "4.4.1",
  scalaTest: "2.2.6",
  scalaParserCombinators: "1.0.4",
  scoverage: "1.1.1",
  slf4j: "1.7.21",
  snappy: "1.1.2.4",
  zkclient: "0.8",
  zookeeper: "3.4.6",
]

// Add Scala version
def defaultScala210Version = '2.10.6'
def defaultScala211Version = '2.11.8'
if (hasProperty('scalaVersion')) {
  if (scalaVersion == '2.10') {
    versions["scala"] = defaultScala210Version
  } else if (scalaVersion == '2.11') {
    versions["scala"] = defaultScala211Version
  } 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",
  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"
]
