buildscript {

    def a_user = hasProperty('artifactory_user') ? artifactory_user : System.getenv('artifactory_user')
    def a_password = hasProperty('artifactory_password') ? artifactory_password : System.getenv('artifactory_password')

    repositories {
        mavenCentral()
        jcenter()
        maven {
            url 'http://dl.bintray.com/cbeust/maven'
        }
        maven {
            url 'http://oss.jfrog.org/artifactory/plugins-release'
            credentials {
                username = "${a_user}"
                password = "${a_password}"
            }
        }
    }

    dependencies {
        //Check for the latest version here: http://plugins.gradle.org/plugin/com.jfrog.artifactory
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.0.3"
        classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3"
        classpath "com.netflix.nebula:gradle-extra-configurations-plugin:3.0.3"
    }
}

plugins {
    id "com.jfrog.bintray" version "1.2"
    id "com.jfrog.artifactory" version "3.1.1"
    id "org.sonarqube" version "1.0"
}

version = '6.9.10-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'nebula.optional-base'
apply plugin: 'nebula.provided-base'

targetCompatibility = "1.7"
sourceCompatibility = "1.7"

apply plugin: 'osgi'

repositories {
    mavenCentral()
    jcenter()
    maven {
        url 'http://dl.bintray.com/cbeust/maven'
    }
}

dependencies {
    compile 'org.beanshell:bsh:2.0b4'
    compile 'com.beust:jcommander:1.48'

    compile 'org.apache.ant:ant:1.7.0', optional
    compile 'junit:junit:4.10', optional
    compile 'org.yaml:snakeyaml:1.15', optional

    provided 'com.google.inject:guice:4.0:no_aop'

    testCompile 'org.assertj:assertj-core:2.0.0'
    testCompile 'org.testng:testng:6.9.4'
}

task sourceJar(type: Jar) {
    group 'Build'
    description 'An archive of the source code'
    classifier 'sources'
    from sourceSets.main.allSource
}

artifacts {
    sourceJar
}

import org.apache.tools.ant.filters.ReplaceTokens

def generatedSourcesFolder = projectDir.toString() + '/src/generated/java'

def dirFrom = projectDir.toString() + '/src/main/resources/org/testng/internal'
def dirTo = generatedSourcesFolder + "/org/testng/internal"
def fileFrom = 'VersionTemplateJava'
def fileTo = 'Version.java'

task removeVersion {
    delete dirTo + fileTo
}

sourceSets {
    generated {
        java {
            srcDir 'src/generated/java'
        }
        resources {
            srcDir 'src/generated/resources'
        }
    }
}

sourceSets {
    main {
        compileClasspath += generated.output
        runtimeClasspath += generated.output
    }
}

gradle.projectsEvaluated {
    compileJava.dependsOn(myDir)
}

task myDir {
    delete dirTo + "/" + fileTo
    mkdir(dirTo)
}

// Include the generated Version.class in the jar
jar {
    manifest {
        instruction 'Bundle-License', 'http://apache.org/licenses/LICENSE-2.0'
        instruction 'Bundle-Description', 'TestNG is a testing framework.'
        instruction 'Import-Package',
            'bsh.*;version="[2.0.0,3.0.0)";resolution:=optional',
            'com.beust.jcommander.*;version="[1.7.0,3.0.0)";resolution:=optional',
            'com.google.inject.*;version="[1.2,1.3)";resolution:=optional',
            'junit.framework;version="[3.8.1, 5.0.0)";resolution:=optional',
            'org.junit.*;resolution:=optional',
            'org.apache.tools.ant.*;version="[1.7.0, 2.0.0)";resolution:=optional',
            'org.yaml.*;version="[1.6,2.0)";resolution:=optional',
            '!com.beust.testng',
            '!org.testng.*',
            '!com.sun.*',
            '*'
    }
    from "$buildDir/classes/generated"
}

task createVersion(type: Copy, dependsOn: myDir) {
    println("Creating Version file: ${version} in ${dirTo}")
    from dirFrom
    include fileFrom
    into(dirTo)
    rename(fileFrom, fileTo)
    filter(ReplaceTokens, tokens: [version: version])
}

compileJava.dependsOn(createVersion)

test {
    useTestNG() {
        suites 'src/test/resources/testng.xml'
    }
//    testLogging.showStandardStreams = true
    systemProperties = System.getProperties()
    systemProperties['test.resources.dir'] = 'build/resources/test/'
}

if (JavaVersion.current().isJava8Compatible()) {
    allprojects {
        tasks.withType(Javadoc) {
            options.addStringOption('Xdoclint:none', '-quiet')
        }
    }
}

sonarqube {
    properties {
        property "sonar.host.url", "http://nemo.sonarqube.org"
        property "sonar.analysis.mode", "preview"
        property "sonar.github.repository", "cbeust/testng"
        property "sonar.github.login", "testng-bot"
    }
}

apply from: 'gradle/publishing.gradle'
