Author: echatellier Date: 2011-02-11 17:18:45 +0100 (Fri, 11 Feb 2011) New Revision: 539 Url: http://nuiton.org/repositories/revision/jrst/539 Log: Improve resources resolution during xslt transformation. Manage docbook-xsl resources as ... resources. Modified: trunk/jrst/pom.xml trunk/jrst/src/main/java/org/nuiton/jrst/JRST.java trunk/jrst/src/main/java/org/nuiton/jrst/JRSTGenerator.java trunk/pom.xml Modified: trunk/jrst/pom.xml =================================================================== --- trunk/jrst/pom.xml 2011-02-10 12:11:19 UTC (rev 538) +++ trunk/jrst/pom.xml 2011-02-11 16:18:45 UTC (rev 539) @@ -60,7 +60,6 @@ <artifactId>commons-primitives</artifactId> </dependency> - <dependency> <groupId>org.nuiton</groupId> <artifactId>nuiton-utils</artifactId> @@ -84,40 +83,24 @@ <groupId>org.apache.xmlgraphics</groupId> <artifactId>fop</artifactId> </dependency> - + <dependency> + <groupId>net.sourceforge.saxon</groupId> + <artifactId>saxon</artifactId> + </dependency> + <!-- <dependency> + <artifactId>xalan</artifactId> + <groupId>xalan</groupId> + </dependency> --> <!-- Annoted interfaces to present command line arguments --> <dependency> <groupId>uk.co.flamingpenguin.jewelcli</groupId> <artifactId>jewelcli</artifactId> </dependency> - <!-- XSLT processor --> <dependency> - <groupId>xalan</groupId> - <artifactId>xalan</artifactId> - </dependency> - <!-- TC-20090929 force it, otherwise the dependency is not attached--> - <dependency> - <groupId>xalan</groupId> - <artifactId>serializer</artifactId> - </dependency> - <dependency> - <groupId>xml-apis</groupId> - <artifactId>xml-apis</artifactId> - <scope>runtime</scope> - </dependency> - <!-- Swing librairie --> - <dependency> - <groupId>org.nuiton.thirdparty</groupId> - <artifactId>sdoc</artifactId> - <!--scope>runtime</scope--> - </dependency> - <!-- XSL librairies --> - <dependency> <groupId>net.sf.docbook</groupId> <artifactId>docbook-xsl</artifactId> <type>zip</type> <classifier>resources</classifier> - <scope>runtime</scope> </dependency> <!-- Test librairies --> <dependency> @@ -130,12 +113,17 @@ <artifactId>junit</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.nuiton.thirdparty</groupId> + <artifactId>sdoc</artifactId> + <scope>test</scope> + </dependency> - <dependency> - <groupId>log4j</groupId> - <artifactId>log4j</artifactId> - <scope>runtime</scope> - </dependency> + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <scope>runtime</scope> + </dependency> </dependencies> <!-- ************************************************************* --> @@ -162,8 +150,17 @@ <build> + <resources> + <resource> + <directory>${project.basedir}/src/main/resources</directory> + </resource> + <resource> + <directory>${project.build.directory}/generated-resources</directory> + </resource> + </resources> + <plugins> - + <!-- plugin i18n --> <plugin> <groupId>org.nuiton.i18n</groupId> @@ -178,24 +175,28 @@ </executions> </plugin> - <!--plugin> - <artifactId>maven-jar-plugin</artifactId> - <configuration> - <archive> - <manifest> - <addClasspath>true</addClasspath> - <classpathPrefix>lib/</classpathPrefix> - </manifest> - </archive> - </configuration> - </plugin--> - <plugin> <artifactId>maven-dependency-plugin</artifactId> <executions> + + <!-- code from http://www.sonatype.com/people/2008/04/how-to-share-resources-across-project... --> <execution> + <id>unpack-shared-resources</id> + <goals> + <goal>unpack-dependencies</goal> + </goals> + <phase>generate-resources</phase> + <configuration> + <outputDirectory>${project.build.directory}/generated-resources</outputDirectory> + <includeGroupIds>net.sf.docbook</includeGroupIds> + <includeArtifacIds>docbook-xsl</includeArtifacIds> + <includeTypes>zip</includeTypes> + <includeClassifiers>resources</includeClassifiers> + <excludeTransitive>true</excludeTransitive> + </configuration> + </execution> + <execution> <id>copy-dependencies</id> - <!--<phase>package</phase>--> <goals> <goal>copy-dependencies</goal> </goals> Modified: trunk/jrst/src/main/java/org/nuiton/jrst/JRST.java =================================================================== --- trunk/jrst/src/main/java/org/nuiton/jrst/JRST.java 2011-02-10 12:11:19 UTC (rev 538) +++ trunk/jrst/src/main/java/org/nuiton/jrst/JRST.java 2011-02-11 16:18:45 UTC (rev 539) @@ -32,10 +32,12 @@ import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Reader; @@ -45,11 +47,16 @@ import java.util.HashMap; 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.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.logging.Log; @@ -58,17 +65,21 @@ import org.apache.fop.apps.Fop; import org.apache.fop.apps.FopFactory; import org.apache.fop.apps.MimeConstants; +import org.dom4j.Document; +import org.dom4j.io.OutputFormat; +import org.dom4j.io.XMLWriter; import org.nuiton.i18n.I18n; +import org.nuiton.jrst.convertisor.DocUtils2RST; +import org.nuiton.jrst.convertisor.DocUtilsVisitor; import org.nuiton.util.FileCompletion; import org.nuiton.util.FileUtil; import org.nuiton.util.Resource; import org.nuiton.util.StringUtil; -import org.dom4j.Document; -import org.dom4j.io.OutputFormat; -import org.dom4j.io.XMLWriter; +import org.xml.sax.EntityResolver; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; -import org.nuiton.jrst.convertisor.DocUtils2RST; -import org.nuiton.jrst.convertisor.DocUtilsVisitor; import uk.co.flamingpenguin.jewel.cli.Cli; import uk.co.flamingpenguin.jewel.cli.CliFactory; import uk.co.flamingpenguin.jewel.cli.CommandLineInterface; @@ -117,7 +128,7 @@ /** XSL Stylesheet to transform Docbook into ODF. */ protected static final String docbook2odf = "/xsl/docbook2odf-0.244/docbook.xsl"; /** XSL Stylesheet to transform Docbook into PDF. */ - protected static final String docbook2fo = "/fo/docbook.xsl"; + protected static final String docbook2fo = "/docbook/fo/docbook.xsl"; /** HTML output format type */ public static final String TYPE_HTML = "html"; @@ -410,7 +421,6 @@ * @param overwrite * @throws Exception */ - public static void generate(String xslListOrOutType, File fileIn, String inputEncoding, File fileOut, String outputEncoding, Overwrite overwrite) throws Exception { @@ -483,22 +493,71 @@ + xsl); } - // add uri resolver - /*gen.setUriResolver(new URIResolver() { + final String finalXsl = xsl; + + // add entity resolver + gen.setUriResolver(new URIResolver() { public Source resolve(String href, String base) { - System.out.println("RESOLVING: href: "+href+" base: "+base); + if (log.isDebugEnabled()) { + log.debug("RESOLVING: href: "+href+" base: "+base); + } + String xslDir = finalXsl.substring(0, finalXsl.lastIndexOf('/') + 1); + String resouceFullName = xslDir + href; + + if (log.isDebugEnabled()) { + log.debug("RESOLVING: resouceFullName: "+resouceFullName); + } - return null; try { - System.out.println("RESOLVING: href: "+href+" base: "+base); - StreamSource ss = new StreamSource(new FileInputStream(new File(href))); - return ss; - } catch (FileNotFoundException e) { + 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); + System.out.println("Url found = " + 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) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } catch (SAXException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; } } - });*/ + }); doc = gen.transform(doc, stylesheet); } Modified: trunk/jrst/src/main/java/org/nuiton/jrst/JRSTGenerator.java =================================================================== --- trunk/jrst/src/main/java/org/nuiton/jrst/JRSTGenerator.java 2011-02-10 12:11:19 UTC (rev 538) +++ trunk/jrst/src/main/java/org/nuiton/jrst/JRSTGenerator.java 2011-02-11 16:18:45 UTC (rev 539) @@ -26,9 +26,26 @@ package org.nuiton.jrst; +import static org.nuiton.jrst.ReStructuredText.*; + +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; +import javax.xml.transform.URIResolver; +import javax.xml.transform.sax.SAXResult; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import static org.nuiton.jrst.ReStructuredText.*; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.Node; @@ -40,21 +57,6 @@ import org.xml.sax.InputSource; import org.xml.sax.SAXException; -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.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; -import java.io.File; -import java.io.IOException; -import java.io.Writer; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.LinkedList; - /** * Cette classe contient plusieurs methodes pour générer, soit en utilisant une * feuille de style {@link #generate(Document, URL, Writer)}, soit un @@ -193,7 +195,7 @@ } /** - * Transform doc in another XML document + * Transform doc in another XML document. * * @param doc * @param stylesheet @@ -204,6 +206,11 @@ */ public Document transform(Document doc, URL stylesheet, String... args) throws TransformerException, IOException { + + if (log.isInfoEnabled()) { + log.info("Transform document using : " + stylesheet); + } + // load the transformer using JAXP TransformerFactory factory = TransformerFactory.newInstance(); if (uriResolver != null) { @@ -211,6 +218,7 @@ } else { factory.setURIResolver(new DocumentResolver(stylesheet)); } + Transformer transformer = factory.newTransformer(new StreamSource( stylesheet.openStream())); @@ -250,9 +258,6 @@ URL baseURL; - private DocumentResolver() { - } - public DocumentResolver(URL url) throws MalformedURLException { String path = new File(url.getPath()).getParent(); baseURL = new URL(url.getProtocol(), url.getHost(), url.getPort(), Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2011-02-10 12:11:19 UTC (rev 538) +++ trunk/pom.xml 2011-02-11 16:18:45 UTC (rev 539) @@ -164,6 +164,20 @@ <artifactId>fop</artifactId> <version>1.0</version> <scope>compile</scope> + <exclusions> + <exclusion> + <groupId>xml-apis</groupId> + <artifactId>xml-apis</artifactId> + </exclusion> + <exclusion> + <groupId>xml-apis</groupId> + <artifactId>xml-apis-ext</artifactId> + </exclusion> + <exclusion> + <artifactId>xalan</artifactId> + <groupId>xalan</groupId> + </exclusion> + </exclusions> </dependency> <dependency> @@ -171,6 +185,12 @@ <artifactId>xalan</artifactId> <version>${xalanVersion}</version> <scope>runtime</scope> + <exclusions> + <exclusion> + <groupId>xml-apis</groupId> + <artifactId>xml-apis</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> @@ -178,24 +198,20 @@ <artifactId>serializer</artifactId> <version>${xalanVersion}</version> <scope>runtime</scope> + <exclusions> + <exclusion> + <groupId>xml-apis</groupId> + <artifactId>xml-apis</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> - <groupId>xml-apis</groupId> - <artifactId>xml-apis</artifactId> - <version>1.0.b2</version> + <groupId>net.sourceforge.saxon</groupId> + <artifactId>saxon</artifactId> + <version>9.1.0.8</version> </dependency> - <!-- TC-20090929 y'a serializer-2.7.1 offer par xalan 2-7-1 - cela devrait faire l'affaire --> - - <!--dependency> - <groupId>xerces</groupId> - <artifactId>xml-serializer</artifactId> - <version>2.7.1</version> - <scope>runtime</scope> - </dependency--> - <dependency> <groupId>org.nuiton.thirdparty</groupId> <artifactId>sdoc</artifactId> @@ -208,6 +224,12 @@ <artifactId>dom4j</artifactId> <version>1.6.1</version> <scope>compile</scope> + <exclusions> + <exclusion> + <groupId>xml-apis</groupId> + <artifactId>xml-apis</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> @@ -224,18 +246,27 @@ <scope>runtime</scope> <exclusions> <exclusion> + <groupId>xml-apis</groupId> + <artifactId>xml-apis</artifactId> + </exclusion> + <exclusion> <groupId>xerces</groupId> <artifactId>xmlParserAPIs</artifactId> </exclusion> + <exclusion> + <artifactId>xalan</artifactId> + <groupId>xalan</groupId> + </exclusion> </exclusions> </dependency> <dependency> <groupId>net.sf.docbook</groupId> <artifactId>docbook-xsl</artifactId> - <version>1.75.2</version> + <version>1.76.1</version> <type>zip</type> <classifier>resources</classifier> + <scope>provided</scope> </dependency> <dependency>
participants (1)
-
echatellier@users.nuiton.org