r579 - in trunk/jrst/src: main/java/org/nuiton/jrst test/java/org/nuiton/jrst
Author: sletellier Date: 2011-05-12 11:55:09 +0200 (Thu, 12 May 2011) New Revision: 579 Url: http://nuiton.org/repositories/revision/jrst/579 Log: - Refactor generate method to allow using it without using files Modified: trunk/jrst/src/main/java/org/nuiton/jrst/JRST.java trunk/jrst/src/test/java/org/nuiton/jrst/JRSTTest.java Modified: trunk/jrst/src/main/java/org/nuiton/jrst/JRST.java =================================================================== --- trunk/jrst/src/main/java/org/nuiton/jrst/JRST.java 2011-04-28 10:05:53 UTC (rev 578) +++ trunk/jrst/src/main/java/org/nuiton/jrst/JRST.java 2011-05-12 09:55:09 UTC (rev 579) @@ -32,6 +32,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; @@ -51,12 +52,14 @@ 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.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.fop.apps.FOUserAgent; @@ -64,8 +67,6 @@ 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.i18n.init.ClassPathI18nInitializer; import org.nuiton.jrst.convertisor.DocUtils2RST; @@ -93,6 +94,8 @@ */ public class JRST { + public static final String UTF_8 = "UTF-8"; + public enum Overwrite { NEVER, IFNEWER, ALLTIME } @@ -249,22 +252,7 @@ public static void generate(String xslListOrOutType, File fileIn, File fileOut, Overwrite overwrite) throws Exception { - generate(xslListOrOutType, fileIn, "UTF-8", fileOut, "UTF-8", overwrite); - } - /** - * - * @param xslListOrOutType - * @param fileIn - * @param inputEncoding - * @param fileOut - * @param outputEncoding - * @param overwrite - * @throws Exception - */ - public static void generate(String xslListOrOutType, File fileIn, - String inputEncoding, File fileOut, String outputEncoding, - Overwrite overwrite) throws Exception { if (fileOut != null && fileOut.exists() && (overwrite == Overwrite.NEVER || (overwrite == Overwrite.IFNEWER && FileUtil @@ -274,204 +262,191 @@ log.info("Don't generate file " + fileOut + ", because already exists"); } else { - // search xsl file list to apply - String xslList = stylesheets.get(xslListOrOutType); - if (xslListOrOutType == null) { - xslList = xslListOrOutType; - } - - // parse rst file URL url = fileIn.toURI().toURL(); - Reader in = new InputStreamReader(url.openStream(), inputEncoding); - JRSTReader jrst = new JRSTReader(); - Document doc = jrst.read(in); + Reader reader = new InputStreamReader(url.openStream(), UTF_8); + FileWriter writer = new FileWriter(fileOut); + String result = generate(xslListOrOutType, reader); - // Sortie vers rst - if (xslListOrOutType.equals(TYPE_RST)){ - // Creation d'un visitor qui convertie de l'xml vers le rst - DocUtilsVisitor visitor = new DocUtils2RST(); + fileOut.getAbsoluteFile().getParentFile().mkdirs(); + // generation PDF + if (xslListOrOutType.equals("pdf")) { + FopFactory fopFactory = FopFactory.newInstance(); + // OutputStream outPDF = new BufferedOutputStream(new + // FileOutputStream(new File("C:/Temp/myfile.pdf"))); - // Atacher le visitor au document - // il va parcourir tout les elements et reconstruire du rst - doc.accept(visitor); + OutputStream outPDF = new BufferedOutputStream(new FileOutputStream( + fileOut)); - // Recuperation du resultat - String result = visitor.getResult(); - // nettoyage du visiteur - visitor.clear(); - // Ecriture du resultat dans un fichier - // prepare the output flux - FileWriter out = null; - if (fileOut != null) { - try { - fileOut.getAbsoluteFile().getParentFile().mkdirs(); - out = new FileWriter(fileOut); - // write generated document - out.write(result); - } finally { - out.close(); - } - } else { - // Si aucun fichier de sortie nest definie, on utilise la sortie standard - System.out.println(result); - } - } - else { - // apply xsl on rst xml document - JRSTGenerator gen = new JRSTGenerator(); - String[] xsls = StringUtil.split(xslList, ","); - for (String xsl : xsls) { - URL stylesheet = null; - File file = new File(xsl); - if (file.exists()) { - stylesheet = file.toURI().toURL(); - } else { - //stylesheet = JRST.class.getResource(xsl); - stylesheet = Resource.getURL(xsl); - } - if (stylesheet == null) { - throw new FileNotFoundException("Can't find stylesheet: " - + xsl); - } + FOUserAgent userAgent = fopFactory.newFOUserAgent(); - final String finalXsl = xsl; + // Step 3: Construct fop with desired output format + Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, + userAgent, outPDF); - // 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; - - if (log.isDebugEnabled()) { - log.debug("RESOLVING: resouceFullName: "+resouceFullName); - } + // Step 4: Setup JAXP using identity transformer + TransformerFactory factory = TransformerFactory + .newInstance(); + Transformer transformer = factory.newTransformer(); // identity + // transformer - 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(); - } - } + // Step 5: Setup input and output for XSLT transformation + // Setup input stream + Source src = new StreamSource(new StringReader(result)); - 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 { + // Resulting SAX events (the generated FO) must be piped + // through to FOP + Result res = new SAXResult(fop.getDefaultHandler()); - InputSource source = null; + // Step 6: Start XSLT transformation and FOP processing + transformer.transform(src, res); - 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); - } + outPDF.close(); + } else { + // write generated document + writer.write(result); - 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; - } - } - }); + writer.close(); - doc = gen.transform(doc, stylesheet); - } + } + } + } - boolean pdf = false; - // generation PDF - if (xslListOrOutType != null) { - if (xslListOrOutType.equals("pdf")) { - pdf = true; - FopFactory fopFactory = FopFactory.newInstance(); - // OutputStream outPDF = new BufferedOutputStream(new - // FileOutputStream(new File("C:/Temp/myfile.pdf"))); + /** + * + * @param xslListOrOutType + * @param in + * @throws Exception + */ + public static String generate(String xslListOrOutType, Reader in) throws Exception { - OutputStream outPDF = null; - if (fileOut != null) { - fileOut.getAbsoluteFile().getParentFile().mkdirs(); - outPDF = new BufferedOutputStream(new FileOutputStream( - fileOut)); - } else { - outPDF = new BufferedOutputStream(System.out); - } + Document doc = generateXMl(in); - FOUserAgent userAgent = fopFactory.newFOUserAgent(); + // Sortie vers rst + if (xslListOrOutType.equals(TYPE_RST)){ + return generateRST(doc); + } else if (!StringUtils.isEmpty(xslListOrOutType)) { + doc = applyXsls(doc, xslListOrOutType); + } + return doc.asXML(); + } - // Step 3: Construct fop with desired output format - Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, - userAgent, outPDF); + private static Document applyXsls(Document doc, String xslListOrOutType) throws IOException, FileNotFoundException, TransformerException { - // Step 4: Setup JAXP using identity transformer - TransformerFactory factory = TransformerFactory - .newInstance(); - Transformer transformer = factory.newTransformer(); // identity - // transformer + // search xsl file list to apply + String xslList = stylesheets.get(xslListOrOutType); + if (xslListOrOutType == null) { + xslList = xslListOrOutType; + } - // Step 5: Setup input and output for XSLT transformation - // Setup input stream - Source src = new StreamSource(new StringReader(doc.asXML())); + // apply xsl on rst xml document + JRSTGenerator gen = new JRSTGenerator(); + String[] xsls = StringUtil.split(xslList, ","); + for (String xsl : xsls) { + URL stylesheet = null; + File file = new File(xsl); + if (file.exists()) { + stylesheet = file.toURI().toURL(); + } else { + //stylesheet = JRST.class.getResource(xsl); + stylesheet = Resource.getURL(xsl); + } + if (stylesheet == null) { + throw new FileNotFoundException("Can't find stylesheet: " + + xsl); + } - // Resulting SAX events (the generated FO) must be piped - // through to FOP - Result res = new SAXResult(fop.getDefaultHandler()); + final String finalXsl = xsl; - // Step 6: Start XSLT transformation and FOP processing - transformer.transform(src, res); - - if (fileOut != null) { - outPDF.close(); - } + // add entity resolver + gen.setUriResolver(new URIResolver() { + public Source resolve(String href, String base) { + if (log.isDebugEnabled()) { + log.debug("RESOLVING: href: "+href+" base: "+base); } - } - if (!pdf) { - // prepare the output flux - XMLWriter out = null; - if (fileOut != null) { - fileOut.getAbsoluteFile().getParentFile().mkdirs(); + String xslDir = finalXsl.substring(0, finalXsl.lastIndexOf('/') + 1); + String resouceFullName = xslDir + href; - out = new XMLWriter(FileUtil.getWriter(fileOut, - outputEncoding), new OutputFormat(" ", true, - outputEncoding)); - } else { - out = new XMLWriter(System.out, new OutputFormat(" ", - true, outputEncoding)); + if (log.isDebugEnabled()) { + log.debug("RESOLVING: resouceFullName: "+resouceFullName); } - // write generated document - out.write(doc); - if (fileOut != null) { - out.close(); + 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; } } - } + }); + + doc = gen.transform(doc, stylesheet); } + return doc; } + + public static Document generateXMl(Reader in) throws Exception { + // parse rst file + JRSTReader jrst = new JRSTReader(); + return jrst.read(in); + } + + public static String generateRST(Document doc) throws IOException { + // Creation d'un visitor qui convertie de l'xml vers le rst + DocUtilsVisitor visitor = new DocUtils2RST(); + + // Atacher le visitor au document + // il va parcourir tout les elements et reconstruire du rst + doc.accept(visitor); + + // Recuperation du resultat + String result = visitor.getResult(); + // nettoyage du visiteur + visitor.clear(); + + return result; + } } Modified: trunk/jrst/src/test/java/org/nuiton/jrst/JRSTTest.java =================================================================== --- trunk/jrst/src/test/java/org/nuiton/jrst/JRSTTest.java 2011-04-28 10:05:53 UTC (rev 578) +++ trunk/jrst/src/test/java/org/nuiton/jrst/JRSTTest.java 2011-05-12 09:55:09 UTC (rev 579) @@ -125,6 +125,8 @@ JRST.generate(JRST.TYPE_RST, in, out, JRST.Overwrite.ALLTIME); List<?> readLines = FileUtils.readLines(out); + log.info(OUT_LINES); + log.info(readLines); Assert.assertEquals(OUT_LINES.size(), readLines.size()); for (int i = 0, j = OUT_LINES.size(); i < j; i++) { String inLine = OUT_LINES.get(i);
participants (1)
-
sletellier@users.nuiton.org