gmazza 2004/07/19 20:39:24 Modified: src/java/org/apache/fop/apps Driver.java FOFileHandler.java Fop.java InputHandler.java XSLTInputHandler.java src/java/org/apache/fop/render/awt/viewer PreviewDialog.java src/java/org/apache/fop/tools TestConverter.java src/java/org/apache/fop/tools/anttasks Fop.java test/java/org/apache/fop BasicDriverTestCase.java GenericFOPTestCase.java Log: 1.) render() methods moved from Driver to XSLTInputHandler and FOFileHandler. 2.) -param command line switch implemented for xml->xslt->pdf processes Revision Changes Path 1.92 +1 -55 xml-fop/src/java/org/apache/fop/apps/Driver.java Index: Driver.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/apps/Driver.java,v retrieving revision 1.91 retrieving revision 1.92 diff -u -r1.91 -r1.92 --- Driver.java 19 Jul 2004 22:46:14 -0000 1.91 +++ Driver.java 20 Jul 2004 03:39:24 -0000 1.92 @@ -19,13 +19,9 @@ package org.apache.fop.apps; // Java -import java.io.IOException; import java.io.OutputStream; // XML -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; // FOP @@ -137,55 +133,5 @@ */ public DefaultHandler getDefaultHandler() throws FOPException { return new FOTreeBuilder(renderType, foUserAgent, stream); - } - - /** - * Render the FO document read by a SAX Parser from an InputHandler - * @param inputHandler the input handler containing the source and - * parser information. - * @throws FOPException if anything goes wrong. - */ - public synchronized void render(InputHandler inputHandler) - throws FOPException { - XMLReader parser = inputHandler.getParser(); - foUserAgent.setBaseURL(inputHandler.getBaseURL()); - render(parser, inputHandler.getInputSource()); - } - - /** - * This is the main render() method. The other render() methods are for - * convenience, and normalize to this form, then run this. - * Renders the FO document read by a SAX Parser from an InputSource. - * For versions not needing an FO Tree (e.g., Alt-Design), override this. - * - * @param parser the SAX parser. - * @param source the input source the parser reads from. - * @throws FOPException if anything goes wrong. - */ - public synchronized void render(XMLReader parser, InputSource source) - throws FOPException { - parser.setContentHandler(getDefaultHandler()); - - try { - /** - The following statement triggers virtually all of the processing - for this document. The SAX parser fires events that are handled by - the appropriate InputHandler object, which means that you will need - to look in those objects to see where FOP picks up control of - processing again. For Structure Renderers (e.g. MIF & RTF), the SAX - events are handled directly. For Layout Renderers (e.g. PDF & - PostScript), an Area Tree is managed by the AreaTreeHandler. - */ - parser.parse(source); - } catch (SAXException e) { - if (e.getException() instanceof FOPException) { - // Undo exception tunneling. - throw (FOPException)e.getException(); - } else { - throw new FOPException(e); - } - } catch (IOException e) { - throw new FOPException(e); - } } } 1.5 +40 -13 xml-fop/src/java/org/apache/fop/apps/FOFileHandler.java Index: FOFileHandler.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/apps/FOFileHandler.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- FOFileHandler.java 16 Mar 2004 22:17:09 -0000 1.4 +++ FOFileHandler.java 20 Jul 2004 03:39:24 -0000 1.5 @@ -15,21 +15,27 @@ */ /* $Id$ */ - + package org.apache.fop.apps; +// Java +import java.io.File; +import java.net.URL; + // Imported SAX classes import org.xml.sax.InputSource; -import org.xml.sax.XMLReader; import org.xml.sax.SAXException; -import org.xml.sax.SAXNotSupportedException; +import org.xml.sax.XMLReader; -// java +//JAXP import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.ParserConfigurationException; -import java.io.File; -import java.net.URL; - +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.Source; +import javax.xml.transform.Result; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.sax.SAXResult; /** * Manages input if it is an XSL-FO file. @@ -72,12 +78,34 @@ } /** - * @see org.apache.fop.apps.InputHandler#getParser() + * @see org.apache.fop.apps.InputHandler#render(Driver) */ - public XMLReader getParser() throws FOPException { - return createParser(); - } + public void render(Driver driver) throws FOPException { + // temporary until baseURL removed from inputHandler objects + if (driver.getUserAgent().getBaseURL() == null) { + driver.getUserAgent().setBaseURL(getBaseURL()); + } + + try { + // Setup JAXP using identity transformer (no stylesheet here) + TransformerFactory factory = TransformerFactory.newInstance(); + Transformer transformer = factory.newTransformer(); + + // Setup input stream + Source src = new SAXSource(getInputSource()); + + // Resulting SAX events (the generated FO) must be piped through to FOP + Result res = new SAXResult(driver.getDefaultHandler()); + + // Start XSLT transformation and FOP processing + transformer.transform(src, res); + + } catch (Exception e) { + throw new FOPException(e); + } + } + /** * Creates <code>XMLReader</code> object using default * <code>SAXParserFactory</code> @@ -109,4 +137,3 @@ } } } - 1.18 +2 -2 xml-fop/src/java/org/apache/fop/apps/Fop.java Index: Fop.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/apps/Fop.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- Fop.java 19 Jul 2004 05:33:34 -0000 1.17 +++ Fop.java 20 Jul 2004 03:39:24 -0000 1.18 @@ -52,7 +52,7 @@ options.getOutputFile())); driver.setOutputStream(bos); } - driver.render(foUserAgent.getInputHandler()); + foUserAgent.getInputHandler().render(driver); } finally { if (bos != null) { bos.close(); 1.12 +5 -13 xml-fop/src/java/org/apache/fop/apps/InputHandler.java Index: InputHandler.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/apps/InputHandler.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- InputHandler.java 4 Apr 2004 11:12:28 -0000 1.11 +++ InputHandler.java 20 Jul 2004 03:39:24 -0000 1.12 @@ -33,12 +33,6 @@ */ public abstract class InputHandler { - /** - * Get the input source associated with this input handler. - * @return the input source - */ - public abstract InputSource getInputSource(); - protected String baseURL = null; /** @@ -50,11 +44,11 @@ } /** - * Get the SAX parser associated with this input handler. - * @return the SAX parser - * @throws FOPException in case of an error determining the SAX parser + * Generate a document, given an initialized Driver object + * @param driver -- Driver object + * @throws FOPException in case of an error during processing */ - public abstract XMLReader getParser() throws FOPException; + public void render(Driver driver) throws FOPException {} /** * Creates an InputSource from a URL. @@ -86,6 +80,4 @@ throw new RuntimeException("unexpected MalformedURLException"); } } - } - 1.15 +28 -74 xml-fop/src/java/org/apache/fop/apps/XSLTInputHandler.java Index: XSLTInputHandler.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/apps/XSLTInputHandler.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- XSLTInputHandler.java 25 Jun 2004 23:35:00 -0000 1.14 +++ XSLTInputHandler.java 20 Jul 2004 03:39:24 -0000 1.15 @@ -28,23 +28,20 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamSource; import javax.xml.transform.sax.SAXResult; -import javax.xml.transform.sax.SAXSource; -import javax.xml.transform.sax.SAXTransformerFactory; +import javax.xml.transform.stream.StreamSource; +import javax.xml.transform.Result; // Imported SAX classes import org.xml.sax.InputSource; -import org.xml.sax.XMLReader; -import org.xml.sax.XMLFilter; /** * XSLTInputHandler basically takes an XML file and transforms it with an XSLT * file and the resulting XSL-FO document is input for FOP. */ public class XSLTInputHandler extends InputHandler { - private StreamSource xmlSource; private Source xsltSource; - private Vector xsltParams = null; // not yet implemented + private Vector xsltParams = null; /** * Constructor for files as input @@ -108,80 +105,37 @@ } /** - * @see org.apache.fop.apps.InputHandler#getInputSource() + * @see org.apache.fop.apps.InputHandler#render(Driver) */ - public InputSource getInputSource() { - InputSource is = new InputSource(); - is.setByteStream(xmlSource.getInputStream()); - is.setSystemId(xmlSource.getSystemId()); - return is; - } + public void render(Driver driver) + throws FOPException { - /** - * Overwrites this method of the super class and returns an XMLFilter - * instead of a simple XMLReader which allows chaining of transformations. - * @see org.apache.fop.apps.InputHandler#getParser() - */ - public XMLReader getParser() throws FOPException { - return getXMLFilter(xsltSource, xsltParams); - } + // temporary until baseURL removed from inputHandler objects + if (driver.getUserAgent().getBaseURL() == null) { + driver.getUserAgent().setBaseURL(getBaseURL()); + } - /** - * Creates from the transformer an instance of an XMLFilter which - * then can be used in a chain with the XMLReader passed to Driver. This way - * during the conversion of the xml file + xslt stylesheet the resulting - * data is fed into Fop. This should help to avoid memory problems - * @param xsltSource An xslt stylesheet - * @return an XMLFilter which can be chained together with other - * XMLReaders or XMLFilters - * @throws FOPException if setting up the XMLFilter fails - */ - public static XMLFilter getXMLFilter(Source xsltSource, Vector inParams) throws FOPException { try { - // Instantiate a TransformerFactory. - TransformerFactory tFactory = TransformerFactory.newInstance(); - // Determine whether the TransformerFactory supports The use of SAXSource - // and SAXResult - if (tFactory.getFeature(SAXSource.FEATURE) - && tFactory.getFeature(SAXResult.FEATURE)) { - // Cast the TransformerFactory to SAXTransformerFactory. - SAXTransformerFactory saxTFactory = - ((SAXTransformerFactory)tFactory); - // Create an XMLFilter for each stylesheet. - XMLFilter xmlfilter = - saxTFactory.newXMLFilter(xsltSource); - -/* if (inParams != null) { - // parameters currently not settable with an XMLFilter - for (int i = 0; i < nParams; i += 2) { - // setParameter() method doesn't exist - xmlfilter.setParameter((String) inParams.elementAt(i), - (String) inParams.elementAt(i + 1)); - } + // Setup XSLT + TransformerFactory factory = TransformerFactory.newInstance(); + Transformer 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)); } -*/ - - // Create an XMLReader. - XMLReader parser = FOFileHandler.createParser(); - if (parser == null) { - throw new FOPException("Unable to create SAX parser"); - } - - // xmlFilter1 uses the XMLReader as its reader. - xmlfilter.setParent(parser); - return xmlfilter; - } else { - throw new FOPException("Your parser doesn't support the " - + "features SAXSource and SAXResult." - + "\nMake sure you are using an XSLT engine which " - + "supports TrAX"); } - } catch (FOPException fe) { - throw fe; - } catch (Exception ex) { - throw new FOPException(ex); + + // Resulting SAX events (the generated FO) must be piped through to FOP + Result res = new SAXResult(driver.getDefaultHandler()); + + // Start XSLT transformation and FOP processing + transformer.transform(xmlSource, res); + + } catch (Exception e) { + throw new FOPException(e); } } - } - 1.6 +2 -2 xml-fop/src/java/org/apache/fop/render/awt/viewer/PreviewDialog.java Index: PreviewDialog.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/render/awt/viewer/PreviewDialog.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- PreviewDialog.java 19 Jul 2004 05:33:34 -0000 1.5 +++ PreviewDialog.java 20 Jul 2004 03:39:24 -0000 1.6 @@ -394,7 +394,7 @@ try { setStatus(translator.getString("Status.Build.FO.tree")); - driver.render(foUserAgent.getInputHandler()); + foUserAgent.getInputHandler().render(driver); setStatus(translator.getString("Status.Show")); } catch (FOPException e) { reportException(e); 1.18 +1 -1 xml-fop/src/java/org/apache/fop/tools/TestConverter.java Index: TestConverter.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/tools/TestConverter.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- TestConverter.java 19 Jul 2004 05:33:34 -0000 1.17 +++ TestConverter.java 20 Jul 2004 03:39:24 -0000 1.18 @@ -326,7 +326,7 @@ driver.setOutputStream(outStream); logger.debug("ddir:" + destdir + " on:" + outputFile.getName()); - driver.render(inputHandler); + inputHandler.render(driver); outStream.close(); // check difference 1.17 +1 -1 xml-fop/src/java/org/apache/fop/tools/anttasks/Fop.java Index: Fop.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/tools/anttasks/Fop.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- Fop.java 19 Jul 2004 05:33:34 -0000 1.16 +++ Fop.java 20 Jul 2004 03:39:24 -0000 1.17 @@ -535,7 +535,7 @@ userAgent.setBaseURL(this.baseURL); Driver driver = new Driver(renderer, userAgent); driver.setOutputStream(out); - driver.render(inputHandler); + inputHandler.render(driver); } catch (Exception ex) { throw new BuildException(ex); } finally { 1.11 +2 -21 xml-fop/test/java/org/apache/fop/BasicDriverTestCase.java Index: BasicDriverTestCase.java =================================================================== RCS file: /home/cvs/xml-fop/test/java/org/apache/fop/BasicDriverTestCase.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- BasicDriverTestCase.java 19 Jul 2004 22:46:14 -0000 1.10 +++ BasicDriverTestCase.java 20 Jul 2004 03:39:24 -0000 1.11 @@ -84,25 +84,6 @@ } /** - * Tests Driver with XMLReader, InputSource and OutputStream. - * @throws Exception if anything fails - */ - public void testFO2PDFWithXMLReader() throws Exception { - File foFile = new File(getBaseDir(), "test/xml/bugtests/block.fo"); - ByteArrayOutputStream baout = new ByteArrayOutputStream(); - Driver driver = new Driver(Driver.RENDER_PDF); - - driver.setOutputStream(baout); - SAXParserFactory factory = SAXParserFactory.newInstance(); - factory.setNamespaceAware(true); - factory.setValidating(false); - SAXParser parser = factory.newSAXParser(); - driver.render(parser.getXMLReader(), - new InputSource(foFile.toURL().toExternalForm())); - assertTrue("Generated PDF has zero length", baout.size() > 0); - } - - /** * Tests Driver with JAXP and OutputStream generating PDF. * @throws Exception if anything fails */ @@ -171,7 +152,7 @@ driver.setOutputStream(baout); InputHandler handler = new XSLTInputHandler(xmlFile, xsltFile); - driver.render(handler); + handler.render(driver); assertTrue("Generated PDF has zero length", baout.size() > 0); } 1.6 +3 -2 xml-fop/test/java/org/apache/fop/GenericFOPTestCase.java Index: GenericFOPTestCase.java =================================================================== RCS file: /home/cvs/xml-fop/test/java/org/apache/fop/GenericFOPTestCase.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- GenericFOPTestCase.java 19 Jul 2004 05:33:35 -0000 1.5 +++ GenericFOPTestCase.java 20 Jul 2004 03:39:24 -0000 1.6 @@ -123,7 +123,8 @@ InputSource source = new InputSource(new StringReader(fo)); DigestFilter filter = new DigestFilter("MD5"); filter.setParent(parserFactory.newSAXParser().getXMLReader()); - driver.render(filter, source); + filter.setContentHandler(driver.getDefaultHandler()); + filter.parse(source); String digestInActual = digestToString(filter.getDigestValue()); if (!digestIn.equals(digestInActual)) { fail("input MD5: was " + digestInActual + ", expected " + digestIn);
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]