diff --git a/build.gradle b/build.gradle index ceffe7f877..05d207580e 100644 --- a/build.gradle +++ b/build.gradle @@ -44,7 +44,8 @@ configure (aspectjProjects) { // Task for creating the distro zip task dist(type: Zip) { - dependsOn subprojects*.tasks*.matching { task -> task.name == 'assemble' } + dependsOn subprojects*.tasks*.matching { task -> task.name == 'assemble' || task.name.endsWith('Zip') } + classifier = 'dist' evaluationDependsOn(':docs') @@ -65,9 +66,10 @@ task dist(type: Zip) { } } -task uploadDist(type: S3DistroUpload) { - archiveFile = dist.archivePath - projectKey = 'SEC' +artifacts { + archives dist + archives project(':docs').docsZip + archives project(':docs').schemaZip } apply from: "$rootDir/gradle/ide-integration.gradle" diff --git a/buildSrc/src/main/groovy/S3DistroUpload.groovy b/buildSrc/src/main/groovy/S3DistroUpload.groovy deleted file mode 100644 index e4342e72dc..0000000000 --- a/buildSrc/src/main/groovy/S3DistroUpload.groovy +++ /dev/null @@ -1,92 +0,0 @@ - -import org.gradle.api.DefaultTask -import org.gradle.api.tasks.InputFile -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.TaskAction -import org.jets3t.service.security.AWSCredentials -import org.jets3t.service.impl.rest.httpclient.RestS3Service -import org.jets3t.service.S3Service -import org.jets3t.service.model.S3Bucket -import org.jets3t.service.model.S3Object -import org.jets3t.service.acl.AccessControlList - -/** - * @author Luke Taylor - */ -class S3DistroUpload extends DefaultTask { - @InputFile - File archiveFile - - @Input - String bucketName = 'dist.springframework.org' - - // 'Spring Security' - @Input - String projectName = project.description - - // e.g 'SEC' - @Input - String projectKey - - @TaskAction - def upload() { - def accessKey = project.s3AccessKey - def secretKey = project.s3SecretAccessKey - def version = project.version.toString() - - assert version.length() > 0 - assert accessKey.length() > 0 - assert secretKey.length() > 0 - assert projectName.length() > 0 - - assert archiveFile.exists() - - String archiveName = archiveFile.getName() - - logger.info("Creating SHA checksum file...") - project.ant.checksum(file: archiveFile, algorithm: 'SHA1', fileext: '.sha1', forceoverwrite: 'true') - File shaFile = "${archiveFile}.sha1" as File - - assert shaFile.exists() - - AWSCredentials creds = new AWSCredentials(accessKey, secretKey); - S3Service s3 = new RestS3Service(creds) - S3Bucket bucket = new S3Bucket(bucketName) - - String releaseType = releaseType(version) - - String key = releaseType + '/' + projectKey + '/' + archiveName - - S3Object archiveDest = new S3Object(bucket, key) - archiveDest.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ) - archiveDest.setDataInputFile(archiveFile) - archiveDest.setContentLength(archiveFile.length()) - archiveDest.addMetadata('project.name', projectName) - archiveDest.addMetadata('bundle.version', version) - archiveDest.addMetadata('release.type', releaseType) - archiveDest.addMetadata('package.file.name', archiveName) - - logger.info("Uploading archive " + archiveFile.getName() + " to " + archiveDest + "...") - s3.putObject(bucket, archiveDest) - logger.info("Done") - - S3Object shaDest = new S3Object(bucket, key + '.sha1') - shaDest.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ) - shaDest.setDataInputFile(shaFile) - shaDest.setContentLength(shaFile.length()) - - logger.info("Uploading SHA checksum " + shaFile.getName() + " to " + key + '.sha1' + "...") - s3.putObject(bucket, shaDest); - logger.info("Done") - } - - def releaseType(String version) { - if (version.endsWith('RELEASE')) { - 'release' - } else if (version.endsWith('SNAPSHOT')) { - 'snapshot' - } else { - 'milestone' - } - } -} diff --git a/buildSrc/src/main/groovy/TarUpload.groovy b/buildSrc/src/main/groovy/TarUpload.groovy deleted file mode 100644 index ab0234865e..0000000000 --- a/buildSrc/src/main/groovy/TarUpload.groovy +++ /dev/null @@ -1,75 +0,0 @@ -import org.gradle.api.DefaultTask; -import org.gradle.api.tasks.*; -import org.gradle.api.tasks.bundling.Tar; -import org.gradle.api.tasks.bundling.Compression; - -/** - * Extends the Tar task, uploading the created archive to a remote directory, unpacking and deleting it. - * Requires Ant ssh (jsch) support. - */ -class TarUpload extends Tar { - @Input - String remoteDir - Login login - @Input - String host - - TarUpload() { - compression = Compression.BZIP2 - if (project.configurations.findByName('antjsch') == null) { - project.configurations.add('antjsch') - project.dependencies { - antjsch 'org.apache.ant:ant-jsch:1.8.1' - } - def classpath = project.configurations.antjsch.asPath - project.ant { - taskdef(name: 'scp', classname: 'org.apache.tools.ant.taskdefs.optional.ssh.Scp', classpath: classpath) - taskdef(name: 'sshexec', classname: 'org.apache.tools.ant.taskdefs.optional.ssh.SSHExec', classpath: classpath) - } - } - } - - @TaskAction - void copy() { - super.copy(); - upload(); - } - - def upload() { - String username = login.username - String password = login.password - String host = login.host - project.ant { - scp(file: archivePath, todir: "$username@$host:$remoteDir", password: password) - sshexec(host: host, username: username, password: password, command: "cd $remoteDir && tar -xjf $archiveName") - sshexec(host: host, username: username, password: password, command: "rm $remoteDir/$archiveName") - } - } - - void setLogin(Login login) { - dependsOn(login) - this.login = login - this.host = login.host - } -} - -/** - * Stores login information for a remote host. - */ -class Login extends DefaultTask { - @Input - String host - String username - String password - - @TaskAction - login() { - def console = System.console() - if (console) { - username = console.readLine("\nPlease enter the ssh username for host '$host': ") - password = new String(console.readPassword("Please enter the ssh password for '$host': ")) - } else { - logger.error "Unable to access System.console()." - } - } -} diff --git a/buildSrc/src/main/groovy/docbook/DocbookPlugin.groovy b/buildSrc/src/main/groovy/docbook/DocbookPlugin.groovy index dae24e8ab4..d9c699c061 100644 --- a/buildSrc/src/main/groovy/docbook/DocbookPlugin.groovy +++ b/buildSrc/src/main/groovy/docbook/DocbookPlugin.groovy @@ -92,7 +92,7 @@ public class Docbook extends DefaultTask { factory.setXIncludeAware(XIncludeAware); docsDir.mkdirs(); - File srcFile = new File(sourceDirectory, sourceFileName); + File srcFile = new File(filterDocbookSources(sourceDirectory), sourceFileName); String outputFilename = srcFile.getName().substring(0, srcFile.getName().length() - 4) + suffix + '.' + extension; File outputFile = new File(getDocsDir(), outputFilename); @@ -135,6 +135,32 @@ public class Docbook extends DefaultTask { postTransform(outputFile); } + /** + * @param sourceDir directory of unfiltered sources + * @return directory of filtered sources + * @author Chris Beams + */ + private File filterDocbookSources(File sourceDir) { + def docbookWorkDir = new File("${project.buildDir}/reference-work") + + docbookWorkDir.mkdirs() + + // copy everything but springsecurity.xml + project.copy { + into(docbookWorkDir) + from(sourceDir) { exclude '**/springsecurity.xml' } + } + // copy index.xml and expand ${...} variables along the way + // e.g.: ${version} needs to be replaced in the header + project.copy { + into(docbookWorkDir) + from(sourceDir) { include '**/springsecurity.xml' } + expand(version: "${project.version}") + } + + return docbookWorkDir + } + private void extractHighlightFiles(File toDir) { URLClassLoader cl = (URLClassLoader) getClass().getClassLoader(); URL[] urls = cl.getURLs(); diff --git a/docs/docs.gradle b/docs/docs.gradle index d43118aa6c..685ac7dbd6 100644 --- a/docs/docs.gradle +++ b/docs/docs.gradle @@ -99,49 +99,45 @@ ext.apiSpec = copySpec { } } -task docSiteLogin(type: Login) { - if (project.hasProperty('sshHost')) { - host = project.property('sshHost') - } -} - -// Define remoteSiteDir and sshHost in gradle.properties -def remoteDocsDir = null - -if (hasProperty('remoteSiteDir')) { - remoteDocsDir="$remoteSiteDir/docs/3.1.x" -} - -task uploadApidocs(type: TarUpload) { - dependsOn apidocs - baseName = "${rootProject.name}" - appendix = 'apidocs' - remoteDir = remoteDocsDir - login = docSiteLogin - - with(apiSpec) -} - -task uploadManual(type: TarUpload) { - dependsOn 'manual:docbook' - baseName = "${rootProject.name}" - appendix = 'doc' - remoteDir = remoteDocsDir - login = docSiteLogin - - with(project('manual').spec) -} - -task uploadFaq(type: TarUpload) { - dependsOn 'faq:docbookHtmlSingle' - baseName = "${rootProject.name}" - appendix = 'faq' - if (project.hasProperty('remoteSiteDir')) { - remoteDir = project.property('remoteSiteDir') - } - login = docSiteLogin - - with(project('faq').spec) -} - assemble.dependsOn = [apidocs, 'manual:docbook'] + +task docsZip(type: Zip) { + dependsOn docs + group = 'Distribution' + baseName = rootProject.name + classifier = 'docs' + description = "Builds -${classifier} archive containing api and reference " + + "for deployment at static.springframework.org/spring-security/site/docs." + + with(project(':docs').apiSpec) + with(project(':docs:manual').spec) + with(project(':docs:faq').spec) +} + +task schemaZip(type: Zip) { + group = 'Distribution' + baseName = rootProject.name + classifier = 'schema' + description = "Builds -${classifier} archive containing all " + + "XSDs for deployment at static.springframework.org/schema." + + coreModuleProjects.each { module -> + def Properties schemas = new Properties(); + + module.sourceSets.main.resources.find { + it.path.endsWith('META-INF/spring.schemas') + }?.withInputStream { schemas.load(it) } + + for (def key : schemas.keySet()) { + def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1') + assert shortName != key + File xsdFile = module.sourceSets.main.resources.find { + it.path.endsWith(schemas.get(key)) + } + assert xsdFile != null + into (shortName) { + from xsdFile.path + } + } + } +} diff --git a/docs/manual/src/docbook/springsecurity.xml b/docs/manual/src/docbook/springsecurity.xml index e9495e4202..0188bc587c 100644 --- a/docs/manual/src/docbook/springsecurity.xml +++ b/docs/manual/src/docbook/springsecurity.xml @@ -13,7 +13,7 @@ Spring Security - 3.1.2.CI-SNAPSHOT + ${version} diff --git a/gradle/maven-deployment.gradle b/gradle/maven-deployment.gradle index 4be1515b66..164de7a38e 100644 --- a/gradle/maven-deployment.gradle +++ b/gradle/maven-deployment.gradle @@ -25,37 +25,6 @@ configurations.default.extendsFrom = [configurations.runtime] as Set // Add the main jar into the default configuration artifacts { 'default' jar } -gradle.taskGraph.whenReady {graph -> - if (graph.hasTask(uploadArchives)) { - // check properties defined and fail early - s3AccessKey - s3SecretAccessKey - } -} - -uploadArchives { - // "mavenSyncRepoDir" should be set in properties - def releaseRepositoryUrl = "file://${project.properties.mavenSyncRepoDir}" - def milestoneRepositoryUrl = 's3://maven.springframework.org/milestone' - def snapshotRepositoryUrl = 's3://maven.springframework.org/snapshot' - - repositories.mavenDeployer { deployer -> - configuration = configurations.deployerJars - if (releaseBuild) { - repository(url: releaseRepositoryUrl) - } else { - def s3credentials = [userName: project.properties.s3AccessKey, passphrase: project.properties.s3SecretAccessKey] - repository(url: milestoneRepositoryUrl) { - authentication(s3credentials) - } - snapshotRepository(url: snapshotRepositoryUrl) { - authentication(s3credentials) - } - } - customizePom(deployer.pom) - } -} - install { customizePom(repositories.mavenInstaller.pom) } @@ -105,4 +74,4 @@ def customizePom(pom) { } } } -} +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 31db6dae91..8db553f5e9 100644 --- a/settings.gradle +++ b/settings.gradle @@ -63,6 +63,8 @@ include 'docs', 'docs:faq', 'docs:manual' def docs = findProject(':docs') docs.buildFileName = 'docs.gradle' +rootProject.name = 'spring-security' + rootProject.children.each {project -> assert project.projectDir.isDirectory() assert project.buildFile.isFile()