You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ar...@apache.org on 2001/02/21 02:08:53 UTC

cvs commit: xml-fop/src/org/apache/fop/apps Driver.java

arved       01/02/20 17:08:53

  Modified:    src/org/apache/fop/apps Driver.java
  Log:
  Updated command line support
  
  Revision  Changes    Path
  1.20      +406 -519  xml-fop/src/org/apache/fop/apps/Driver.java
  
  Index: Driver.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/apps/Driver.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- Driver.java	2000/12/18 02:28:29	1.19
  +++ Driver.java	2001/02/21 01:08:53	1.20
  @@ -1,519 +1,406 @@
  -/*-- $Id: Driver.java,v 1.19 2000/12/18 02:28:29 kellyc Exp $ --
  -
  - ============================================================================
  -                   The Apache Software License, Version 1.1
  - ============================================================================
  -
  -    Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
  -
  - Redistribution and use in source and binary forms, with or without modifica-
  - tion, are permitted provided that the following conditions are met:
  -
  - 1. Redistributions of  source code must  retain the above copyright  notice,
  -    this list of conditions and the following disclaimer.
  -
  - 2. Redistributions in binary form must reproduce the above copyright notice,
  -    this list of conditions and the following disclaimer in the documentation
  -    and/or other materials provided with the distribution.
  -
  - 3. The end-user documentation included with the redistribution, if any, must
  -    include  the following  acknowledgment:  "This product includes  software
  -    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
  -    Alternately, this  acknowledgment may  appear in the software itself,  if
  -    and wherever such third-party acknowledgments normally appear.
  -
  - 4. The names "FOP" and  "Apache Software Foundation"  must not be used to
  -    endorse  or promote  products derived  from this  software without  prior
  -    written permission. For written permission, please contact
  -    apache@apache.org.
  -
  - 5. Products  derived from this software may not  be called "Apache", nor may
  -    "Apache" appear  in their name,  without prior written permission  of the
  -    Apache Software Foundation.
  -
  - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  - FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
  - APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
  - INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
  - DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
  - OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
  - ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
  - (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
  - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  -
  - This software  consists of voluntary contributions made  by many individuals
  - on  behalf of the Apache Software  Foundation and was  originally created by
  - James Tauber <jt...@jtauber.com>. For more  information on the Apache
  - Software Foundation, please see <http://www.apache.org/>.
  -
  - */
  -
  -package org.apache.fop.apps;
  -
  -// FOP
  -import org.apache.fop.fo.FOTreeBuilder;
  -import org.apache.fop.fo.ElementMapping;
  -import org.apache.fop.fo.PropertyListMapping;
  -import org.apache.fop.layout.AreaTree;
  -import org.apache.fop.layout.FontInfo;
  -import org.apache.fop.render.Renderer;
  -import org.apache.fop.messaging.MessageHandler;
  -import org.apache.fop.configuration.ConfigurationReader;
  -import org.apache.fop.configuration.Configuration;
  -
  -
  -// DOM
  -import org.w3c.dom.Document;
  -import org.w3c.dom.Node;
  -import org.w3c.dom.NamedNodeMap;
  -import org.w3c.dom.Attr;
  -
  -// SAX
  -import org.xml.sax.ContentHandler;
  -import org.xml.sax.InputSource;
  -import org.xml.sax.XMLReader;
  -import org.xml.sax.SAXException;
  -import org.xml.sax.helpers.AttributesImpl;
  -
  -// Java
  -import java.io.*;
  -
  -
  -/**
  - * <P>Primary class that drives overall FOP process.
  - *
  - * <P>Once this class is instantiated, methods are called to set the
  - * Renderer to use, the (possibly multiple) ElementMapping(s) to
  - * use and the PrintWriter to use to output the results of the
  - * rendering (where applicable). In the case of the Renderer and
  - * ElementMapping(s), the Driver may be supplied either with the
  - * object itself, or the name of the class, in which case Driver will
  - * instantiate the class itself. The advantage of the latter is it
  - * enables runtime determination of Renderer and ElementMapping(s).
  - *
  - * <P>Once the Driver is set up, the buildFOTree method
  - * is called. Depending on whether DOM or SAX is being used, the
  - * invocation of the method is either buildFOTree(Document) or
  - * buildFOTree(Parser, InputSource) respectively.
  - *
  - * <P>A third possibility may be used to build the FO Tree, namely
  - * calling getContentHandler() and firing the SAX events yourself.
  - *
  - * <P>Once the FO Tree is built, the format() and render() methods may be
  - * called in that order.
  - *
  - * <P>Here is an example use of Driver from CommandLine.java:
  - *
  - * <PRE>
  - *   Driver driver = new Driver();
  - *   driver.setRenderer("org.apache.fop.render.pdf.PDFRenderer", version);
  - *   driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
  - *   driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
  - *   driver.addPropertyList("org.apache.fop.fo.StandardPropertyListMapping");
  - *   driver.addPropertyList("org.apache.fop.svg.SVGPropertyListMapping");
  - *   driver.setOutputStream(new FileOutputStream(args[1]));
  - *   driver.buildFOTree(parser, fileInputSource(args[0]));
  - *   driver.format();
  - *   driver.render();
  - * </PRE>
  - */
  -public class Driver {
  -
  -    /** the FO tree builder */
  -    protected FOTreeBuilder treeBuilder;
  -
  -    /** the area tree that is the result of formatting the FO tree */
  -    protected AreaTree areaTree;
  -
  -    /** the renderer to use to output the area tree */
  -    protected Renderer renderer;
  -
  -    /** the stream to use to output the results of the renderer */
  -    protected OutputStream stream;
  -
  -    /** If true, full error stacks are reported */
  -    protected boolean errorDump = false;
  -
  -    /** create a new Driver */
  -    public Driver() {
  -        this.treeBuilder = new FOTreeBuilder();
  -        this.loadStandardConfiguration();
  -    }
  -
  -    /** Set the error dump option
  -        * @param dump if true, full stacks will be reported to the error log
  -        */
  -    public void setErrorDump(boolean dump) {
  -        errorDump = dump;
  -    }
  -
  -    /** set the Renderer to use */
  -    public void setRenderer(Renderer renderer) {
  -        this.renderer = renderer;
  -    }
  -
  -    /**
  -        * set the class name of the Renderer to use as well as the
  -        * producer string for those renderers that can make use of it
  -        */
  -    public void setRenderer(String rendererClassName, String producer) {
  -        this.renderer = createRenderer(rendererClassName);
  -        this.renderer.setProducer(producer);
  -    }
  -
  -    /**
  -        * protected method used by setRenderer(String, String) to
  -        * instantiate the Renderer class
  -        */
  -    protected Renderer createRenderer(String rendererClassName) {
  -        MessageHandler.logln("using renderer " + rendererClassName);
  -
  -        try {
  -            return (Renderer) Class.forName(
  -                     rendererClassName).newInstance();
  -        } catch (ClassNotFoundException e) {
  -            MessageHandler.errorln("Could not find " + rendererClassName);
  -        }
  -        catch (InstantiationException e) {
  -            MessageHandler.errorln("Could not instantiate " +
  -                                   rendererClassName);
  -        }
  -        catch (IllegalAccessException e) {
  -            MessageHandler.errorln("Could not access " + rendererClassName);
  -        }
  -        catch (ClassCastException e) {
  -            MessageHandler.errorln(rendererClassName + " is not a renderer");
  -        }
  -        return null;
  -    }
  -
  -    /**
  -        * add the given element mapping.
  -        *
  -        * an element mapping maps element names to Java classes
  -        */
  -    public void addElementMapping(ElementMapping mapping) {
  -        mapping.addToBuilder(this.treeBuilder);
  -    }
  -
  -    /**
  -        * add the element mapping with the given class name
  -        */
  -    public void addElementMapping(String mappingClassName) {
  -        createElementMapping(mappingClassName).addToBuilder(
  -          this.treeBuilder);
  -    }
  -
  -    /**
  -        * protected method used by addElementMapping(String) to
  -        * instantiate element mapping class
  -        */
  -    protected ElementMapping createElementMapping(
  -      String mappingClassName) {
  -        MessageHandler.logln("using element mapping " + mappingClassName);
  -
  -        try {
  -            return (ElementMapping) Class.forName(
  -                     mappingClassName).newInstance();
  -        } catch (ClassNotFoundException e) {
  -            MessageHandler.errorln("Could not find " + mappingClassName);
  -            dumpError(e);
  -        }
  -        catch (InstantiationException e) {
  -            MessageHandler.errorln("Could not instantiate " +
  -                                   mappingClassName);
  -            dumpError(e);
  -        }
  -        catch (IllegalAccessException e) {
  -            MessageHandler.errorln("Could not access " + mappingClassName);
  -            dumpError(e);
  -        }
  -        catch (ClassCastException e) {
  -            MessageHandler.errorln(mappingClassName + " is not an element mapping");
  -            dumpError(e);
  -        }
  -        return null;
  -    }
  -
  -    /**
  -        * add the element mapping with the given class name
  -        */
  -    public void addPropertyList(String listClassName) {
  -        createPropertyList(listClassName).addToBuilder(this.treeBuilder);
  -    }
  -
  -    /**
  -        * protected method used by addPropertyList(String) to
  -        * instantiate list mapping class
  -        */
  -    protected PropertyListMapping createPropertyList(
  -      String listClassName) {
  -        MessageHandler.logln("using property list mapping " +
  -                             listClassName);
  -
  -        try {
  -            return (PropertyListMapping) Class.forName(
  -                     listClassName).newInstance();
  -        } catch (ClassNotFoundException e) {
  -            MessageHandler.errorln("Could not find " + listClassName);
  -            dumpError(e);
  -        }
  -        catch (InstantiationException e) {
  -            MessageHandler.errorln("Could not instantiate " +
  -                                   listClassName);
  -            dumpError(e);
  -        }
  -        catch (IllegalAccessException e) {
  -            MessageHandler.errorln("Could not access " + listClassName);
  -            dumpError(e);
  -        }
  -        catch (ClassCastException e) {
  -            MessageHandler.errorln(listClassName + " is not an property list");
  -            dumpError(e);
  -        }
  -        return null;
  -    }
  -
  -    /**
  -        * return the tree builder (a SAX ContentHandler).
  -        *
  -        * used in situations where SAX is used but not via a FOP-invoked
  -        * SAX parser. A good example is an XSLT engine that fires SAX
  -        * events but isn't a SAX Parser itself.
  -        */
  -    public ContentHandler getContentHandler() {
  -        return this.treeBuilder;
  -    }
  -
  -    /**
  -        * build the formatting object tree using the given SAX Parser and
  -        * SAX InputSource
  -        */
  -    public void buildFOTree(XMLReader parser,
  -                            InputSource source) throws FOPException {
  -
  -        parser.setContentHandler(this.treeBuilder);
  -        try {
  -            parser.parse(source);
  -        } catch (SAXException e) {
  -            if (e.getException() instanceof FOPException) {
  -                dumpError(e.getException());
  -                throw (FOPException) e.getException();
  -            } else {
  -                dumpError(e);
  -                throw new FOPException(e.getMessage());
  -            }
  -        }
  -        catch (IOException e) {
  -            dumpError(e);
  -            throw new FOPException(e.getMessage());
  -        }
  -    }
  -
  -    /**
  -        * build the formatting object tree using the given DOM Document
  -        */
  -    public void buildFOTree(Document document) throws FOPException {
  -
  -        /* most of this code is modified from John Cowan's */
  -
  -        Node currentNode;
  -        AttributesImpl currentAtts;
  -
  -        /* temporary array for making Strings into character arrays */
  -        char[] array = null;
  -
  -        currentAtts = new AttributesImpl();
  -
  -        /* start at the document element */
  -        currentNode = document;
  -
  -        try {
  -            while (currentNode != null) {
  -                switch (currentNode.getNodeType()) {
  -                    case Node.DOCUMENT_NODE:
  -                        this.treeBuilder.startDocument();
  -                        break;
  -                    case Node.CDATA_SECTION_NODE:
  -                    case Node.TEXT_NODE:
  -                        String data = currentNode.getNodeValue();
  -                        int datalen = data.length();
  -                        if (array == null || array.length < datalen) {
  -                            /* if the array isn't big enough, make a new
  -                                  one */
  -                            array = new char[datalen];
  -                        }
  -                        data.getChars(0, datalen, array, 0);
  -                        this.treeBuilder.characters(array, 0, datalen);
  -                        break;
  -                    case Node.PROCESSING_INSTRUCTION_NODE:
  -                        this.treeBuilder.processingInstruction(
  -                          currentNode.getNodeName(),
  -                          currentNode.getNodeValue());
  -                        break;
  -                    case Node.ELEMENT_NODE:
  -                        NamedNodeMap map = currentNode.getAttributes();
  -                        currentAtts.clear();
  -                        for (int i = map.getLength() - 1; i >= 0; i--) {
  -                            Attr att = (Attr) map.item(i);
  -                            currentAtts.addAttribute( att.getNamespaceURI(),
  -                                                      att.getLocalName(), att.getName(),
  -                                                      "CDATA", att.getValue());
  -                        }
  -                        this.treeBuilder.startElement(
  -                          currentNode.getNamespaceURI(),
  -                          currentNode.getLocalName(),
  -                          currentNode.getNodeName(), currentAtts);
  -                        break;
  -                }
  -
  -                Node nextNode = currentNode.getFirstChild();
  -                if (nextNode != null) {
  -                    currentNode = nextNode;
  -                    continue;
  -                }
  -
  -                while (currentNode != null) {
  -                    switch (currentNode.getNodeType()) {
  -                        case Node.DOCUMENT_NODE:
  -                            this.treeBuilder.endDocument();
  -                            break;
  -                        case Node.ELEMENT_NODE:
  -                            this.treeBuilder.endElement(
  -                              currentNode.getNamespaceURI(),
  -                              currentNode.getLocalName(),
  -                              currentNode.getNodeName());
  -                            break;
  -                    }
  -
  -                    nextNode = currentNode.getNextSibling();
  -                    if (nextNode != null) {
  -                        currentNode = nextNode;
  -                        break;
  -                    }
  -
  -                    currentNode = currentNode.getParentNode();
  -                }
  -            }
  -        } catch (SAXException e) {
  -            dumpError(e);
  -            throw new FOPException(e.getMessage());
  -        }
  -    }
  -
  -    /**
  -        * Dumps an error
  -        */
  -    public void dumpError(Exception e) {
  -        if (errorDump) {
  -            if (e instanceof SAXException) {
  -                e.printStackTrace();
  -                if (((SAXException) e).getException() != null) {
  -                    ((SAXException) e).getException().printStackTrace();
  -                }
  -            } else {
  -                e.printStackTrace();
  -            }
  -        }
  -
  -    }
  -
  -    /**
  -       * set the OutputStream to use to output the result of the Renderer
  -       * (if applicable)
  -       */
  -    public void setOutputStream(OutputStream stream) {
  -        this.stream = stream;
  -    }
  -
  -    /**
  -        * format the formatting object tree into an area tree
  -        */
  -    public void format() throws FOPException {
  -        FontInfo fontInfo = new FontInfo();
  -        this.renderer.setupFontInfo(fontInfo);
  -
  -        this.areaTree = new AreaTree();
  -        this.areaTree.setFontInfo(fontInfo);
  -
  -        this.treeBuilder.format(areaTree);
  -    }
  -
  -    /**
  -        * render the area tree to the output form
  -        */
  -    public void render() throws IOException, FOPException {
  -        this.renderer.render(areaTree, this.stream);
  -    }
  -
  -    /**
  -       *  loads standard configuration file and a user file, if it has been specified
  -       */
  -    public void loadStandardConfiguration() {
  -        String file = "config.xml";
  -
  -        // the entry /conf/config.xml refers to a directory conf which is a sibling of org
  -        InputStream configfile =
  -          ConfigurationReader.class.getResourceAsStream("/conf/"+
  -                  file);
  -        if (configfile == null) {
  -            MessageHandler.errorln("Fatal error: can't find default configuration file");
  -            System.exit(1);
  -        }
  -        if (errorDump) {
  -            MessageHandler.logln("reading default configuration file");
  -        }
  -        ConfigurationReader reader =
  -          new ConfigurationReader (new InputSource(configfile));
  -        if (errorDump) {
  -            reader.setDumpError(true);
  -        }
  -        try {
  -            reader.start();
  -        } catch (org.apache.fop.apps.FOPException error) {
  -            MessageHandler.errorln("Fatal Error: Can't process default configuration file. \nProbably it is not well-formed.");
  -            if (errorDump) {
  -                reader.dumpError(error);
  -            }
  -            System.exit(1);
  -        }
  -    }
  -
  -    public void loadUserconfiguration(String userConfigFile) {
  -        //read user configuration file
  -        if (userConfigFile != null) {
  -            MessageHandler.logln("reading user configuration file");
  -            ConfigurationReader reader = new ConfigurationReader (
  -                                           CommandLine.fileInputSource(userConfigFile));
  -            if (errorDump) {
  -                reader.setDumpError(true);
  -            }
  -            try {
  -                reader.start();
  -            } catch (org.apache.fop.apps.FOPException error) {
  -                MessageHandler.errorln(
  -                  "Can't find user configuration file " +
  -                  userConfigFile);
  -                MessageHandler.errorln("using default values");
  -                if (errorDump) {
  -                    reader.dumpError(error);
  -                }
  -            }
  -        }
  -    }
  -
  -    public void setBaseDir(String fofile) {
  -        String baseDir = Configuration.getStringValue("baseDir");
  -        if (baseDir == null) {
  -            baseDir = new File(
  -                        new File(fofile).getAbsolutePath()).getParent();
  -            Configuration.put("baseDir",baseDir);
  -        }
  -        if (errorDump) {
  -            MessageHandler.logln("base directory: " + baseDir);
  -        }
  -    }
  -
  -
  -}
  +/* 
  + * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  + * For details on use and redistribution please refer to the 
  + * LICENSE file included with these sources."
  + */
  +
  +
  +package org.apache.fop.apps;
  +
  +// FOP
  +import org.apache.fop.fo.FOTreeBuilder;
  +import org.apache.fop.fo.ElementMapping;
  +import org.apache.fop.fo.PropertyListMapping;
  +import org.apache.fop.layout.AreaTree;
  +import org.apache.fop.layout.FontInfo;
  +import org.apache.fop.render.Renderer;
  +import org.apache.fop.messaging.MessageHandler;
  +import org.apache.fop.configuration.ConfigurationReader;
  +import org.apache.fop.configuration.Configuration;
  +
  +
  +// DOM
  +import org.w3c.dom.Document;
  +import org.w3c.dom.Node;
  +import org.w3c.dom.NamedNodeMap;
  +import org.w3c.dom.Attr;
  +
  +// SAX
  +import org.xml.sax.ContentHandler;
  +import org.xml.sax.InputSource;
  +import org.xml.sax.XMLReader;
  +import org.xml.sax.SAXException;
  +import org.xml.sax.helpers.AttributesImpl;
  +
  +// Java
  +import java.io.*;
  +
  +
  +/**
  + * <P>Primary class that drives overall FOP process.
  + *
  + * <P>Once this class is instantiated, methods are called to set the
  + * Renderer to use, the (possibly multiple) ElementMapping(s) to
  + * use and the PrintWriter to use to output the results of the
  + * rendering (where applicable). In the case of the Renderer and
  + * ElementMapping(s), the Driver may be supplied either with the
  + * object itself, or the name of the class, in which case Driver will
  + * instantiate the class itself. The advantage of the latter is it
  + * enables runtime determination of Renderer and ElementMapping(s).
  + *
  + * <P>Once the Driver is set up, the buildFOTree method
  + * is called. Depending on whether DOM or SAX is being used, the
  + * invocation of the method is either buildFOTree(Document) or
  + * buildFOTree(Parser, InputSource) respectively.
  + *
  + * <P>A third possibility may be used to build the FO Tree, namely
  + * calling getContentHandler() and firing the SAX events yourself.
  + *
  + * <P>Once the FO Tree is built, the format() and render() methods may be
  + * called in that order.
  + *
  + * <P>Here is an example use of Driver from CommandLine.java:
  + *
  + * <PRE>
  + *   Driver driver = new Driver();
  + *   driver.setRenderer("org.apache.fop.render.pdf.PDFRenderer", version);
  + *   driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
  + *   driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
  + *   driver.addPropertyList("org.apache.fop.fo.StandardPropertyListMapping");
  + *   driver.addPropertyList("org.apache.fop.svg.SVGPropertyListMapping");
  + *   driver.setOutputStream(new FileOutputStream(args[1]));
  + *   driver.buildFOTree(parser, fileInputSource(args[0]));
  + *   driver.format();
  + *   driver.render();
  + * </PRE>
  + */
  +public class Driver {
  +
  +    /** the FO tree builder */
  +    protected FOTreeBuilder treeBuilder;
  +
  +    /** the area tree that is the result of formatting the FO tree */
  +    protected AreaTree areaTree;
  +
  +    /** the renderer to use to output the area tree */
  +    protected Renderer renderer;
  +
  +    /** the stream to use to output the results of the renderer */
  +    protected OutputStream stream;
  +
  +    /** If true, full error stacks are reported */
  +    protected boolean errorDump = false;
  +
  +    /** create a new Driver */
  +    public Driver() {
  +        this.treeBuilder = new FOTreeBuilder();
  +    }
  +
  +    /** Set the error dump option
  +         * @param dump if true, full stacks will be reported to the error log
  +         */
  +    public void setErrorDump(boolean dump) {
  +        errorDump = dump;
  +    }
  +
  +    /** set the Renderer to use */
  +    public void setRenderer(Renderer renderer) {
  +        this.renderer = renderer;
  +    }
  +
  +    /**
  +         * set the class name of the Renderer to use as well as the
  +         * producer string for those renderers that can make use of it
  +         */
  +    public void setRenderer(String rendererClassName, String producer) {
  +        this.renderer = createRenderer(rendererClassName);
  +        this.renderer.setProducer(producer);
  +    }
  +
  +    /**
  +         * protected method used by setRenderer(String, String) to
  +         * instantiate the Renderer class
  +         */
  +    protected Renderer createRenderer(String rendererClassName) {
  +        MessageHandler.logln("using renderer " + rendererClassName);
  +
  +        try {
  +            return (Renderer) Class.forName(
  +                     rendererClassName).newInstance();
  +        } catch (ClassNotFoundException e) {
  +            MessageHandler.errorln("Could not find " + rendererClassName);
  +        }
  +        catch (InstantiationException e) {
  +            MessageHandler.errorln("Could not instantiate " +
  +                                   rendererClassName);
  +        }
  +        catch (IllegalAccessException e) {
  +            MessageHandler.errorln("Could not access " + rendererClassName);
  +        }
  +        catch (ClassCastException e) {
  +            MessageHandler.errorln(rendererClassName + " is not a renderer");
  +        }
  +        return null;
  +    }
  +
  +    /**
  +         * add the given element mapping.
  +         *
  +         * an element mapping maps element names to Java classes
  +         */
  +    public void addElementMapping(ElementMapping mapping) {
  +        mapping.addToBuilder(this.treeBuilder);
  +    }
  +
  +    /**
  +         * add the element mapping with the given class name
  +         */
  +    public void addElementMapping(String mappingClassName) {
  +        createElementMapping(mappingClassName).addToBuilder(
  +          this.treeBuilder);
  +    }
  +
  +    /**
  +         * protected method used by addElementMapping(String) to
  +         * instantiate element mapping class
  +         */
  +    protected ElementMapping createElementMapping(
  +      String mappingClassName) {
  +        MessageHandler.logln("using element mapping " + mappingClassName);
  +
  +        try {
  +            return (ElementMapping) Class.forName(
  +                     mappingClassName).newInstance();
  +        } catch (ClassNotFoundException e) {
  +            MessageHandler.errorln("Could not find " + mappingClassName);
  +            dumpError(e);
  +        }
  +        catch (InstantiationException e) {
  +            MessageHandler.errorln("Could not instantiate " +
  +                                   mappingClassName);
  +            dumpError(e);
  +        }
  +        catch (IllegalAccessException e) {
  +            MessageHandler.errorln("Could not access " + mappingClassName);
  +            dumpError(e);
  +        }
  +        catch (ClassCastException e) {
  +            MessageHandler.errorln(mappingClassName + " is not an element mapping");
  +            dumpError(e);
  +        }
  +        return null;
  +    }
  +
  +    /**
  +         * add the element mapping with the given class name
  +         */
  +    public void addPropertyList(String listClassName) {
  +        createPropertyList(listClassName).addToBuilder(this.treeBuilder);
  +    }
  +
  +    /**
  +         * protected method used by addPropertyList(String) to
  +         * instantiate list mapping class
  +         */
  +    protected PropertyListMapping createPropertyList(
  +      String listClassName) {
  +        MessageHandler.logln("using property list mapping " +
  +                             listClassName);
  +
  +        try {
  +            return (PropertyListMapping) Class.forName(
  +                     listClassName).newInstance();
  +        } catch (ClassNotFoundException e) {
  +            MessageHandler.errorln("Could not find " + listClassName);
  +            dumpError(e);
  +        }
  +        catch (InstantiationException e) {
  +            MessageHandler.errorln("Could not instantiate " +
  +                                   listClassName);
  +            dumpError(e);
  +        }
  +        catch (IllegalAccessException e) {
  +            MessageHandler.errorln("Could not access " + listClassName);
  +            dumpError(e);
  +        }
  +        catch (ClassCastException e) {
  +            MessageHandler.errorln(listClassName + " is not an property list");
  +            dumpError(e);
  +        }
  +        return null;
  +    }
  +
  +    /**
  +         * return the tree builder (a SAX ContentHandler).
  +         *
  +         * used in situations where SAX is used but not via a FOP-invoked
  +         * SAX parser. A good example is an XSLT engine that fires SAX
  +         * events but isn't a SAX Parser itself.
  +         */
  +    public ContentHandler getContentHandler() {
  +        return this.treeBuilder;
  +    }
  +
  +    /**
  +         * build the formatting object tree using the given SAX Parser and
  +         * SAX InputSource
  +         */
  +    public void buildFOTree(XMLReader parser,
  +                            InputSource source) throws FOPException {
  +
  +        parser.setContentHandler(this.treeBuilder);
  +        try {
  +            parser.parse(source);
  +        } catch (SAXException e) {
  +            if (e.getException() instanceof FOPException) {
  +                dumpError(e.getException());
  +                throw (FOPException) e.getException();
  +            } else {
  +                dumpError(e);
  +                throw new FOPException(e.getMessage());
  +            }
  +        }
  +        catch (IOException e) {
  +            dumpError(e);
  +            throw new FOPException(e.getMessage());
  +        }
  +    }
  +
  +    /**
  +         * build the formatting object tree using the given DOM Document
  +         */
  +    public void buildFOTree(Document document) throws FOPException {
  +
  +        /* most of this code is modified from John Cowan's */
  +
  +        Node currentNode;
  +        AttributesImpl currentAtts;
  +
  +        /* temporary array for making Strings into character arrays */
  +        char[] array = null;
  +
  +        currentAtts = new AttributesImpl();
  +
  +        /* start at the document element */
  +        currentNode = document;
  +
  +        try {
  +            while (currentNode != null) {
  +                switch (currentNode.getNodeType()) {
  +                    case Node.DOCUMENT_NODE:
  +                        this.treeBuilder.startDocument();
  +                        break;
  +                    case Node.CDATA_SECTION_NODE:
  +                    case Node.TEXT_NODE:
  +                        String data = currentNode.getNodeValue();
  +                        int datalen = data.length();
  +                        if (array == null || array.length < datalen) {
  +                            /* if the array isn't big enough, make a new
  +                                   one */
  +                            array = new char[datalen];
  +                        }
  +                        data.getChars(0, datalen, array, 0);
  +                        this.treeBuilder.characters(array, 0, datalen);
  +                        break;
  +                    case Node.PROCESSING_INSTRUCTION_NODE:
  +                        this.treeBuilder.processingInstruction(
  +                          currentNode.getNodeName(),
  +                          currentNode.getNodeValue());
  +                        break;
  +                    case Node.ELEMENT_NODE:
  +                        NamedNodeMap map = currentNode.getAttributes();
  +                        currentAtts.clear();
  +                        for (int i = map.getLength() - 1; i >= 0; i--) {
  +                            Attr att = (Attr) map.item(i);
  +                            currentAtts.addAttribute( att.getNamespaceURI(),
  +                                                      att.getLocalName(), att.getName(),
  +                                                      "CDATA", att.getValue());
  +                        }
  +                        this.treeBuilder.startElement(
  +                          currentNode.getNamespaceURI(),
  +                          currentNode.getLocalName(),
  +                          currentNode.getNodeName(), currentAtts);
  +                        break;
  +                }
  +
  +                Node nextNode = currentNode.getFirstChild();
  +                if (nextNode != null) {
  +                    currentNode = nextNode;
  +                    continue;
  +                }
  +
  +                while (currentNode != null) {
  +                    switch (currentNode.getNodeType()) {
  +                        case Node.DOCUMENT_NODE:
  +                            this.treeBuilder.endDocument();
  +                            break;
  +                        case Node.ELEMENT_NODE:
  +                            this.treeBuilder.endElement(
  +                              currentNode.getNamespaceURI(),
  +                              currentNode.getLocalName(),
  +                              currentNode.getNodeName());
  +                            break;
  +                    }
  +
  +                    nextNode = currentNode.getNextSibling();
  +                    if (nextNode != null) {
  +                        currentNode = nextNode;
  +                        break;
  +                    }
  +
  +                    currentNode = currentNode.getParentNode();
  +                }
  +            }
  +        } catch (SAXException e) {
  +            dumpError(e);
  +            throw new FOPException(e.getMessage());
  +        }
  +    }
  +
  +    /**
  +         * Dumps an error
  +         */
  +    public void dumpError(Exception e) {
  +        if (errorDump) {
  +            if (e instanceof SAXException) {
  +                e.printStackTrace();
  +                if (((SAXException) e).getException() != null) {
  +                    ((SAXException) e).getException().printStackTrace();
  +                }
  +            } else {
  +                e.printStackTrace();
  +            }
  +        }
  +
  +    }
  +
  +    /**
  +        * set the OutputStream to use to output the result of the Renderer
  +        * (if applicable)
  +        */
  +    public void setOutputStream(OutputStream stream) {
  +        this.stream = stream;
  +    }
  +
  +    /**
  +         * format the formatting object tree into an area tree
  +         */
  +    public void format() throws FOPException {
  +        FontInfo fontInfo = new FontInfo();
  +        this.renderer.setupFontInfo(fontInfo);
  +
  +        this.areaTree = new AreaTree();
  +        this.areaTree.setFontInfo(fontInfo);
  +
  +        this.treeBuilder.format(areaTree);
  +    }
  +
  +    /**
  +         * render the area tree to the output form
  +         */
  +    public void render() throws IOException, FOPException {
  +        this.renderer.render(areaTree, this.stream);
  +    }
  +
  +
  +}