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