import org.gradle.plugins.ide.idea.model.*
import t5build.*

description = "Bridge to CDI for Apache Tapestry 5 Project"

apply plugin: JavaPlugin

buildDir = 'target/gradle-build'
       
project.ext.libraryVersions = [
    javaeeapi: '6.0-4', 
    tomee: '1.6.0', 
    ziplock: '1.5.1',
    junit: '4.8.1', 
    commonsHttpclient: '3.1',
    arquillian: '1.1.1.Final', 
    jbossJavaeeSpec: '1.0.0.Final',
    arquillianGlassfish: '1.0.0.CR4',
    glassfishDistrib: '3.1.1-b04', 
    jbossDistrib: '7.1.1.Final', 
    cdi: '1.0-SP4',
    jbossAS7: '7.1.1.Final', 
    shrinkwrapDesc: '2.0.0-alpha-3'
]


configurations {
    compileOnly 
    jboss
    glassfish
    tomeeEmbeddedTestRuntime  { extendsFrom testRuntime, compileOnly }
    jbossAS7ManagedTestRuntime { extendsFrom testRuntime, compileOnly }
    glassfishManagedTestRuntime { extendsFrom testRuntime, compileOnly }
}

dependencies {
    compile project(':tapestry-core')
    compile project(':tapestry-ioc')
    testCompile (project(':tapestry-test')){
         transitive = false
     } 
      
    // replace javax.enterprise:cdi-api with group: 'org.jboss.spec', name: 'jboss-javaee-6.0', version: libraryVersions.jbossJavaeeSpec to compile against full Java EE API
    compileOnly group: 'javax.enterprise', name: 'cdi-api', version: libraryVersions.cdi
    
    
    testCompile group: 'org.apache.openejb', name: 'ziplock', version: libraryVersions.ziplock
    testCompile group: 'junit', name: 'junit', version: libraryVersions.junit
    testCompile group: 'commons-httpclient', name: 'commons-httpclient', version: libraryVersions.commonsHttpclient
    
    testCompile group: 'org.jboss.arquillian.junit', name: 'arquillian-junit-container', version: libraryVersions.arquillian
    testCompile group: 'org.jboss.shrinkwrap.descriptors', name: 'shrinkwrap-descriptors-api-javaee', version: libraryVersions.shrinkwrapDesc
    testRuntime group: 'org.jboss.shrinkwrap.descriptors', name: 'shrinkwrap-descriptors-impl-javaee', version: libraryVersions.shrinkwrapDesc
    
    tomeeEmbeddedTestRuntime group: 'org.apache.openejb', name: 'arquillian-tomee-embedded', version: libraryVersions.tomee
    
    jbossAS7ManagedTestRuntime group: 'org.jboss.as', name: 'jboss-as-arquillian-container-managed', version: libraryVersions.jbossAS7
    jbossAS7ManagedTestRuntime group: 'org.jboss.spec', name: 'jboss-javaee-6.0', version: libraryVersions.jbossJavaeeSpec
    jboss "org.jboss.as:jboss-as-dist:$libraryVersions.jbossDistrib@zip"
 
    glassfishManagedTestRuntime group: 'org.jboss.arquillian.container', name: 'arquillian-glassfish-managed-3.1', version: libraryVersions.arquillianGlassfish
    glassfish "org.glassfish.distributions:glassfish:$libraryVersions.glassfishDistrib@zip"     
}

sourceSets {
    main {
        compileClasspath = configurations.compile + configurations.compileOnly
    }
    test {
        compileClasspath = compileClasspath + configurations.compileOnly
    }
}

idea {
      module {
        scopes.PROVIDED.plus += configurations.compileOnly
      }
    }

eclipse {
    classpath {
        plusConfigurations += configurations.compileOnly
    }
}

task resolveJBoss(type: Copy) {  
    destinationDir = file('target') 
    from { zipTree(configurations.jboss.singleFile) }
}

task resolveGlassfish(type: Copy) {
    destinationDir = file('target')
    from { zipTree(configurations.glassfish.singleFile) }
}


task tomeeEmbeddedTest(type: Test) {
  systemProperty 'arquillian.launch', "tomee_embedded"
}

task jbossAS7ManagedTest(type: Test) {
  systemProperty 'arquillian.launch', "jbossas_managed"
   dependsOn { resolveJBoss }
}

task glassfishManagedTest(type: Test){
  systemProperty 'arquillian.launch', "glassfish_managed"
   dependsOn { resolveGlassfish }
}

tasks.withType(Test).matching({ t-> t.name.endsWith('Test') } as Spec).each { t ->
    t.testClassesDir = sourceSets.test.output.classesDir
    t.classpath = sourceSets.test.output + sourceSets.main.output + configurations[t.name + 'Runtime']
}

test {
  dependsOn { tomeeEmbeddedTest }
  setEnabled(false)
}

jar {	

	manifest {	
		attributes 'Tapestry-Module-Classes': 'org.apache.tapestry5.cdi.CDIInjectModule'
		}
 }
