/**
 * 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 "org.nosphere.apache.rat" version "0.3.0"
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'checkstyle'
apply plugin: 'jacoco'
apply plugin: 'findbugs'
apply plugin: 'maven-publish'

apply from: 'gradle/sqoop-version-gen.gradle'
apply from: 'gradle/sqoop-package.gradle'

group = 'org.apache.sqoopgradle'

sourceCompatibility = javaSourceCompatibilityVersion

repositories {
    mavenCentral()
    maven {
        url 'http://conjars.org/repo/'
    }
}

sourceSets {
    main {
        java {
            srcDirs = ['src/java']
        }
        resources {
            srcDirs = ['src/java']
        }
    }
    test {
        java {
            srcDirs = ['src/test']
            exclude 'aop/'
        }
        resources {
            srcDirs = ['src/test', 'testdata/hcatalog/conf', 'conf']
            exclude 'aop/'
        }
    }
    aop {
        java {
            srcDirs = ['src/test/aop']
        }
        resources {
            srcDirs = ['src/test/aop']
        }
    }
}

configurations {
    common.extendsFrom(redist)
    compile.extendsFrom(common)
}

compileJava.dependsOn(SqoopVersionFileGen)

configurations.all {
    resolutionStrategy {
        force group: 'org.apache.avro', name: 'avro', version: avroVersion
        force group: 'org.apache.avro', name: 'avro-mapred', version: avroVersion
        force group: 'com.google.guava', name: 'guava', version: guavaVersion
    }
    exclude group: 'org.apache.hadoop', module: 'avro'
}

def sqoopThirdPartyLib = System.getProperty("sqoop.thirdparty.lib.dir")

dependencies {
    if (sqoopThirdPartyLib != null) runtime fileTree(dir: sqoopThirdPartyLib, include: '*.jar')
    compile group: 'org.apache.hadoop', name: 'hadoop-aws', version: hadoopVersion
    compile group: 'org.apache.hadoop', name: 'hadoop-common', version: hadoopVersion
    compile group: 'org.apache.hadoop', name: 'hadoop-hdfs', version: hadoopVersion
    compile group: 'org.apache.hadoop', name: 'hadoop-mapreduce-client-common', version: hadoopVersion
    compile group: 'org.apache.hadoop', name: 'hadoop-mapreduce-client-core', version: hadoopVersion
    compile group: 'org.apache.hbase', name: 'hbase-hadoop-compat', version: hbaseVersion

    aopCompile group: 'org.aspectj', name: 'aspectjtools', version: aspectjVersion
    aopCompile group: 'org.aspectj', name: 'aspectjrt', version: aspectjVersion
    aopCompile group: 'org.apache.hadoop', name: 'hadoop-common', version: hadoopVersion

    common group: 'org.apache.accumulo', name: 'accumulo-core', version: accumuloVersion
    common group: 'org.apache.accumulo', name: 'accumulo-minicluster', version: accumuloVersion
    common group: 'org.apache.hbase', name: 'hbase-hadoop2-compat', version: hbaseVersion
    common group: 'org.apache.hbase', name: 'hbase-server', version: hbaseVersion
    common group: 'org.apache.hbase', name: 'hbase-client', version: hbaseVersion
    common group: 'org.apache.hbase', name: 'hbase-common', version: hbaseVersion
    common (group: 'org.apache.hive.hcatalog', name: 'hive-hcatalog-core', version: hcatalogVersion) {
        exclude  group: 'org.apache.avro', module: 'avro'
        exclude  group: 'org.apache.hive', module: 'hive-exec'
    }
    common group: 'org.apache.hive', name: 'hive-exec', version: hcatalogVersion, classifier: 'core'
    // Kryo and calcite are dependencies of hive-exec:core
    common group: 'com.esotericsoftware.kryo', name: 'kryo', version: kryoVersion
    common group: 'org.apache.calcite', name: 'calcite-core', version: calciteVersion
    common (group: 'org.apache.hive', name: 'hive-jdbc', version: hcatalogVersion) {
        exclude  group: 'org.apache.avro', module: 'avro'
    }
    common group: 'commons-cli', name: 'commons-cli', version: commonscliVersion
    common group: 'commons-logging', name: 'commons-logging', version: commonsloggingVersion
    common group: 'commons-net', name: 'commons-net', version: commonsnetVersion
    common group: 'log4j', name: 'log4j', version: log4jVersion
    common group: 'org.postgresql', name: 'postgresql', version: postgresqlVersion

    testCompile group: 'com.h2database', name: 'h2', version: h2Version
    testCompile group: 'org.apache.hbase', name: 'hbase-server', version: hbaseVersion, classifier: 'tests'
    testCompile group: 'org.apache.hbase', name: 'hbase-hadoop2-compat', version: hbaseVersion, classifier: 'tests'
    testCompile group: 'org.apache.hbase', name: 'hbase-hadoop-compat', version: hbaseVersion, classifier: 'tests'
    testCompile( group: 'org.apache.hadoop', name: 'hadoop-minikdc', version: hadoopVersion) {
     exclude  group: 'org.apache.directory.api', module: 'api-ldap-schema-data'
    }
    testCompile group: 'junit', name: 'junit', version: junitVersion
    testCompile group: 'org.assertj', name: 'assertj-core', version: assertjVersion
    testCompile group: 'org.mockito', name: 'mockito-core', version: mockitoallVersion
    testCompile group: 'org.apache.zookeeper', name: 'zookeeper', version: zookeeperVersion, ext: 'jar'
}

test {
    include '**/Test*.*'
}

task thirdPartyTest(type: Test) {
    description 'Run ThirdParty tests - you need to specify -Dsqoop.thirdparty.lib.dir where the Third party driver jars reside (relative to the project directory)'
    exclude '**/*ManualTest.*'
    exclude '**/Test*.*'
    include '**/*Test*.*'
    systemProperty "ms.datatype.test.data.file.export" ,"DatatypeTestData-export-lite.txt"
    systemProperty "ms.datatype.test.data.file.import" ,"DatatypeTestData-import-lite.txt"
    systemProperty "ms.datatype.test.data.file.delim" ,","
    systemProperty "ms.datatype.test.hdfsprefix" ,"file:///"
}

task manualTest(type: Test) {
    description 'Run manual tests'
    include '**/*ManualTest.*'
}

def testBuildDir = "$buildDir/test/"
def testBuildDirData ="$testBuildDir/data/"

task buildFolder {
    project.mkdir(testBuildDirData)
}

tasks.withType(Test) {
    testLogging {
        events 'started', 'passed', 'skipped'
    }
    workingDir = testBuildDirData
    project.mkdir(workingDir)
    systemProperties(System.getProperties())
    systemProperty "test.data.dir", "$projectDir/testdata"
    systemProperty 'test.build.data', "$testBuildDir/data"
    systemProperty "hadoop.root.logger", "DEBUG,console"
    systemProperty "user.dir", workingDir
    systemProperty "sqoop.src.dir", "$testBuildDir/data"
    systemProperty "hadoop.tmp.dir", "$testBuildDir/hadoop"
    systemProperty "fs.default.name", ""
    systemProperty "hadoop.log.dir", "$testBuildDir/logs"
    systemProperty "hive.home", "$projectDir/testdata/hive"
    systemProperty "sqoop.throwOnError", ""

    minHeapSize = "512m"
    maxHeapSize = "5120m"
    jvmArgs '-Xmx5012m', "-da:org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge"
    forkEvery 1

    dependsOn buildFolder

    jacoco{
        excludes = ["**/SqoopVersion*"]
    }
}

tasks.withType(Checkstyle) {
    reports {
        xml.enabled false
        html.enabled true
        html.stylesheet resources.text.fromFile('config/checkstyle/checkstyle-noframes.xsl')
    }
    ignoreFailures = true
}

tasks.withType(FindBugs) {
    reports {
        xml.enabled false
        html.enabled true
    }
    ignoreFailures = false
}

findbugs {
    sourceSets = []
}

checkstyle {
    sourceSets = []
    toolVersion checkstyleVersion
}

jacocoTestReport {
    description "Generates a coverage report of the unit test results under $buildDir/jacocoHtml/test/index.html"
    reports {
        xml.enabled true
        csv.enabled false
        html.destination file("$buildDir/jacocoHtml/test")
    }
}

task jacocoThirdPartyReport(type: JacocoReport){
    description "Generates a coverage report of the thirdparty test results under $buildDir/jacocoHtml/3rd/index.html"
    sourceSets sourceSets.main
    executionData thirdPartyTest
    reports {
        xml.enabled true
        csv.enabled false
        html.destination file("$buildDir/jacocoHtml/3rd")
    }
}

task jacocoCompositeReport(type: JacocoReport){
    description "Generates a composite coverage report of test and thirdparty test results under $buildDir/jacocoHtml/index.html"
    sourceSets sourceSets.main
    executionData test, thirdPartyTest
    reports {
        xml.enabled true
        csv.enabled false
        html.destination file("$buildDir/jacocoHtml/")
    }
}

javadoc {
    source = sourceSets.main.allJava
    include 'com/cloudera/sqoop/lib/**'
    include 'org/apache/sqoop/lib/**'
    destinationDir = reporting.file("${project.docsDir}/api")
}

task faultInjectionJar(type: Jar) {
    description 'Create the test jar'
    appendix = 'test'
    from sourceSets.aop.output
}

def archiveName = jar.baseName + "-" + jar.version
def binArtifactName = archiveName + ".bin__hadoop-" + hadoopVersion
def distDir = "$buildDir/$binArtifactName"

rat {
    inputDir = distDir
    reportDir = project.file(buildDir)
    excludes = ['**/docs/**', '**/testdata/**', '**/.idea/**', '**/test-dir/**', '**/.settings/**', '**/.gradle/**','**/gradle/**' ,'**/gradle/build/**', '*.iml', '*.iws', '*.ipr', 'derby.log', '**/gradlew**' ]
    failOnError = true
    xmlOutput = false
    htmlOutput = true
    plainOutput = false
}
rat.dependsOn('packageDist')

def scripts = ['export', 'list-databases', 'metastore', 'create-hive-table', 'help',
               'import-mainframe', 'list-tables', 'version',
               'eval', 'import', 'job', 'merge',
               'import-all-tables', 'codegen']


task runSqoopHelp(type: JavaExec, dependsOn: 'classes') {
    main = 'org.apache.sqoop.Sqoop'
    jvmArgs = ['-Dhadoop.security.log.file=./build/security-audit.log']
    classpath = sourceSets.main.runtimeClasspath + configurations.runtime
    args = ['help']
    standardOutput = new ByteArrayOutputStream()
    ext.helpOut = {
        standardOutput.toString()
    }

}

task createAllStartScripts(dependsOn: 'runSqoopHelp' ) doLast{
    // Placeholder task with validation
    // We call Sqoop help to verify that all tasks that we create scripts for are present in Sqoop help and vice-versa
    // We currently depend on the format of the help output to parse the relevant information out
    def matcher = (tasks.runSqoopHelp.helpOut() =~/(?m)^\s\s([a-z-]+)\s+\w+/)
    def matches = new String[matcher.getCount()]
    for (def i=0; i < matcher.getCount(); i++) {
        matches[i] = matcher[i][1]
    }
    if (matches.sort() != scripts.sort())
        throw new GradleException('Error: script list in gradle build script and result of Sqoop help are not the same, but should be')
}

scripts.each() { scriptName ->
    def t = tasks.create(name: scriptName + 'StartScript', type: CreateStartScripts) {
        unixStartScriptGenerator.template = resources.text.fromFile('gradle/customUnixStartScript.txt')
        windowsStartScriptGenerator.template = resources.text.fromFile('gradle/customWindowsStartScript.txt')
        outputDir = file("$buildDir/bin")
        applicationName = scriptName
        mainClassName = 'com.cloudera.sqoop.Sqoop'
        classpath = project.configurations.runtime
        doLast {
            file("$buildDir/bin/"+ scriptName).renameTo(file("$buildDir/bin/"+"sqoop-"+scriptName))
            file("$buildDir/bin/"+ scriptName +".bat").renameTo(file("$buildDir/bin/"+"sqoop-"+scriptName+".bat"))
        }
    }
    t.dependsOn('compileJava')
    createAllStartScripts.dependsOn(t)
}

task checkVersion doLast {
    if (version.contains('SNAPSHOT'))
        throw new GradleException('Error: cannot release a snapshot. Set -Pversion')
}

task release(dependsOn: ['checkVersion', 'tar', 'rat']) {
    doLast {
        println 'Release complete'
        println "Binary tar: $buildDir/$binArtifactName-${version}.tar.gz"
        println "Documentation: $buildDir/docs"
        println "Release notes: $buildDir/docs/sqoop-$version" + ".releasenotes.html"
        println "Release audit report: $buildDir/index.html"
    }
}

task relnotes(type: Exec)  {
    workingDir 'src/scripts'
    if (!version.contains('SNAPSHOT')) {
        commandLine "python", "relnotes.py", "$buildDir/docs", "$projectDir", "$oldHash\\..HEAD", "$version", "$oldVersion"
    } else {
        commandLine "true" //noop
        println "Will not run releasenotes for SNAPSHOT version."
    }
}

task realDocs(type: Exec, dependsOn: ['relnotes', 'javadoc']) {
    workingDir projectDir
    commandLine "make", "-C", "$projectDir/src/docs", "BUILDROOT=$buildDir", "VERSION=$version"
}

task docs(dependsOn: ['realDocs', 'relnotes', 'javadoc']) {
    //placeholder
}
def $mvnRepo = System.getProperty("mvnRepo", "snapshots")

publishing {
    repositories {
        maven {
            name "cloudera." + $mvnRepo + ".repo"
            url "https://repository.cloudera.com/content/repositories/"+$mvnRepo
            credentials {
                username 'username'
                password 'password'
            }
        }
    }
}
publishing {
    publications {
        sqoop(MavenPublication) {
            groupId group
            version  version
            from components.java
            artifact sourceJar {
                classifier "sources"
            }
        }
        sqoopTest(MavenPublication) {
            groupId group
            version  version
            artifactId 'sqoop-test'
            artifact testJar
            artifact sourceTestJar
            pom.withXml {
                def dependencies = asNode().appendNode('dependencies')
                configurations.testRuntime.getResolvedConfiguration().getFirstLevelModuleDependencies().each {
                    def dependency = dependencies.appendNode('dependency')
                    dependency.appendNode('groupId', it.moduleGroup)
                    dependency.appendNode('artifactId', it.moduleName)
                    dependency.appendNode('version', it.moduleVersion)
                }
            }
        }
    }
}

wrapper {
    gradleVersion = '4.9'
}
