Author: sletellier Date: 2011-11-29 18:38:54 +0100 (Tue, 29 Nov 2011) New Revision: 628 Url: http://nuiton.org/repositories/revision/jrst/628 Log: Introduce JRSTResourceResolver extends FasterCachedResourceResolver and if not found, resolve in xsl Added: trunk/jrst/src/main/java/org/nuiton/jrst/JRSTResourceResolver.java Modified: trunk/jrst/src/main/java/org/nuiton/jrst/JRST.java trunk/jrst/src/main/java/org/nuiton/jrst/JRSTGenerator.java Modified: trunk/jrst/src/main/java/org/nuiton/jrst/JRST.java =================================================================== --- trunk/jrst/src/main/java/org/nuiton/jrst/JRST.java 2011-11-29 09:13:20 UTC (rev 627) +++ trunk/jrst/src/main/java/org/nuiton/jrst/JRST.java 2011-11-29 17:38:54 UTC (rev 628) @@ -22,7 +22,6 @@ * <http://www.gnu.org/licenses/lgpl-3.0.html>. * #L% */ - package org.nuiton.jrst; import java.awt.GraphicsDevice; @@ -34,20 +33,14 @@ import java.util.Locale; import java.util.Map; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; 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.StreamSource; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -64,10 +57,6 @@ import org.nuiton.util.FileUtil; import org.nuiton.util.Resource; import org.nuiton.util.StringUtil; -import org.xml.sax.EntityResolver; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; /** * FIXME: 'JRST --help' doesn't work, but 'JRST --help toto' work :( FIXME: @@ -397,7 +386,7 @@ return doc.asXML(); } - protected static Document applyXsls(Document doc, String xslListOrOutType) throws IOException, FileNotFoundException, TransformerException { + private static Document applyXsls(Document doc, String xslListOrOutType) throws IOException, TransformerException { // search xsl file list to apply String xslList = stylesheets.get(xslListOrOutType); @@ -422,74 +411,10 @@ + xsl); } - final String finalXsl = xsl; - // add entity resolver - gen.setUriResolver(new URIResolver() { - public Source resolve(String href, String base) { - if (log.isDebugEnabled()) { - log.debug("RESOLVING: href: "+href+" base: "+base); - } - String xslDir = finalXsl.substring(0, finalXsl.lastIndexOf('/') + 1); - String resouceFullName = xslDir + href; + gen.setUriResolver(new JRSTResourceResolver(xsl)); - if (log.isDebugEnabled()) { - log.debug("RESOLVING: resouceFullName: "+resouceFullName); - } - - try { - InputStream stream = null; - File file = new File(resouceFullName); - if (file.exists()) { - stream = new FileInputStream(file); - } else { - try { - stream = Resource.getURL(resouceFullName).openStream(); - } - catch (Exception e) { - stream = Resource.getURL("/docbook/common/" + href).openStream(); - } - } - - SAXParserFactory parserFactory = SAXParserFactory.newInstance(); - SAXParser saxParser = parserFactory.newSAXParser(); - XMLReader xmlReader = saxParser.getXMLReader(); - xmlReader.setEntityResolver(new EntityResolver() { - @Override - public InputSource resolveEntity(String publicId, String systemId) - throws SAXException, IOException { - - InputSource source = null; - - String smallSystemId = systemId.substring(systemId.lastIndexOf("/") + 1); - URL url = Resource.getURL("/docbook/common/" + smallSystemId); - if (url != null) { - if (log.isDebugEnabled()) { - log.debug("Resolved entity url : " + url); - } - InputStream stream = url.openStream(); - source = new InputSource(stream); - } - - return source; - } - }); - InputSource inSrc = new InputSource(stream); - SAXSource saxs = new SAXSource(xmlReader, inSrc); - return saxs; - } catch (IOException e) { - e.printStackTrace(); - return null; - } catch (ParserConfigurationException e) { - e.printStackTrace(); - return null; - } catch (SAXException e) { - e.printStackTrace(); - return null; - } - } - }); - + // do transformation doc = gen.transform(doc, stylesheet); } return doc; Modified: trunk/jrst/src/main/java/org/nuiton/jrst/JRSTGenerator.java =================================================================== --- trunk/jrst/src/main/java/org/nuiton/jrst/JRSTGenerator.java 2011-11-29 09:13:20 UTC (rev 627) +++ trunk/jrst/src/main/java/org/nuiton/jrst/JRSTGenerator.java 2011-11-29 17:38:54 UTC (rev 628) @@ -57,14 +57,11 @@ import static org.nuiton.jrst.ReStructuredText.TRANSITION; import static org.nuiton.jrst.ReStructuredText.VERSION; -import java.io.File; import java.io.IOException; import java.io.Writer; -import java.net.MalformedURLException; import java.net.URL; import java.util.LinkedList; -import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; @@ -83,9 +80,6 @@ import org.dom4j.io.DocumentSource; import org.nuiton.util.FasterCachedResourceResolver; import org.xml.sax.ContentHandler; -import org.xml.sax.EntityResolver; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; /** * Cette classe contient plusieurs methodes pour générer, soit en utilisant une Added: trunk/jrst/src/main/java/org/nuiton/jrst/JRSTResourceResolver.java =================================================================== --- trunk/jrst/src/main/java/org/nuiton/jrst/JRSTResourceResolver.java (rev 0) +++ trunk/jrst/src/main/java/org/nuiton/jrst/JRSTResourceResolver.java 2011-11-29 17:38:54 UTC (rev 628) @@ -0,0 +1,108 @@ +package org.nuiton.jrst; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.FasterCachedResourceResolver; +import org.nuiton.util.Resource; +import org.xml.sax.EntityResolver; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.transform.Source; +import javax.xml.transform.sax.SAXSource; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +/** + * @author sletellier <letellier@codelutin.com> + * @since 1.5 + */ +public class JRSTResourceResolver extends FasterCachedResourceResolver { + + static private Log log = LogFactory.getLog(JRSTResourceResolver.class); + + protected String xsl; + + public JRSTResourceResolver(String xsl) { + this.xsl = xsl; + } + + @Override + public Source resolve(String href, String base) { + + // Try first with faster resource resolver + Source resolved = super.resolve(href, base); + if (resolved != null) { + return resolved; + } + + // If not found, try to find in xsl + if (log.isDebugEnabled()) { + log.debug("RESOLVING: href: "+href+" base: "+base); + } + String xslDir = xsl.substring(0, xsl.lastIndexOf('/') + 1); + String resouceFullName = xslDir + href; + + if (log.isDebugEnabled()) { + log.debug("RESOLVING: resouceFullName: "+resouceFullName); + } + + try { + InputStream stream = null; + File file = new File(resouceFullName); + if (file.exists()) { + stream = new FileInputStream(file); + } else { + try { + stream = Resource.getURL(resouceFullName).openStream(); + } + catch (Exception e) { + stream = Resource.getURL("/docbook/common/" + href).openStream(); + } + } + + SAXParserFactory parserFactory = SAXParserFactory.newInstance(); + SAXParser saxParser = parserFactory.newSAXParser(); + XMLReader xmlReader = saxParser.getXMLReader(); + xmlReader.setEntityResolver(new EntityResolver() { + @Override + public InputSource resolveEntity(String publicId, String systemId) + throws SAXException, IOException { + + InputSource source = null; + + String smallSystemId = systemId.substring(systemId.lastIndexOf("/") + 1); + URL url = Resource.getURL("/docbook/common/" + smallSystemId); + if (url != null) { + if (log.isDebugEnabled()) { + log.debug("Resolved entity url : " + url); + } + InputStream stream = url.openStream(); + source = new InputSource(stream); + } + + return source; + } + }); + InputSource inSrc = new InputSource(stream); + SAXSource saxs = new SAXSource(xmlReader, inSrc); + return saxs; + } catch (IOException e) { + e.printStackTrace(); + return null; + } catch (ParserConfigurationException e) { + e.printStackTrace(); + return null; + } catch (SAXException e) { + e.printStackTrace(); + return null; + } + } +}