--- /dev/null
+Index: src/blocks/fop/java/org/apache/cocoon/serialization/FOPSerializer.java
+===================================================================
+RCS file: /home/cvspublic/xml-cocoon2/src/blocks/fop/java/org/apache/cocoon/serialization/FOPSerializer.java,v
+retrieving revision 1.3
+diff -u -r1.3 FOPSerializer.java
+--- src/blocks/fop/java/org/apache/cocoon/serialization/FOPSerializer.java 23 Sep 2002 03:30:44 -0000 1.3
++++ src/blocks/fop/java/org/apache/cocoon/serialization/FOPSerializer.java 8 Nov 2002 12:06:40 -0000
+@@ -62,18 +62,28 @@
+ import org.apache.cocoon.components.url.URLFactory;
+ import org.apache.cocoon.util.ClassUtils;
+ import org.apache.cocoon.environment.URLFactorySourceResolver;
+-import org.apache.cocoon.environment.Source;
++import org.apache.cocoon.environment.Environment;
++import org.apache.excalibur.source.Source;
++import org.apache.excalibur.source.SourceResolver;
+ import org.apache.excalibur.source.SourceValidity;
+ import org.apache.excalibur.source.impl.validity.NOPValidity;
+ import org.apache.fop.apps.Driver;
+-import org.apache.fop.apps.Options;
+-import org.apache.fop.messaging.MessageHandler;
+ import org.apache.fop.render.Renderer;
+-import org.apache.fop.configuration.ConfigurationParser;
++import org.apache.fop.fo.FOUserAgent;
++import org.apache.cocoon.components.RequestLifecycleComponent;
++import org.apache.avalon.framework.component.Component;
++import org.apache.cocoon.ProcessingException;
++import org.xml.sax.SAXException;
++import org.apache.cocoon.components.RequestLifecycleComponent;
++
++import java.io.IOException;
++import java.util.Map;
+
+ import java.io.OutputStream;
+ import java.io.File;
+ import java.io.Serializable;
++import java.io.InputStream;
++import java.net.URL;
+ import java.net.MalformedURLException;
+
+ /**
+@@ -83,7 +93,7 @@
+ */
+ public class FOPSerializer
+ extends AbstractSerializer
+-implements Composable, Configurable, CacheableProcessingComponent {
++implements Composable, Configurable, CacheableProcessingComponent, RequestLifecycleComponent {
+
+ /**
+ * The Renderer Factory to use
+@@ -96,6 +106,11 @@
+ protected Driver driver;
+
+ /**
++ * The current <code>FOUserAgent</code>.
++ */
++ protected FOUserAgent userAgent;
++
++ /**
+ * The current <code>Renderer</code>.
+ */
+ protected Renderer renderer;
+@@ -144,24 +159,6 @@
+ public void configure(Configuration conf) throws ConfigurationException {
+
+ this.logger = getLogger().getChildLogger("fop");
+- MessageHandler.setScreenLogger(this.logger);
+-
+- // FIXME: VG: Initialize static FOP configuration with defaults, only once.
+- // FOP has static config, but that's going to change in the near future.
+- // Then this code should be reviewed.
+- synchronized (FOPSerializer.class) {
+- if (!configured) {
+- try {
+- if (getLogger().isDebugEnabled()) {
+- getLogger().debug("Loading default configuration");
+- }
+- new Options();
+- } catch (Exception e) {
+- getLogger().error("Cannot load default configuration. Proceeding.", e);
+- }
+- configured = true;
+- }
+- }
+
+ this.setContentLength = conf.getChild("set-content-length").getValueAsBoolean(true);
+
+@@ -179,28 +176,6 @@
+ // New syntax: Element user-config contains URL
+ configUrl = conf.getChild("user-config").getValue(null);
+ }
+- if(configUrl != null) {
+- URLFactory urlFactory = null;
+- Source configSource = null;
+- try {
+- // FIXME: How to do without URLFactory but relative to context?
+- urlFactory = (URLFactory)manager.lookup(URLFactory.ROLE);
+- URLFactorySourceResolver urlResolver = new URLFactorySourceResolver(urlFactory, manager);
+- configSource = urlResolver.resolve(configUrl);
+- if (getLogger().isDebugEnabled()) {
+- getLogger().debug("Loading configuration from " + configSource.getSystemId());
+- }
+- configSource.toSAX(new ConfigurationParser());
+- } catch (Exception e) {
+- getLogger().warn("Cannot load configuration from " + configUrl);
+- throw new ConfigurationException("Cannot load configuration from " + configUrl, e);
+- } finally {
+- manager.release(urlFactory);
+- if (configSource != null) {
+- configSource.recycle();
+- }
+- }
+- }
+
+ // Get the mime type.
+ this.mimetype = conf.getAttribute("mime-type");
+@@ -232,6 +207,21 @@
+ + "no renderer was specified in the sitemap configuration."
+ );
+ }
++
++ userAgent = new FOUserAgent();
++ userAgent.enableLogging(this.logger);
++ //userAgent.setBaseURL(source.getSystemId());
++
++ // load the fop driver
++ this.driver = new Driver();
++ driver.enableLogging(this.logger);
++ driver.setUserAgent(userAgent);
++
++ driver.setRenderer(this.renderer);
++
++ //driver.configure(conf);
++ driver.initialize();
++
+ }
+
+ /**
+@@ -241,27 +231,40 @@
+ return mimetype;
+ }
+
++ public void setup(final org.apache.cocoon.environment.SourceResolver resolver, Map objectModel)
++ throws ProcessingException, SAXException, IOException {
++
++ userAgent = new FOUserAgent() {
++ public InputStream getStream(String uri) {
++ try {
++ Environment env = (Environment) resolver;
++ org.apache.cocoon.environment.Source source = null;
++ org.apache.cocoon.components.source.CocoonSourceFactory ccf;
++ ccf = new org.apache.cocoon.components.source.CocoonSourceFactory(null, manager);
++ ccf.enableLogging(logger);
++ source = ccf.getSource(env, "/" + uri);
++ getLogger().error("Loading image from " + source.getSystemId());
++ InputStream is = source.getInputStream();
++ getLogger().error("input stream: " + is + ":" + is.available());
++ return is;
++ } catch (Exception e) {
++ getLogger().error("Cannot load source", e);
++ }
++ return null;
++ }
++ };
++ userAgent.enableLogging(this.logger);
++ //userAgent.setBaseURL(source.getSystemId());
++
++ driver.setUserAgent(userAgent);
++
++ }
++
+ /**
+ * Create the FOP driver
+ * Set the <code>OutputStream</code> where the XML should be serialized.
+ */
+ public void setOutputStream(OutputStream out) {
+- // load the fop driver
+- this.driver = new Driver();
+- this.driver.setLogger(this.logger);
+- if (this.rendererName == null) {
+- this.renderer = factory.createRenderer(mimetype);
+- } else {
+- try {
+- this.renderer = (Renderer)ClassUtils.newInstance(this.rendererName);
+- } catch (Exception e) {
+- if (getLogger().isWarnEnabled()) {
+- getLogger().warn("Cannot load class " + this.rendererName, e);
+- }
+- throw new RuntimeException("Cannot load class " + this.rendererName + "(" + e + ")");
+- }
+- }
+- this.driver.setRenderer(this.renderer);
+ this.driver.setOutputStream(out);
+ setContentHandler(this.driver.getContentHandler());
+ }
+@@ -295,8 +298,7 @@
+ */
+ public void recycle() {
+ super.recycle();
+- this.driver = null;
+- this.renderer = null;
++ this.driver.reset();
+ }
+
+ /**
+@@ -306,3 +308,4 @@
+ return this.setContentLength;
+ }
+ }
++
+Index: src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java
+===================================================================
+RCS file: /home/cvspublic/xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java,v
+retrieving revision 1.24
+diff -u -r1.24 AbstractProcessingPipeline.java
+--- src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java 11 Oct 2002 08:36:30 -0000 1.24
++++ src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java 8 Nov 2002 12:06:40 -0000
+@@ -62,6 +62,7 @@
+ import org.apache.cocoon.ConnectionResetException;
+ import org.apache.cocoon.ProcessingException;
+ import org.apache.cocoon.components.CocoonComponentManager;
++import org.apache.cocoon.components.RequestLifecycleComponent;
+ import org.apache.cocoon.components.treeprocessor.ProcessingNode;
+ import org.apache.cocoon.environment.Environment;
+ import org.apache.cocoon.environment.ObjectModelHelper;
+@@ -392,6 +393,15 @@
+ environment.getObjectModel(),
+ (String)transformerSourceItt.next(),
+ (Parameters)transformerParamItt.next()
++ );
++ }
++
++ // WARNING: quick hack
++ // setup the generator
++ if(this.serializer instanceof RequestLifecycleComponent) {
++ ((RequestLifecycleComponent)this.serializer).setup(
++ environment,
++ environment.getObjectModel()
+ );
+ }
+
--- /dev/null
+Index: src/resources/skins/forrest-site/xslt/fo/document2fo.xsl
+===================================================================
+RCS file: /home/cvspublic/xml-forrest/src/resources/skins/forrest-site/xslt/fo/document2fo.xsl,v
+retrieving revision 1.3
+diff -u -r1.3 document2fo.xsl
+--- src/resources/skins/forrest-site/xslt/fo/document2fo.xsl 1 Nov 2002 02:49:58 -0000 1.3
++++ src/resources/skins/forrest-site/xslt/fo/document2fo.xsl 8 Nov 2002 12:05:50 -0000
+@@ -2,6 +2,7 @@
+
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
++ xmlns:fox="http://xml.apache.org/fop/extensions"
+ version="1.0">
+
+ <xsl:output method="xml"/>
+@@ -80,14 +81,52 @@
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+ </fo:layout-master-set>
+-
++
++ <fox:bookmarks>
++ <xsl:apply-templates select="document/body/section" mode="bookmarks"/>
++ </fox:bookmarks>
++
+ <fo:page-sequence master-reference="book">
+ <xsl:apply-templates/>
+ </fo:page-sequence>
+
+ </fo:root>
+ </xsl:template>
+-
++
++ <xsl:template match="section" mode="bookmarks">
++ <fox:outline internal-destination="{generate-id()}">
++ <fox:label>
++ <xsl:number format="1.1.1.1.1.1.1" count="section" level="multiple"/>
++ <xsl:text> </xsl:text>
++ <xsl:value-of select="title"/>
++ </fox:label>
++ <xsl:apply-templates mode="bookmarks"/>
++ </fox:outline>
++ </xsl:template>
++
++ <xsl:template match="*" mode="bookmarks">
++ <xsl:apply-templates mode="bookmarks"/>
++ </xsl:template>
++
++ <xsl:template name="info">
++ <fo:block-container font-style="italic" absolute-position="absolute"
++ left="0pt" top="0pt" right="6.25in" bottom="150pt"
++ font-size="10pt">
++ <fo:block text-align="center">
++ <fo:basic-link color="lightgrey"
++ external-destination="http://xml.apache.org/fop/dev">
++ Created by: FOP 1.0dev
++ </fo:basic-link>
++ </fo:block>
++ <fo:block text-align="center">
++ <fo:basic-link color="lightgrey"
++ external-destination="http://xml.apache.org/fop/dev">
++ http://xml.apache.org/fop/dev
++ </fo:basic-link>
++ </fo:block>
++ </fo:block-container>
++ </xsl:template>
++
+ <xsl:template match="document">
+ <fo:title><xsl:value-of select="header/title"/></fo:title>
+
+@@ -102,6 +141,7 @@
+ text-align="start">
+ Page <fo:page-number/>
+ </fo:block>
++ <xsl:call-template name="info"/>
+ </fo:static-content>
+
+ <fo:static-content flow-name="even-header">
+@@ -110,6 +150,7 @@
+ font-style="italic">
+ <xsl:value-of select="header/title"/>
+ </fo:block>
++ <xsl:call-template name="info"/>
+ </fo:static-content>
+
+ <fo:static-content flow-name="even-footer">
+@@ -131,6 +172,7 @@
+ font-style="italic">
+ <xsl:value-of select="header/title"/>
+ </fo:block>
++ <xsl:call-template name="info"/>
+ </fo:static-content>
+
+ <fo:static-content flow-name="odd-footer">
+@@ -191,7 +233,12 @@
+ NOTICE: <xsl:apply-templates/>
+ </fo:block>
+ </xsl:template>
+-
++<!--
++ <xsl:template match="anchor">
++ <fo:block id="{@id}"/>
++ <xsl:apply-templates/>
++ </xsl:template>
++-->
+ <xsl:template match="section">
+
+ <xsl:param name="level">0</xsl:param>
+@@ -201,9 +248,15 @@
+ font-family="serif"
+ font-size="{$size}pt"
+ font-weight="bold"
+- space-before="12pt">
++ space-before="12pt"
++ id="{generate-id()}">
+ <xsl:number format="1.1.1.1.1.1.1" count="section" level="multiple"/>
+ <xsl:text> </xsl:text>
++
++ <xsl:if test="normalize-space(@id)!=''">
++ <fo:block id="{@id}"/>
++ </xsl:if>
++
+ <xsl:value-of select="title"/>
+ </fo:block>
+ <xsl:apply-templates>
+@@ -255,6 +308,9 @@
+ font-size="10pt"
+ background-color="#f0f0f0"
+ white-space-collapse="false"
++ linefeed-treatment="preserve"
++ white-space-treatment="preserve"
++ wrap-option="no-wrap"
+ text-align="start">
+ <xsl:apply-templates/>
+ </fo:block>
+@@ -456,7 +512,14 @@
+ </xsl:template>
+
+ <xsl:template match="link">
++ <xsl:choose>
++ <xsl:when test="starts-with(@href, '#')">
++ <fo:basic-link color="blue" text-decoration="underline" internal-destination="substring(@href,2)"><xsl:apply-templates/></fo:basic-link>
++ </xsl:when>
++ <xsl:otherwise>
+ <fo:basic-link color="blue" text-decoration="underline" external-destination="{@href}"><xsl:apply-templates/></fo:basic-link>
++ </xsl:otherwise>
++ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="figure">