From c135179029343d4856e4be8d637ca36b5d49bb30 Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Wed, 30 Oct 2013 16:56:00 -0500 Subject: [PATCH] Update to latest Asciidoctor version We will temporarily remove PDF support until the plugin supports it. --- build.gradle | 2 +- buildSrc/build.gradle | 16 - .../gradle/AsciidoctorBackend.groovy | 45 --- .../gradle/AsciidoctorPlugin.groovy | 32 -- .../asciidoctor/gradle/AsciidoctorTask.groovy | 207 ----------- .../org/asciidoctor/gradle/InputHandler.java | 336 ------------------ .../gradle-plugins/asciidoctor.properties | 1 - buildSrc/src/main/resources/docbook-xsl.zip | Bin 32346 -> 0 bytes docs/docs.gradle | 7 +- docs/guides/build.gradle | 2 +- .../verify-app.asc | 0 .../basic-authentication.asc | 0 .../exploring-the-secured-application.asc | 0 .../secure-the-application.asc | 0 .../setting-up-the-sample.asc | 0 .../verify-insecure-app.asc | 0 .../verify-insecuremvc-app.asc | 0 docs/guides/src/asciidoc/form.asc | 12 +- docs/guides/src/asciidoc/hellomvc.asc | 11 +- docs/guides/src/asciidoc/helloworld.asc | 11 +- .../src/{asciidoctor => asciidoc}/Guardfile | 0 .../src/{asciidoctor => asciidoc}/faq.adoc | 0 .../images/Authentication.gif | Bin .../images/access-decision-voting.graffle | Bin .../images/access-decision-voting.png | Bin .../images/after-invocation.graffle | Bin .../images/after-invocation.png | Bin .../{asciidoctor => asciidoc}/images/note.png | Bin .../images/s2-banner-rhs.png | Bin .../images/s2_box_logo.png | Bin .../images/security-interception.graffle | Bin .../images/security-interception.png | Bin .../{asciidoctor => asciidoc}/images/tip.png | Bin .../src/{asciidoctor => asciidoc}/index.adoc | 0 34 files changed, 22 insertions(+), 660 deletions(-) delete mode 100755 buildSrc/src/main/groovy/org/asciidoctor/gradle/AsciidoctorBackend.groovy delete mode 100755 buildSrc/src/main/groovy/org/asciidoctor/gradle/AsciidoctorPlugin.groovy delete mode 100755 buildSrc/src/main/groovy/org/asciidoctor/gradle/AsciidoctorTask.groovy delete mode 100644 buildSrc/src/main/groovy/org/asciidoctor/gradle/InputHandler.java delete mode 100644 buildSrc/src/main/resources/META-INF/gradle-plugins/asciidoctor.properties delete mode 100644 buildSrc/src/main/resources/docbook-xsl.zip rename docs/guides/src/asciidoc/{form-includes => _form-includes}/verify-app.asc (100%) rename docs/guides/src/asciidoc/{hello-includes => _hello-includes}/basic-authentication.asc (100%) rename docs/guides/src/asciidoc/{hello-includes => _hello-includes}/exploring-the-secured-application.asc (100%) rename docs/guides/src/asciidoc/{hello-includes => _hello-includes}/secure-the-application.asc (100%) rename docs/guides/src/asciidoc/{hello-includes => _hello-includes}/setting-up-the-sample.asc (100%) rename docs/guides/src/asciidoc/{hello-includes => _hello-includes}/verify-insecure-app.asc (100%) rename docs/guides/src/asciidoc/{hello-includes => _hello-includes}/verify-insecuremvc-app.asc (100%) rename docs/manual/src/{asciidoctor => asciidoc}/Guardfile (100%) rename docs/manual/src/{asciidoctor => asciidoc}/faq.adoc (100%) rename docs/manual/src/{asciidoctor => asciidoc}/images/Authentication.gif (100%) rename docs/manual/src/{asciidoctor => asciidoc}/images/access-decision-voting.graffle (100%) rename docs/manual/src/{asciidoctor => asciidoc}/images/access-decision-voting.png (100%) rename docs/manual/src/{asciidoctor => asciidoc}/images/after-invocation.graffle (100%) rename docs/manual/src/{asciidoctor => asciidoc}/images/after-invocation.png (100%) rename docs/manual/src/{asciidoctor => asciidoc}/images/note.png (100%) rename docs/manual/src/{asciidoctor => asciidoc}/images/s2-banner-rhs.png (100%) rename docs/manual/src/{asciidoctor => asciidoc}/images/s2_box_logo.png (100%) rename docs/manual/src/{asciidoctor => asciidoc}/images/security-interception.graffle (100%) rename docs/manual/src/{asciidoctor => asciidoc}/images/security-interception.png (100%) rename docs/manual/src/{asciidoctor => asciidoc}/images/tip.png (100%) rename docs/manual/src/{asciidoctor => asciidoc}/index.adoc (100%) diff --git a/build.gradle b/build.gradle index c2f94dc294..be9e83d67e 100644 --- a/build.gradle +++ b/build.gradle @@ -3,13 +3,13 @@ import groovy.text.SimpleTemplateEngine buildscript { repositories { maven { url "http://repo.springsource.org/plugins-release" } - maven { url "http://jcenter.bintray.com"} } dependencies { classpath("org.springframework.build.gradle:propdeps-plugin:0.0.3") classpath("org.springframework.build.gradle:bundlor-plugin:0.1.2") classpath("org.gradle.api.plugins:gradle-tomcat-plugin:0.9.8") classpath('me.champeau.gradle:gradle-javadoc-hotfix-plugin:0.1') + classpath('org.asciidoctor:asciidoctor-gradle-plugin:0.7.0') } } diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 0f4af0b504..9dae29df88 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -31,22 +31,6 @@ dependencies { 'net.sourceforge.saxon:saxon:9.1.0.8' } -dependencies { - compile('org.asciidoctor:asciidoctor-java-integration:0.1.3') { - exclude group: 'rubygems', module :'haml' - exclude group: 'rubygems', module :'asciidoctor' - exclude group: 'rubygems', module :'coderay' - exclude group: 'rubygems', module :'tilt' - exclude group: 'rubygems', module :'erubis' - exclude group: 'rubygems', module :'slim' - } - compile 'net.alchim31:livereload-jvm:0.1.0' - compile 'org.apache.avalon.framework:avalon-framework-api:4.3.1' - compile 'org.apache.avalon.framework:avalon-framework-impl:4.3.1' - compile 'org.apache.xmlgraphics:fop:1.1' - runtime 'net.sf.xslthl:xslthl:2.1.0' -} - task ide(type: Copy) { from configurations.runtime into 'ide' diff --git a/buildSrc/src/main/groovy/org/asciidoctor/gradle/AsciidoctorBackend.groovy b/buildSrc/src/main/groovy/org/asciidoctor/gradle/AsciidoctorBackend.groovy deleted file mode 100755 index f45a789619..0000000000 --- a/buildSrc/src/main/groovy/org/asciidoctor/gradle/AsciidoctorBackend.groovy +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2012-2013 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.asciidoctor.gradle - -/** - * Supported backends. - * - * @author Benjamin Muschko - */ -enum AsciidoctorBackend { - HTML5('html5'), DOCBOOK('docbook'), PDF('pdf') - - private final static Map ALL_BACKENDS - private final String id - - static { - ALL_BACKENDS = values().collectEntries{ [it.id, it] }.asImmutable() - } - - private AsciidoctorBackend(String id) { - this.id = id - } - - String getId() { - id - } - - static boolean isSupported(String name) { - ALL_BACKENDS.containsKey(name) - } -} diff --git a/buildSrc/src/main/groovy/org/asciidoctor/gradle/AsciidoctorPlugin.groovy b/buildSrc/src/main/groovy/org/asciidoctor/gradle/AsciidoctorPlugin.groovy deleted file mode 100755 index 4c56b8167f..0000000000 --- a/buildSrc/src/main/groovy/org/asciidoctor/gradle/AsciidoctorPlugin.groovy +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2012-2013 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.asciidoctor.gradle - -import groovy.lang.Closure; - -import org.gradle.api.Plugin -import org.gradle.api.Project - -/** - * @author Noam Tenne - * @author Andres Almiray - */ -class AsciidoctorPlugin implements Plugin { - void apply(Project project) { - project.task('asciidoctor', type: AsciidoctorTask, group: 'Documentation') - } -} diff --git a/buildSrc/src/main/groovy/org/asciidoctor/gradle/AsciidoctorTask.groovy b/buildSrc/src/main/groovy/org/asciidoctor/gradle/AsciidoctorTask.groovy deleted file mode 100755 index 19ba0e9bd4..0000000000 --- a/buildSrc/src/main/groovy/org/asciidoctor/gradle/AsciidoctorTask.groovy +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright 2012-2013 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.asciidoctor.gradle - -import org.asciidoctor.gradle.* - - -import org.apache.commons.io.IOUtils -import org.asciidoctor.Asciidoctor -import org.gradle.api.DefaultTask -import org.gradle.api.GradleException -import org.gradle.api.InvalidUserDataException -import org.gradle.api.file.* -import org.gradle.api.tasks.* - -import javax.xml.transform.* -import javax.xml.transform.stream.* -import javax.xml.transform.sax.* -import org.apache.fop.apps.FopFactory -import org.apache.fop.apps.Fop -import org.apache.fop.apps.MimeConstants - - -class AsciidoctorTask extends DefaultTask { - @InputFiles FileCollection sourceDocuments - @Input Map options = [:] - - @Optional @OutputDirectory File outputDir - @Optional @Input List backends - - AsciidoctorTask() { - sourceDocuments = project.fileTree("src/asciidoctor/").include("*.adoc") - outputDir = project.file("${project.buildDir}/asciidoctor") - backends = [AsciidoctorBackend.HTML5.id] - } - - @TaskAction - void render() { - - Asciidoctor asciidoctor = Asciidoctor.Factory.create() - for(File sourceDocument : sourceDocuments) { - render(asciidoctor, sourceDocument) - } - } - - void render(Asciidoctor asciidoctor, File sourceDocument) { - for(backend in backends) { - boolean isPdf = backend == AsciidoctorBackend.PDF.id - String asciidoctorBackend = isPdf ? AsciidoctorBackend.DOCBOOK.id : backend - - File distDir = new File("${outputDir}/dist/$backend") - File workingDir = new File("${outputDir}/work/$backend") - - [workingDir,distDir]*.mkdirs() - - try { - asciidoctor.renderFile(sourceDocument, mergedOptions(options, isPdf ? workingDir : distDir, asciidoctorBackend)) - - if(isPdf) { - generatePdf(sourceDocument, workingDir,distDir) - } else { - project.copy { - from "${sourceDocument.parent}/images" - into "${distDir}/images/" - } - } - } catch (Exception e) { - throw new GradleException("Error running Asciidoctor on single source $sourceDocument for backend $asciidoctorBackend", e) - } - } - } - - private void generatePdf(File sourceDocument, File workingDir, File distDir) { - String docbookXmlUrl = 'http://maven-us.nuxeo.org/nexus/content/repositories/public/docbook/docbook-xml/4.5/docbook-xml-4.5.jar' - String docbookXslUrl = 'http://downloads.sourceforge.net/project/docbook/docbook-xsl-ns/1.78.1/docbook-xsl-ns-1.78.1.zip' - - File docbookXmlFile = downloadFile(docbookXmlUrl) - File docbookXslFile = downloadFile(docbookXslUrl) - - project.copy { - from "src/asciidoctor/images" - into "${workingDir}/images/" - } - - project.copy { - from project.zipTree(docbookXmlFile) - into "$workingDir/docbook" - } - - project.copy { - from(project.zipTree(docbookXslFile)) { - eachFile { details -> - details.path = details.path.substring(details.relativePath.segments[0].length()) - } - } - into "$workingDir/docbook/" - } - - unzipDockbookXsl(workingDir) - - def outputUri = workingDir.toURI().toASCIIString() - - Vector params = new Vector() - params.add("highlight.xslthl.config") - params.add(outputUri + "docbook-xsl/xslthl-config.xml") - params.add("admon.graphics.path") - params.add(outputUri + "docbook/images/") - params.add("callout.graphics.path") - params.add(outputUri + "docbook/images/callouts/") - params.add("img.src.path") - params.add(outputUri) - params.add("fop-output-format") - params.add("application/pdf") - params.add("fop-version") - params.add("1.1") - - File outputFile = new File("${distDir}/", sourceDocument.name.replaceAll("\\..*", ".pdf")) - File docbookFile = new File("$workingDir/",sourceDocument.name.replaceAll("\\..*", ".xml")) - File xsltFile = new File("${workingDir}/docbook-xsl/fo-pdf.xsl") - - InputHandler handler = new InputHandler(docbookFile, xsltFile, params) - - FopFactory fopFactory = FopFactory.newInstance(); // Reuse the FopFactory if possible! - fopFactory.setUserConfig(new File("${workingDir}/docbook-xsl/fop-config.xml")) - // do the following for each new rendering run - def foUserAgent = fopFactory.newFOUserAgent(); - - handler.createCatalogResolver(foUserAgent) - - def out = new java.io.BufferedOutputStream( - new java.io.FileOutputStream(outputFile)); - - foUserAgent.setOutputFile(outputFile); - - try { - handler.renderTo(foUserAgent, MimeConstants.MIME_PDF, out) - } finally { - IOUtils.closeQuietly(out) - } - } - - private void unzipDockbookXsl(def installDir) { - def docbookXslResourceName = 'docbook-xsl.zip' - def docbookXslInputStream = this.class.classLoader.getResourceAsStream(docbookXslResourceName) - if (docbookXslInputStream == null) { - throw new GradleException("could not find ${docbookXslResourceName} on the classpath"); - } - // the file is a jar:file - write it to disk first - File docbookXslOutputFile = new File("${installDir}/downloads/${docbookXslResourceName}") - docbookXslOutputFile.parentFile.mkdirs() - IOUtils.copy(docbookXslInputStream, new FileOutputStream(docbookXslOutputFile)) - project.copy { - from project.zipTree(docbookXslOutputFile) - into "${installDir}/" - } - } - - private File downloadFile(String url) { - def home = System.getProperty("user.home") - File destinationFile = new File("${home}/.fopdf/downloads", url.split("/")[-1]) - destinationFile.parentFile.mkdirs() - - if(!destinationFile.exists()) { - logger.info("Downloading " + url + " to "+ destinationFile + "...") - destinationFile.bytes = new URL(url).bytes - } - destinationFile - } - - private static Map mergedOptions(Map options, File outputDir, String backend) { - Map mergedOptions = [:] - mergedOptions.putAll(options) - mergedOptions.in_place = false - mergedOptions.safe = 0i - mergedOptions.to_dir = outputDir.absolutePath - Map attributes = mergedOptions.get('attributes', [:]) - attributes.backend = backend - - // Issue #14 force GString -> String as jruby will fail - // to find an exact match when invoking Asciidoctor - for (entry in mergedOptions) { - if (entry.value instanceof CharSequence) { - mergedOptions[entry.key] = entry.value.toString() - } - } - for (entry in attributes) { - if (entry.value instanceof CharSequence) { - attributes[entry.key] = entry.value.toString() - } - } - mergedOptions - } -} \ No newline at end of file diff --git a/buildSrc/src/main/groovy/org/asciidoctor/gradle/InputHandler.java b/buildSrc/src/main/groovy/org/asciidoctor/gradle/InputHandler.java deleted file mode 100644 index 21d66392f5..0000000000 --- a/buildSrc/src/main/groovy/org/asciidoctor/gradle/InputHandler.java +++ /dev/null @@ -1,336 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* $Id$ */ - -package org.asciidoctor.gradle; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Vector; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParserFactory; -import javax.xml.transform.ErrorListener; -import javax.xml.transform.Result; -import javax.xml.transform.Source; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.URIResolver; -import javax.xml.transform.sax.SAXResult; -import javax.xml.transform.sax.SAXSource; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; - -import org.xml.sax.EntityResolver; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import org.apache.fop.ResourceEventProducer; -import org.apache.fop.apps.FOPException; -import org.apache.fop.apps.FOUserAgent; -import org.apache.fop.apps.Fop; -import org.apache.fop.apps.FopFactory; -import org.apache.fop.render.awt.viewer.Renderable; - -/** - * Class for handling files input from command line - * either with XML and XSLT files (and optionally xsl - * parameters) or FO File input alone. - */ -public class InputHandler implements ErrorListener, Renderable { - - /** original source file */ - protected File sourcefile; - private File stylesheet; // for XML/XSLT usage - private Vector xsltParams; // for XML/XSLT usage - private EntityResolver entityResolver = null; - private URIResolver uriResolver = null; - - /** the logger */ - protected Log log = LogFactory.getLog(InputHandler.class); - - /** - * Constructor for XML->XSLT->FO input - * - * @param xmlfile XML file - * @param xsltfile XSLT file - * @param params Vector of command-line parameters (name, value, - * name, value, ...) for XSL stylesheet, null if none - */ - public InputHandler(File xmlfile, File xsltfile, Vector params) { - if(!xsltfile.exists()) { - throw new RuntimeException("Couldn't find "+ xsltfile); - } - sourcefile = xmlfile; - stylesheet = xsltfile; - xsltParams = params; - } - - /** - * Constructor for FO input - * @param fofile the file to read the FO document. - */ - public InputHandler(File fofile) { - sourcefile = fofile; - } - - /** - * Generate a document, given an initialized Fop object - * @param userAgent the user agent - * @param outputFormat the output format to generate (MIME type, see MimeConstants) - * @param out the output stream to write the generated output to (may be null if not applicable) - * @throws FOPException in case of an error during processing - */ - public void renderTo(FOUserAgent userAgent, String outputFormat, OutputStream out) - throws FOPException { - - FopFactory factory = userAgent.getFactory(); - Fop fop; - if (out != null) { - fop = factory.newFop(outputFormat, userAgent, out); - } else { - fop = factory.newFop(outputFormat, userAgent); - } - - // if base URL was not explicitly set in FOUserAgent, obtain here - if (fop.getUserAgent().getBaseURL() == null && sourcefile != null) { - String baseURL = null; - - try { - baseURL = new File(sourcefile.getAbsolutePath()) - .getParentFile().toURI().toURL().toExternalForm(); - } catch (Exception e) { - baseURL = ""; - } - fop.getUserAgent().setBaseURL(baseURL); - } - - // Resulting SAX events (the generated FO) must be piped through to FOP - Result res = new SAXResult(fop.getDefaultHandler()); - - transformTo(res); - } - - /** {@inheritDoc} */ - public void renderTo(FOUserAgent userAgent, String outputFormat) throws FOPException { - renderTo(userAgent, outputFormat, null); - } - - /** - * In contrast to render(Fop) this method only performs the XSLT stage and saves the - * intermediate XSL-FO file to the output file. - * @param out OutputStream to write the transformation result to. - * @throws FOPException in case of an error during processing - */ - public void transformTo(OutputStream out) throws FOPException { - Result res = new StreamResult(out); - transformTo(res); - } - - /** - * Creates a Source for the main input file. Processes XInclude if - * available in the XML parser. - * - * @return the Source for the main input file - */ - protected Source createMainSource() { - Source source; - InputStream in; - String uri; - if (this.sourcefile != null) { - try { - in = new java.io.FileInputStream(this.sourcefile); - uri = this.sourcefile.toURI().toASCIIString(); - } catch (FileNotFoundException e) { - //handled elsewhere - return new StreamSource(this.sourcefile); - } - } else { - in = System.in; - uri = null; - } - try { - InputSource is = new InputSource(in); - is.setSystemId(uri); - XMLReader xr = getXMLReader(); - if (entityResolver != null) { - xr.setEntityResolver(entityResolver); - } - source = new SAXSource(xr, is); - } catch (SAXException e) { - if (this.sourcefile != null) { - source = new StreamSource(this.sourcefile); - } else { - source = new StreamSource(in, uri); - } - } catch (ParserConfigurationException e) { - if (this.sourcefile != null) { - source = new StreamSource(this.sourcefile); - } else { - source = new StreamSource(in, uri); - } - } - return source; - } - - /** - * Creates a catalog resolver and uses it for XML parsing and XSLT URI resolution. - * Tries the Apache Commons Resolver, and if unsuccessful, - * tries the same built into Java 6. - * @param userAgent the user agent instance - */ - public void createCatalogResolver(FOUserAgent userAgent) { - String[] classNames = new String[] { - "org.apache.xml.resolver.tools.CatalogResolver", - "com.sun.org.apache.xml.internal.resolver.tools.CatalogResolver"}; - ResourceEventProducer eventProducer - = ResourceEventProducer.Provider.get(userAgent.getEventBroadcaster()); - Class resolverClass = null; - for (int i = 0; i < classNames.length && resolverClass == null; ++i) { - try { - resolverClass = Class.forName(classNames[i]); - } catch (ClassNotFoundException e) { - // No worries - } - } - if (resolverClass == null) { - eventProducer.catalogResolverNotFound(this); - return; - } - try { - entityResolver = (EntityResolver) resolverClass.newInstance(); - uriResolver = (URIResolver) resolverClass.newInstance(); - } catch (InstantiationException e) { - log.error("Error creating the catalog resolver: " + e.getMessage()); - eventProducer.catalogResolverNotCreated(this, e.getMessage()); - } catch (IllegalAccessException e) { - log.error("Error creating the catalog resolver: " + e.getMessage()); - eventProducer.catalogResolverNotCreated(this, e.getMessage()); - } - } - - /** - * Creates a Source for the selected stylesheet. - * - * @return the Source for the selected stylesheet or null if there's no stylesheet - */ - protected Source createXSLTSource() { - Source xslt = null; - if (this.stylesheet != null) { - if (entityResolver != null) { - try { - InputSource is = new InputSource(this.stylesheet.getPath()); - XMLReader xr = getXMLReader(); - xr.setEntityResolver(entityResolver); - xslt = new SAXSource(xr, is); - } catch (SAXException e) { - // return StreamSource - } catch (ParserConfigurationException e) { - // return StreamSource - } - } - if (xslt == null) { - xslt = new StreamSource(this.stylesheet); - } - } - return xslt; - } - - private XMLReader getXMLReader() throws ParserConfigurationException, SAXException { - SAXParserFactory spf = SAXParserFactory.newInstance(); - spf.setFeature("http://xml.org/sax/features/namespaces", true); - spf.setFeature("http://apache.org/xml/features/xinclude", true); - XMLReader xr = spf.newSAXParser().getXMLReader(); - return xr; - } - - /** - * Transforms the input document to the input format expected by FOP using XSLT. - * @param result the Result object where the result of the XSL transformation is sent to - * @throws FOPException in case of an error during processing - */ - protected void transformTo(Result result) throws FOPException { - try { - // Setup XSLT - System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl"); - TransformerFactory factory = TransformerFactory.newInstance(); - if (uriResolver != null) { - factory.setURIResolver(uriResolver); - } - factory.setErrorListener(this); - Transformer transformer; - - Source xsltSource = createXSLTSource(); - if (xsltSource == null) { // FO Input - transformer = factory.newTransformer(); - } else { // XML/XSLT input - transformer = factory.newTransformer(xsltSource); - - // Set the value of parameters, if any, defined for stylesheet - if (xsltParams != null) { - for (int i = 0; i < xsltParams.size(); i += 2) { - transformer.setParameter((String) xsltParams.elementAt(i), - (String) xsltParams.elementAt(i + 1)); - } - } - } - transformer.setErrorListener(this); - - // Create a SAXSource from the input Source file - Source src = createMainSource(); - - // Start XSLT transformation and FOP processing - transformer.transform(src, result); - - } catch (Exception e) { - throw new FOPException(e); - } - } - - // --- Implementation of the ErrorListener interface --- - - /** - * {@inheritDoc} - */ - public void warning(TransformerException exc) { - log.warn(exc.getLocalizedMessage()); - } - - /** - * {@inheritDoc} - */ - public void error(TransformerException exc) { - log.error(exc.toString()); - } - - /** - * {@inheritDoc} - */ - public void fatalError(TransformerException exc) - throws TransformerException { - throw exc; - } - -} \ No newline at end of file diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/asciidoctor.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/asciidoctor.properties deleted file mode 100644 index 2f347513ee..0000000000 --- a/buildSrc/src/main/resources/META-INF/gradle-plugins/asciidoctor.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=org.asciidoctor.gradle.AsciidoctorPlugin \ No newline at end of file diff --git a/buildSrc/src/main/resources/docbook-xsl.zip b/buildSrc/src/main/resources/docbook-xsl.zip deleted file mode 100644 index e0d6d7da09ba4ca14b2c5d555a08c36223de9f90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32346 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�bTu}q#Y?URMVM!dkJ|qjC;h^CgXI?U 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

S>FXJP3zWVguptcvk<>P3t@Cw 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 diff --git a/docs/docs.gradle b/docs/docs.gradle index a8067d3711..3ac3e66dd8 100644 --- a/docs/docs.gradle +++ b/docs/docs.gradle @@ -12,7 +12,6 @@ project('manual') { ext.expandPlaceholders = "" asciidoctor { - backends = ["html5", "pdf"] options = [ eruby: 'erubis', attributes: [ @@ -34,10 +33,8 @@ project('manual') { ext.spec = copySpec { into ('reference/htmlsingle') { - from("${asciidoctor.outputDir}/dist/html5") - } - into ('reference/pdf') { - from("${asciidoctor.outputDir}/dist/pdf") + from(asciidoctor.outputDir) + exclude 'build', 'Guardfile' } } } diff --git a/docs/guides/build.gradle b/docs/guides/build.gradle index d57a8ae180..3478447b5e 100644 --- a/docs/guides/build.gradle +++ b/docs/guides/build.gradle @@ -3,7 +3,7 @@ import org.asciidoctor.gradle.* file("src/asciidoc").eachFileMatch(~/.*\.asc/) { file-> task "asciidoctor-${file.name}"(type: AsciidoctorTask) { - sourceDocument = file + sourceDocumentName = file options = [ eruby: 'erubis', eruby: 'erubis', diff --git a/docs/guides/src/asciidoc/form-includes/verify-app.asc b/docs/guides/src/asciidoc/_form-includes/verify-app.asc similarity index 100% rename from docs/guides/src/asciidoc/form-includes/verify-app.asc rename to docs/guides/src/asciidoc/_form-includes/verify-app.asc diff --git a/docs/guides/src/asciidoc/hello-includes/basic-authentication.asc b/docs/guides/src/asciidoc/_hello-includes/basic-authentication.asc similarity index 100% rename from docs/guides/src/asciidoc/hello-includes/basic-authentication.asc rename to docs/guides/src/asciidoc/_hello-includes/basic-authentication.asc diff --git a/docs/guides/src/asciidoc/hello-includes/exploring-the-secured-application.asc b/docs/guides/src/asciidoc/_hello-includes/exploring-the-secured-application.asc similarity index 100% rename from docs/guides/src/asciidoc/hello-includes/exploring-the-secured-application.asc rename to docs/guides/src/asciidoc/_hello-includes/exploring-the-secured-application.asc diff --git a/docs/guides/src/asciidoc/hello-includes/secure-the-application.asc b/docs/guides/src/asciidoc/_hello-includes/secure-the-application.asc similarity index 100% rename from docs/guides/src/asciidoc/hello-includes/secure-the-application.asc rename to docs/guides/src/asciidoc/_hello-includes/secure-the-application.asc diff --git a/docs/guides/src/asciidoc/hello-includes/setting-up-the-sample.asc b/docs/guides/src/asciidoc/_hello-includes/setting-up-the-sample.asc similarity index 100% rename from docs/guides/src/asciidoc/hello-includes/setting-up-the-sample.asc rename to docs/guides/src/asciidoc/_hello-includes/setting-up-the-sample.asc diff --git a/docs/guides/src/asciidoc/hello-includes/verify-insecure-app.asc b/docs/guides/src/asciidoc/_hello-includes/verify-insecure-app.asc similarity index 100% rename from docs/guides/src/asciidoc/hello-includes/verify-insecure-app.asc rename to docs/guides/src/asciidoc/_hello-includes/verify-insecure-app.asc diff --git a/docs/guides/src/asciidoc/hello-includes/verify-insecuremvc-app.asc b/docs/guides/src/asciidoc/_hello-includes/verify-insecuremvc-app.asc similarity index 100% rename from docs/guides/src/asciidoc/hello-includes/verify-insecuremvc-app.asc rename to docs/guides/src/asciidoc/_hello-includes/verify-insecuremvc-app.asc diff --git a/docs/guides/src/asciidoc/form.asc b/docs/guides/src/asciidoc/form.asc index bcc9c19750..cb4abe9a08 100644 --- a/docs/guides/src/asciidoc/form.asc +++ b/docs/guides/src/asciidoc/form.asc @@ -2,11 +2,12 @@ :author: Rob Winch :starter-appname: hellomvc-jc :completed-appname: form-jc -:verify-starter-app-include: form-includes/verify-app.asc +:include-dir: src/asciidoc/_hello-includes +:verify-starter-app-include: ../_form-includes/verify-app.asc This guide builds off of link:hellomvc.html[Hello Spring MVC Security Java Config] to explain how to configure and use a custom login form with Spring Security Java Configuration. -include::hello-includes/setting-up-the-sample.asc[] +include::{include-dir}/setting-up-the-sample.asc[] = Overriding the default configure(HttpSecurity) method @@ -201,13 +202,12 @@ Our existing configuration means that all we need to do is create a *login.jspx* <1> The URL we submit our username and password to is the same URL as our login form (i.e. */login*), but a *POST* instead of a *GET*. <2> When authentication fails, the browser is redirected to */login?error* so we can display an error message by detecting if the parameter *error* is non-null. - -IMPORTANT: Do not display details about why authentication failed. For example, we do not want to display that the user does not exist as this will tell an attacker that they should try a different username. - <3> When we are successfully loged out, the browser is redirected to */login?logout* so we can display an logout success message by detecting if the parameter *logout* is non-null. <4> The username should be present on the HTTP parameter username <5> The password should be present on the HTTP parameter password +IMPORTANT: Do not display details about why authentication failed. For example, we do not want to display that the user does not exist as this will tell an attacker that they should try a different username. + TIP: We use Spring Web MVC's tag to automatically add the CSRF token to our form. We could also manually add the CSRF token using ``. Start up the server and try visiting http://localhost:8080/sample/ to see the updates to our configuration. We now see our login page, but it does not look very pretty. The issue is that we have not granted access to the css files. @@ -245,7 +245,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { ---- <1> This allows anyone to access a URL that begins with */resources/*. Since this is where our css, javascript, and images are stored all our static resources are viewable by anyone. -<2> As you might expect, `logout().permitAll()` allows any user to request logout and view logout success URL. +<2> As you might expect, `logout().permitAll()` allows any user to request logout and view logout success URL. Start up the server and try visiting http://localhost:8080/sample/ to see the updates to our configuration. We now see a custom login page that looks like the rest of our application. diff --git a/docs/guides/src/asciidoc/hellomvc.asc b/docs/guides/src/asciidoc/hellomvc.asc index 7053b7bd2b..82e2500b2e 100644 --- a/docs/guides/src/asciidoc/hellomvc.asc +++ b/docs/guides/src/asciidoc/hellomvc.asc @@ -2,13 +2,14 @@ :author: Rob Winch :starter-appname: insecuremvc :completed-appname: hellomvc-jc -:verify-starter-app-include: hello-includes/verify-insecuremvc-app.asc +:include-dir: src/asciidoc/_hello-includes +:verify-starter-app-include: verify-insecuremvc-app.asc This guide provides instructions on how to add Spring Security to an existing Spring MVC application without the use of XML. -include::hello-includes/setting-up-the-sample.asc[] +include::{include-dir}/setting-up-the-sample.asc[] -include::hello-includes/secure-the-application.asc[] +include::{include-dir}/secure-the-application.asc[] === Registering Spring Security with the war @@ -76,7 +77,7 @@ The `@ComponentScan` is loading all configuration in the org.springframework.sec NOTE: Had <> not been loaded, we could have used an `@Import(SecurityConfig)` above the class definition of <> or added <> as one of the results for `getRootConfigClasses()`. -include::hello-includes/exploring-the-secured-application.asc[] +include::{include-dir}/exploring-the-secured-application.asc[] ==== Displaying the user name @@ -138,7 +139,7 @@ In order to help protect against http://en.wikipedia.org/wiki/Cross-site_request Refresh the page at http://localhost:8080/sample/ and you will see the log out button. Click the button and see that the application logs you out successfully. -include::hello-includes/basic-authentication.asc[] +include::{include-dir}/basic-authentication.asc[] == Conclusion diff --git a/docs/guides/src/asciidoc/helloworld.asc b/docs/guides/src/asciidoc/helloworld.asc index 7b96657240..f1378c433d 100644 --- a/docs/guides/src/asciidoc/helloworld.asc +++ b/docs/guides/src/asciidoc/helloworld.asc @@ -2,13 +2,14 @@ :author: Rob Winch :starter-appname: insecure :completed-appname: helloworld-jc -:verify-starter-app-include: hello-includes/verify-insecure-app.asc +:include-dir: src/asciidoc/_hello-includes +:verify-starter-app-include: verify-insecure-app.asc This guide provides instructions on how to add Spring Security to an existing application without the use of XML. -include::hello-includes/setting-up-the-sample.asc[] +include::{include-dir}/setting-up-the-sample.asc[] -include::hello-includes/secure-the-application.asc[] +include::{include-dir}/secure-the-application.asc[] === Registering Spring Security with the war @@ -44,7 +45,7 @@ The `SecurityWebApplicationInitializer` will do the following things: NOTE: Since we were not already using Spring, this is a simple way to add our <>. If we were already using Spring, then we should add our <> with the reset of our Spring configuration (i.e. a subclass of AbstractContextLoaderInitializer or AbstractDispatcherServletInitializer) and use the default constructor instead. -include::hello-includes/exploring-the-secured-application.asc[] +include::{include-dir}/exploring-the-secured-application.asc[] ==== Displaying the user name @@ -96,7 +97,7 @@ In order to help protect against http://en.wikipedia.org/wiki/Cross-site_request Refresh the page at http://localhost:8080/sample/ and you will see the log out button. Click the logout button and see that the application logs you out successfully. -include::hello-includes/basic-authentication.asc[] +include::{include-dir}/basic-authentication.asc[] == Conclusion diff --git a/docs/manual/src/asciidoctor/Guardfile b/docs/manual/src/asciidoc/Guardfile similarity index 100% rename from docs/manual/src/asciidoctor/Guardfile rename to docs/manual/src/asciidoc/Guardfile diff --git a/docs/manual/src/asciidoctor/faq.adoc b/docs/manual/src/asciidoc/faq.adoc similarity index 100% rename from docs/manual/src/asciidoctor/faq.adoc rename to docs/manual/src/asciidoc/faq.adoc diff --git a/docs/manual/src/asciidoctor/images/Authentication.gif b/docs/manual/src/asciidoc/images/Authentication.gif similarity index 100% rename from docs/manual/src/asciidoctor/images/Authentication.gif rename to docs/manual/src/asciidoc/images/Authentication.gif diff --git a/docs/manual/src/asciidoctor/images/access-decision-voting.graffle b/docs/manual/src/asciidoc/images/access-decision-voting.graffle similarity index 100% rename from docs/manual/src/asciidoctor/images/access-decision-voting.graffle rename to docs/manual/src/asciidoc/images/access-decision-voting.graffle diff --git a/docs/manual/src/asciidoctor/images/access-decision-voting.png b/docs/manual/src/asciidoc/images/access-decision-voting.png similarity index 100% rename from docs/manual/src/asciidoctor/images/access-decision-voting.png rename to docs/manual/src/asciidoc/images/access-decision-voting.png diff --git a/docs/manual/src/asciidoctor/images/after-invocation.graffle b/docs/manual/src/asciidoc/images/after-invocation.graffle similarity index 100% rename from docs/manual/src/asciidoctor/images/after-invocation.graffle rename to docs/manual/src/asciidoc/images/after-invocation.graffle diff --git a/docs/manual/src/asciidoctor/images/after-invocation.png b/docs/manual/src/asciidoc/images/after-invocation.png similarity index 100% rename from docs/manual/src/asciidoctor/images/after-invocation.png rename to docs/manual/src/asciidoc/images/after-invocation.png diff --git a/docs/manual/src/asciidoctor/images/note.png b/docs/manual/src/asciidoc/images/note.png similarity index 100% rename from docs/manual/src/asciidoctor/images/note.png rename to docs/manual/src/asciidoc/images/note.png diff --git a/docs/manual/src/asciidoctor/images/s2-banner-rhs.png b/docs/manual/src/asciidoc/images/s2-banner-rhs.png similarity index 100% rename from docs/manual/src/asciidoctor/images/s2-banner-rhs.png rename to docs/manual/src/asciidoc/images/s2-banner-rhs.png diff --git a/docs/manual/src/asciidoctor/images/s2_box_logo.png b/docs/manual/src/asciidoc/images/s2_box_logo.png similarity index 100% rename from docs/manual/src/asciidoctor/images/s2_box_logo.png rename to docs/manual/src/asciidoc/images/s2_box_logo.png diff --git a/docs/manual/src/asciidoctor/images/security-interception.graffle b/docs/manual/src/asciidoc/images/security-interception.graffle similarity index 100% rename from docs/manual/src/asciidoctor/images/security-interception.graffle rename to docs/manual/src/asciidoc/images/security-interception.graffle diff --git a/docs/manual/src/asciidoctor/images/security-interception.png b/docs/manual/src/asciidoc/images/security-interception.png similarity index 100% rename from docs/manual/src/asciidoctor/images/security-interception.png rename to docs/manual/src/asciidoc/images/security-interception.png diff --git a/docs/manual/src/asciidoctor/images/tip.png b/docs/manual/src/asciidoc/images/tip.png similarity index 100% rename from docs/manual/src/asciidoctor/images/tip.png rename to docs/manual/src/asciidoc/images/tip.png diff --git a/docs/manual/src/asciidoctor/index.adoc b/docs/manual/src/asciidoc/index.adoc similarity index 100% rename from docs/manual/src/asciidoctor/index.adoc rename to docs/manual/src/asciidoc/index.adoc