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.4 diff -u -r1.4 FOPSerializer.java --- src/blocks/fop/java/org/apache/cocoon/serialization/FOPSerializer.java 21 Nov 2002 18:18:48 -0000 1.4 +++ src/blocks/fop/java/org/apache/cocoon/serialization/FOPSerializer.java 5 Dec 2002 09:21:13 -0000 @@ -63,18 +63,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; /** @@ -84,7 +94,7 @@ */ public class FOPSerializer extends AbstractSerializer -implements Composable, Configurable, CacheableProcessingComponent { +implements Composable, Configurable, CacheableProcessingComponent, RequestLifecycleComponent { /** * The Renderer Factory to use @@ -97,6 +107,11 @@ protected Driver driver; /** + * The current FOUserAgent. + */ + protected FOUserAgent userAgent; + + /** * The current Renderer. */ protected Renderer renderer; @@ -145,24 +160,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); @@ -180,28 +177,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"); @@ -233,6 +208,22 @@ + "no renderer was specified in the sitemap configuration." ); } + this.renderer.setCreator("Cocoon"); + + 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(); + } /** @@ -242,27 +233,39 @@ 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().debug("Loading image from " + source.getSystemId()); + InputStream is = source.getInputStream(); + getLogger().debug("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 OutputStream 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 CascadingRuntimeException("Cannot load class " + this.rendererName, e); - } - } - this.driver.setRenderer(this.renderer); this.driver.setOutputStream(out); setContentHandler(this.driver.getContentHandler()); } @@ -296,8 +299,7 @@ */ public void recycle() { super.recycle(); - this.driver = null; - this.renderer = null; + this.driver.reset(); } /** @@ -307,3 +309,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 5 Dec 2002 09:21:13 -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 serializer + if(this.serializer instanceof RequestLifecycleComponent) { + ((RequestLifecycleComponent)this.serializer).setup( + environment, + environment.getObjectModel() ); }