123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- /*
- * Copyright 2004-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.render;
-
- import java.io.OutputStream;
- import java.util.Collections;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
-
- //Avalon
- import org.apache.avalon.framework.configuration.Configuration;
- import org.apache.avalon.framework.configuration.ConfigurationException;
- import org.apache.avalon.framework.container.ContainerUtil;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
-
- //FOP
- import org.apache.fop.apps.FOPException;
- import org.apache.fop.apps.FOUserAgent;
- import org.apache.fop.area.AreaTreeHandler;
- import org.apache.fop.fo.FOEventHandler;
- import org.apache.fop.util.Service;
-
- /**
- * Factory for FOEventHandlers and Renderers.
- */
- public class RendererFactory {
-
- /** the logger */
- private static Log log = LogFactory.getLog(RendererFactory.class);
-
- private Map rendererMakerMapping = new java.util.HashMap();
- private Map eventHandlerMakerMapping = new java.util.HashMap();
-
-
- /**
- * Main constructor.
- */
- public RendererFactory() {
- registerStandardRenderers();
- discoverRenderers();
-
- registerStandardEventHandlers();
- discoverFOEventHandlers();
- }
-
- private void registerStandardRenderers() {
- addRendererMaker(new org.apache.fop.render.pdf.PDFRendererMaker());
- addRendererMaker(new org.apache.fop.render.ps.PSRendererMaker());
- addRendererMaker(new org.apache.fop.render.pcl.PCLRendererMaker());
- addRendererMaker(new org.apache.fop.render.svg.SVGRendererMaker());
- addRendererMaker(new org.apache.fop.render.txt.TXTRendererMaker());
- addRendererMaker(new org.apache.fop.render.bitmap.PNGRendererMaker());
- addRendererMaker(new org.apache.fop.render.bitmap.TIFFRendererMaker());
- addRendererMaker(new org.apache.fop.render.bitmap.TIFFRendererMaker());
- addRendererMaker(new org.apache.fop.render.xml.XMLRendererMaker());
- addRendererMaker(new org.apache.fop.render.awt.AWTRendererMaker());
- addRendererMaker(new org.apache.fop.render.print.PrintRendererMaker());
- }
-
- private void registerStandardEventHandlers() {
- addFOEventHandlerMaker(new org.apache.fop.render.rtf.RTFFOEventHandlerMaker());
- addFOEventHandlerMaker(new org.apache.fop.render.mif.MIFFOEventHandlerMaker());
- }
-
- /**
- * Add a new RendererMaker. If another maker has already been registered for a
- * particular MIME type, this call overwrites the existing one.
- * @param maker the RendererMaker
- */
- public void addRendererMaker(AbstractRendererMaker maker) {
- String[] mimes = maker.getSupportedMimeTypes();
- for (int i = 0; i < mimes.length; i++) {
- //This overrides any renderer previously set for a MIME type
- if (rendererMakerMapping.get(mimes[i]) != null) {
- log.trace("Overriding renderer for " + mimes[i]
- + " with " + maker.getClass().getName());
- }
- rendererMakerMapping.put(mimes[i], maker);
- }
- }
-
- /**
- * Add a new FOEventHandlerMaker. If another maker has already been registered for a
- * particular MIME type, this call overwrites the existing one.
- * @param maker the FOEventHandlerMaker
- */
- public void addFOEventHandlerMaker(AbstractFOEventHandlerMaker maker) {
- String[] mimes = maker.getSupportedMimeTypes();
- for (int i = 0; i < mimes.length; i++) {
- //This overrides any event handler previously set for a MIME type
- if (eventHandlerMakerMapping.get(mimes[i]) != null) {
- log.trace("Overriding FOEventHandler for " + mimes[i]
- + " with " + maker.getClass().getName());
- }
- eventHandlerMakerMapping.put(mimes[i], maker);
- }
- }
-
- /**
- * Add a new RendererMaker. If another maker has already been registered for a
- * particular MIME type, this call overwrites the existing one.
- * @param className the fully qualified class name of the RendererMaker
- */
- public void addRendererMaker(String className) {
- try {
- AbstractRendererMaker makerInstance
- = (AbstractRendererMaker)Class.forName(className).newInstance();
- addRendererMaker(makerInstance);
- } catch (ClassNotFoundException e) {
- throw new IllegalArgumentException("Could not find "
- + className);
- } catch (InstantiationException e) {
- throw new IllegalArgumentException("Could not instantiate "
- + className);
- } catch (IllegalAccessException e) {
- throw new IllegalArgumentException("Could not access "
- + className);
- } catch (ClassCastException e) {
- throw new IllegalArgumentException(className
- + " is not an "
- + AbstractRendererMaker.class.getName());
- }
- }
-
- /**
- * Add a new FOEventHandlerMaker. If another maker has already been registered for a
- * particular MIME type, this call overwrites the existing one.
- * @param className the fully qualified class name of the FOEventHandlerMaker
- */
- public void addFOEventHandlerMaker(String className) {
- try {
- AbstractFOEventHandlerMaker makerInstance
- = (AbstractFOEventHandlerMaker)Class.forName(className).newInstance();
- addFOEventHandlerMaker(makerInstance);
- } catch (ClassNotFoundException e) {
- throw new IllegalArgumentException("Could not find "
- + className);
- } catch (InstantiationException e) {
- throw new IllegalArgumentException("Could not instantiate "
- + className);
- } catch (IllegalAccessException e) {
- throw new IllegalArgumentException("Could not access "
- + className);
- } catch (ClassCastException e) {
- throw new IllegalArgumentException(className
- + " is not an "
- + AbstractFOEventHandlerMaker.class.getName());
- }
- }
-
- /**
- * Returns a RendererMaker which handles the given MIME type.
- * @param mime the requested output format
- * @return the requested RendererMaker or null if none is available
- */
- public AbstractRendererMaker getRendererMaker(String mime) {
- AbstractRendererMaker maker
- = (AbstractRendererMaker)rendererMakerMapping.get(mime);
- return maker;
- }
-
- /**
- * Returns a FOEventHandlerMaker which handles the given MIME type.
- * @param mime the requested output format
- * @return the requested FOEventHandlerMaker or null if none is available
- */
- public AbstractFOEventHandlerMaker getFOEventHandlerMaker(String mime) {
- AbstractFOEventHandlerMaker maker
- = (AbstractFOEventHandlerMaker)eventHandlerMakerMapping.get(mime);
- return maker;
- }
-
- /**
- * Creates a Renderer object based on render-type desired
- * @param userAgent the user agent for access to configuration
- * @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
- * @return the new Renderer instance
- * @throws FOPException if the renderer cannot be properly constructed
- */
- public Renderer createRenderer(FOUserAgent userAgent, String outputFormat)
- throws FOPException {
- if (userAgent.getRendererOverride() != null) {
- return userAgent.getRendererOverride();
- } else {
- AbstractRendererMaker maker = getRendererMaker(outputFormat);
- if (maker == null) {
- throw new UnsupportedOperationException(
- "No renderer for the requested format available: " + outputFormat);
- }
- Renderer rend = maker.makeRenderer(userAgent);
- rend.setUserAgent(userAgent);
- String mimeType = rend.getMimeType(); //Always use main MIME type for this
- Configuration userRendererConfig = null;
- if (mimeType != null) {
- userRendererConfig
- = userAgent.getUserRendererConfig(mimeType);
- }
- if (userRendererConfig != null) {
- try {
- ContainerUtil.configure(rend, userRendererConfig);
- } catch (ConfigurationException e) {
- throw new FOPException(e);
- }
- }
- return rend;
- }
- }
-
-
- /**
- * Creates FOEventHandler instances based on the desired output.
- * @param userAgent the user agent for access to configuration
- * @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
- * @param out the OutputStream where the output is written to (if applicable)
- * @return the newly constructed FOEventHandler
- * @throws FOPException if the FOEventHandler cannot be properly constructed
- */
- public FOEventHandler createFOEventHandler(FOUserAgent userAgent,
- String outputFormat, OutputStream out) throws FOPException {
-
- if (userAgent.getFOEventHandlerOverride() != null) {
- return userAgent.getFOEventHandlerOverride();
- } else {
- AbstractFOEventHandlerMaker maker = getFOEventHandlerMaker(outputFormat);
- if (maker == null) {
- AbstractRendererMaker rendMaker = getRendererMaker(outputFormat);
- if (rendMaker == null && userAgent.getRendererOverride() == null) {
- throw new UnsupportedOperationException(
- "Don't know how to handle \"" + outputFormat + "\" as an output format."
- + " Neither an FOEventHandler, nor a Renderer could be found"
- + " for this output format.");
- } else {
- if (out == null
- && userAgent.getRendererOverride() == null
- && rendMaker.needsOutputStream()) {
- throw new IllegalStateException(
- "OutputStream has not been set");
- }
- //Found a Renderer so we need to construct an AreaTreeHandler.
- return new AreaTreeHandler(userAgent, outputFormat, out);
- }
- } else {
- return maker.makeFOEventHandler(userAgent, out);
- }
- }
- }
-
- /**
- * @return an array of all supported MIME types
- */
- public String[] listSupportedMimeTypes() {
- List lst = new java.util.ArrayList();
- Iterator iter = this.rendererMakerMapping.keySet().iterator();
- while (iter.hasNext()) {
- lst.add(((String)iter.next()));
- }
- iter = this.eventHandlerMakerMapping.keySet().iterator();
- while (iter.hasNext()) {
- lst.add(((String)iter.next()));
- }
- Collections.sort(lst);
- return (String[])lst.toArray(new String[lst.size()]);
- }
-
- /**
- * Discovers Renderer implementations through the classpath and dynamically
- * registers them.
- */
- private void discoverRenderers() {
- // add mappings from available services
- Iterator providers
- = Service.providers(Renderer.class);
- if (providers != null) {
- while (providers.hasNext()) {
- String str = (String)providers.next();
- try {
- if (log.isDebugEnabled()) {
- log.debug("Dynamically adding maker for Renderer: " + str);
- }
- addRendererMaker(str);
- } catch (IllegalArgumentException e) {
- log.error("Error while adding maker for Renderer", e);
- }
-
- }
- }
- }
-
- /**
- * Discovers FOEventHandler implementations through the classpath and dynamically
- * registers them.
- */
- private void discoverFOEventHandlers() {
- // add mappings from available services
- Iterator providers
- = Service.providers(FOEventHandler.class);
- if (providers != null) {
- while (providers.hasNext()) {
- String str = (String)providers.next();
- try {
- if (log.isDebugEnabled()) {
- log.debug("Dynamically adding maker for FOEventHandler: " + str);
- }
- addFOEventHandlerMaker(str);
- } catch (IllegalArgumentException e) {
- log.error("Error while adding maker for FOEventHandler", e);
- }
-
- }
- }
- }
-
- }
|