group 'com.r3cev.prototyping'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'application'
apply plugin: 'project-report'
apply plugin: QuasarPlugin

allprojects {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    tasks.withType(JavaCompile) {
        options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
    }
}

buildscript {
    ext.kotlin_version = '1.0.2'
    ext.quasar_version = '0.7.5'
    ext.asm_version = '0.5.3'
    ext.artemis_version = '1.3.0'
    ext.jetty_version = '9.1.1.v20140108'
    ext.jersey_version = '2.22.2'
	ext.jolokia_version = '2.0.0-M1'

    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}


repositories {
    mavenLocal()
    mavenCentral()
    maven {
        url 'http://oss.sonatype.org/content/repositories/snapshots'
    }
    jcenter()
}

sourceSets {
    integrationTest {
        kotlin {
            compileClasspath += main.output + test.output
            runtimeClasspath += main.output + test.output
            srcDir file('src/integration-test/kotlin')
        }
    }
}

//noinspection GroovyAssignabilityCheck
configurations {
    // we don't want isolated.jar in classPath, since we want to test jar being dynamically loaded as an attachment
    runtime.exclude module: 'isolated'

    integrationTestCompile.extendsFrom testCompile
    integrationTestRuntime.extendsFrom testRuntime
}

// This is required for quasar. I think.
applicationDefaultJvmArgs = ["-javaagent:${configurations.quasar.singleFile}"]
// Needed by the :startScripts task
mainClassName = 'com.r3corda.demos.TraderDemoKt'

// To find potential version conflicts, run "gradle htmlDependencyReport" and then look in
// build/reports/project/dependencies/index.html for green highlighted parts of the tree.

dependencies {
    compile project(':node')

    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
    compile "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
    compile "org.jetbrains.kotlinx:kotlinx-support-jdk8:0.1"

    // Unit testing helpers.
    testCompile 'junit:junit:4.12'
    testCompile 'org.assertj:assertj-core:3.4.1'
    testCompile 'com.pholser:junit-quickcheck-core:0.6'

    // Integration test helpers
    integrationTestCompile 'junit:junit:4.12'
    integrationTestCompile 'org.assertj:assertj-core:3.4.1'
}

// Package up the demo programs.
task getRateFixDemo(type: CreateStartScripts) {
    mainClassName = "com.r3corda.demos.RateFixDemoKt"
    applicationName = "get-rate-fix"
    defaultJvmOpts = ["-javaagent:${configurations.quasar.singleFile}"]
    outputDir = new File(project.buildDir, 'scripts')
    classpath = jar.outputs.files + project.configurations.runtime
}

task getIRSDemo(type: CreateStartScripts) {
    mainClassName = "com.r3corda.demos.IRSDemoKt"
    applicationName = "irsdemo"
    defaultJvmOpts = ["-javaagent:${configurations.quasar.singleFile}"]
    outputDir = new File(project.buildDir, 'scripts')
    classpath = jar.outputs.files + project.configurations.runtime
}

task getTraderDemo(type: CreateStartScripts) {
    mainClassName = "com.r3corda.demos.TraderDemoKt"
    applicationName = "trader-demo"
    defaultJvmOpts = ["-javaagent:${configurations.quasar.singleFile}"]
    outputDir = new File(project.buildDir, 'scripts')
    classpath = jar.outputs.files + project.configurations.runtime
}

// Force windows script classpath to wildcard path to avoid the 'Command Line Is Too Long' issues
// with generated scripts. Include Jolokia .war explicitly as this isn't picked up by wildcard
tasks.withType(CreateStartScripts) {
    doLast {
        windowsScript.text = windowsScript
                .readLines()
                .collect { line -> line.replaceAll(~/^set CLASSPATH=.*$/, 'set CLASSPATH=%APP_HOME%/lib/*;%APP_HOME%/lib/jolokia-agent-war-'+project.ext.jolokia_version+'.war') }
                .join('\r\n')
    }
}

task integrationTest(type: Test) {
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath = sourceSets.integrationTest.runtimeClasspath
}
test.finalizedBy(integrationTest)

tasks.withType(Test) {
    reports.html.destination = file("${reporting.baseDir}/${name}")
}

quasarScan.dependsOn('classes', 'core:classes', 'contracts:classes', 'node:classes')

applicationDistribution.into("bin") {
    from(getRateFixDemo)
    from(getIRSDemo)
    from(getTraderDemo)
    fileMode = 0755
}