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.1"

    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.1"
    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'}"
    }
}
