/**
 * 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()
        maven { url 'http://google-gson.googlecode.com/svn/mavenrepo' }
        maven { url 'https://repo.springsource.org/libs-release' }
        maven { url 'http://repo.gradle.org/gradle/libs-releases-local' }

        /* 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"
    }
    
    configurations.all {
        transitive = false
    }
}

/* 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',
    aop_alliance:       'aopalliance:aopalliance:1.0',
    guice_assist:       'com.google.inject.extensions:guice-assistedinject:3.0',
    kryo:               'com.googlecode:kryo:1.04',
    minlog:             'com.googlecode:minlog:1.2',
    reflectasm:         'com.googlecode:reflectasm:1.01',
    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.
    commons_io:         'commons-io:commons-io:2.4',
    commons_lang:       'commons-lang:commons-lang:2.6',
    commons_logging:    'commons-logging:commons-logging:1.1.1',
    commons_collections:'commons-collections:commons-collections:3.2.1',
    objenesis:          'org.objenesis:objenesis:1.2',
    slf4j:              'org.slf4j:slf4j-api:1.6.1',
    log4j:              'log4j:log4j:1.2.15',
    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',
    asm:                'asm:asm:3.2',
    javax_inject:       'javax.inject:javax.inject:1',
    gradle_base_services: 'org.gradle:gradle-base-services:1.0',
    gradle_core: 'org.gradle:gradle-core:1.0',
    gradle_tooling_api: 'org.gradle:gradle-tooling-api:1.0',
    gradle_wrapper: 'gradle-wrapper:gradle-wrapper:1.0'
]

subprojects {
    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'idea'
    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 )
        runtime( libraries.commons_logging)

        /* Commons. */
        compile( libraries.commons_config )
        compile( libraries.commons_coll )
        compile( libraries.commons_io )
        compile ( libraries.commons_lang )
        runtime(libraries.commons_collections)

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

        /* Testing. */
        testCompile( libraries.junit )
        
        // transitive
        runtime( libraries.log4j) // required by Zookeeper
        runtime(libraries.aop_alliance)
        runtime(libraries.minlog)
        runtime(libraries.gson)
        runtime(libraries.objenesis)
        runtime(libraries.kryo)
        runtime(libraries.netty)
        runtime(libraries.asm)
        runtime(libraries.javax_inject)
        runtime(libraries.commons_codec)
    }
    
    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 copyRequiredFilesForBinaryRelease (type: Copy) {
    copy {
        from (rootDir) {
            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/')
    }
    
    copy {
        // binary release specifics
        from (rootDir.path + "/config/binrelease/")
        into new File(project.rootDir.path+'/subprojects/s4-tools/src/dist/')
        include "*"
    }
    
    
    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", "copyRequiredFilesForBinaryRelease", "s4-tools:cleanDistZip", "s4-tools:distZip"]) {
    doFirst {
        new File(project.rootDir.path+'/subprojects/s4-tools/src/dist').deleteDir()
    }
    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()
        }
        new File(project.rootDir.path+'/subprojects/s4-tools/src/dist').deleteDir()
    }
    classifier='src'
    version = project.version
    baseName=project.ext.archivesBaseName
    destinationDir = project.buildDir
    from (project.rootDir)
    exclude ('**/.project')
    exclude ('**/.classpath')
    exclude ('.rat-excludes')
    exclude ('**/.gradle/**')
    exclude ('**/.settings/**')
    exclude ('**/build/**')
    exclude ('**/tmp/**')
    exclude ('**/bin/**')
    into (baseName+'-'+version+'-'+classifier)
}


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