diff --git a/.gitignore b/.gitignore index 81f392e62b..eee4e3e0d0 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,6 @@ target/ .settings/ build/ *.log +*.iml .gradle/ gradle.properties diff --git a/build.gradle b/build.gradle index e4bb6969cd..d3a9a4acac 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,3 @@ -import java.util.jar.Manifest -import org.gradle.api.tasks.bundling.GradleManifest - apply id: 'base' allprojects { @@ -11,137 +8,26 @@ allprojects { group = 'org.springframework.security' repositories { - mavenRepo name:'Local', urls:'file:///Users/luke/.m2/repository' + mavenRepo name:'Local', urls: "file://" + System.properties['user.home'] + "/.m2/repository" mavenCentral() - mavenRepo name:'SpringSource Milestone Repo', urls:'http://repository.springsource.com/maven/bundles/milestone' - mavenRepo name:'SpringSource Maven Snapshot Repo', urls:'http://maven.springframework.org/snapshot/' + mavenRepo name: 'SpringSource Milestone Repo', urls: 'http://repository.springsource.com/maven/bundles/milestone' + mavenRepo name: 'SpringSource Maven Snapshot Repo', urls: 'http://maven.springframework.org/snapshot/' + mavenRepo name: 'SpringSource Enterprise Release', urls: 'http://repository.springsource.com/maven/bundles/release' + mavenRepo name: 'SpringSource Enterprise External', urls: 'http://repository.springsource.com/maven/bundles/external' } } -configure(javaProjects()) { - apply id: 'java' - - springVersion = '3.0.1.RELEASE' - springLdapVersion = '1.3.0.RELEASE' - ehcacheVersion = '1.6.2' - aspectjVersion = '1.6.8' - apacheDsVersion = '1.5.5' - jstlVersion = '1.1.2' - jettyVersion = '6.1.22' - hsqlVersion = '1.8.0.10' - - configurations { - bundlor - provided - } - - dependencies { - compile 'commons-logging:commons-logging:1.1.1' - - testCompile 'junit:junit:4.7', - 'org.mockito:mockito-core:1.7', - 'org.jmock:jmock:2.5.1', - 'org.jmock:jmock-junit4:2.5.1', - 'org.hamcrest:hamcrest-core:1.1', - 'org.hamcrest:hamcrest-library:1.1', - "org.springframework:spring-test:$springVersion" - bundlor 'com.springsource.bundlor:com.springsource.bundlor.ant:1.0.0.RC1', - 'com.springsource.bundlor:com.springsource.bundlor:1.0.0.RC1', - 'com.springsource.bundlor:com.springsource.bundlor.blint:1.0.0.RC1' - } - - sourceSets { - main { - compileClasspath = compileClasspath + configurations.provided - } - test { - compileClasspath = compileClasspath + configurations.provided - runtimeClasspath = runtimeClasspath + configurations.provided - } - } - - test { - jvmArgs = ['-ea', '-Xms128m', '-Xmx500m', '-XX:MaxPermSize=128m'] - } - - task bundlor (dependsOn: compileJava) << { - if (!dependsOnTaskDidWork()) { - return - } - ant.taskdef(resource: 'com/springsource/bundlor/ant/antlib.xml', classpath: configurations.bundlor.asPath) - File template = new File(projectDir, 'template.mf') - mkdir(buildDir, 'bundlor') - if (template.exists()) { - ant.bundlor(inputPath: sourceSets.main.classesDir, outputPath: "$buildDir/bundlor", manifestTemplatePath: template) { - property(name: 'version', value: "$version") - property(name: 'spring.version', value: "$springVersion") - } - // See GRADLE-395 for support for using an existing manifest - jar.manifest = new GradleManifest(new Manifest(new File("$buildDir/bundlor/META-INF/MANIFEST.MF").newInputStream())) - } - } - - jar.dependsOn bundlor +configure(javaProjects) { + apply url: "$rootDir/gradle/javaprojects.gradle" + apply url: "$rootDir/gradle/maven.gradle" } -configure(javaProjects()) { - apply id: 'maven' - // Create a source jar for uploading - task sourceJar(type: Jar) { - classifier = 'sources' - from sourceSets.main.java - } - - configurations { - deployerJars - } - - artifacts { - archives sourceJar - } - - dependencies { - deployerJars "org.springframework.build.aws:org.springframework.build.aws.maven:2.0.1.BUILD-SNAPSHOT" - } - - uploadArchives { - repositories.mavenDeployer { - configuration = configurations.deployerJars - if (releaseBuild) { - // "mavenSyncRepoDir" should be set in properties - repository(url: mavenSyncRepoDir) - } else { - s3credentials = [userName: s3AccessKey, passphrase: s3SecretAccessKey] - repository(url: "s3://maven.springframework.org/milestone") { - authentication(s3credentials) - } - snapshotRepository(url: "s3://maven.springframework.org/snapshot") { - authentication(s3credentials) - } - } - pom.whenConfigured { pom -> - def optionalDeps = ['commons-logging', 'ehcache', 'log4j', 'apacheds-core', 'apacheds-server-jndi', 'jsp-api', 'slf4j-api', 'slf4j-log4j12', 'jsr250-api', 'ldapsdk'] - def providedDeps = ['servlet-api'] - pom.dependencies.findAll { dep -> optionalDeps.contains(dep.artifactId) }*.optional = true - pom.dependencies.findAll { dep -> providedDeps.contains(dep.artifactId) }*.scope = 'provided' - } - } - } - - conf2ScopeMappings.addMapping(1, configurations.provided, "provided") -} - -configure(coreModuleProjects()) { +configure(coreModuleProjects) { // Gives better names in structure101 jar diagram sourceSets.main.classesDir = new File(buildDir, "classes/" + project.name.substring("spring-security".length() + 1)) } -repositories { - // Required for ant s3 task - mavenRepo name: "s2.com release", urls: "http://repository.springsource.com/maven/bundles/release" -} - configurations { antlibs } @@ -158,12 +44,13 @@ task apidocs(type: Javadoc) { title = "Spring Security $version API" optionsFile = file("$buildDir/tmp/javadoc.options") - source coreModuleProjects().collect { project -> + source coreModuleProjects.collect {project -> project.sourceSets.main.allJava } - classpath = files(coreModuleProjects().collect { project -> - project.sourceSets.main.compileClasspath }) + classpath = files(coreModuleProjects.collect {project -> + project.sourceSets.main.compileClasspath + }) } task apitar(type: Tar, dependsOn: apidocs) { @@ -182,31 +69,39 @@ task doctar(type: Tar, dependsOn: ':manual:doc') { } } -def username; -def password; - -task login << { - ant.input("Please enter the ssh username for host '$sshHost'", addproperty: "ssh.username") - ant.input("Please enter the ssh password '$sshHost'", addproperty: "ssh.password") - username = ant.properties['ssh.username'] - password = ant.properties['ssh.password'] +task login { + // add dynamic properties to login task + username = null + password = null + doFirst { + ant { + input("Please enter the ssh username for host '$sshHost'", addproperty: "ssh.username") + input("Please enter the ssh password '$sshHost'", addproperty: "ssh.password") + } + username = ant.properties['ssh.username'] + password = ant.properties['ssh.password'] + } } -task uploadApidocs (dependsOn: login) << { - ant.scp(file: apitar.archivePath, todir: "$username@$sshHost:$remoteDocsDir", password: password) - ant.sshexec(host: sshHost, username: username, password: password, command: "cd $remoteDocsDir && tar -xjf ${apitar.archiveName}") - ant.sshexec(host: sshHost, username: username, password: password, command: "rm $remoteDocsDir/${apitar.archiveName}") +task uploadApidocs(dependsOn: login) << { + ant { + scp(file: apitar.archivePath, todir: "$login.username@$sshHost:$remoteDocsDir", password: login.password) + sshexec(host: sshHost, username: login.username, password: login.password, command: "cd $remoteDocsDir && tar -xjf ${apitar.archiveName}") + sshexec(host: sshHost, username: login.username, password: login.password, command: "rm $remoteDocsDir/${apitar.archiveName}") + } } -task uploadManual (dependsOn: login) << { - ant.scp(file: doctar.archivePath, todir: "$username@$sshHost:$remoteDocsDir", password: password) - ant.sshexec(host: sshHost, username: username, password: password, command: "cd $remoteDocsDir && tar -xjf ${doctar.archiveName}") - ant.sshexec(host: sshHost, username: username, password: password, command: "rm $remoteDocsDir/${doctar.archiveName}") +task uploadManual(dependsOn: login) << { + ant { + scp(file: doctar.archivePath, todir: "$login.username@$sshHost:$remoteDocsDir", password: login.password) + sshexec(host: sshHost, username: login.username, password: login.password, command: "cd $remoteDocsDir && tar -xjf ${doctar.archiveName}") + sshexec(host: sshHost, username: login.username, password: login.password, command: "rm $remoteDocsDir/${doctar.archiveName}") + } } -task dist (type: Zip) { +task dist(type: Zip) { def zipRootDir = "${project.name}-$version" - into (zipRootDir) { + into(zipRootDir) { into('docs/apidocs') { from apidocs.destinationDir } @@ -214,61 +109,81 @@ task dist (type: Zip) { from docsDir } into('dist') { - from coreModuleProjects().collect { project -> project.libsDir } + from coreModuleProjects.collect {project -> project.libsDir } from project(':spring-security-samples-tutorial').libsDir from project(':spring-security-samples-contacts').libsDir } } } -dist.dependsOn apidocs, ':manual:doc' -dist.dependsOn subprojects.collect { "$it.path:assemble" } - -dist.doLast { - ant.checksum(file: archivePath, algorithm: 'SHA1', fileext: '.sha1') +dist { + dependsOn apidocs, ':manual:doc', subprojects.collect { "$it.path:assemble" } + doLast { + ant.checksum(file: archivePath, algorithm: 'SHA1', fileext: '.sha1') + } } -task uploadDist << { - def shaFile = file("${dist.archivePath}.sha1") - assert dist.archivePath.isFile() - assert shaFile.isFile() - ant.taskdef(resource: 'org/springframework/build/aws/ant/antlib.xml', classpath: configurations.antlibs.asPath) - ant.s3(accessKey: s3AccessKey, secretKey: s3SecretAccessKey) { - upload(bucketName: 'dist.springframework.org', file: dist.archivePath, - toFile: releaseType() + "/SEC/${dist.archiveName}", publicRead: 'true') { - metadata(name: 'project.name', value: 'Spring Security') - metadata(name: 'release.type', value: releaseType()) - metadata(name: 'bundle.version', value: version) - metadata(name: 'package.file.name', value: dist.archiveName) +task uploadDist(type: UploadDist) { + archiveFile = dist.archivePath + shaFile = "${dist.archivePath}.sha1" as File + archiveName = dist.archiveName +} + +def getJavaProjects() { + subprojects.findAll {project -> project.name != 'faq' && project.name != 'manual' } +} + +def getSampleProjects() { + subprojects.findAll {project -> project.name.startsWith('spring-security-samples') } +} + +def getItestProjects() { + subprojects.findAll {project -> project.name.startsWith('itest') } +} + +def getCoreModuleProjects() { + javaProjects - sampleProjects - itestProjects +} + +class UploadDist extends DefaultTask { + @InputFile + File shaFile + + @InputFile + File archiveFile + + @Input + String archiveName + + @InputFiles + def classpath + + @TaskAction + def upload() { + project.ant { + taskdef(resource: 'org/springframework/build/aws/ant/antlib.xml', classpath: classpath.asPath) + s3(accessKey: project.s3AccessKey, secretKey: project.s3SecretAccessKey) { + upload(bucketName: 'dist.springframework.org', file: archiveFile, + toFile: releaseType() + "/SEC/${archiveName}", publicRead: 'true') { + metadata(name: 'project.name', value: 'Spring Security') + metadata(name: 'release.type', value: releaseType()) + metadata(name: 'bundle.version', value: project.version) + metadata(name: 'package.file.name', value: archiveName) + } + upload(bucketName: 'dist.springframework.org', file: shaFile, + toFile: releaseType() + "/SEC/${archiveName}.sha1", publicRead: 'true') + } + } + } + + def releaseType() { + if (project.releaseBuild) { + 'release' + } else if (project.snapshotBuild) { + 'snapshot' + } else { + 'milestone' } - upload(bucketName: 'dist.springframework.org', file: shaFile, - toFile: releaseType() + "/SEC/${dist.archiveName}.sha1", publicRead: 'true') - } -} - -def javaProjects() { - subprojects.findAll { project -> project.name != 'faq' && project.name != 'manual' } -} - -def sampleProjects() { - subprojects.findAll { project -> project.name.startsWith('spring-security-samples') } -} - -def itestProjects() { - subprojects.findAll { project -> project.name.startsWith('itest') } -} - -def coreModuleProjects() { - javaProjects() - sampleProjects() - itestProjects() -} - -def releaseType() { - if (releaseBuild) { - 'release' - } else if (snapshotBuild) { - 'snapshot' - } else { - 'milestone' } } diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 0000000000..aee47393c5 --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,32 @@ +apply id: 'groovy' + +repositories { + mavenRepo name:'localRepo', urls: "file://" + System.properties['user.home'] + "/.m2/repository" + mavenCentral() + mavenRepo name:'Shibboleth Repo', urls:'http://shibboleth.internet2.edu/downloads/maven2' +} + +dependencies { + def fopDeps = [ 'org.apache.xmlgraphics:fop:0.95-1@jar', + 'org.apache.xmlgraphics:xmlgraphics-commons:1.3', + 'org.apache.xmlgraphics:batik-bridge:1.7@jar', + 'org.apache.xmlgraphics:batik-util:1.7@jar', + 'org.apache.xmlgraphics:batik-css:1.7@jar', + 'org.apache.xmlgraphics:batik-dom:1.7', + 'org.apache.xmlgraphics:batik-svg-dom:1.7@jar', + 'org.apache.avalon.framework:avalon-framework-api:4.3.1'] + groovy localGroovy() + compile gradleApi(), + 'org.apache.xerces:resolver:2.9.1', + 'saxon:saxon:6.5.3', + 'org.apache.xerces:xercesImpl:2.9.1', + fopDeps + + runtime 'net.sf.xslthl:xslthl:2.0.1', + 'net.sf.docbook:docbook-xsl:1.75.2:resources@zip' +} + +task ide(type: Copy) { + from configurations.runtime + into 'ide' +} diff --git a/buildSrc/src/main/groovy/docbook/DocbookPlugin.groovy b/buildSrc/src/main/groovy/docbook/DocbookPlugin.groovy new file mode 100644 index 0000000000..856f467320 --- /dev/null +++ b/buildSrc/src/main/groovy/docbook/DocbookPlugin.groovy @@ -0,0 +1,266 @@ +package docbook; + +import org.gradle.api.Plugin; +import org.gradle.api.GradleException; +import org.gradle.api.DefaultTask; +import org.gradle.api.Task; +import org.gradle.api.Project; +import org.gradle.api.Action; +import org.gradle.api.tasks.*; +import org.gradle.api.file.FileCollection; + +import org.xml.sax.XMLReader; +import org.xml.sax.InputSource; +import org.apache.xml.resolver.CatalogManager; +import org.apache.xml.resolver.tools.CatalogResolver; + +import javax.xml.parsers.SAXParserFactory; +import javax.xml.transform.*; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.sax.SAXResult; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import java.io.*; +import java.util.*; +import java.util.zip.*; +import java.net.*; + +import org.apache.fop.apps.*; + +import com.icl.saxon.TransformerFactoryImpl; + +/** + * Gradle Docbook plugin implementation. + *

+ * Creates three tasks: docbookHtml, docbookHtmlSingle and docbookPdf. Each task takes a single File on + * which it operates. + */ +class DocbookPlugin implements Plugin { + public void use(Project project) { + // Add the plugin tasks to the project + Task docbookHtml = project.tasks.add('docbookHtml', DocbookHtml.class); + docbookHtml.setDescription('Generates chunked docbook html output'); + + Task docbookHtmlSingle = project.tasks.add('docbookHtmlSingle', Docbook.class); + docbookHtmlSingle.setDescription('Generates single page docbook html output') + docbookHtmlSingle.suffix = '-single' + + Task docbookFoPdf = project.tasks.add("docbookFoPdf", DocbookFoPdf.class); + docbookFoPdf.setDescription('Generates PDF output'); + docbookFoPdf.extension = 'fo' + } +} + +/** + */ +public class Docbook extends DefaultTask { + + @Input + String extension = 'html'; + + @Input + String suffix = ''; + + @Input + boolean XIncludeAware = true; + + @Input + boolean highlightingEnabled = true; + + String admonGraphicsPath; + + @InputDirectory + File sourceDirectory = new File(project.getProjectDir(), "src/docbook"); + + @Input + String sourceFileName; + + @InputFile + File stylesheet; + + @OutputDirectory + File docsDir = new File(project.getBuildDir(), "docs"); + + @TaskAction + public final void transform() { + SAXParserFactory factory = new org.apache.xerces.jaxp.SAXParserFactoryImpl(); + factory.setXIncludeAware(XIncludeAware); + docsDir.mkdirs(); + + File srcFile = new File(sourceDirectory, sourceFileName); + String outputFilename = srcFile.getName().substring(0, srcFile.getName().length() - 4) + suffix + '.' + extension; + + File outputFile = new File(getDocsDir(), outputFilename); + + Result result = new StreamResult(outputFile.getAbsolutePath()); + CatalogResolver resolver = new CatalogResolver(createCatalogManager()); + InputSource inputSource = new InputSource(srcFile.getAbsolutePath()); + + XMLReader reader = factory.newSAXParser().getXMLReader(); + reader.setEntityResolver(resolver); + TransformerFactory transformerFactory = new TransformerFactoryImpl(); + transformerFactory.setURIResolver(resolver); + URL url = stylesheet.toURL(); + Source source = new StreamSource(url.openStream(), url.toExternalForm()); + Transformer transformer = transformerFactory.newTransformer(source); + + if (highlightingEnabled) { + File highlightingDir = new File(getProject().getBuildDir(), "highlighting"); + if (!highlightingDir.exists()) { + highlightingDir.mkdirs(); + extractHighlightFiles(highlightingDir); + } + + transformer.setParameter("highlight.xslthl.config", new File(highlightingDir, "xslthl-config.xml").toURI().toURL()); + + if (admonGraphicsPath != null) { + transformer.setParameter("admon.graphics", "1"); + transformer.setParameter("admon.graphics.path", admonGraphicsPath); + } + } + + preTransform(transformer, srcFile, outputFile); + + transformer.transform(new SAXSource(reader, inputSource), result); + + postTransform(outputFile); + } + + private void extractHighlightFiles(File toDir) { + URLClassLoader cl = (URLClassLoader) getClass().getClassLoader(); + URL[] urls = cl.getURLs(); + URL docbookZip = null; + + for (URL url : urls) { + if (url.toString().contains("docbook-xsl-")) { + docbookZip = url; + break; + } + } + + if (docbookZip == null) { + throw new GradleException("Docbook zip file not found"); + } + + ZipFile zipFile = new ZipFile(new File(docbookZip.toURI())); + + Enumeration e = zipFile.entries(); + while (e.hasMoreElements()) { + ZipEntry ze = (ZipEntry) e.nextElement(); + if (ze.getName().matches(".*/highlighting/.*\\.xml")) { + String filename = ze.getName().substring(ze.getName().lastIndexOf("/highlighting/") + 14); + copyFile(zipFile.getInputStream(ze), new File(toDir, filename)); + } + } + } + + private void copyFile(InputStream source, File destFile) { + destFile.createNewFile(); + FileOutputStream to = null; + try { + to = new FileOutputStream(destFile); + byte[] buffer = new byte[4096]; + int bytesRead; + + while ((bytesRead = source.read(buffer)) > 0) { + to.write(buffer, 0, bytesRead); + } + } finally { + if (source != null) { + source.close(); + } + if (to != null) { + to.close(); + } + } + } + + protected void preTransform(Transformer transformer, File sourceFile, File outputFile) { + } + + protected void postTransform(File outputFile) { + } + + private CatalogManager createCatalogManager() { + CatalogManager manager = new CatalogManager(); + manager.setIgnoreMissingProperties(true); + ClassLoader classLoader = this.getClass().getClassLoader(); + StringBuilder builder = new StringBuilder(); + String docbookCatalogName = "docbook/catalog.xml"; + URL docbookCatalog = classLoader.getResource(docbookCatalogName); + + if (docbookCatalog == null) { + throw new IllegalStateException("Docbook catalog " + docbookCatalogName + " could not be found in " + classLoader); + } + + builder.append(docbookCatalog.toExternalForm()); + + Enumeration enumeration = classLoader.getResources("/catalog.xml"); + while (enumeration.hasMoreElements()) { + builder.append(';'); + URL resource = (URL) enumeration.nextElement(); + builder.append(resource.toExternalForm()); + } + String catalogFiles = builder.toString(); + manager.setCatalogFiles(catalogFiles); + return manager; + } +} + +/** + */ +class DocbookHtml extends Docbook { + + @Override + protected void preTransform(Transformer transformer, File sourceFile, File outputFile) { + String rootFilename = outputFile.getName(); + rootFilename = rootFilename.substring(0, rootFilename.lastIndexOf('.')); + transformer.setParameter("root.filename", rootFilename); + transformer.setParameter("base.dir", outputFile.getParent() + File.separator); + } +} + +/** + */ +class DocbookFoPdf extends Docbook { + + /** + * From the FOP usage guide + */ + @Override + protected void postTransform(File foFile) { + FopFactory fopFactory = FopFactory.newInstance(); + + OutputStream out = null; + final File pdfFile = getPdfOutputFile(foFile); + logger.debug("Transforming 'fo' file "+ foFile + " to PDF: " + pdfFile); + + try { + out = new BufferedOutputStream(new FileOutputStream(pdfFile)); + + Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out); + + TransformerFactory factory = TransformerFactory.newInstance(); + Transformer transformer = factory.newTransformer(); + + Source src = new StreamSource(foFile); + + Result res = new SAXResult(fop.getDefaultHandler()); + + transformer.transform(src, res); + } finally { + if (out != null) { + out.close(); + } + } + + if (!foFile.delete()) { + logger.warn("Failed to delete 'fo' file " + foFile); + } + } + + private File getPdfOutputFile(File foFile) { + String name = foFile.getAbsolutePath(); + return new File(name.substring(0, name.length() - 2) + "pdf"); + } +} diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/docbook.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/docbook.properties new file mode 100644 index 0000000000..5fecd7333b --- /dev/null +++ b/buildSrc/src/main/resources/META-INF/gradle-plugins/docbook.properties @@ -0,0 +1 @@ +implementation-class=docbook.DocbookPlugin \ No newline at end of file diff --git a/docs/faq/faq.gradle b/docs/faq/faq.gradle index f81d93061c..86d80c0947 100644 --- a/docs/faq/faq.gradle +++ b/docs/faq/faq.gradle @@ -3,7 +3,8 @@ apply id: 'docbook' defaultTasks 'docbookHtmlSingle' -docbookSrcFileName = 'faq.xml' +[docbookHtml, docbookFoPdf, docbookHtmlSingle]*.sourceFileName = 'faq.xml' + docbookHtmlSingle.stylesheet = new File(projectDir, 'src/xsl/html-single-custom.xsl') docbookHtmlSingle.doLast { diff --git a/docs/faq/src/xsl/html-single-custom.xsl b/docs/faq/src/xsl/html-single-custom.xsl index ccb1cb31d6..6fb09740b7 100644 --- a/docs/faq/src/xsl/html-single-custom.xsl +++ b/docs/faq/src/xsl/html-single-custom.xsl @@ -1,101 +1,101 @@ + xmlns:xslthl="http://xslthl.sf.net" + exclude-result-prefixes="xslthl" + version='1.0'> - - - - + + - - 1 + - + 1 + + - - - css/faq.css - text/css + + + css/faq.css + text/css - + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - + + + - - - Begin Google Analytics code - - - End Google Analytics code - + + + - - - Begin LoopFuse code - - - End LoopFuse code - + + + Begin Google Analytics code + + +End Google Analytics code + + + + +Begin LoopFuse code + + +End LoopFuse code + \ No newline at end of file diff --git a/docs/manual/manual.gradle b/docs/manual/manual.gradle index 0260fc4a8d..336978718b 100644 --- a/docs/manual/manual.gradle +++ b/docs/manual/manual.gradle @@ -1,13 +1,15 @@ apply id: 'base' apply id: 'docbook' -docbookSrcFileName = 'springsecurity.xml' +[docbookHtml, docbookFoPdf, docbookHtmlSingle]*.sourceFileName = 'springsecurity.xml'; + docbookHtml.stylesheet = new File(projectDir, 'src/xsl/html-custom.xsl') +docbookHtmlSingle.stylesheet = new File(projectDir, 'src/xsl/html-single-custom.xsl') docbookFoPdf.stylesheet = new File(projectDir, 'src/xsl/pdf-custom.xsl') def imagesDir = new File(projectDir, 'src/docbook/images'); docbookFoPdf.admonGraphicsPath = "${imagesDir}/" -task doc (dependsOn: [docbookHtml, docbookFoPdf]) << { +task doc (dependsOn: [docbookHtml, docbookHtmlSingle, docbookFoPdf]) << { resourcesDir = new File(projectDir, 'src/resources') ant { docsDir = new File(buildDir, 'docs') diff --git a/docs/manual/src/docbook/springsecurity.xml b/docs/manual/src/docbook/springsecurity.xml index 440a9760ab..4c4d54dfef 100644 --- a/docs/manual/src/docbook/springsecurity.xml +++ b/docs/manual/src/docbook/springsecurity.xml @@ -13,7 +13,7 @@ Spring Security - 3.0.2.RELEASE + 3.1.0-DRAFT diff --git a/docs/manual/src/xsl/html-single-custom.xsl b/docs/manual/src/xsl/html-single-custom.xsl new file mode 100644 index 0000000000..63ccaaff6c --- /dev/null +++ b/docs/manual/src/xsl/html-single-custom.xsl @@ -0,0 +1,142 @@ + + + + + + + + + + + 1 + + + 1 + + + 1 + 0 + 1 + + + + images/ + .png + + 120 + images/callouts/ + .png + + + css/manual.css + text/css + book toc,title + + text-align: left + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Begin Google Analytics code + + +End Google Analytics code + + + + +Begin LoopFuse code + + +End LoopFuse code + + + \ No newline at end of file diff --git a/gradle/javaprojects.gradle b/gradle/javaprojects.gradle new file mode 100644 index 0000000000..1c69944ad9 --- /dev/null +++ b/gradle/javaprojects.gradle @@ -0,0 +1,59 @@ +import java.util.jar.Manifest +import org.gradle.api.tasks.bundling.GradleManifest + +apply id: 'java' + +springVersion = '3.0.1.RELEASE' +springLdapVersion = '1.3.0.RELEASE' +ehcacheVersion = '1.6.2' +aspectjVersion = '1.6.8' +apacheDsVersion = '1.5.5' +jstlVersion = '1.1.2' +jettyVersion = '6.1.22' +hsqlVersion = '1.8.0.10' + +configurations { + bundlor + provided + compile.extendsFrom provided +} + +dependencies { + compile 'commons-logging:commons-logging:1.1.1' + + testCompile 'junit:junit:4.7', + 'org.mockito:mockito-core:1.7', + 'org.jmock:jmock:2.5.1', + 'org.jmock:jmock-junit4:2.5.1', + 'org.hamcrest:hamcrest-core:1.1', + 'org.hamcrest:hamcrest-library:1.1', + "org.springframework:spring-test:$springVersion" + bundlor 'com.springsource.bundlor:com.springsource.bundlor.ant:1.0.0.RC1', + 'com.springsource.bundlor:com.springsource.bundlor:1.0.0.RC1', + 'com.springsource.bundlor:com.springsource.bundlor.blint:1.0.0.RC1' +} + +test { + jvmArgs = ['-ea', '-Xms128m', '-Xmx500m', '-XX:MaxPermSize=128m'] +} + +task bundlor(dependsOn: compileJava) { + onlyIf { + dependsOnTaskDidWork() + } + doFirst { + ant.taskdef(resource: 'com/springsource/bundlor/ant/antlib.xml', classpath: configurations.bundlor.asPath) + File template = new File(projectDir, 'template.mf') + mkdir(buildDir, 'bundlor') + if (template.exists()) { + ant.bundlor(inputPath: sourceSets.main.classesDir, outputPath: "$buildDir/bundlor", manifestTemplatePath: template) { + property(name: 'version', value: "$version") + property(name: 'spring.version', value: "$springVersion") + } + // See GRADLE-395 for support for using an existing manifest + jar.manifest = new GradleManifest(new Manifest(new File("$buildDir/bundlor/META-INF/MANIFEST.MF").newInputStream())) + } + } +} + +jar.dependsOn bundlor \ No newline at end of file diff --git a/gradle/maven.gradle b/gradle/maven.gradle new file mode 100644 index 0000000000..188c2c53a6 --- /dev/null +++ b/gradle/maven.gradle @@ -0,0 +1,55 @@ +apply id: 'maven' + +// Create a source jar for uploading +task sourceJar(type: Jar) { + classifier = 'sources' + from sourceSets.main.java +} + +configurations { + deployerJars +} + +artifacts { + archives sourceJar +} + +dependencies { + deployerJars "org.springframework.build.aws:org.springframework.build.aws.maven:3.0.0.RELEASE" +} + +gradle.taskGraph.whenReady {graph -> + if (graph.hasTask(uploadArchives)) { + // check properties defined and fail early + s3AccessKey + s3SecretAccessKey + } +} + +uploadArchives { + def mavenDeployer = repositories.mavenDeployer { + configuration = configurations.deployerJars + pom.whenConfigured {pom -> + def optionalDeps = ['commons-logging', 'ehcache', 'log4j', 'apacheds-core', 'apacheds-server-jndi', 'jsp-api', 'slf4j-api', 'slf4j-log4j12', 'jsr250-api', 'ldapsdk'] + def providedDeps = ['servlet-api'] + pom.dependencies.findAll {dep -> optionalDeps.contains(dep.artifactId) }*.optional = true + pom.dependencies.findAll {dep -> providedDeps.contains(dep.artifactId) }*.scope = 'provided' + } + } + doFirst { + if (releaseBuild) { + // "mavenSyncRepoDir" should be set in properties + repository(url: mavenSyncRepoDir) + } else { + s3credentials = [userName: s3AccessKey, passphrase: s3SecretAccessKey] + repository(url: "s3://maven.springframework.org/milestone") { + authentication(s3credentials) + } + snapshotRepository(url: "s3://maven.springframework.org/snapshot") { + authentication(s3credentials) + } + } + } +} + +conf2ScopeMappings.addMapping(1, configurations.provided, "provided") \ No newline at end of file diff --git a/taglibs/taglibs.gradle b/taglibs/taglibs.gradle index 32c53ba710..0c253d8d80 100644 --- a/taglibs/taglibs.gradle +++ b/taglibs/taglibs.gradle @@ -10,11 +10,7 @@ dependencies { "org.springframework:spring-expression:$springVersion", "org.springframework:spring-web:$springVersion" - provided 'javax.servlet:jsp-api:2.0' - - testCompile 'javax.servlet:servlet-api:2.5', - 'javax.servlet:jsp-api:2.0' + provided 'javax.servlet:jsp-api:2.0', 'javax.servlet:servlet-api:2.5' testRuntime "taglibs:standard:$jstlVersion" - } \ No newline at end of file