* events but isn't a SAX Parser itself.
*/
public ContentHandler getContentHandler() {
- StreamRenderer streamRenderer = new StreamRenderer(_stream, _renderer);
- streamRenderer.setLogger(getLogger());
+ StructureHandler handler = new LayoutHandler(_stream, _renderer, true);
+ handler.setLogger(getLogger());
_treeBuilder.setLogger(getLogger());
_treeBuilder.setUserAgent(getUserAgent());
- _treeBuilder.setStreamRenderer(streamRenderer);
+ _treeBuilder.setStructHandler(handler);
return _treeBuilder;
}
Starter starter = options.getStarter();
starter.run();
} catch (FOPException e) {
- if("null".equals(e.getMessage())) {
- System.err.println("NullPointerException");
+ if("null".equals("" + e.getMessage())) {
+ System.err.println("Exception occured with a null error message");
} else {
System.err.println("" + e.getMessage());
}
--- /dev/null
+package org.apache.fop.apps;
+
+import java.io.OutputStream;
+import java.io.IOException;
+import java.util.HashSet;
+
+import org.xml.sax.SAXException;
+
+import org.apache.fop.layout.FontInfo;
+import org.apache.fop.area.PageViewport;
+import org.apache.fop.area.AreaTree;
+import org.apache.fop.area.Title;
+import org.apache.fop.render.Renderer;
+import org.apache.fop.fo.pagination.PageSequence;
+
+import org.apache.avalon.framework.logger.Logger;
+
+/**
+ * Layout handler that receives the structure events.
+ * This initiates layout processes and corresponding
+ * rendering processes such as start/end.
+ */
+public class LayoutHandler extends StructureHandler {
+ private static final boolean MEM_PROFILE_WITH_GC = false;
+
+ /**
+ Somewhere to get our stats from.
+ */
+ private Runtime runtime = Runtime.getRuntime();
+
+ /**
+ Keep track of the number of pages rendered.
+ */
+ int pageCount = 0;
+
+ /**
+ Keep track of heap memory allocated,
+ for statistical purposes.
+ */
+ private long initialMemory;
+
+ /**
+ Keep track of time used by renderer.
+ */
+ private long startTime;
+
+ /**
+ The stream to which this rendering is to be
+ written to. <B>Note</B> that some renderers
+ do not render to a stream, and that this
+ member can therefore be null.
+ */
+ private OutputStream outputStream;
+
+ /**
+ The renderer being used.
+ */
+ private Renderer renderer;
+
+ /**
+ The FontInfo for this renderer.
+ */
+ private FontInfo fontInfo = new FontInfo();
+
+ /**
+ * The current AreaTree for the PageSequence being rendered.
+ */
+ private AreaTree areaTree;
+ private AreaTree.StorePagesModel atModel;
+
+ /**
+ * @param outputStream the stream that the result is rendered to
+ * @param renderer the renderer to call
+ * @param store if true then use the store pages model and keep the
+ * area tree in memory
+ */
+ public LayoutHandler(OutputStream outputStream, Renderer renderer,
+ boolean store) {
+ this.outputStream = outputStream;
+ this.renderer = renderer;
+
+ this.areaTree = new AreaTree();
+ this.atModel = AreaTree.createStorePagesModel();
+ areaTree.setTreeModel(atModel);
+ }
+
+ public AreaTree getAreaTree() {
+ return areaTree;
+ }
+
+ public void startDocument() throws SAXException {
+ pageCount = 0;
+
+ if (MEM_PROFILE_WITH_GC)
+ System.gc(); // This takes time but gives better results
+
+ initialMemory = runtime.totalMemory() - runtime.freeMemory();
+ startTime = System.currentTimeMillis();
+
+ try {
+ renderer.setupFontInfo(fontInfo);
+ renderer.startRenderer(outputStream);
+ } catch (IOException e) {
+ throw new SAXException(e);
+ }
+ }
+
+ public void endDocument() throws SAXException {
+ /*
+ Force the processing of any more queue elements,
+ even if they are not resolved.
+ */
+ try {
+ //processQueue(true);
+ processAreaTree();
+ renderer.stopRenderer();
+ } catch (FOPException e) {
+ throw new SAXException(e);
+ }
+ catch (IOException e) {
+ throw new SAXException(e);
+ }
+
+ if (MEM_PROFILE_WITH_GC)
+ System.gc(); // This takes time but gives better results
+
+ long memoryNow = runtime.totalMemory() - runtime.freeMemory();
+ long memoryUsed = (memoryNow - initialMemory) / 1024L;
+
+ log.debug("Initial heap size: " + (initialMemory / 1024L) + "Kb");
+ log.debug("Current heap size: " + (memoryNow / 1024L) + "Kb");
+ log.debug("Total memory used: " + memoryUsed + "Kb");
+
+ if (!MEM_PROFILE_WITH_GC) {
+ log.debug(" Memory use is indicative; no GC was performed");
+ log.debug(" These figures should not be used comparatively");
+ }
+
+ long timeUsed = System.currentTimeMillis() - startTime;
+
+ log.debug("Total time used: " + timeUsed + "ms");
+ log.debug("Pages rendered: " + pageCount);
+ //log.debug("Avg render time: " + (timeUsed / pageCount) + "ms/page");
+ }
+
+ /**
+ Format the PageSequence. The PageSequence
+ formats Pages and adds them to the AreaTree,
+ which subsequently calls the StreamRenderer
+ instance (this) again to render the page.
+ At this time the page might be printed
+ or it might be queued. A page might not
+ be renderable immediately if the IDReferences
+ are not all valid. In this case we defer
+ the rendering until they are all valid.
+ */
+ public void endPageSequence(PageSequence pageSequence)
+ throws FOPException {
+ //areaTree.setFontInfo(fontInfo);
+
+ pageSequence.format(areaTree);
+ }
+
+
+ private void processAreaTree() throws FOPException {
+ int count = 0;
+ int seqc = atModel.getPageSequenceCount();
+ while (count < seqc) {
+ Title title = atModel.getTitle(count);
+ renderer.startPageSequence(title);
+ int pagec = atModel.getPageCount(count);
+ for (int c = 0; c < pagec; c++) {
+ try {
+ renderer.renderPage(atModel.getPage(count, c));
+ } catch (java.io.IOException ioex) {
+ throw new FOPException("I/O Error rendering page",
+ ioex);
+ }
+ }
+ count++;
+ }
+
+ }
+
+ public FontInfo getFontInfo() {
+ return this.fontInfo;
+ }
+}
+
+++ /dev/null
-package org.apache.fop.apps;
-
-import java.io.OutputStream;
-import java.io.IOException;
-import java.util.HashSet;
-
-import org.xml.sax.SAXException;
-
-import org.apache.fop.layout.FontInfo;
-import org.apache.fop.area.PageViewport;
-import org.apache.fop.area.AreaTree;
-import org.apache.fop.area.Title;
-import org.apache.fop.render.Renderer;
-import org.apache.fop.fo.pagination.PageSequence;
-
-import org.apache.avalon.framework.logger.Logger;
-
-/**
- This class acts as a bridge between the XML:FO parser
- and the formatting/rendering classes. It will queue
- PageSequences up until all the IDs required by them
- are satisfied, at which time it will render the
- pages.<P>
-
- StreamRenderer is created by Driver and called from
- FOTreeBuilder when a PageSequence is created,
- and AreaTree when a Page is formatted.<P>
-*/
-public class StreamRenderer {
- private static final boolean MEM_PROFILE_WITH_GC = false;
-
- /**
- Somewhere to get our stats from.
- */
- private Runtime runtime = Runtime.getRuntime();
-
- /**
- Keep track of the number of pages rendered.
- */
- int pageCount = 0;
-
- /**
- Keep track of heap memory allocated,
- for statistical purposes.
- */
- private long initialMemory;
-
- /**
- Keep track of time used by renderer.
- */
- private long startTime;
-
- /**
- The stream to which this rendering is to be
- written to. <B>Note</B> that some renderers
- do not render to a stream, and that this
- member can therefore be null.
- */
- private OutputStream outputStream;
-
- /**
- The renderer being used.
- */
- private Renderer renderer;
-
- /**
- The FontInfo for this renderer.
- */
- private FontInfo fontInfo = new FontInfo();
-
- /**
- The current set of id's in the FO tree
- This is used so we know if the FO tree contains duplicates
- */
- private HashSet idReferences = new HashSet();
-
- private Logger log;
-
- /**
- * The current AreaTree for the PageSequence being rendered.
- */
- private AreaTree areaTree;
- private AreaTree.StorePagesModel atModel;
-
- public StreamRenderer(OutputStream outputStream, Renderer renderer) {
- this.outputStream = outputStream;
- this.renderer = renderer;
-
- this.areaTree = new AreaTree();
- this.atModel = AreaTree.createStorePagesModel();
- areaTree.setTreeModel(atModel);
- }
-
- public void setLogger(Logger logger) {
- log = logger;
- }
-
- public HashSet getIDReferences() {
- return idReferences;
- }
-
- public AreaTree getAreaTree() {
- return areaTree;
- }
-
- public void startRenderer()
- throws SAXException {
- pageCount = 0;
-
- if (MEM_PROFILE_WITH_GC)
- System.gc(); // This takes time but gives better results
-
- initialMemory = runtime.totalMemory() - runtime.freeMemory();
- startTime = System.currentTimeMillis();
-
- try {
- renderer.setupFontInfo(fontInfo);
- renderer.startRenderer(outputStream);
- } catch (IOException e) {
- throw new SAXException(e);
- }
- }
-
- public void stopRenderer()
- throws SAXException {
- /*
- Force the processing of any more queue elements,
- even if they are not resolved.
- */
- try {
- //processQueue(true);
- processAreaTree();
- renderer.stopRenderer();
- } catch (FOPException e) {
- throw new SAXException(e);
- }
- catch (IOException e) {
- throw new SAXException(e);
- }
-
- if (MEM_PROFILE_WITH_GC)
- System.gc(); // This takes time but gives better results
-
- long memoryNow = runtime.totalMemory() - runtime.freeMemory();
- long memoryUsed = (memoryNow - initialMemory) / 1024L;
-
- log.debug("Initial heap size: " + (initialMemory/1024L) + "Kb");
- log.debug("Current heap size: " + (memoryNow/1024L) + "Kb");
- log.debug("Total memory used: " + memoryUsed + "Kb");
-
- if (!MEM_PROFILE_WITH_GC) {
- log.debug(" Memory use is indicative; no GC was performed");
- log.debug(" These figures should not be used comparatively");
- }
-
- long timeUsed = System.currentTimeMillis() - startTime;
-
- log.debug("Total time used: " + timeUsed + "ms");
- log.debug("Pages rendered: " + pageCount);
- //log.debug("Avg render time: " + (timeUsed / pageCount) + "ms/page");
- }
-
- /**
- Format the PageSequence. The PageSequence
- formats Pages and adds them to the AreaTree,
- which subsequently calls the StreamRenderer
- instance (this) again to render the page.
- At this time the page might be printed
- or it might be queued. A page might not
- be renderable immediately if the IDReferences
- are not all valid. In this case we defer
- the rendering until they are all valid.
- */
- public void render(PageSequence pageSequence)
- throws FOPException {
- //areaTree.setFontInfo(fontInfo);
-
- pageSequence.format(areaTree);
- }
-
-
- private void processAreaTree() throws FOPException {
- int count = 0;
- int seqc = atModel.getPageSequenceCount();
- while (count < seqc) {
- Title title = atModel.getTitle(count);
- renderer.startPageSequence(title);
- int pagec = atModel.getPageCount(count);
- for (int c=0; c < pagec; c++) {
- try {
- renderer.renderPage(atModel.getPage(count, c));
- } catch (java.io.IOException ioex) {
- throw new FOPException("I/O Error rendering page", ioex);
- }
- }
- count++;
- }
-
- }
-
- public FontInfo getFontInfo() {
- return this.fontInfo;
- }
-}
-
--- /dev/null
+/*
+ * $Id$
+ * 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;
+
+// Java
+import java.util.HashSet;
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.fop.fo.pagination.PageSequence;
+import org.apache.fop.layout.FontInfo;
+
+import org.xml.sax.SAXException;
+
+/**
+ * This class receives structure events from the FO Tree.
+ * Sub-classes can then implement various methods to handle
+ * the FO Tree when the SAX events occur.
+ */
+public class StructureHandler {
+ /**
+ The current set of id's in the FO tree
+ This is used so we know if the FO tree contains duplicates
+ */
+ private HashSet idReferences = new HashSet();
+ protected Logger log;
+
+ public StructureHandler() {
+ }
+
+ public void setLogger(Logger logger) {
+ log = logger;
+ }
+
+ public HashSet getIDReferences() {
+ return idReferences;
+ }
+
+ public FontInfo getFontInfo() {
+ return null;
+ }
+
+ public void startDocument() throws SAXException {
+
+ }
+
+ public void endDocument() throws SAXException {
+
+ }
+
+ public void startPageSequence() {
+
+ }
+
+ public void endPageSequence(PageSequence pageSeq) throws FOPException {
+
+ }
+
+ public void setPageInfo() {
+
+ }
+
+ public void startBlock() {
+
+ }
+
+ public void endBlock() {
+
+ }
+
+
+ // Tables
+ public void startTable() {
+
+ }
+
+ public void endTable() {
+
+ }
+
+ public void startHeader() {
+
+ }
+
+ public void endHeader() {
+
+ }
+
+ public void startFooter() {
+
+ }
+
+ public void endFooter() {
+
+ }
+
+ public void startBody() {
+
+ }
+
+ public void endBody() {
+
+ }
+
+ public void startRow() {
+
+ }
+
+ public void endRow() {
+
+ }
+
+ public void startCell() {
+
+ }
+
+ public void endCell() {
+
+ }
+
+
+ // Lists
+ public void startList() {
+
+ }
+
+ public void endList() {
+
+ }
+
+ public void startListItem() {
+
+ }
+
+ public void endListItem() {
+
+ }
+
+ public void startListLabel() {
+
+ }
+
+ public void endListLabel() {
+
+ }
+
+ public void startListBody() {
+
+ }
+
+ public void endListBody() {
+
+ }
+
+
+ // Static Regions
+ public void startStatic() {
+
+ }
+
+ public void endStatic() {
+
+ }
+
+
+ public void startMarkup() {
+
+ }
+
+ public void endMarkup() {
+
+ }
+
+
+ public void startLink() {
+
+ }
+
+ public void endLink() {
+
+ }
+
+
+ public void image() {
+
+ }
+
+ public void pageRef() {
+
+ }
+
+ public void foreignObject() {
+
+ }
+
+ public void footnote() {
+
+ }
+
+ public void leader() {
+
+ }
+
+
+ public void characters() {
+
+ }
+
+ public void pageBreak() {
+
+ }
+
+
+}
+
package org.apache.fop.extensions;
+import org.apache.fop.apps.LayoutHandler;
import org.apache.fop.fo.FONode;
import org.apache.fop.area.AreaTree;
data.addSubData(out.getData());
}
// add data to area tree for resolving and handling
- AreaTree at = streamRenderer.getAreaTree();
- at.addTreeExtension(data);
+ if(structHandler instanceof LayoutHandler) {
+ AreaTree at = ((LayoutHandler)structHandler).getAreaTree();
+ at.addTreeExtension(data);
+ }
}
}
// FOP
import org.apache.fop.apps.FOPException;
-import org.apache.fop.apps.StreamRenderer;
+import org.apache.fop.apps.StructureHandler;
import org.apache.fop.layout.Area;
import org.apache.fop.util.CharUtilities;
userAgent = ua;
}
- public void setStreamRenderer(StreamRenderer st) {
+ public void setStructHandler(StructureHandler st) {
}
public void handleAttrs(Attributes attlist) throws FOPException {
// FOP
import org.apache.fop.layout.AreaTree;
import org.apache.fop.apps.FOPException;
-import org.apache.fop.apps.StreamRenderer;
+import org.apache.fop.apps.StructureHandler;
import org.apache.fop.fo.pagination.Root;
import org.apache.fop.fo.pagination.PageSequence;
import org.apache.fop.extensions.ExtensionObj;
* The class that handles formatting and rendering to a stream
* (mark-fop@inomial.com)
*/
- private StreamRenderer streamRenderer;
+ private StructureHandler structHandler;
private Logger log;
private FOUserAgent userAgent;
}
- public void setStreamRenderer(StreamRenderer streamRenderer) {
- this.streamRenderer = streamRenderer;
+ public void setStructHandler(StructureHandler sh) {
+ this.structHandler = sh;
}
/**
throws SAXException {
rootFObj = null; // allows FOTreeBuilder to be reused
log.info("building formatting object tree");
- streamRenderer.startRenderer();
+ structHandler.startDocument();
}
public void endDocument()
throws SAXException {
log.info("Parsing of document complete, stopping renderer");
- streamRenderer.stopRenderer();
+ structHandler.endDocument();
}
/**
fobj.setUserAgent(userAgent);
// set the stream renderer so that appropriate
// elements can add pages and handle resolving references
- fobj.setStreamRenderer(streamRenderer);
+ fobj.setStructHandler(structHandler);
fobj.handleAttrs(attlist);
} catch (FOPException e) {
public void reset() {
currentFObj = null;
rootFObj = null;
- streamRenderer = null;
+ structHandler = null;
}
public boolean hasData() {
import org.apache.fop.layout.Area;
import org.apache.fop.layout.AreaClass;
import org.apache.fop.apps.FOPException;
-import org.apache.fop.apps.StreamRenderer;
+import org.apache.fop.apps.StructureHandler;
import org.apache.fop.layoutmgr.LayoutManager;
import org.apache.fop.fo.properties.FOPropertyMapping;
import org.apache.fop.layout.Area;
* base class for representation of formatting objects and their processing
*/
public class FObj extends FONode {
- protected StreamRenderer streamRenderer;
+ protected StructureHandler structHandler;
public PropertyList properties;
protected PropertyManager propMgr;
protected String areaClass = AreaClass.UNASSIGNED;
children.add(child);
}
- public void setStreamRenderer(StreamRenderer st) {
- streamRenderer = st;
+ public void setStructHandler(StructureHandler st) {
+ structHandler = st;
}
/**
if(prop != null) {
String str = prop.getString();
if(str != null && !str.equals("")) {
- HashSet idrefs = streamRenderer.getIDReferences();
+ HashSet idrefs = structHandler.getIDReferences();
if(!idrefs.contains(str)) {
id = str;
idrefs.add(id);
import org.apache.fop.layout.FontState;
import org.apache.fop.layout.FontInfo;
import org.apache.fop.apps.FOPException;
-import org.apache.fop.apps.StreamRenderer;
+import org.apache.fop.apps.StructureHandler;
import org.apache.fop.datatypes.ColorType;
import org.apache.fop.layoutmgr.InlineStackingBPLayoutManager;
import org.apache.fop.layoutmgr.LMiter;
super(parent);
}
- public void setStreamRenderer(StreamRenderer st) {
+ public void setStructHandler(StructureHandler st) {
+ super.setStructHandler(st);
fontInfo = st.getFontInfo();
}
import org.apache.fop.layoutmgr.LayoutManager;
import org.apache.fop.layoutmgr.BlockLayoutManager;
import org.apache.fop.util.CharUtilities;
-import org.apache.fop.apps.StreamRenderer;
import org.xml.sax.Attributes;
import org.apache.fop.area.AreaTree;
import org.apache.fop.area.PageViewport;
import org.apache.fop.apps.FOPException;
-import org.apache.fop.apps.StreamRenderer;
import org.apache.fop.layoutmgr.PageLayoutManager;
//
// associations
//
- /**
- * Use to layout and render the page sequence.
- */
- private StreamRenderer streamRenderer;
-
/**
* The parent root object
*/
}
}
-
- public void setStreamRenderer(StreamRenderer st) {
- this.streamRenderer = st;
- }
-
public void end() {
try {
- this.streamRenderer.render(this);
+ this.structHandler.endPageSequence(this);
} catch (FOPException fopex) {
log.error("Error in PageSequence.end(): " +
fopex.getMessage());
// FOP
import org.apache.fop.apps.FOPException;
-import org.apache.fop.apps.StreamRenderer;
import org.apache.fop.fo.flow.StaticContent;
import org.apache.fop.svg.*;
import org.apache.fop.render.Renderer;
*/
Vector rootExtensions = null;
- private StreamRenderer streamRenderer;
-
- public AreaTree(StreamRenderer streamRenderer) {
- this.streamRenderer = streamRenderer;
+ public AreaTree() {
}
public void setFontInfo(FontInfo fontInfo) {