import org.gradle.plugins.ide.eclipse.model.SourceFolder

apply plugin: 'java'
apply plugin: 'javadocHotfix'
apply plugin: 'eclipse-wtp'
apply plugin: 'propdeps'
apply plugin: 'propdeps-maven'
apply plugin: 'propdeps-idea'
apply plugin: 'propdeps-eclipse'

sourceCompatibility = 1.5
targetCompatibility = 1.5

ext.ehcacheVersion = '1.6.2'
ext.aspectjVersion = '1.6.10'
ext.apacheDsVersion = '1.5.5'
ext.jstlVersion = '1.2'
ext.jettyVersion = '6.1.26'
ext.hsqlVersion = '2.3.1'
ext.slf4jVersion = '1.7.5'
ext.logbackVersion = '0.9.29'
ext.cglibVersion = '2.2'
ext.powerMockVersion = '1.5.1'
ext.servletApiVersion = '7.0.33'
ext.seleniumVersion = '2.33.0'
ext.groovyVersion = '2.0.5'
ext.spockVersion = '0.7-groovy-2.0'
ext.gebVersion = '0.9.0'
ext.thymeleafVersion = '2.1.2.RELEASE'

ext.powerMockDependencies = [
    "org.powermock:powermock-core:$powerMockVersion",
    "org.powermock:powermock-api-support:$powerMockVersion",
    "org.powermock:powermock-module-junit4-common:$powerMockVersion",
    "org.powermock:powermock-module-junit4:$powerMockVersion",
    "org.powermock:powermock-api-mockito:$powerMockVersion",
    "org.powermock:powermock-reflect:$powerMockVersion"
]

ext.apacheds_libs = [
         "org.apache.directory.server:apacheds-core:$apacheDsVersion",
         "org.apache.directory.server:apacheds-core-entry:$apacheDsVersion",
         "org.apache.directory.server:apacheds-protocol-shared:$apacheDsVersion",
         "org.apache.directory.server:apacheds-protocol-ldap:$apacheDsVersion",
         "org.apache.directory.server:apacheds-server-jndi:$apacheDsVersion",
         'org.apache.directory.shared:shared-ldap:0.9.15'
]

ext.bundlorProperties = [
    version: version,
    secRange: "[$version, 3.3.0)",
    springRange: "[$springVersion, 3.3.0)",
    aspectjRange: '[1.6.0, 1.8.0)',
    casRange: '[3.1.1, 3.2.0)',
    cloggingRange: '[1.0.4, 2.0.0)',
    ehcacheRange: '[1.4.1, 2.5.0)',
    openid4javaRange: '[0.9.5, 1.0.0)',
    springLdapRange: '[1.3.0,1.4.0)',
    apacheDSRange: '[1.5.5, 1.6)',
    apacheDSSharedRange: '[0.9.15, 1.0)',
    ldapSdkRange: '[4.1, 5.0)',
    aopAllianceRange: '[1.0.0, 2.0.0)'
]

// Integration test setup
configurations {
    integrationTestCompile {
        extendsFrom testCompile, optional, provided
    }
    integrationTestRuntime {
        extendsFrom integrationTestCompile, testRuntime
    }
}

sourceSets {
    integrationTest {
        java.srcDir file('src/integration-test/java')
        resources.srcDir file('src/integration-test/resources')
        compileClasspath = sourceSets.main.output + sourceSets.test.output + configurations.integrationTestCompile
        runtimeClasspath = output + compileClasspath + configurations.integrationTestRuntime
    }
}

task integrationTest(type: Test, dependsOn: jar) {
    testClassesDir = sourceSets.integrationTest.output.classesDir
    logging.captureStandardOutput(LogLevel.INFO)
    classpath = sourceSets.integrationTest.runtimeClasspath
    maxParallelForks = 1
}
project.conf2ScopeMappings.addMapping(MavenPlugin.TEST_COMPILE_PRIORITY + 1, project.configurations.getByName("integrationTestCompile"), Conf2ScopeMappingContainer.TEST)
project.conf2ScopeMappings.addMapping(MavenPlugin.TEST_COMPILE_PRIORITY + 2, project.configurations.getByName("integrationTestRuntime"), Conf2ScopeMappingContainer.TEST)
check.dependsOn integrationTest

dependencies {
    optional 'commons-logging:commons-logging:1.1.1'

    compile ("org.springframework:spring-core:$springVersion") {
        exclude(group: 'commons-logging', module: 'commons-logging')
    }

    testCompile 'junit:junit:4.10',
            'org.mockito:mockito-core:1.9.5',
            "org.springframework:spring-test:$springVersion",
            'org.easytesting:fest-assert:1.4'

    // Use slf4j/logback for logging
    testRuntime "org.slf4j:jcl-over-slf4j:$slf4jVersion",
                "ch.qos.logback:logback-classic:$logbackVersion"
}

[configurations.runtime, configurations.default]*.exclude(module: 'commons-logging')

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            if (details.requested.group == 'org.slf4j') {
                details.useVersion slf4jVersion
            }
    }
}

[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

test {
    jvmArgs = ['-ea', '-Xmx500m', '-XX:MaxPermSize=128M']
    maxParallelForks = guessMaxForks()
    logging.captureStandardOutput(LogLevel.INFO)
}

def guessMaxForks() {
    int processors = Runtime.runtime.availableProcessors()
    return Math.max(2, (int) (processors / 2))
}

javadoc {
    title = "Spring Security $version API"
    source = sourceSets.main.allJava
    options {
        memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED
        author = true
        header = project.name
        outputLevel = org.gradle.external.javadoc.JavadocOutputLevel.QUIET
        links = [
            "http://static.springsource.org/spring/docs/3.2.x/javadoc-api/",
            "http://static.springsource.org/spring-ldap/docs/1.3.x/apidocs/",
            "http://download.oracle.com/javase/6/docs/api/"
        ]
        groups = [
            'Spring Security Core':[
                'org.springframework.security.core*',
                'org.springframework.security.authentication*',
                'org.springframework.security.access*',
                'org.springframework.security.remoting*',
                'org.springframework.security.provisioning*',
                'org.springframework.security.util*'],
            'Spring Security Web':['org.springframework.security.web*'],
            'Spring Security LDAP':['org.springframework.security.ldap*'],
            'Spring Security Crypto':['org.springframework.security.crypto*'],
            'Spring Security OpenID':['org.springframework.security.openid*'],
            'Spring Security CAS':['org.springframework.security.cas*'],
            'Spring Security ACL':['org.springframework.security.acls*'],
            'Spring Security Config':['org.springframework.security.config*'],
            'Spring Security Taglibs':['org.springframework.security.taglibs*'],
        ]
    }
}

eclipse.classpath.downloadSources = true

// http://forums.gradle.org/gradle/topics/eclipse_wtp_deploys_testcode_to_server_example_provided
eclipse.classpath {
    defaultOutputDir = file('bin/main')
    file.whenMerged { cp ->
        cp.entries.findAll { it instanceof SourceFolder && (it.path.contains("test") || it.path.contains("Test")) }*.output = "bin/test"
    }
}

// GRADLE-1116
project.eclipse.classpath.file.whenMerged { classpath ->
    classpath.entries.removeAll { entry -> entry.path.endsWith('/build/resources/test') }
    classpath.entries.removeAll { entry -> entry.path.endsWith('/build/classes/test') }
    classpath.entries.removeAll { entry -> entry.path.endsWith('/build/resources/main') }
    classpath.entries.removeAll { entry -> entry.path.endsWith('/build/classes/main') }
}

// GRADLE-1422
project.eclipseClasspath.doFirst {
   // delay adding whenMerged till the entryAttributes are added (must be the last whenMerged)
   project.eclipse.classpath.file.whenMerged { classpath ->
       def includeDeps = project.configurations.getByName('runtime').collect {f -> f.absolutePath } as Set
       classpath.entries.each { cp ->
           if(cp instanceof org.gradle.plugins.ide.eclipse.model.Library) {
               def include = includeDeps.contains(cp.path)
               def attr = 'org.eclipse.jst.component.dependency'
               if(!include) {
                   cp.entryAttributes.remove(attr)
               }
           }
       }
   }
}

task javadocJar(type: Jar) {
    classifier = 'javadoc'
    from javadoc
}

artifacts {
    archives javadocJar
}
