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

plugins {
    id 'eclipse'
    id 'maven'
    id 'org.scoverage'
    id 'scala'
}

ext.dockerImageName = 'scala'
apply from: '../../gradle/docker.gradle'

project.archivesBaseName = "openwhisk-common"

dependencies {
    compile "org.scala-lang:scala-library:${gradle.scala.version}"

    compile ("com.github.pureconfig:pureconfig_${gradle.scala.depVersion}:0.11.1") {
        exclude group: 'org.scala-lang', module: 'scala-compiler'
        exclude group: 'org.scala-lang', module: 'scala-reflect'
    }
    compile "io.spray:spray-json_${gradle.scala.depVersion}:1.3.5"
    compile "com.lihaoyi:fastparse_${gradle.scala.depVersion}:2.1.3"

    compile "com.typesafe.akka:akka-actor_${gradle.scala.depVersion}:${gradle.akka.version}"
    compile "com.typesafe.akka:akka-stream_${gradle.scala.depVersion}:${gradle.akka.version}"
    compile "com.typesafe.akka:akka-slf4j_${gradle.scala.depVersion}:${gradle.akka.version}"

    compile "com.typesafe.akka:akka-http-core_${gradle.scala.depVersion}:${gradle.akka_http.version}"
    compile "com.typesafe.akka:akka-http-spray-json_${gradle.scala.depVersion}:${gradle.akka_http.version}"

    compile "com.lightbend.akka:akka-stream-alpakka-file_${gradle.scala.depVersion}:1.1.2"

    compile "ch.qos.logback:logback-classic:1.2.3"
    compile "org.slf4j:jcl-over-slf4j:1.7.25"
    compile "org.slf4j:log4j-over-slf4j:1.7.25"
    compile "commons-codec:commons-codec:1.9"
    compile "commons-io:commons-io:2.6"
    compile "commons-collections:commons-collections:3.2.2"
    compile "org.apache.kafka:kafka-clients:2.4.0"
    compile "org.apache.httpcomponents:httpclient:4.5.5"
    compile "com.fasterxml.uuid:java-uuid-generator:3.1.3"
    compile "com.github.ben-manes.caffeine:caffeine:2.6.2"
    compile "com.google.code.findbugs:jsr305:3.0.2"
    compile "io.fabric8:kubernetes-client:${gradle.kube_client.version}"

    //metrics
    compile ("io.kamon:kamon-core_${gradle.scala.depVersion}:2.1.12") {
        exclude group: 'com.lihaoyi'
    }
    compile "io.kamon:kamon-statsd_${gradle.scala.depVersion}:2.1.12"
    compile ("io.kamon:kamon-system-metrics_${gradle.scala.depVersion}:2.1.12") {
        exclude group: 'io.kamon', module: 'sigar-loader'
    }
    compile "io.kamon:kamon-prometheus_${gradle.scala.depVersion}:2.1.12"
    compile "io.kamon:kamon-datadog_${gradle.scala.depVersion}:2.1.12"

    // for etcd
    compile("com.ibm.etcd:etcd-java:0.0.13")

    //tracing support
    compile "io.opentracing:opentracing-api:0.31.0"
    compile "io.opentracing:opentracing-util:0.31.0"
    compile ("io.opentracing.brave:brave-opentracing:0.31.0") {
        exclude group: 'io.zipkin.brave', module:'brave-tests'
    }
    compile "io.zipkin.reporter2:zipkin-sender-okhttp3:2.6.1"
    compile "io.zipkin.reporter2:zipkin-reporter:2.6.1"

    compile "io.reactivex:rxjava:1.3.8"
    compile "io.reactivex:rxjava-reactive-streams:1.2.1"
    compile "com.microsoft.azure:azure-cosmosdb:2.6.2"

    compile "com.sksamuel.elastic4s:elastic4s-http_${gradle.scala.depVersion}:6.7.4"
    //for mongo
    compile "org.mongodb.scala:mongo-scala-driver_${gradle.scala.depVersion}:2.7.0"

    compile ("com.lightbend.akka:akka-stream-alpakka-s3_${gradle.scala.depVersion}:1.1.2") {
        exclude group: 'org.apache.httpcomponents' //Not used as alpakka uses akka-http
        exclude group: 'com.fasterxml.jackson.core'
        exclude group: 'com.fasterxml.jackson.dataformat'
    }
    compile "com.amazonaws:aws-java-sdk-cloudfront:1.11.517"

    compile ("com.azure:azure-storage-blob:12.7.0") {
        exclude group: "com.azure", module: "azure-core-test"
    }
}

configurations {
    compile {
        exclude group: 'commons-logging'
        exclude group: 'log4j'
    }
}
