/**
 * 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.
 */


/**
 * The Apache Incubator S4 Project Build File
 *
 */

description = 'Apache S4'
defaultTasks 'assemble'
project.ext["archivesBaseName"] = 'apache-s4'
project.ext["distRootFolder"] = "$archivesBaseName-${-> version}"

allprojects {

    // Append the suffix 'SNAPSHOT' when the build is not for release.
    version = new Version(major: 0, minor: 5, bugfix: 0, isRelease: true)
    group = 'org.apache.s4'

    /* Search these repos to find artifacts. Gradle will download and cache. */
    repositories {
        mavenLocal()
        mavenCentral()
        mavenRepo name: "gson", url: "http://google-gson.googlecode.com/svn/mavenrepo"

        /* Add lib dir as a repo. Some jar files that are not available
         in a public repo are distributed in the lib dir. */
        flatDir name: 'libDir', dirs: "$rootDir/lib"
    }
}

/* All project libraries must be defined here. */
project.ext["libraries"] = [
    guava:              'com.google.guava:guava:12.0.1',
    gson:               'com.google.code.gson:gson:1.6',
    guice:              'com.google.inject:guice:3.0',
    guice_assist:       'com.google.inject.extensions:guice-assistedinject:3.0',
    kryo:               'com.googlecode:kryo:1.04',
    netty:              'org.jboss.netty:netty:3.2.5.Final',
    mockito_core:       'org.mockito:mockito-core:1.9.0',
    commons_config:     'commons-configuration:commons-configuration:1.6',
    commons_codec:      'commons-codec:commons-codec:1.4',
    commons_coll:       'net.sourceforge.collections:collections-generic:4.01', // Use this lib until the commons collection with Generics is released.
    slf4j:              'org.slf4j:slf4j-api:1.6.1',
    logback_core:       'ch.qos.logback:logback-core:0.9.29',
    logback_classic:    'ch.qos.logback:logback-classic:0.9.29',
    zk:                 'org.apache.zookeeper:zookeeper:3.3.1',
    jcip:               'net.jcip:jcip-annotations:1.0',
    junit:              'junit:junit:4.10',
    zkclient:           'com.github.sgroschupf:zkclient:0.1',
    diezel:             'net.ericaro:diezel-maven-plugin:1.0.0-beta-4',
    jcommander:         'com.beust:jcommander:1.25',
    gradle_base_services: 'gradle-base-services:gradle-base-services:1.0',
    gradle_core: 'gradle-core:gradle-core:1.0',
    gradle_tooling_api: 'gradle-tooling-api:gradle-tooling-api:1.0',
    gradle_wrapper: 'gradle-wrapper:gradle-wrapper:1.0'
]

subprojects {
    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'maven'
//    apply plugin: 'checkstyle'

    /* Set Java version. */
    sourceCompatibility = 1.6
    targetCompatibility = 1.6

    project.ext["checkstyleConfigFileName"] = "$rootDir/config/checkstyle/s4-checkstyle.xml"

    configurations.all {
        exclude group: 'com.sun.jdmk', module: 'jmxtools'
        exclude group: 'com.sun.jmx', module: 'jmxri'
        exclude group: 'javax.jms', module: 'jms'
    }

    dependencies {

        /* Google. */
        compile( libraries.guava )
        compile( libraries.guice )
        compile (libraries.guice_assist)

        /* Logging. */
        compile( libraries.slf4j )
        compile( libraries.logback_core )
        compile( libraries.logback_classic )

        /* Commons. */
        compile( libraries.commons_config )
        compile( libraries.commons_coll )

        /* Misc. */
        compile( libraries.jcip )
        compile( libraries.zk )

        /* Testing. */
        testCompile( libraries.junit )
    }
    
    jar {
        from (rootDir) {
            include "NOTICE.txt"
            include "LICENSE"
            into "META-INF"
        }
    }

    manifest.mainAttributes(
        provider: 'gradle',
        'Implementation-Url': 'http://incubator.apache.org/s4/',
        'Implementation-Version': version,
        'Implementation-Vendor': 'Apache Software Foundation',
        'Implementation-Vendor-Id': 'org.apache',
        'Implementation-Title': 'org.apache.s4.'+project.name.substring(3) // s4-comm becomes org.apache.s4.comm for instance
    )
}

evaluationDependsOnChildren()

project.ext["platformProjects"] = [project(':s4-base'), project(':s4-core'), project(':s4-comm'), project(':s4-tools')]

configurations {
    platformLibs
}

dependencies {
    platformLibs platformProjects
}


task javadoc (type: Javadoc) {
    destinationDir = new File(project.rootDir, 'doc/javadoc')
    destinationDir.deleteDir()

    title = "Apache S4 " + version
    source platformProjects.collect { project ->
        project.sourceSets.main.allJava
    }
    // Might need a classpath
    classpath = files(subprojects.collect { project ->
        project.sourceSets.main.compileClasspath
    })
}

// TODO parameterize
task javadocBinRelease (type: Javadoc) {
    destinationDir = new File(project.rootDir,'subprojects/s4-tools/src/dist/doc/javadoc')
    destinationDir.deleteDir()
    title = "Apache S4 " + version
    source platformProjects.collect { project ->
        project.sourceSets.main.allJava
    }
    // Might need a classpath
    classpath = files(subprojects.collect { project ->
        project.sourceSets.main.compileClasspath
    })
}

task copyRequiredFilesToS4ToolsDistDir (type: Copy) {
    copy {
        from (rootDir) {
            include "NOTICE.txt"
            include "README.md"
            include "DISCLAIMER"
            include "RELEASE_NOTES.txt"
            include "gradlew"
            include "gradle.bat"
            include "s4"
        }
        into new File(project.rootDir.path+'/subprojects/s4-tools/src/dist/')
    }
    
    File s4DistFile = new File(project.rootDir.path+'/subprojects/s4-tools/src/dist/s4')
    ant.replace(file: s4DistFile, token: "\n# NOTE: \"./gradlew s4-tools:installApp\" will prepare/update the tools subproject and related startup scripts", value: "")

    ant.replace(file: s4DistFile, token: "subprojects/s4-tools/build/install/s4-tools/", value: "")
    
    ant.chmod(file: s4DistFile, perm: "700")
    
    copy {
        from new File(rootDir, 'gradle') 
        into new File(project.rootDir.path+'/subprojects/s4-tools/src/dist/gradle')
    }
    
    copy {
        from (new File(rootDir, 'lib')) {
            include '*.properties'
        }
        into new File(project.rootDir.path+'/subprojects/s4-tools/src/dist/lib')
    }
}



task binDist(dependsOn: ["s4-tools:clean", "javadocBinRelease", "copyRequiredFilesToS4ToolsDistDir", "s4-tools:cleanDistZip", "s4-tools:distZip"]) {
    doLast { 
        copy {
            from (project.rootDir.path+"/subprojects/s4-tools/build/distributions/")
            into (project.buildDir)
            exclude('tmp')
        }
    }
}

task srcDist(dependsOn: ["javadoc"], type: Zip) {
    doFirst {
        platformProjects.collect { project ->
            project.tasks.clean.execute()
        }
    }
    classifier='src'
    version = project.version
    baseName=project.ext.archivesBaseName
    destinationDir = project.buildDir
    from (project.rootDir)
    exclude ('build')
    exclude ('.project')
    exclude ('.classpath')
    exclude ('tmp')
    exclude ('.rat-excludes')
}

task clean << {
    delete buildDir
}

/* Generates the gradlew scripts.
 http://www.gradle.org/docs/1.0/userguide/gradle_wrapper.html */
task wrapper(type: Wrapper) {
    gradleVersion = '1.0'
    jarFile='lib/gradle-wrapper-1.0.jar'
}

class Version {
    int major
    int minor
    int bugfix
    boolean isRelease

    String toString() {
        "$major.$minor.$bugfix${isRelease ? '' : '-SNAPSHOT'}-incubating"
    }
}
