apply from: 'gradle/filter.gradle'
apply from: "gradle/indy.gradle"

// TODO use antlr plugin
//apply plugin: 'antlr'

allprojects {
    apply plugin: 'java'

    buildDir = 'target'
    sourceCompatibility = 1.5
    targetCompatibility = 1.5

    group = 'org.codehaus.groovy'
    version = groovyVersion
    repositories {
        mavenCentral()
    }

    apply plugin: 'checkstyle'
    apply plugin: 'groovy'
    apply plugin: 'codenarc'
    apply from: "${rootProject.projectDir}/gradle/groovydoc.gradle"
    apply from: "${rootProject.projectDir}/gradle/indy.gradle"

    // don't fail build on CodeNarc tasks
    tasks.withType(CodeNarc) {
        ignoreFailures = true
        configFile = file("$rootProject.projectDir/config/codenarc/codenarc.groovy")
    }
    tasks.withType(Checkstyle) {
        ignoreFailures = true
        configFile = file("$rootProject.projectDir/config/checkstyle/checkstyle.xml")
    }
    
    if (useIndy()) {
        def indyGroovy = {
            options.useAnt = true
            // todo: when Gradle includes support for "indy" option, replace this
            // with groovyOptions.indy = true
            groovyOptions.metaClass.optionMap = {
                ['indy':true,
                        memoryMaximumSize:'384m',
                        fork:true,
                        includeJavaRuntime:false,
                        verbose:false,
                        encoding:'UTF-8',
                        failonerror:true,
                        stacktrace:false,
                        listfiles:false]
            }
            groovyOptions.useAnt = true
            sourceCompatibility = 1.7
            targetCompatibility = 1.7
            groovyClasspath = files(
                    rootProject.compileJava.destinationDir,
                    rootProject.compileJava.classpath,
                    { project(':groovy-docgenerator').compileJava.destinationDir },
                    { project(':groovy-groovydoc').compileJava.destinationDir },
                    { project(':groovy-ant').compileJava.destinationDir },
                    { project(':groovy-templates').compileJava.destinationDir },
            )
        }
        // add tasks to compile the invokedynamic version

        compileGroovy indyGroovy.clone()
        compileTestGroovy indyGroovy.clone()

        compileJava.sourceCompatibility = 1.7
        compileJava.targetCompatibility = 1.7
        jar {
            classifier = 'indy'
        }
    }

}

// todo: use the conventional "resources" directory for classpath resources
task(copyResources, type: Copy) {
    destinationDir = file("$buildDir/classes")
    // text files requiring filtering
    into("main") {
        from('src/main')
        include('**/*.txt', '**/*.xml', '**/*.properties', '**/*.html')
        filter(rootProject.propertiesFilter, org.apache.tools.ant.filters.ReplaceTokens)
    }
    // other resources
    into("main") {
        from 'src/main'
        include('**/*.png', '**/*.gif', '**/*.ico', '**/*.css')
    }
}
compileJava.dependsOn(copyResources)
task(copyTestResources, type: Copy)
        .from('src/test')
        .into("$buildDir/classes/test")
        .include('**/*.txt', '**/*.xml', '**/*.properties', '**/*.png', '**/*.html', '**/*.gif', '**/*.ico', '**/*.css')
compileTestJava.dependsOn(copyTestResources)

task sourceJar(type: Jar) {
    classifier = 'sources'
    from 'src/main'
}

subprojects {
    task sourceJar(type: Jar) {
        classifier = 'sources'
        from sourceSets.main.allSource
    }

}

repositories {
    // todo Some repos are needed only for some configs. Declare them just for the configuration once Gradle allows this.
//    mavenCentral() // default, tools
    maven { url "http://www.aQute.biz/repo" } // tools
    maven { url "http://repository.jboss.org/maven2" } // examples, tools
}

// todo do we need compile and runtime scope for examples?
configurations {
    compilerCompile
    tools
    examplesCompile.extendsFrom compile
    examplesRuntime.extendsFrom examplesCompile
    antlr
}

dependencies {
    compilerCompile "antlr:antlr:2.7.7"
    compilerCompile "org.ow2.asm:asm:4.0"
    compilerCompile "org.ow2.asm:asm-analysis:4.0"
    compilerCompile "org.ow2.asm:asm-commons:4.0"
    compilerCompile "org.ow2.asm:asm-tree:4.0"
    compilerCompile "org.ow2.asm:asm-util:4.0"

    compilerCompile "commons-cli:commons-cli:1.2"
    compilerCompile "org.apache.ant:ant:1.8.4"
    compilerCompile("com.thoughtworks.xstream:xstream:1.4.2") {
        exclude(group: 'xpp3', module: 'xpp3_min')
        exclude(group: 'junit', module: 'junit')
        exclude(group: 'jmock', module: 'jmock')
    }
    compilerCompile("jline:jline:1.0") {
        exclude(group: 'junit', module: 'junit')
    }
    compilerCompile "org.fusesource.jansi:jansi:1.6"
    compilerCompile("org.apache.ivy:ivy:2.2.0") {
        transitive = false
    }
    compilerCompile files("$buildDir/classes/compiler")

    groovy files("$buildDir/classes/compiler")
    groovy "antlr:antlr:2.7.7"
    groovy "org.ow2.asm:asm:4.0"
    groovy "org.ow2.asm:asm-analysis:4.0"
    groovy "org.ow2.asm:asm-commons:4.0"
    groovy "org.ow2.asm:asm-tree:4.0"
    groovy "org.ow2.asm:asm-util:4.0"

    compile "commons-cli:commons-cli:1.2"
    compile("com.thoughtworks.xstream:xstream:1.4.2") {
        exclude(group: 'xpp3', module: 'xpp3_min')
        exclude(group: 'junit', module: 'junit')
        exclude(group: 'jmock', module: 'jmock')
    }
    compile("jline:jline:1.0") {
        exclude(group: 'junit', module: 'junit')
    }
    compile "org.fusesource.jansi:jansi:1.6"
    compile("org.apache.ivy:ivy:2.2.0") {
        transitive = false
    }
    runtime "org.codehaus.gpars:gpars:1.0.0"
    testCompile "jmock:jmock:1.2.0"
    testCompile "jmock:jmock-cglib:1.2.0"
    testCompile "xmlunit:xmlunit:1.3"
    testCompile "ch.qos.logback:logback-classic:0.9.21"
    testCompile "log4j:log4j:1.2.16"
    testCompile "org.slf4j:jcl-over-slf4j:1.6.0"
    testCompile "com.thoughtworks.qdox:qdox:1.12"

    tools "com.googlecode.jarjar:jarjar:1.3"
    tools("checkstyle:checkstyle:4.4") {
        exclude(module: 'junit')
    }
    tools "redhill:simian:2.2.4"
    tools("net.sourceforge.cobertura:cobertura:1.9.4.1") {
        exclude(module: 'asm')
        exclude(module: 'asm')
        exclude(module: 'ant')
    }
    tools "org.ow2.asm:asm-all:4.0"
    tools "com.thoughtworks.qdox:qdox:1.12"
    tools "biz.aQute:bnd:0.0.401"

    examplesCompile "lucene:lucene:1.4.3"
    examplesCompile "org.eclipse:osgi:3.5.0.v20090520"
    examplesRuntime("commons-httpclient:commons-httpclient:3.1") {
        exclude(module: 'junit')
        exclude(module: 'commons-logging')
        exclude(module: 'commons-codec')
    }
    examplesRuntime("openejb:openejb-loader:1.0") {
        exclude(module: 'log4j')
        exclude(module: 'openejb-core')
        exclude(module: 'geronimo-jta_1.0.1B_spec')
        exclude(module: 'geronimo-servlet_2.4_spec')
        exclude(module: 'geronimo-ejb_2.1_spec')
        exclude(module: 'geronimo-j2ee-connector_1.5_spec')
    }

// TODO use antlr plugin
//    antlr "antlr:antlr:2.7.7"
    antlr "org.apache.ant:ant-antlr:1.8.4"

    // TODO remove once M12N refactoring finished
    testCompile project(':groovy-ant')
    testCompile project(':groovy-test')
}

ext.generatedDirectory = "${buildDir}/generated-sources"

sourceSets {
    compiler {
        // This sourceSet corresponds to the minimal "bootstrap" Groovy compiler
        // which will be used by the build itself to compile the groovy files
        java {
            srcDirs = [
                    "src/main",
                    "subprojects/groovy-ant/src/main",
                    "subprojects/groovy-groovydoc/src/main",
                    "subprojects/groovy-templates/src/main",
                    "subprojects/groovy-xml/src/main",
                    "subprojects/groovy-jmx/src/main",
                    "$generatedDirectory/src/main"
            ]
            if (!useIndy()) {
                exclude '**/indy/*'
                exclude '**/v7/*'
                exclude '**/vm7/*'
            }
        }
    }
    main {
        java {
            srcDirs = [
                    "src/main",
                    "$generatedDirectory/src/main"
            ]
            fileTree("src/main/groovy/ui").matching {
                exclude 'GroovyMain.java', 'GroovySocketServer.java'
            }.visit {details ->
                exclude "groovy/ui/$details.path"
            }
            if (!useIndy()) {
                exclude '**/indy/*'
                exclude '**/v7/*'
                exclude '**/vm7/*'
            }
        }
        groovy {
            srcDirs = [
                    "src/main",
                    "$generatedDirectory/src/main"
            ]
            if (!useIndy()) {
                exclude '**/indy/*'
                exclude '**/v7/*'
                exclude '**/vm7/*'
            }
        }
        resources {
            srcDirs = ["src/main", "src/tools", "src/resources"]
            include "META-INF/services/*", "META-INF/groovy-release-info.properties",
                    "groovy/grape/*.xml", "groovy/ui/*.properties", "groovy/ui/**/*.png",
                    "groovy/inspect/swingui/AstBrowserProperties.groovy",
                    "org/codehaus/groovy/tools/shell/**/*.properties",
                    "org/codehaus/groovy/tools/shell/**/*.xml",
                    "org/codehaus/groovy/tools/groovydoc/gstringTemplates/**/*.*",
                    "org/codehaus/groovy/tools/groovy.ico"
        }
    }
    test {
        groovy {
            srcDirs = [
                    "src/test",
            ]
            if (isJava15()) {
                exclude "groovy/**/vm6/*Test.groovy"
                exclude "org/codehaus/groovy/**/vm6/*Test.groovy"
            }
        }
        resources {
            srcDirs = ["src/test-resources"]
        }
        output.classesDir = "$buildDir/test-classes" as File
    }
    tools {
        groovy {
            srcDirs = ["src/tools"]
        }
        resources {
            srcDirs = ["src/tools"]
        }
        compileClasspath = configurations.tools + sourceSets.main.runtimeClasspath
        runtimeClasspath = output + compileClasspath
        output.classesDir = "$buildDir/tools-classes" as File
    }
    examples {
        groovy {
            srcDirs = ["src/examples"]
        }
        resources {
            srcDirs = ["src/examples"]
        }
        compileClasspath = configurations.examplesRuntime + sourceSets.main.output
        output.classesDir = "$buildDir/examples-classes" as File
    }
}

// remove this from config once GRADLE-854 is fixed.
processResources.doLast {
    copy {
        from("src/main") {
            include "groovy/inspect/swingui/AstBrowserProperties.groovy",
                    "org/codehaus/groovy/tools/groovydoc/gstringTemplates/GroovyDocTemplateInfo.java"
        }
        into sourceSets.main.output.classesDir
    }
}

task ensureGrammars {
    description = "Ensure all the Antlr generated files are up to date."
    ext.antlrDirectory = "$projectDir/src/main/org/codehaus/groovy/antlr"
    ext.groovyParserDirectory = "$ext.antlrDirectory/parser"
    ext.javaParserDirectory = "$ext.antlrDirectory/java"
    ext.genPath = "$generatedDirectory/src/main/org/codehaus/groovy/antlr"
    ext.groovyOutDir = "$ext.genPath/parser"
    ext.javaOutDir = "$ext.genPath/java"
    inputs.dir(antlrDirectory)
    outputs.dir(groovyOutDir)
    outputs.dir(javaOutDir)
    doFirst {
        new File(groovyOutDir).mkdirs()
        new File(javaOutDir).mkdirs()
        ant {
            taskdef(name: 'antlr',
                    classname: 'org.apache.tools.ant.taskdefs.optional.ANTLR',
                    classpath: configurations.antlr.asPath)

            mkdir dir: ext.groovyParserDirectory
            antlr(target: "$ext.antlrDirectory/groovy.g", outputdirectory: ext.groovyOutDir) {
                classpath path: configurations.compile.asPath
            }
            antlr(target: "$ext.javaParserDirectory/java.g", outputdirectory: ext.javaOutDir) {
                classpath path: configurations.compile.asPath
            }
        }
    }
}

apply from: 'gradle/utils.gradle'

def isJava16() {
    System.properties['java.version'].contains('1.6')
}
def isJava15() {
    System.properties['java.version'].contains('1.5')
}
def modules() {
    subprojects.findAll { it.name =~ /groovy-(?!all-tests)/ }
}

// provide to other build scripts
ext.isJava6 = this.&isJava16()
ext.isJava5 = this.&isJava15()
ext.modules = this.&modules()

task dgmConverter(type: JavaExec, dependsOn: 'classes') {
    description = 'Generates DGM info file required for faster startup.'
    ext.classesDir = sourceSets.main.output.classesDir
    classpath = files(classesDir) + configurations.compile
    main = 'org.codehaus.groovy.tools.DgmConverter'
    args = ['--info', classesDir.absolutePath]
    doFirst {
        file("$classesDir/META-INF").mkdirs()
    }
    inputs.files fileTree(dir: projectDir, includes: ['src/**/*GroovyMethods.java'])
    outputs.file file("$classesDir/META-INF/dgminfo")
}

task compilerDgmConverter(type: JavaExec) {
    description = 'Generates DGM info file for the bootstrap compiler'
    ext.compilerClassesDir = sourceSets.compiler.output.classesDir
    classpath = files(compilerClassesDir) + configurations.compilerCompile
    main = 'org.codehaus.groovy.tools.DgmConverter'
    args = ['--info', compilerClassesDir.absolutePath]
    doFirst {
        file("$compilerClassesDir/META-INF").mkdirs()
    }
    inputs.files fileTree(dir: projectDir, includes: ['src/**/*GroovyMethods.java'])
    outputs.file file("$compilerClassesDir/META-INF/dgminfo")
}

compileCompilerJava {
    dependsOn ensureGrammars, exceptionUtils
    options.fork(memoryMaximumSize: javacMain_mx)
}

compileJava {
    dependsOn compilerClasses,compilerDgmConverter,ensureGrammars
    options.fork(memoryMaximumSize: javacMain_mx)
}

compileGroovy {
    doFirst {
        if (useIndy()) {
            logger.info('Building with InvokeDynamic support activated')
        }
    }
    groovyOptions.fork(memoryMaximumSize: groovycMain_mx)
}

compileTestGroovy {
    groovyOptions.fork(memoryMaximumSize: groovycTest_mx)
}

compileExamplesGroovy {
    groovyOptions.fork(memoryMaximumSize: groovycExamples_mx)
}

// suppress CheckStyle/CodeNarc
task checkstyleExamples(overwrite: true) << {}
task checkstyleMain(overwrite: true) << {}
task checkstyleTest(overwrite: true) << {}
task checkstyleTools(overwrite: true) << {}
task codenarcExamples(overwrite: true) << {}

apply from: "gradle/test.gradle"
apply from: "gradle/docs.gradle"
apply from: "gradle/assemble.gradle"
apply from: "gradle/upload.gradle"
apply from: "gradle/idea.gradle"
// Define a GroovyDoc task which depends on the generated groovydoc tool
apply from: "gradle/groovydoc.gradle"

task wrapper(type: Wrapper) {
    gradleVersion = '1.3'
}

classes {
    doFirst {
        logger.lifecycle "InvokeDynamic support ${useIndy()?'on':'off'}"
    }
}
