/*
 * 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.0.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.0.3") {
        exclude group: 'com.lihaoyi'
    }
    compile "io.kamon:kamon-statsd_${gradle.scala.depVersion}:2.0.0"
    compile ("io.kamon:kamon-system-metrics_${gradle.scala.depVersion}:2.0.1") {
        exclude group: 'io.kamon', module: 'sigar-loader'
    }
    compile "io.kamon:kamon-prometheus_${gradle.scala.depVersion}:2.0.1"
    compile "io.kamon:kamon-datadog_${gradle.scala.depVersion}:2.0.1"

    //for mesos
    compile "com.adobe.api.platform.runtime:mesos-actor:0.0.17"

    //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.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"
}

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