
buildscript {
    dependencies {
        // findBugs needs a newer version of Guava in the buildscript.
        // otherwise it throws an exception
        classpath "com.google.guava:guava:28.2-jre"
    }
}

plugins {
    id 'java'
    id 'application'
    id 'idea'
    id 'checkstyle'
    id 'jacoco'
    id "com.github.spotbugs" version "3.0.0"
    id 'org.hidetake.swagger.generator' version '2.16.0'
    id "io.swagger.core.v3.swagger-gradle-plugin" version "2.1.2"

    // https://github.com/nebula-plugins/gradle-ospackage-plugin/wiki
    id "nebula.ospackage" version "8.3.0"
    id 'nebula.ospackage-application' version "8.3.0"
    id 'com.google.cloud.tools.jib' version '2.2.0'
}

group 'org.apache.cassandra'
version project.version

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

// Take the application out once we're running via Cassandra
mainClassName = "org.apache.cassandra.sidecar.CassandraSidecarDaemon"
applicationName = 'cassandra-sidecar'

// Config file location should be in file:/// format for local files,
def confFile = "file:" + File.separator + File.separator + "APP_HOME_TO_REPLACE/conf/sidecar.yaml"

applicationDefaultJvmArgs = ["-Dsidecar.logdir=./logs",
                             "-Dsidecar.config=" + confFile,
                             "-Dlogback.configurationFile=./conf/logback.xml",
                             "-Dvertx.logger-delegate-factory-class-name=io.vertx.core.logging.SLF4JLogDelegateFactory",
                             "-javaagent:APP_HOME_TO_REPLACE/agents/jolokia-jvm-1.6.0-agent.jar=port=7777,host=localhost"]
startScripts {
    doLast {
        unixScript.text = unixScript.text.replace("APP_HOME_TO_REPLACE", "\${APP_HOME}")
    }
}

run {
    confFile = "file:" + File.separator + File.separator + "$projectDir/conf/sidecar.yaml"
    jvmArgs = ["-Dsidecar.logdir=./logs",
                                 "-Dsidecar.config=" + confFile,
                                 "-Dlogback.configurationFile=./conf/logback.xml",
                                 "-Dvertx.logger-delegate-factory-class-name=io.vertx.core.logging.SLF4JLogDelegateFactory",
                                 "-javaagent:$projectDir/agents/jolokia-jvm-1.6.0-agent.jar=port=7777,host=localhost"]
}

sourceSets {
    integrationTest {
        java {
            compileClasspath += main.output + test.output
            runtimeClasspath += main.output + test.output
            srcDir file('src/integration/java')
        }
        resources {
            srcDirs = [main.resources, "src/integration/resources"]
        }
    }
}

configurations {
    jolokia

    integrationTestCompile.extendsFrom testCompile
    integrationTestRuntime.extendsFrom testRuntime
}

dependencies {
    compile 'io.vertx:vertx-web:3.8.5'
    compile 'io.vertx:vertx-dropwizard-metrics:3.8.5'
    compile 'io.vertx:vertx-web-client:3.8.5'

    compile 'io.swagger.core.v3:swagger-jaxrs2:2.1.0'
    compile 'org.jboss.resteasy:resteasy-vertx:3.1.0.Final'
    compile group: 'org.jboss.spec.javax.servlet', name: 'jboss-servlet-api_4.0_spec', version: '2.0.0.Final'

    // Trying to be exactly compatible with Cassandra's deps
    compile 'org.slf4j:slf4j-api:1.7.25'
    compile 'ch.qos.logback:logback-core:1.2.3'
    compile 'ch.qos.logback:logback-classic:1.2.3'

    compile 'com.datastax.cassandra:cassandra-driver-core:3.6+'
    compile group: 'com.google.inject', name: 'guice', version: '4.2.2'

    compile group: 'org.apache.commons', name: 'commons-configuration2', version: '2.7'
    compile 'org.webjars:swagger-ui:3.10.0'

    runtime group: 'commons-beanutils', name: 'commons-beanutils', version: '1.9.3'
    runtime group: 'org.yaml', name: 'snakeyaml', version: '1.26'

    jolokia 'org.jolokia:jolokia-jvm:1.6.0:agent'

    testCompile group: 'org.cassandraunit', name: 'cassandra-unit-shaded', version: '3.3.0.2'
    testCompile 'com.datastax.cassandra:cassandra-driver-core:3.6.+:tests'
    testCompile 'org.apache.commons:commons-exec:1.3+'
    testCompile group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
    testCompile group: 'io.vertx', name: 'vertx-junit5', version: '3.8.5'

    integrationTestCompile group: 'com.datastax.oss.simulacron', name: 'simulacron-driver-3x', version: '0.8.10'
}

task copyCodeStyle(type: Copy) {
    from "ide/idea/codeStyleSettings.xml"
    into ".idea"
}

// Lets copy the distributions from build/install directory to /bin and /lib
// directories to be aligned with C* distribution format
task copyDist(type: Copy) {
    from "$buildDir/install/$applicationName"
    into "$projectDir"
}

task copyJolokia(type: Copy) {
    from configurations.jolokia
    into "$projectDir/src/main/dist/agents"
}

// Lets clean distribution directories along with default build directories.
clean.doLast {
    ["agents", "bin", "conf", "lib"].each {
        println "Deleting directory $projectDir/$it"
        delete "$projectDir/$it"
    }
    println "Deleting generated docs $projectDir/src/main/resources/docs"
    delete "$projectDir/src/main/resources/docs"
}

test {
    useJUnitPlatform()
    systemProperty "javax.net.ssl.trustStore", "$projectDir/src/test/resources/certs/ca.p12"
    systemProperty "javax.net.ssl.trustStorePassword", "password"
    reports {
        junitXml.enabled = true
        html.enabled = true
    }
}

task integrationTest(type: Test) {
    jacoco {
        enabled = false
    }
    useJUnitPlatform()
    testClassesDirs = sourceSets.integrationTest.output.classesDirs
    classpath = sourceSets.integrationTest.runtimeClasspath
    shouldRunAfter test
}

// copy the user documentation to the final build
task copyDocs(type: Copy, dependsOn: ':docs:asciidoctor') {
    from(tasks.getByPath(":docs:asciidoctor").outputs) {
        include "**/*.html"
    }
    into "build/docs/"
    exclude "tmp"
}

checkstyle {
    toolVersion '7.8.1'
    configFile file("checkstyle.xml")
}

spotbugs {
    toolVersion = '4.0.0'
    excludeFilter = file("src/main/resources/spotbugs-exclude.xml")
}

tasks.withType(com.github.spotbugs.SpotBugsTask) {
    reports.xml.enabled = false
    reports.html.enabled = true
}

/**
 * General configuration for linux packages.
 * Can be overridden in the buildRpm and buildDeb configuration
 * We can put dependencies here, such as java, but unfortunately since java is distributed
 * in an inconsistent manner depending on the version you want (8 vs 11) we can't include Java
 * as a requirement without the install breaking if you want to use a different version
 */
ospackage {
    packageName = "cassandra-sidecar"
    version = project.version
    // ospackage puts packages into /opt/[package] by default
    // which is _technically_ the right spot for packages
    link("/usr/local/bin/cassandra-sidecar", "/opt/cassandra-sidecar/bin/cassandra-sidecar")
    license "Apache License 2.0"
    description "Sidecar Management Tool for Apache Cassandra"
    os = LINUX
    user "root"
}

buildRpm {
    group = "build"
}

buildDeb {
    group = "build"
}

applicationDistribution.from("LICENSE.txt") {
    into ""
}

// This task is defined by swagger-gradle-plugin
// Resolves project openAPI specification and saves
// the result in JSON during the build process.
resolve {
    outputFileName = 'api'
    outputFormat = 'JSON'
    prettyPrint = 'TRUE'
    classpath = sourceSets.main.runtimeClasspath
    resourcePackages = ['org.apache.cassandra.sidecar']
    outputDir = file('build/generated/swagger')
}

// copyDist gets called on every build
copyDist.dependsOn installDist, copyJolokia
check.dependsOn checkstyleMain, checkstyleTest, integrationTest, jacocoTestReport
build.dependsOn copyDist, generateReDoc, generateSwaggerUI, copyJolokia, copyDocs
run.dependsOn build
