/* * $Id$ * Copyright (C) 2001-2003 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.fo; // Java import java.util.Map; import java.io.IOException; import java.io.InputStream; // XML import org.w3c.dom.Document; // Avalon import org.apache.avalon.framework.logger.LogEnabled; import org.apache.avalon.framework.logger.Logger; // FOP import org.apache.fop.render.XMLHandler; import org.apache.fop.render.RendererContext; /** * The User Agent for fo. * This user agent is used by the processing to obtain user configurable * options. *

* Renderer specific extensions (that do not produce normal areas on * the output) will be done like so: *
* The extension will create an area, custom if necessary *
* this area will be added to the user agent with a key *
* the renderer will know keys for particular extensions *
* eg. bookmarks will be held in a special hierarchical area representing * the title and bookmark structure *
* These areas may contain resolveable areas that will be processed * with other resolveable areas */ public class FOUserAgent implements LogEnabled { private Logger log; private Map defaults = new java.util.HashMap(); private Map handlers = new java.util.HashMap(); private String baseURL; /** * Sets the logger. * @param log Logger to use * @see org.apache.avalon.framework.logger.LogEnabled#enableLogging(Logger) */ public void enableLogging(Logger log) { this.log = log; } /** * Returns the logger to use. * @see org.apache.avalon.framework.logger.AbstractLogEnabled#getLogger() * @todo This breaks IoC/SoC. Should be improved. */ public Logger getLogger() { return this.log; } /** * Sets the base URL. * @param baseURL base URL */ public void setBaseURL(String baseURL) { this.baseURL = baseURL; } /** * Returns the base URL. * @return the base URL */ public String getBaseURL() { if ((this.baseURL == null) || (this.baseURL.trim().equals(""))) { return "file:."; } else { return this.baseURL; } } /** * Get an input stream for a reference. * Temporary solution until API better. * @param uri URI to access * @return InputStream for accessing the resource. * @throws IOException in case of an I/O problem */ public InputStream getStream(String uri) throws IOException { return null; } /** * Returns the conversion factor from pixel units to millimeters. This * depends on the desired reolution. * @return float conversion factor */ public float getPixelUnitToMillimeter() { return 0.35277777777777777778f; } /** * If to create hot links to footnotes and before floats. * @return True if hot links dhould be created */ public boolean linkToFootnotes() { return true; } /** * Set the default xml handler for the given mime type. * @param mime MIME type * @param handler XMLHandler to use */ public void setDefaultXMLHandler(String mime, XMLHandler handler) { defaults.put(mime, handler); } /** * Add an xml handler for the given mime type and xml namespace. * @param mime MIME type * @param ns Namespace URI * @param handler XMLHandler to use */ public void addXMLHandler(String mime, String ns, XMLHandler handler) { Map mh = (Map) handlers.get(mime); if (mh == null) { mh = new java.util.HashMap(); handlers.put(mime, mh); } mh.put(ns, handler); } /** * Render the xml document with the given xml namespace. * The Render Context is by the handle to render into the current * rendering target. * @param ctx rendering context * @param doc DOM Document containing the source document * @param namespace Namespace URI of the document */ public void renderXML(RendererContext ctx, Document doc, String namespace) { String mime = ctx.getMimeType(); Map mh = (Map) handlers.get(mime); XMLHandler handler = null; if (mh != null) { handler = (XMLHandler) mh.get(namespace); } if (handler == null) { handler = (XMLHandler) defaults.get(mime); } if (handler != null) { try { handler.handleXML(ctx, doc, namespace); } catch (Throwable t) { // could not handle document getLogger().error("Some XML content will be ignored. " + "Could not render XML", t); } } else { // no handler found for document getLogger().warn("Some XML content will be ignored. " + "No handler defined for XML: " + namespace); } } }