/*
 *  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.
 */
//most of this is just a "hack" to break the circular dependencies between projects
//which exist because Eclipse does not distinguish between build phases (e.g. compile, test, runtime)
allprojects {
    apply plugin: 'eclipse'
    
    eclipse.jdt {
        sourceCompatibility = 1.7
        targetCompatibility = 1.7
    }
    
    eclipse.classpath.file {
        whenMerged { classpath ->
            classpath.entries.removeAll{ entry -> entry.path == '/groovy-groovydoc' }
            classpath.entries.removeAll{ entry -> entry.path =~ /groovy-ant/ }
            classpath.entries.removeAll{ entry -> entry.path =~ /target/ }
            classpath.entries.unique(true){ entry -> entry.path }
        }
        withXml {
            def node = it.asNode()
            node.appendNode('classpathentry', [kind: 'lib', path: "${rootProject.jar.archivePath}"])
        }
    }
    
    project.tasks.eclipse.doLast {
        File groovyPrefs = file("${project.projectDir}/.settings/org.eclipse.jdt.groovy.core.prefs")
        if (!groovyPrefs.exists()) {
            groovyPrefs.append('groovy.compiler.level=-1\n')
        }
    }
}

eclipse.classpath.file {
    whenMerged { classpath ->
        classpath.entries.find { entry -> entry.path =~ /src\/main/ }.path = '/groovy/src/main'
        classpath.entries.find { entry -> entry.path =~ /src\/main/ }.includes = []
        classpath.entries.each { entry -> if(entry.path == 'src/test'){ entry.excludes = ['groovy/PropertyTest.groovy'] as List } }
        classpath.entries.removeAll{ entry -> entry.path == '/groovy-test' }
        classpath.entries.removeAll{ entry -> entry.path =~ /subprojects/ }
        classpath.entries.removeAll{ entry -> entry.path =~ /examples/ }
    }
    withXml {
        def node = it.asNode()
        ['groovy-test', 'groovy-groovydoc', 'groovy-jmx', 'groovy-xml', 'groovy-ant'].each{
            node.appendNode('classpathentry', [kind: 'src', path: "/groovy/subprojects/$it/src/main/groovy"])
            node.appendNode('classpathentry', [kind: 'src', path: "/groovy/subprojects/$it/src/main/java"])
        }
        node.appendNode('classpathentry', [kind: 'src', path: '/groovy/subprojects/groovy-templates/src/main/groovy'])
    }
}
