/* * Copyright 1999-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* $Id$ */ package org.apache.fop.apps; // Java import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; import java.util.Map; // avalon configuration import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; // commons logging import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; // FOP import org.apache.fop.fo.ElementMapping; import org.apache.fop.fo.FOEventHandler; import org.apache.fop.layoutmgr.LayoutManagerMaker; import org.apache.fop.pdf.PDFEncryptionParams; import org.apache.fop.render.Renderer; import org.apache.fop.render.XMLHandlerRegistry; /** * 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 resolvable areas that will be processed
* with other resolvable areas
*/
public class FOUserAgent {
/** Defines the default resolution (72dpi) for FOP */
public static final float DEFAULT_PX2MM = (25.4f / 72); //dpi (=25.4/dpi)
/** Registry for XML handlers */
private XMLHandlerRegistry xmlHandlers = new XMLHandlerRegistry();
private String baseURL;
private PDFEncryptionParams pdfEncryptionParams;
private float px2mm = DEFAULT_PX2MM;
private Map rendererOptions = new java.util.HashMap();
private InputHandler inputHandler = null;
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;
/* 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.)
*/
protected String producer = "Apache FOP Version " + Fop.getVersion();
/** Creator: Metadata element for the user that created the
* document. (Some renderers can store this in the document.)
*/
protected String creator = null;
/** Creation Date: Override of the date the document was created.
* (Some renderers can store this in the document.)
*/
protected Date creationDate = null;
/** Author of the content of the document. */
protected String author = null;
/** Title of the document. */
protected String title = null;
/** Set of keywords applicable to this document. */
protected String keywords = null;
/**
* Sets the InputHandler object for this process
* @param inputHandler holding input file name information
*/
public void setInputHandler(InputHandler inputHandler) {
this.inputHandler = inputHandler;
}
/**
* Returns the apps.InputHandler object created during command-line
* processing
* @return InputHandler object
*/
public InputHandler getInputHandler() {
return inputHandler;
}
/**
* Add the element mapping with the given class name.
* @param elementMapping the class name representing the element mapping.
*/
public void addElementMapping(ElementMapping elementMapping) {
if (additionalElementMappings == null) {
additionalElementMappings = new java.util.ArrayList();
}
additionalElementMappings.add(elementMapping);
}
/**
* Returns the List of user-added ElementMapping class names
* @return List of Strings holding ElementMapping names.
*/
public List getAdditionalElementMappings() {
return additionalElementMappings;
}
/**
* Sets an explicit renderer to use which overrides the one defined by the
* render type setting.
* @param renderer the Renderer instance to use
*/
public void setRendererOverride(Renderer renderer) {
this.rendererOverride = renderer;
}
/**
* Returns the overriding Renderer instance, if any.
* @return the overriding Renderer or null
*/
public Renderer getRendererOverride() {
return rendererOverride;
}
/**
* Sets an explicit FOEventHandler instance which overrides the one
* defined by the render type setting.
* @param handler the FOEventHandler instance
*/
public void setFOEventHandlerOverride(FOEventHandler handler) {
this.foEventHandlerOverride = handler;
}
/**
* Returns the overriding FOEventHandler instance, if any.
* @return the overriding FOEventHandler or null
*/
public FOEventHandler getFOEventHandlerOverride() {
return this.foEventHandlerOverride;
}
/**
* 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;
}
/**
* 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
*/
public void setProducer(String producer) {
this.producer = producer;
}
/**
* Returns the producer of the document
* @return producer name
*/
public String getProducer() {
return producer;
}
/**
* Sets the creator of the document.
* @param creator of document
*/
public void setCreator(String creator) {
this.creator = creator;
}
/**
* Returns the creator of the document
* @return creator name
*/
public String getCreator() {
return creator;
}
/**
* Sets the creation date of the document.
* @param creationDate date of document
*/
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
/**
* Returns the creation date of the document
* @return creation date of document
*/
public Date getCreationDate() {
return creationDate;
}
/**
* Sets the author of the document.
* @param author of document
*/
public void setAuthor(String author) {
this.author = author;
}
/**
* Returns the author of the document
* @return author name
*/
public String getAuthor() {
return author;
}
/**
* Sets the title of the document. This will override any title coming from
* an fo:title element.
* @param title of document
*/
public void setTitle(String title) {
this.title = title;
}
/**
* Returns the title of the document
* @return title name
*/
public String getTitle() {
return title;
}
/**
* Sets the keywords for the document.
* @param keywords for the document
*/
public void setKeywords(String keywords) {
this.keywords = keywords;
}
/**
* Returns the keywords for the document
* @return the keywords
*/
public String getKeywords() {
return keywords;
}
/**
* Returns the renderer options
* @return renderer options
*/
public Map getRendererOptions() {
return rendererOptions;
}
/**
* Set the user configuration.
* @param userConfig configuration
*/
public void setUserConfig(Configuration userConfig) {
this.userConfig = userConfig;
}
/**
* Get the user configuration.
* @return the user configuration
*/
public Configuration getUserConfig() {
return userConfig;
}
/**
* Returns the configuration subtree for a specific renderer.
* @param mimeType MIME type of the renderer
* @return the requested configuration subtree, null if there's no configuration
*/
public Configuration getUserRendererConfig (String mimeType) {
if (userConfig == null || mimeType == null) {
return null;
}
Configuration userRendererConfig = null;
Configuration[] cfgs
= userConfig.getChild("renderers").getChildren("renderer");
for (int i = 0; i < cfgs.length; ++i) {
Configuration cfg = cfgs[i];
try {
if (cfg.getAttribute("mime").equals(mimeType)) {
userRendererConfig = cfg;
break;
}
} catch (ConfigurationException e) {
// silently pass over configurations without mime type
}
}
log.debug((userRendererConfig == null ? "No u" : "U")
+ "ser configuration found for MIME type " + mimeType);
return userRendererConfig;
}
/**
* 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;
}
}
/**
* Returns the parameters for PDF encryption.
* @return the PDF encryption parameters, null if not applicable
*/
public PDFEncryptionParams getPDFEncryptionParams() {
return pdfEncryptionParams;
}
/**
* Sets the parameters for PDF encryption.
* @param pdfEncryptionParams the PDF encryption parameters, null to
* disable PDF encryption
*/
public void setPDFEncryptionParams(PDFEncryptionParams pdfEncryptionParams) {
this.pdfEncryptionParams = pdfEncryptionParams;
}
/**
* 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;
}
/**
* Sets the output File.
* @param the output File
*/
public void setOutputFile(File f){
this.outputFile = f;
}
/**
* Gets the output File.
* @return the output File
*/
public File getOutputFile(){
return outputFile;
}
/**
* Returns the conversion factor from pixel units to millimeters. This
* depends on the desired reolution.
* @return float conversion factor
*/
public float getPixelUnitToMillimeter() {
return this.px2mm;
}
/**
* Sets the resolution in dpi.
* @param dpi resolution in dpi
*/
public void setResolution(int dpi) {
this.px2mm = (float)(25.4 / dpi);
}
/**
* If to create hot links to footnotes and before floats.
* @return True if hot links should be created
*/
public boolean linkToFootnotes() {
return true;
}
/**
* @return the XML handler registry
*/
public XMLHandlerRegistry getXMLHandlerRegistry() {
return this.xmlHandlers;
}
}