description = "Apache Tapestry 5 Project"

jettyVersion = '7.0.0.v20091005'
tomcatVersion = '6.0.30'
testngVersion = '5.14.9'
easymockVersion = '3.0'
servletAPIVersion = '2.4'

version = '5.3.0'

doSign = !project.hasProperty('noSign') && project.hasProperty("signing.keyId")

buildscript {
  repositories {
    mavenLocal()
    mavenRepo name: "Gradle", urls: "http://repo.gradle.org/gradle/plugins-snapshots/"
  }
  dependencies {
    classpath "org.gradle.plugins:gradle-signing-plugin:0.0.1-SNAPSHOT"
  }
}

allprojects {
    
    apply plugin: 'eclipse'
    apply plugin: 'idea'
    
    repositories {
        mavenCentral()
               
        // All things JBoss/Javassist/Hibernate
        mavenRepo urls: "https://repository.jboss.org/nexus/content/repositories/releases/" 
    }
}

subprojects {
  version =  parent.version  
  
  apply plugin: 'java'
  apply plugin: 'groovy' // mostly for testing
  apply plugin: 'maven'
  apply plugin: 'project-report'
  
  sourceCompatibility = '1.5'
  targetCompatibility = '1.5'
      
  group = 'org.apache.tapestry'  
  
  configurations {
    provided
    deployerJars
    
    // meta -- non-code artifacts, such as sources and javadoc JARs
    meta
    
    // published -- what gets uploaded to the Nexus repository
    published.extendsFrom archives, meta
    if (doSign) { published.extendsFrom signatures }    
  }
  
  // See http://jira.codehaus.org/browse/GRADLE-784
  
  sourceSets {
    main { 
      compileClasspath += configurations.provided 
    }
    test {
      compileClasspath += configurations.provided
      runtimeClasspath += configurations.provided
    }
  }
  

  dependencies {
      groovy "org.codehaus.groovy:groovy-all:1.7.4"
      
      deployerJars "org.apache.maven.wagon:wagon-http-lightweight:1.0-beta-6"
  }
  
  test {
      useTestNG()
      
      options.suites("src/test/conf/testng.xml")
      
      maxHeapSize = "400M"
      
      // Turn off live service reloading

      systemProperties["tapestry.service-reloading-enabled"] = "false"

      jvmArgs("-XX:MaxPermSize=512m")        
  }
  
  task sourcesJar(type: Jar, dependsOn:classes) {
     classifier = 'sources'
     from sourceSets.main.allSource
  }

  artifacts {
     meta sourcesJar
  }    
  
  if (doSign) {
    apply plugin: 'signing'
    // sign (create PGP signature for) archives (standard JARs)
    // and meta (sources JARs)
    signing { sign configurations.archives, configurations.meta }
  }
  
  // apacheDeployUserName and apacheDeployPassword should be specified in ~/.gradle/gradle.properties
  
  deployUsernameProperty = "apacheDeployUserName"
  deployPasswordProperty = "apacheDeployPassword"
  canDeploy = [deployUsernameProperty, deployPasswordProperty].every { project.hasProperty(it) }
  
    
  uploadPublished  {
  
    doFirst {
      if (!canDeploy) { 
        throw new InvalidUserDataException("Missing upload credentials. Set '$deployUsernameProperty' and '$deployPasswordProperty' project properties.")
      }
    }  
    
    if (canDeploy) {
      repositories  {
        
        project.deployer = repositories.mavenDeployer {
        
          if (doSign) {
            beforeDeployment { MavenDeployment deployment ->
              def signedPomArtifact = sign(deployment.pomArtifact).singleArtifact
              // See http://issues.gradle.org/browse/GRADLE-1589
              signedPomArtifact.type = "pom." + signing.type.extension
              deployment.addArtifact(signedPomArtifact)
            }
          }          

          repository(url: "https://repository.apache.org/service/local/staging/deploy/maven2/") {
            authentication(userName: apacheDeployUserName, password: apacheDeployPassword)
          }        
        }
      }
    }
  }
}

// Specific to top-level build, not set for subprojects:

configurations {
  javadoc
  published.extendsFrom archives, meta
  if (doSign) { published.extendsFrom signatures }
}

dependencies {
  javadoc project(':tapestry-javadoc')
}

subprojects.each { project.evaluationDependsOn(it.name) }

// Cribbed from https://github.com/hibernate/hibernate-core/blob/master/release/release.gradle#L19

javadocBuildDir = dir(buildDirName + "/documentation/javadocs")

task aggregateJavadoc(type: Javadoc) {

   dependsOn configurations.javadoc
   
   description = "Build the aggregated JavaDocs for all modules"
   maxMemory = '512m'
   destinationDir = javadocBuildDir.dir
   configure(options) {
       // overview = new File( projectDir, 'src/javadoc/package.html' )
       // stylesheetFile = new File( projectDir, 'src/javadoc/stylesheet.css' )
       windowTitle = 'Tapestry API Documentation'
       docTitle = "Tapestry JavaDoc ($project.version)"
       bottom = "Copyright &copy; 2003-2011 <a href=\"http://tapestry.apache.org\">The Apache Software Foundation</a>."
       use = true
       links = [ 'http://download.oracle.com/javase/6/docs/api/', 'http://download.oracle.com/javaee/6/api/' ]
       addStringOption "tagletpath", configurations.javadoc.asPath
       addStringOption "taglet", "org.apache.tapestry5.javadoc.TapestryDocTaglet"
       
       exclude "org/apache/tapestry5/internal/plastic/asm/**"
   }

   subprojects.each { sp -> 
     sp.sourceSets.all.findAll { set -> set.name != "test" }.each { set ->
       
       source set.java

       classpath += set.classes + set.compileClasspath

       // Some of the component .xdoc files refer to PNG images
       // (we could also exclude .java and .xdoc)
       copy {
         from set.java.srcDirs.toList()                 
         into javadocBuildDir.dir
         include '**/*.png'
       }       
     }
   }
 }


task clean(type: Delete) {
  delete buildDirName
}

task continuousIntegration(dependsOn: [subprojects.build, 'aggregateJavadoc'], 
  description: "Task executed on Jenkins CI server after SVN commits")

task generateRelease(dependsOn: [subprojects.clean, 'continuousIntegration', subprojects.uploadPublished, 'distSourcesZip'], 
  description: "Generates and uploads a final release to Apache Nexus")

task wrapper(type: Wrapper) {
  gradleVersion = '1.0-milestone-3'
  description = "Regenerates the Gradle Wrapper files"
}

task distSourcesZip(type: Zip) {
  classifier = "sources"
  baseName = "apache-tapestry"
  version = project.version
  destinationDir = buildDir
  description = "Creates a combined Zip file of all sub-project's sources"

  from project.projectDir
  exclude "**/.*/**"
  exclude "**/bin/**"
  exclude "**/target/**"
  exclude "**/build/**"
  exclude "**/test-output/**"  // Left around by TestNG sometimes
 
}