/**
 * 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.
 */
configurations {
    redist
}

dependencies {
    redist group: 'commons-io', name: 'commons-io', version: commonsioVersion
    redist(group: 'org.apache.avro', name: 'avro', version: avroVersion) {
        exclude group: 'org.slf4j', module: 'slf4j-api'
        exclude group: 'org.mortbay.jetty', module: 'jetty'
        exclude group: 'org.mortbay.jetty', module: 'jetty-util'
        exclude group: 'org.mortbay.jetty', module: 'servlet-api'
        exclude module: 'netty'
        exclude group: 'org.apache.velocity', module: 'velocity'
    }
    redist(group: 'org.apache.avro', name: 'avro-mapred', version: avroVersion, classifier: 'hadoop2') {
        exclude group: 'org.slf4j', module: 'slf4j-api'
        exclude group: 'org.mortbay.jetty', module: 'jetty'
        exclude group: 'org.mortbay.jetty', module: 'jetty-util'
        exclude group: 'org.mortbay.jetty', module: 'servlet-api'
        exclude module: 'netty'
        exclude group: 'org.apache.velocity', module: 'velocity'
    }
    redist group: 'hsqldb', name: 'hsqldb', version: hsqldbVersion
    redist group: 'org.apache.commons', name: 'commons-lang3', version: commonslang3Version
    redist group: 'com.twitter', name: 'parquet-avro', version: parquetVersion
}

//Jar tasks
jar {
    baseName = rootProject.name.toLowerCase()
    destinationDir = buildDir
}

task testJar(type: Jar) {
    baseName = rootProject.name.toLowerCase()
    destinationDir = buildDir
    description 'Create the test jar'
    appendix = 'test'
    from sourceSets.test.output
}

task jarAll(dependsOn: ['testJar', 'jar'])

def buildSrcJarDir = "$buildDir/srcjars"

task sourceJar(type: Jar) {
    description 'Create source jars'
    classifier = 'sources'
    from sourceSets.main.allSource
    into buildSrcJarDir
}

task sourceTestJar(type: Jar) {
    description 'Create source jars'
    classifier = 'sources'
    appendix = 'test'
    from sourceSets.test.allSource
    into buildSrcJarDir
}

task sourceJars(dependsOn: ['jarAll', 'sourceJar', 'sourceTestJar'])

//tar tasks
def srcArchiveName =jar.baseName.toLowerCase() + "-" + jar.version
def srcDirstDir = "$buildDir/$srcArchiveName"
def binArtifactName = srcArchiveName + ".bin__hadoop-" + hadoopVersion
def distDir = "$buildDir/$binArtifactName"

task copyToSrcDistDir(type: Copy) {
    from(projectDir) {
        include "**/*"
        exclude "build/**", ".git/**", "tags", ".project", ".classpath", "conf/managers.d/**", "conf/tools.d/**", ".gradle/**"
    }
    into srcDirstDir
    includeEmptyDirs = false
}

task filepermissionForSrcDist(type: Exec) {
    commandLine 'chmod', 'ugo+x', "$srcDirstDir/bin"
    commandLine 'chmod', 'ugo+x', "$srcDirstDir/testdata/hive/bin"
    fileTree("$srcDirstDir").matching { include "**/*.sh" }.each { aFile ->
        exec {
            commandLine 'chmod'
            args 'ugo+x', aFile.absolutePath
        }
    }
}

task srcPackageDist(dependsOn: ['copyToSrcDistDir', 'filepermissionForSrcDist'])

task srctar(type: Tar, dependsOn: srcPackageDist) {
    from("$srcDirstDir") {
        include "**"
        exclude "**/*.sh", "testdata/hive/bin/*", "bin/*"
        fileMode 0644
    }
    from("$srcDirstDir") {
        include "**/*.sh", "testdata/hive/bin/*", "bin/*", "testdata/hcatalog/conf/*"
        fileMode 0755
    }
    baseName = srcArchiveName
    destinationDir = file("$buildDir")
    extension = 'tar.gz'
    compression = Compression.GZIP
}

task copyToDistDir(type: Copy, dependsOn: ['jarAll', 'docs', 'createAllStartScripts']) {
    from jar
    from testJar
    from(projectDir) {
        include "**/*"
        exclude "build/**", "lib/**", ".git/**", "tags", ".project", ".classpath", "conf/managers.d/**", "conf/tools.d/**", ".gradle/**"
    }
    into distDir
    includeEmptyDirs = false
}

task copyToDistLibDir(type: Copy, dependsOn: [configurations.redist, copyToDistDir]) {
    from configurations.redist
    from("$projectDir/lib") {
        include "**/*"
        exclude "ivy*"
    }
    into "$distDir/lib"
    includeEmptyDirs = false
}

task copyToDistDirDocs(type: Copy, dependsOn: ['docs', 'copyToDistLibDir']) {
    from("$buildDir/docs") {
        include "**/*.html", "**/*.css", "images/**"
    }
    into "$distDir/docs"
    includeEmptyDirs = false
}

task copyToDistDirDocsMan(type: Copy, dependsOn: ['docs', 'copyToDistDirDocs']) {
    from("$buildDir/docs") {
        include "**/*.gz"
    }
    into "$distDir/docs/man"
    includeEmptyDirs = false
}

task copyToDistBinDir(type: Copy, dependsOn: ['copyToDistDirDocsMan']) {
    from("$buildDir/bin") {
        include "*"
    }
    into "$distDir/bin"
    includeEmptyDirs = false
}

task filepermissionForDist(type: Exec, dependsOn: ['copyToDistBinDir']) {
    commandLine 'chmod', 'ugo+x', "$distDir/bin"
    commandLine 'chmod', 'ugo+x', "$distDir/testdata/hive/bin"
    fileTree("$distDir").matching { include "**/*.sh" }.each { aFile ->
        exec {
            commandLine 'chmod'
            args 'ugo+x', aFile.absolutePath
        }
    }
}

def contentSpec = copySpec {
    from("$distDir/conf") {
        include "sqoop-site-template.xml"
    }
    rename('sqoop-site-template.xml', 'sqoop-site.xml')
}

task copyAndOverwriteSqoopSiteXML(type: Copy, dependsOn: filepermissionForDist) {
    into "$distDir/conf"
    with contentSpec
}

task packageDist(dependsOn: ['copyToDistDir', 'copyToDistLibDir', 'copyToDistDirDocs', 'copyToDistDirDocsMan', 'copyToDistBinDir', 'filepermissionForDist', 'copyAndOverwriteSqoopSiteXML'])

task tar(type: Tar, dependsOn: packageDist) {
    from("$buildDir") {
        include "$binArtifactName/**"
        exclude "$binArtifactName/**/*.sh", "$binArtifactName/testdata/hive/bin/*", "$binArtifactName/bin/*"
        fileMode 0644
    }
    from("$buildDir") {
        include "$binArtifactName/**/*.sh", "$binArtifactName/testdata/hive/bin/*", "$binArtifactName/bin/*", "$binArtifactName/testdata/hcatalog/conf/*"
        fileMode 0755
    }
    baseName = binArtifactName
    destinationDir = file("$buildDir")
    extension = 'tar.gz'
    compression = Compression.GZIP
}
