From: Jeremias Maerki Date: Thu, 27 Mar 2003 11:21:11 +0000 (+0000) Subject: Common base class for all of FOP's transcoders. X-Git-Tag: Root_Temp_KnuthStylePageBreaking~1697 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e41db6d94a1b62b4d746ab1942d1a7f637d13bd6;p=xmlgraphics-fop.git Common base class for all of FOP's transcoders. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@196176 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/fop/svg/AbstractFOPTranscoder.java b/src/java/org/apache/fop/svg/AbstractFOPTranscoder.java new file mode 100644 index 000000000..bb93e52d9 --- /dev/null +++ b/src/java/org/apache/fop/svg/AbstractFOPTranscoder.java @@ -0,0 +1,317 @@ +/* + * $Id$ + * ============================================================================ + * The Apache Software License, Version 1.1 + * ============================================================================ + * + * Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The end-user documentation included with the redistribution, if any, must + * include the following acknowledgment: "This product includes software + * developed by the Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, if + * and wherever such third-party acknowledgments normally appear. + * + * 4. The names "FOP" and "Apache Software Foundation" must not be used to + * endorse or promote products derived from this software without prior + * written permission. For written permission, please contact + * apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", nor may + * "Apache" appear in their name, without prior written permission of the + * Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- + * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + * + * This software consists of voluntary contributions made by many individuals + * on behalf of the Apache Software Foundation and was originally created by + * James Tauber . For more information on the Apache + * Software Foundation, please see . + */ +package org.apache.fop.svg; + +import java.awt.Dimension; +import java.awt.geom.AffineTransform; +import java.awt.geom.Dimension2D; + +import org.xml.sax.EntityResolver; + +import org.apache.avalon.framework.logger.ConsoleLogger; +import org.apache.avalon.framework.logger.LogEnabled; +import org.apache.avalon.framework.logger.Logger; +import org.apache.batik.bridge.UserAgent; +import org.apache.batik.bridge.UserAgentAdapter; +import org.apache.batik.dom.svg.SVGDOMImplementation; +import org.apache.batik.dom.util.DocumentFactory; +import org.apache.batik.transcoder.ErrorHandler; +import org.apache.batik.transcoder.TranscoderException; +import org.apache.batik.transcoder.XMLAbstractTranscoder; +import org.apache.batik.transcoder.image.ImageTranscoder; +import org.apache.batik.util.SVGConstants; +import org.apache.batik.util.XMLResourceDescriptor; +import org.w3c.dom.DOMImplementation; + +/** + * This is the common base class of all of FOP's transcoders. + */ +public abstract class AbstractFOPTranscoder extends XMLAbstractTranscoder + implements LogEnabled { + + /** + * The user agent dedicated to this Transcoder. + */ + protected UserAgent userAgent = createUserAgent(); + + private Logger logger; + private EntityResolver resolver; + + /** + * Constructs a new FOP-style transcoder. + */ + public AbstractFOPTranscoder() { + hints.put(KEY_DOCUMENT_ELEMENT_NAMESPACE_URI, + SVGConstants.SVG_NAMESPACE_URI); + hints.put(KEY_DOCUMENT_ELEMENT, SVGConstants.SVG_SVG_TAG); + hints.put(KEY_DOM_IMPLEMENTATION, + SVGDOMImplementation.getDOMImplementation()); + } + + /** + * Creates and returns the default user agent for this transcoder. Override + * this method if you need non-default behaviour. + * @return UserAgent the newly created user agent + */ + protected UserAgent createUserAgent() { + return new FOPTranscoderUserAgent(); + } + + /** + * @see org.apache.avalon.framework.logger.LogEnabled#enableLogging(Logger) + */ + public void enableLogging(Logger logger) { + this.logger = logger; + } + + /** + * Sets the EntityResolver that should be used when building SVG documents. + * @param resolver the resolver + */ + public void setEntityResolver(EntityResolver resolver) { + this.resolver = resolver; + } + + /** + * Returns the logger associated with this transcoder. It returns a + * ConsoleLogger if no logger has been explicitly set. + * @return Logger the logger for the transcoder. + */ + protected final Logger getLogger() { + if (this.logger == null) { + this.logger = new ConsoleLogger(ConsoleLogger.LEVEL_INFO); + } + return this.logger; + } + + /** + * Creates a DocumentFactory that is used to create an SVG DOM + * tree. The specified DOM Implementation is ignored and the Batik + * SVG DOM Implementation is automatically used. + * + * @param domImpl the DOM Implementation (not used) + * @param parserClassname the XML parser classname + * @return the document factory + */ + protected DocumentFactory createDocumentFactory(DOMImplementation domImpl, + String parserClassname) { + final FOPSAXSVGDocumentFactory factory = + new FOPSAXSVGDocumentFactory(parserClassname); + if (this.resolver != null) { + factory.setAdditionalEntityResolver(this.resolver); + } + return factory; + } + + // -------------------------------------------------------------------- + // FOP's default error handler (for transcoders) + // -------------------------------------------------------------------- + + /** + * This is the default transcoder error handler for FOP. It logs error + * to an Avalon Logger instead of to System.out. The remaining behaviour + * is the same as Batik's DefaultErrorHandler. + */ + protected class FOPErrorHandler implements ErrorHandler { + + /** + * @see org.apache.batik.transcoder.ErrorHandler#error(TranscoderException) + */ + public void error(TranscoderException te) + throws TranscoderException { + getLogger().error(te.getMessage()); + } + + /** + * @see org.apache.batik.transcoder.ErrorHandler#fatalError(TranscoderException) + */ + public void fatalError(TranscoderException te) + throws TranscoderException { + throw te; + } + + /** + * @see org.apache.batik.transcoder.ErrorHandler#warning(TranscoderException) + */ + public void warning(TranscoderException te) + throws TranscoderException { + getLogger().warn(te.getMessage()); + } + + } + + // -------------------------------------------------------------------- + // UserAgent implementation + // -------------------------------------------------------------------- + + /** + * A user agent implementation for FOP's Transcoders. + */ + protected class FOPTranscoderUserAgent extends UserAgentAdapter { + + /** + * Returns the default size of this user agent (400x400). + * @return the default viewport size + */ + public Dimension2D getViewportSize() { + return new Dimension(400, 400); + } + + /** + * Displays the specified error message using the ErrorHandler. + * @param message the message to display + */ + public void displayError(String message) { + try { + getErrorHandler().error(new TranscoderException(message)); + } catch (TranscoderException ex) { + throw new RuntimeException(); + } + } + + /** + * Displays the specified error using the ErrorHandler. + * @param e the exception to display + */ + public void displayError(Exception e) { + try { + getErrorHandler().error(new TranscoderException(e)); + } catch (TranscoderException ex) { + throw new RuntimeException(); + } + } + + /** + * Displays the specified message using the ErrorHandler. + * @param message the message to display + */ + public void displayMessage(String message) { + getLogger().info(message); + } + + /** + * Returns the pixel to millimeter conversion factor specified in the + * TranscodingHints or 0.3528 if any. + * @return the pixel unit to millimeter factor + */ + public float getPixelUnitToMillimeter() { + Object key = ImageTranscoder.KEY_PIXEL_UNIT_TO_MILLIMETER; + if (getTranscodingHints().containsKey(key)) { + return ((Float)getTranscodingHints().get(key)).floatValue(); + } else { + // return 0.3528f; // 72 dpi + return 0.26458333333333333333333333333333f; // 96dpi + } + } + + /** + * Returns the user language specified in the + * TranscodingHints or "en" (english) if any. + * @return the languages for the transcoder + */ + public String getLanguages() { + Object key = ImageTranscoder.KEY_LANGUAGE; + if (getTranscodingHints().containsKey(key)) { + return (String)getTranscodingHints().get(key); + } else { + return "en"; + } + } + + /** + * Get the media for this transcoder. Which is always print. + * @return PDF media is "print" + */ + public String getMedia() { + return "print"; + } + + /** + * Returns the user stylesheet specified in the + * TranscodingHints or null if any. + * @return the user style sheet URI specified in the hints + */ + public String getUserStyleSheetURI() { + return (String)getTranscodingHints() + .get(ImageTranscoder.KEY_USER_STYLESHEET_URI); + } + + /** + * Returns the XML parser to use from the TranscodingHints. + * @return the XML parser class name + */ + public String getXMLParserClassName() { + Object key = KEY_XML_PARSER_CLASSNAME; + if (getTranscodingHints().containsKey(key)) { + return (String)getTranscodingHints().get(key); + } else { + return XMLResourceDescriptor.getXMLParserClassName(); + } + } + + /** + * Check if the XML parser is validating. + * @return true if the XML parser is validating + */ + public boolean isXMLParserValidating() { + return false; + } + + /** + * Unsupported operation. + * @return null since this is unsupported + */ + public AffineTransform getTransform() { + return null; + } + } + +}