diff options
Diffstat (limited to 'src/java/org/apache/fop/apps/FOUserAgent.java')
-rw-r--r-- | src/java/org/apache/fop/apps/FOUserAgent.java | 425 |
1 files changed, 111 insertions, 314 deletions
diff --git a/src/java/org/apache/fop/apps/FOUserAgent.java b/src/java/org/apache/fop/apps/FOUserAgent.java index e7686e65f..9a052b155 100644 --- a/src/java/org/apache/fop/apps/FOUserAgent.java +++ b/src/java/org/apache/fop/apps/FOUserAgent.java @@ -20,10 +20,7 @@ package org.apache.fop.apps; // Java import java.io.File; -import java.net.URL; -import java.net.MalformedURLException; import java.util.Date; -import java.util.List; import java.util.Map; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; @@ -39,19 +36,17 @@ import org.apache.commons.logging.LogFactory; // FOP import org.apache.fop.Version; -import org.apache.fop.fo.ElementMapping; import org.apache.fop.fo.FOEventHandler; -import org.apache.fop.hyphenation.HyphenationTreeResolver; -import org.apache.fop.layoutmgr.LayoutManagerMaker; import org.apache.fop.pdf.PDFEncryptionParams; import org.apache.fop.render.Renderer; import org.apache.fop.render.RendererFactory; import org.apache.fop.render.XMLHandlerRegistry; +import org.apache.fop.render.pdf.PDFRenderer; /** - * The User Agent for fo. - * This user agent is used by the processing to obtain user configurable - * options. + * This is the user agent for FOP. + * It is the entity through which you can interact with the XSL-FO processing and is + * used by the processing to obtain user configurable options. * <p> * Renderer specific extensions (that do not produce normal areas on * the output) will be done like so: @@ -70,65 +65,25 @@ import org.apache.fop.render.XMLHandlerRegistry; */ public class FOUserAgent { - /** Defines the default source resolution (72dpi) for FOP */ - public static final float DEFAULT_SOURCE_RESOLUTION = 72.0f; //dpi /** Defines the default target resolution (72dpi) for FOP */ public static final float DEFAULT_TARGET_RESOLUTION = 72.0f; //dpi - /** Defines the default page-height */ - public static final String DEFAULT_PAGE_HEIGHT = "11in"; - /** Defines the default page-width */ - public static final String DEFAULT_PAGE_WIDTH = "8.26in"; - - /** Factory for Renderers and FOEventHandlers */ - private RendererFactory rendererFactory = new RendererFactory(); - - /** Registry for XML handlers */ - private XMLHandlerRegistry xmlHandlers = new XMLHandlerRegistry(); - - /** The resolver for user-supplied hyphenation patterns */ - private HyphenationTreeResolver hyphResolver; + + private static Log log = LogFactory.getLog("FOP"); + + private FopFactory factory; /** The base URL for all URL resolutions, especially for external-graphics */ private String baseURL; - /** The base URL for all font URL resolutions */ - private String fontBaseURL; - /** A user settable URI Resolver */ private URIResolver uriResolver = null; - /** Our default resolver if none is set */ - private URIResolver foURIResolver = new FOURIResolver(); - private PDFEncryptionParams pdfEncryptionParams; - private float sourceResolution = DEFAULT_SOURCE_RESOLUTION; private float targetResolution = DEFAULT_TARGET_RESOLUTION; - private String pageHeight = DEFAULT_PAGE_HEIGHT; - private String pageWidth = DEFAULT_PAGE_WIDTH; private Map rendererOptions = new java.util.HashMap(); private File outputFile = null; private Renderer rendererOverride = null; private FOEventHandler foEventHandlerOverride = null; - private LayoutManagerMaker lmMakerOverride = null; - /* user configuration */ - private Configuration userConfig = null; - private Log log = LogFactory.getLog("FOP"); - - /* FOP has the ability, for some FO's, to continue processing even if the - * input XSL violates that FO's content model. This is the default - * behavior for FOP. However, this flag, if set, provides the user the - * ability for FOP to halt on all content model violations if desired. - */ - private boolean strictValidation = true; - /** @see #setBreakIndentInheritanceOnReferenceAreaBoundary(boolean) */ - private boolean breakIndentInheritanceOnReferenceAreaBoundary = false; - - /** Allows enabling kerning on the base 14 fonts, default is false */ - private boolean enableBase14Kerning = false; - - /* Additional fo.ElementMapping subclasses set by user */ - private List additionalElementMappings = null; - /** Producer: Metadata element for the system/software that produces * the document. (Some renderers can store this in the document.) */ @@ -152,24 +107,43 @@ public class FOUserAgent { protected String keywords = null; /** - * Add the element mapping with the given class name. - * @param elementMapping the class name representing the element mapping. + * Default constructor + * @see org.apache.fop.apps.FopFactory + * @deprecated Provided for compatibility only. Please use the methods from + * FopFactory to construct FOUserAgent instances! */ - public void addElementMapping(ElementMapping elementMapping) { - if (additionalElementMappings == null) { - additionalElementMappings = new java.util.ArrayList(); - } - additionalElementMappings.add(elementMapping); + public FOUserAgent() { + this(FopFactory.newInstance()); } - + /** - * Returns the List of user-added ElementMapping class names - * @return List of Strings holding ElementMapping names. + * Main constructor. <b>This constructor should not be called directly. Please use the + * methods from FopFactory to construct FOUserAgent instances!</b> + * @param factory the factory that provides environment-level information + * @see org.apache.fop.apps.FopFactory */ - public List getAdditionalElementMappings() { - return additionalElementMappings; + public FOUserAgent(FopFactory factory) { + if (factory == null) { + throw new NullPointerException("The factory parameter must not be null"); + } + this.factory = factory; + try { + if (factory.getUserConfig() != null) { + configure(factory.getUserConfig()); + } + } catch (ConfigurationException cfge) { + log.error("Error while initializing the user asgent: " + + cfge.getMessage()); + } } - + + /** @return the associated FopFactory instance */ + public FopFactory getFactory() { + return this.factory; + } + + // ---------------------------------------------- rendering-run dependent stuff + /** * Sets an explicit renderer to use which overrides the one defined by the * render type setting. @@ -205,78 +179,6 @@ public class FOUserAgent { } /** - * Activates strict XSL content model validation for FOP - * Default is false (FOP will continue processing where it can) - * @param validateStrictly true to turn on strict validation - */ - public void setStrictValidation(boolean validateStrictly) { - this.strictValidation = validateStrictly; - } - - /** - * Returns whether FOP is strictly validating input XSL - * @return true of strict validation turned on, false otherwise - */ - public boolean validateStrictly() { - return strictValidation; - } - - /** - * @return true if the indent inheritance should be broken when crossing reference area - * boundaries (for more info, see the javadoc for the relative member variable) - */ - public boolean isBreakIndentInheritanceOnReferenceAreaBoundary() { - return breakIndentInheritanceOnReferenceAreaBoundary; - } - - /** - * Controls whether to enable a feature that breaks indent inheritance when crossing - * reference area boundaries. - * <p> - * This flag controls whether FOP will enable special code that breaks property - * inheritance for start-indent and end-indent when the evaluation of the inherited - * value would cross a reference area. This is described under - * http://wiki.apache.org/xmlgraphics-fop/IndentInheritance as is intended to - * improve interoperability with commercial FO implementations and to produce - * results that are more in line with the expectation of unexperienced FO users. - * Note: Enabling this features violates the XSL specification! - * @param value true to enable the feature - */ - public void setBreakIndentInheritanceOnReferenceAreaBoundary(boolean value) { - this.breakIndentInheritanceOnReferenceAreaBoundary = value; - } - - /** @return true if kerning on base 14 fonts is enabled */ - public boolean isBase14KerningEnabled() { - return this.enableBase14Kerning; - } - - /** - * Controls whether kerning is activated on base 14 fonts. - * @param value true if kerning should be activated - */ - public void setBase14KerningEnabled(boolean value) { - this.enableBase14Kerning = value; - } - - /** - * Sets an explicit LayoutManagerMaker instance which overrides the one - * defined by the AreaTreeHandler. - * @param lmMaker the LayoutManagerMaker instance - */ - public void setLayoutManagerMakerOverride(LayoutManagerMaker lmMaker) { - this.lmMakerOverride = lmMaker; - } - - /** - * Returns the overriding LayoutManagerMaker instance, if any. - * @return the overriding LayoutManagerMaker or null - */ - public LayoutManagerMaker getLayoutManagerMakerOverride() { - return this.lmMakerOverride; - } - - /** * Sets the producer of the document. * @param producer source of document */ @@ -382,95 +284,18 @@ public class FOUserAgent { } /** - * Set the user configuration. - * @param userConfig configuration - */ - public void setUserConfig(Configuration userConfig) { - this.userConfig = userConfig; - try { - initUserConfig(); - } catch (ConfigurationException cfge) { - log.error("Error initializing User Agent configuration: " - + cfge.getMessage()); - } - } - - /** - * Get the user configuration. - * @return the user configuration + * Configures the FOUserAgent through the factory's configuration. + * @see org.apache.avalon.framework.configuration.Configurable */ - public Configuration getUserConfig() { - return userConfig; - } - - /** - * Initializes user agent settings from the user configuration - * file, if present: baseURL, resolution, default page size,... - * - * @throws ConfigurationException when there is an entry that - * misses the required attribute - */ - public void initUserConfig() throws ConfigurationException { - log.debug("Initializing User Agent Configuration"); - setBaseURL(getBaseURLfromConfig("base")); - setFontBaseURL(getBaseURLfromConfig("font-base")); - final String hyphBase = getBaseURLfromConfig("hyphenation-base"); - if (hyphBase != null) { - this.hyphResolver = new HyphenationTreeResolver() { - public Source resolve(String href) { - return resolveURI(href, hyphBase); - } - }; - } - if (userConfig.getChild("source-resolution", false) != null) { - this.sourceResolution - = userConfig.getChild("source-resolution").getValueAsFloat( - DEFAULT_SOURCE_RESOLUTION); - log.info("Source resolution set to: " + sourceResolution - + "dpi (px2mm=" + getSourcePixelUnitToMillimeter() + ")"); - } - if (userConfig.getChild("target-resolution", false) != null) { + protected void configure(Configuration cfg) throws ConfigurationException { + setBaseURL(FopFactory.getBaseURLfromConfig(cfg, "base")); + if (cfg.getChild("target-resolution", false) != null) { this.targetResolution - = userConfig.getChild("target-resolution").getValueAsFloat( + = cfg.getChild("target-resolution").getValueAsFloat( DEFAULT_TARGET_RESOLUTION); log.info("Target resolution set to: " + targetResolution + "dpi (px2mm=" + getTargetPixelUnitToMillimeter() + ")"); } - if (userConfig.getChild("strict-validation", false) != null) { - this.strictValidation = userConfig.getChild("strict-validation").getValueAsBoolean(); - } - if (userConfig.getChild("break-indent-inheritance", false) != null) { - this.breakIndentInheritanceOnReferenceAreaBoundary - = userConfig.getChild("break-indent-inheritance").getValueAsBoolean(); - } - Configuration pageConfig = userConfig.getChild("default-page-settings"); - if (pageConfig.getAttribute("height", null) != null) { - setPageHeight(pageConfig.getAttribute("height")); - log.info("Default page-height set to: " + pageHeight); - } - if (pageConfig.getAttribute("width", null) != null) { - setPageWidth(pageConfig.getAttribute("width")); - log.info("Default page-width set to: " + pageWidth); - } - } - - private String getBaseURLfromConfig(String name) { - if (userConfig.getChild(name, false) != null) { - try { - String cfgBaseDir = userConfig.getChild(name).getValue(null); - if (cfgBaseDir != null) { - File dir = new File(cfgBaseDir); - if (dir.isDirectory()) { - cfgBaseDir = dir.toURL().toExternalForm(); - } - } - log.info(name + " set to: " + cfgBaseDir); - return cfgBaseDir; - } catch (MalformedURLException mue) { - log.error("Base URL in user config is malformed!"); - } - } - return null; } /** @@ -478,21 +303,22 @@ public class FOUserAgent { * @param mimeType MIME type of the renderer * @return the requested configuration subtree, null if there's no configuration */ - public Configuration getUserRendererConfig (String mimeType) { + public Configuration getUserRendererConfig(String mimeType) { - if (userConfig == null || mimeType == null) { + Configuration cfg = getFactory().getUserConfig(); + if (cfg == null || mimeType == null) { return null; } Configuration userRendererConfig = null; Configuration[] cfgs - = userConfig.getChild("renderers").getChildren("renderer"); + = cfg.getChild("renderers").getChildren("renderer"); for (int i = 0; i < cfgs.length; ++i) { - Configuration cfg = cfgs[i]; + Configuration child = cfgs[i]; try { - if (cfg.getAttribute("mime").equals(mimeType)) { - userRendererConfig = cfg; + if (child.getAttribute("mime").equals(mimeType)) { + userRendererConfig = child; break; } } catch (ConfigurationException e) { @@ -521,27 +347,11 @@ public class FOUserAgent { } /** - * Sets the font base URL. - * @param fontBaseURL font base URL - */ - public void setFontBaseURL(String fontBaseURL) { - this.fontBaseURL = fontBaseURL; - } - - /** - * Returns the font base URL. - * @return the font base URL - */ - public String getFontBaseURL() { - return this.fontBaseURL != null ? this.fontBaseURL : this.baseURL; - } - - /** * Sets the URI Resolver. - * @param uriResolver the new URI resolver + * @param resolver the new URI resolver */ - public void setURIResolver(URIResolver uriResolver) { - this.uriResolver = uriResolver; + public void setURIResolver(URIResolver resolver) { + this.uriResolver = resolver; } /** @@ -555,18 +365,23 @@ public class FOUserAgent { /** * Returns the parameters for PDF encryption. * @return the PDF encryption parameters, null if not applicable + * @deprecated Use (PDFEncryptionParams)getRendererOptions().get("encryption-params") + * instead. */ public PDFEncryptionParams getPDFEncryptionParams() { - return pdfEncryptionParams; + return (PDFEncryptionParams)getRendererOptions().get(PDFRenderer.ENCRYPTION_PARAMS); } /** * Sets the parameters for PDF encryption. * @param pdfEncryptionParams the PDF encryption parameters, null to * disable PDF encryption + * @deprecated Use getRendererOptions().put("encryption-params", + * new PDFEncryptionParams(..)) instead or set every parameter separately: + * getRendererOptions().put("noprint", Boolean.TRUE). */ public void setPDFEncryptionParams(PDFEncryptionParams pdfEncryptionParams) { - this.pdfEncryptionParams = pdfEncryptionParams; + getRendererOptions().put(PDFRenderer.ENCRYPTION_PARAMS, pdfEncryptionParams); } @@ -588,27 +403,23 @@ public class FOUserAgent { * Will use the configured resolver and if not successful fall back * to the default resolver. * @param uri URI to access - * @param baseURL the base url to resolve against + * @param base the base URI to resolve against * @return A {@link javax.xml.transform.Source} object, or null if the URI * cannot be resolved. * @see org.apache.fop.apps.FOURIResolver */ - public Source resolveURI(String uri, String baseURL) { + public Source resolveURI(String uri, String base) { Source source = null; if (uriResolver != null) { try { - source = uriResolver.resolve(uri, baseURL); + source = uriResolver.resolve(uri, base); } catch (TransformerException te) { log.error("Attempt to resolve URI '" + uri + "' failed: ", te); } } if (source == null) { - // URI Resolver not configured or returned null, use default resolver - try { - source = foURIResolver.resolve(uri, baseURL); - } catch (TransformerException te) { - log.error("Attempt to resolve URI '" + uri + "' failed: ", te); - } + // URI Resolver not configured or returned null, use default resolver from the factory + source = getFactory().resolveURI(uri, base); } return source; } @@ -631,44 +442,20 @@ public class FOUserAgent { /** * Returns the conversion factor from pixel units to millimeters. This - * depends on the desired source resolution. - * @return float conversion factor - * @see getSourceResolution() - */ - public float getSourcePixelUnitToMillimeter() { - return 25.4f / this.sourceResolution; - } - - /** - * Returns the conversion factor from pixel units to millimeters. This * depends on the desired target resolution. * @return float conversion factor - * @see getTargetResolution() + * @see #getTargetResolution() */ public float getTargetPixelUnitToMillimeter() { return 25.4f / this.targetResolution; } - /** @return the resolution for resolution-dependant input */ - public float getSourceResolution() { - return this.sourceResolution; - } - /** @return the resolution for resolution-dependant output */ public float getTargetResolution() { return this.targetResolution; } /** - * Sets the source resolution in dpi. This value is used to interpret the pixel size - * of source documents like SVG images and bitmap images without resolution information. - * @param dpi resolution in dpi - */ - public void setSourceResolution(int dpi) { - this.sourceResolution = dpi; - } - - /** * Sets the target resolution in dpi. This value defines the target resolution of * bitmap images generated by the bitmap renderers (such as the TIFF renderer) and of * bitmap images generated by filter effects in Apache Batik. @@ -678,24 +465,39 @@ public class FOUserAgent { this.targetResolution = dpi; } + // ---------------------------------------------- environment-level stuff + // (convenience access to FopFactory methods) + + /** @return the font base URL */ + public String getFontBaseURL() { + String fontBaseURL = getFactory().getFontBaseURL(); + return fontBaseURL != null ? fontBaseURL : this.baseURL; + } + /** - * Gets the default page-height to use as fallback, - * in case page-height="auto" - * - * @return the page-height, as a String + * Returns the conversion factor from pixel units to millimeters. This + * depends on the desired source resolution. + * @return float conversion factor + * @see #getSourceResolution() */ - public String getPageHeight() { - return this.pageHeight; + public float getSourcePixelUnitToMillimeter() { + return getFactory().getSourcePixelUnitToMillimeter(); } + /** @return the resolution for resolution-dependant input */ + public float getSourceResolution() { + return getFactory().getSourceResolution(); + } + /** - * Sets the page-height to use as fallback, in case - * page-height="auto" + * Gets the default page-height to use as fallback, + * in case page-height="auto" * - * @param pageHeight page-height as a String + * @return the page-height, as a String + * @see FopFactory#getPageHeight() */ - public void setPageHeight(String pageHeight) { - this.pageHeight = pageHeight; + public String getPageHeight() { + return getFactory().getPageHeight(); } /** @@ -703,48 +505,43 @@ public class FOUserAgent { * in case page-width="auto" * * @return the page-width, as a String + * @see FopFactory#getPageWidth() */ public String getPageWidth() { - return this.pageWidth; + return getFactory().getPageWidth(); } /** - * Sets the page-width to use as fallback, in case - * page-width="auto" - * - * @param pageWidth page-width as a String + * Returns whether FOP is strictly validating input XSL + * @return true of strict validation turned on, false otherwise + * @see FopFactory#validateStrictly() */ - public void setPageWidth(String pageWidth) { - this.pageWidth = pageWidth; + public boolean validateStrictly() { + return getFactory().validateStrictly(); } - + /** - * If to create hot links to footnotes and before floats. - * @return True if hot links should be created + * @return true if the indent inheritance should be broken when crossing reference area + * boundaries (for more info, see the javadoc for the relative member variable) + * @see FopFactory#isBreakIndentInheritanceOnReferenceAreaBoundary() */ - /* TODO This method is never referenced! - public boolean linkToFootnotes() { - return true; - }*/ + public boolean isBreakIndentInheritanceOnReferenceAreaBoundary() { + return getFactory().isBreakIndentInheritanceOnReferenceAreaBoundary(); + } /** * @return the RendererFactory */ public RendererFactory getRendererFactory() { - return this.rendererFactory; + return getFactory().getRendererFactory(); } /** * @return the XML handler registry */ public XMLHandlerRegistry getXMLHandlerRegistry() { - return this.xmlHandlers; + return getFactory().getXMLHandlerRegistry(); } - /** @return the HyphenationTreeResolver for resolving user-supplied hyphenation patterns. */ - public HyphenationTreeResolver getHyphenationTreeResolver() { - return this.hyphResolver; - } - } |