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

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

version = '6.9.7-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'osgi'

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

dependencies {
    compile 'org.apache.ant:ant:1.7.0'
    compile 'junit:junit:4.10'
    compile 'org.beanshell:bsh:2.0b4'
    compile 'com.google.inject:guice:4.0:no_aop'
    compile 'com.beust:jcommander:1.48'
    compile 'org.yaml:snakeyaml:1.15'

    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')
        }
    }
}

apply from: 'gradle/publishing.gradle'
