aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/fop/apps/FOUserAgent.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/org/apache/fop/apps/FOUserAgent.java')
-rw-r--r--src/java/org/apache/fop/apps/FOUserAgent.java425
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;
- }
-
}