You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by je...@apache.org on 2008/03/20 10:27:37 UTC

svn commit: r639222 - in /xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop: events/ fo/ fo/pagination/ image/loader/batik/ layoutmgr/ render/ render/java2d/ render/pdf/ render/ps/ svg/

Author: jeremias
Date: Thu Mar 20 02:27:34 2008
New Revision: 639222

URL: http://svn.apache.org/viewvc?rev=639222&view=rev
Log:
Some initial work for event forwarding from Batik.
Missing errors/exceptions converted to events in PageSequenceMaster.

Added:
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGEventProducer.java   (with props)
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SimpleSVGUserAgent.java
      - copied, changed from r634269, xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGUserAgent.java
Modified:
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.xml
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/FONode.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/pagination/PageSequenceMaster.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/layoutmgr/BlockLevelEventProducer.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/AbstractGenericSVGHandler.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/pdf/PDFSVGHandler.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/ps/PSSVGHandler.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGUserAgent.java

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.xml?rev=639222&r1=639221&r2=639222&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.xml (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.xml Thu Mar 20 02:27:34 2008
@@ -60,7 +60,7 @@
   <message key="org.apache.fop.fo.flow.table.TableEventProducer.cellOverlap">{elementName} overlaps in column {column}.<!-- no locator here, exception will be wrapped --></message>
   <message key="org.apache.fop.fo.flow.table.TableEventProducer.breakIgnoredDueToRowSpanning">{breakBefore,if,break-before,break-after} ignored on {elementName} because of row spanning in progress (See XSL 1.1, {breakBefore,if,7.20.2,7.20.1}){{locator}}</message>
   <message key="org.apache.fop.events.ResourceEventProducer.imageNotFound">Image not found. URI: {uri}{{locator}}</message>
-  <message key="org.apache.fop.events.ResourceEventProducer.imageError">Image not available. URI: {uri}. Reason: {e}{{locator}}</message>
+  <message key="org.apache.fop.events.ResourceEventProducer.imageError">Image not available.[ URI: {uri}.] Reason:[ {reason}][ {e}]{{locator}}</message>
   <message key="org.apache.fop.events.ResourceEventProducer.imageIOError">I/O error while loading image.  URI: {uri}. Reason: {ioe}{{locator}}</message>
   <message key="org.apache.fop.events.ResourceEventProducer.ifoNoIntrinsicSize">The intrinsic dimensions of an instream-foreign-object could not be determined.{{locator}}</message>
   <message key="org.apache.fop.events.ResourceEventProducer.uriError">Error while handling URI: {uri}. Reason: {e}{{locator}}</message>
@@ -73,4 +73,12 @@
   <message key="org.apache.fop.layoutmgr.BlockLevelEventProducer.viewportOverflow">Content overflows the viewport of an {elementName} in block-progression direction by {amount} millipoints.{clip,if, Content will be clipped.}{{locator}}</message>
   <message key="org.apache.fop.layoutmgr.BlockLevelEventProducer.regionOverflow">Content overflows the viewport of the {elementName} on page {page} in block-progression direction by {amount} millipoints.{clip,if, Content will be clipped.}{{locator}}</message>
   <message key="org.apache.fop.layoutmgr.BlockLevelEventProducer.flowNotMappingToRegionBody">Flow "{flowName}" does not map to the region-body in page-master "{masterName}". FOP presently does not support this.{{locator}}</message>
+  <message key="org.apache.fop.layoutmgr.BlockLevelEventProducer.pageSequenceMasterExhausted">Subsequences exhausted in page-sequence-master "{pageSequenceMasterName}", {canRecover,if,using previous subsequence,cannot recover}.{{locator}}</message>
+  <message key="org.apache.fop.layoutmgr.BlockLevelEventProducer.missingSubsequencesInPageSequenceMaster">No subsequences in page-sequence-master "{pageSequenceMasterName}".{{locator}}</message>
+  <message key="org.apache.fop.layoutmgr.BlockLevelEventProducer.noMatchingPageMaster">No simple-page-master matching "{pageMasterName}" in page-sequence-master "{pageSequenceMasterName}".{{locator}}</message>
+  <message key="org.apache.fop.svg.SVGEventProducer.error">SVG error: {message}</message>
+  <message key="org.apache.fop.svg.SVGEventProducer.alert">SVG alert: {message}</message>
+  <message key="org.apache.fop.svg.SVGEventProducer.info">SVG info: {message}</message>
+  <message key="org.apache.fop.svg.SVGEventProducer.svgNotBuilt">SVG graphic could not be built. Reason: {e}</message>
+  <message key="org.apache.fop.svg.SVGEventProducer.svgRenderingError">SVG graphic could not be rendered. Reason: {e}</message>
 </catalogue>

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/FONode.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/FONode.java?rev=639222&r1=639221&r2=639222&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/FONode.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/FONode.java Thu Mar 20 02:27:34 2008
@@ -443,6 +443,7 @@
      * Helper function to return "invalid child" exceptions with more
      * complex validation rules (i.e., needing more explanation of the problem)
      * @param loc org.xml.sax.Locator object of the error (*not* parent node)
+     * @param parentName the name of the parent element
      * @param nsURI namespace URI of incoming invalid node
      * @param lName local name (i.e., no prefix) of incoming node
      * @param ruleViolated name of the rule violated (used to lookup a resource in a bundle)

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/pagination/PageSequenceMaster.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/pagination/PageSequenceMaster.java?rev=639222&r1=639221&r2=639222&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/pagination/PageSequenceMaster.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/pagination/PageSequenceMaster.java Thu Mar 20 02:27:34 2008
@@ -29,6 +29,7 @@
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.PropertyList;
 import org.apache.fop.fo.ValidationException;
+import org.apache.fop.layoutmgr.BlockLevelEventProducer;
 
 /**
  * The page-sequence-master formatting object.
@@ -199,8 +200,10 @@
         if (currentSubSequence == null) {
             currentSubSequence = getNextSubSequence();
             if (currentSubSequence == null) {
-                throw new FOPException("no subsequences in page-sequence-master '"
-                                       + masterName + "'");
+                BlockLevelEventProducer eventProducer = BlockLevelEventProducer.Factory.create(
+                        getUserAgent().getEventBroadcaster());
+                eventProducer.missingSubsequencesInPageSequenceMaster(this,
+                        masterName, getLocator());
             }
         }
         String pageMasterName = currentSubSequence
@@ -209,14 +212,10 @@
         while (pageMasterName == null) {
             SubSequenceSpecifier nextSubSequence = getNextSubSequence();
             if (nextSubSequence == null) {
-                if (!canRecover) {
-                    throw new FOPException("subsequences exhausted in page-sequence-master '"
-                                           + masterName
-                                           + "', cannot recover");
-                }
-                log.warn("subsequences exhausted in page-sequence-master '"
-                                 + masterName
-                                 + "', using previous subsequence");
+                BlockLevelEventProducer eventProducer = BlockLevelEventProducer.Factory.create(
+                        getUserAgent().getEventBroadcaster());
+                eventProducer.pageSequenceMasterExhausted(this,
+                        masterName, canRecover, getLocator());
                 currentSubSequence.reset();
                 canRecover = false;
             } else {
@@ -228,9 +227,10 @@
         SimplePageMaster pageMaster = this.layoutMasterSet
             .getSimplePageMaster(pageMasterName);
         if (pageMaster == null) {
-            throw new FOPException("No simple-page-master matching '"
-                                   + pageMasterName + "' in page-sequence-master '"
-                                   + masterName + "'");
+            BlockLevelEventProducer eventProducer = BlockLevelEventProducer.Factory.create(
+                    getUserAgent().getEventBroadcaster());
+            eventProducer.noMatchingPageMaster(this,
+                    masterName, pageMasterName, getLocator());
         }
         return pageMaster;
     }

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java?rev=639222&r1=639221&r2=639222&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java Thu Mar 20 02:27:34 2008
@@ -27,8 +27,11 @@
 
 import org.apache.batik.bridge.BridgeContext;
 import org.apache.batik.bridge.GVTBuilder;
+import org.apache.batik.bridge.UserAgent;
 import org.apache.batik.dom.svg.SVGDOMImplementation;
 import org.apache.batik.gvt.GraphicsNode;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 import org.apache.xmlgraphics.image.loader.Image;
 import org.apache.xmlgraphics.image.loader.ImageException;
@@ -40,7 +43,7 @@
 import org.apache.xmlgraphics.java2d.Graphics2DImagePainter;
 import org.apache.xmlgraphics.util.UnitConv;
 
-import org.apache.fop.svg.SVGUserAgent;
+import org.apache.fop.svg.SimpleSVGUserAgent;
 
 /**
  * This ImageConverter converts SVG images to Java2D.
@@ -52,6 +55,9 @@
  */
 public class ImageConverterSVG2G2D extends AbstractImageConverter {
 
+    /** logger */
+    private static Log log = LogFactory.getLog(ImageConverterSVG2G2D.class);
+
     /** {@inheritDoc} */
     public Image convert(Image src, Map hints) throws ImageException {
         checkSourceFlavor(src);
@@ -67,9 +73,7 @@
         if (ptm != null) {
             pxToMillimeter = (float)UnitConv.mm2in(ptm.doubleValue());
         }
-        SVGUserAgent ua = new SVGUserAgent(
-                pxToMillimeter,
-                new AffineTransform());
+        UserAgent ua = createBatikUserAgent(pxToMillimeter);
         GVTBuilder builder = new GVTBuilder();
         final BridgeContext ctx = new BridgeContext(ua);
 
@@ -105,6 +109,25 @@
 
         ImageGraphics2D g2dImage = new ImageGraphics2D(src.getInfo(), painter);
         return g2dImage;
+    }
+
+    /**
+     * Creates a user agent for Batik. Override to provide your own user agent.
+     * @param pxToMillimeter the source resolution (in px per millimeter)
+     * @return the newly created user agent
+     */
+    protected SimpleSVGUserAgent createBatikUserAgent(float pxToMillimeter) {
+        return new SimpleSVGUserAgent(
+                pxToMillimeter,
+                new AffineTransform()) {
+
+            /** {@inheritDoc} */
+            public void displayMessage(String message) {
+                //TODO Refine and pipe through to caller
+                log.debug(message);
+            }
+            
+        };
     }
 
     /** {@inheritDoc} */

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java?rev=639222&r1=639221&r2=639222&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java Thu Mar 20 02:27:34 2008
@@ -32,6 +32,7 @@
 
 import org.apache.batik.bridge.BridgeContext;
 import org.apache.batik.bridge.UnitProcessor;
+import org.apache.batik.bridge.UserAgent;
 import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
 import org.apache.batik.dom.svg.SVGDOMImplementation;
 import org.apache.batik.dom.svg.SVGOMDocument;
@@ -46,7 +47,7 @@
 import org.apache.xmlgraphics.image.loader.util.ImageUtil;
 import org.apache.xmlgraphics.util.MimeConstants;
 
-import org.apache.fop.svg.SVGUserAgent;
+import org.apache.fop.svg.SimpleSVGUserAgent;
 import org.apache.fop.util.UnclosableInputStream;
 
 /**
@@ -154,8 +155,15 @@
         private ImageInfo createImageInfo(String uri, ImageContext context, SVGDocument doc) {
             Element e = doc.getRootElement();
             float pxUnitToMillimeter = 25.4f / context.getSourceResolution(); 
-            SVGUserAgent userAg = new SVGUserAgent(pxUnitToMillimeter,
-                        new AffineTransform());
+            UserAgent userAg = new SimpleSVGUserAgent(pxUnitToMillimeter,
+                        new AffineTransform()) {
+
+                /** {@inheritDoc} */
+                public void displayMessage(String message) {
+                    log.debug(message);
+                }
+                
+            };
             BridgeContext ctx = new BridgeContext(userAg);
             UnitProcessor.Context uctx = UnitProcessor.createContext(ctx, e);
 

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/layoutmgr/BlockLevelEventProducer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/layoutmgr/BlockLevelEventProducer.java?rev=639222&r1=639221&r2=639222&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/layoutmgr/BlockLevelEventProducer.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/layoutmgr/BlockLevelEventProducer.java Thu Mar 20 02:27:34 2008
@@ -130,4 +130,39 @@
     void flowNotMappingToRegionBody(Object source, String flowName, String masterName,
             Locator loc) throws UnsupportedOperationException;
     
+    /**
+     * A page sequence master is exhausted.
+     * @param source the event source
+     * @param pageSequenceMasterName the name of the page sequence master
+     * @param canRecover indicates whether FOP can recover from this problem and continue working
+     * @param loc the location of the error or null
+     * @throws FOPException the error provoked by the method call
+     * @event.severity FATAL
+     */
+    void pageSequenceMasterExhausted(Object source, String pageSequenceMasterName,
+            boolean canRecover, Locator loc) throws FOPException;
+
+    /**
+     * No subsequences in page sequence master.
+     * @param source the event source
+     * @param pageSequenceMasterName the name of the page sequence master
+     * @param loc the location of the error or null
+     * @throws FOPException the error provoked by the method call
+     * @event.severity FATAL
+     */
+    void missingSubsequencesInPageSequenceMaster(Object source, String pageSequenceMasterName,
+            Locator loc) throws FOPException;
+    
+    /**
+     * No single-page-master matching in page sequence master.
+     * @param source the event source
+     * @param pageSequenceMasterName the name of the page sequence master
+     * @param pageMasterName the name of the page master not matching
+     * @param loc the location of the error or null
+     * @throws FOPException the error provoked by the method call
+     * @event.severity FATAL
+     */
+    void noMatchingPageMaster(Object source, String pageSequenceMasterName,
+            String pageMasterName, Locator loc) throws FOPException;
+    
 }

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/AbstractGenericSVGHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/AbstractGenericSVGHandler.java?rev=639222&r1=639221&r2=639222&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/AbstractGenericSVGHandler.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/AbstractGenericSVGHandler.java Thu Mar 20 02:27:34 2008
@@ -30,12 +30,14 @@
 
 import org.apache.batik.bridge.BridgeContext;
 import org.apache.batik.bridge.GVTBuilder;
+import org.apache.batik.dom.AbstractDocument;
 import org.apache.batik.dom.svg.SVGDOMImplementation;
 import org.apache.batik.gvt.GraphicsNode;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+
+import org.apache.xmlgraphics.java2d.Graphics2DImagePainter;
 
 import org.apache.fop.render.RendererContext.RendererContextWrapper;
+import org.apache.fop.svg.SVGEventProducer;
 import org.apache.fop.svg.SVGUserAgent;
 
 /**
@@ -46,9 +48,6 @@
  */
 public abstract class AbstractGenericSVGHandler implements XMLHandler, RendererContextConstants {
 
-    /** logging instance */
-    private static Log log = LogFactory.getLog(AbstractGenericSVGHandler.class);
-
     /** {@inheritDoc} */
     public void handleXML(RendererContext context, 
                 Document doc, String ns) throws Exception {
@@ -73,7 +72,7 @@
 
         //Prepare
         SVGUserAgent ua = new SVGUserAgent(
-                context.getUserAgent().getSourcePixelUnitToMillimeter(),
+                context.getUserAgent(),
                 new AffineTransform());
         GVTBuilder builder = new GVTBuilder();
         final BridgeContext ctx = new BridgeContext(ua);
@@ -83,7 +82,9 @@
         try {
             root = builder.build(ctx, doc);
         } catch (Exception e) {
-            log.error("SVG graphic could not be built: " + e.getMessage(), e);
+            SVGEventProducer eventProducer = SVGEventProducer.Factory.create(
+                    context.getUserAgent().getEventBroadcaster());
+            eventProducer.svgNotBuilt(this, e, getDocumentURI(doc));
             return;
         }
 
@@ -114,6 +115,20 @@
                 x, y, wrappedContext.getWidth(), wrappedContext.getHeight()); 
     }
 
+    /**
+     * Gets the document URI from a Document instance if possible.
+     * @param doc the Document
+     * @return the URI or null
+     */
+    protected String getDocumentURI(Document doc) {
+        String docURI = null;
+        if (doc instanceof AbstractDocument) {
+            AbstractDocument level3Doc = (AbstractDocument)doc;
+            docURI = level3Doc.getDocumentURI();
+        }
+        return docURI;
+    }
+    
     /**
      * Override this method to update the renderer context if it needs special settings for
      * certain conditions.

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java?rev=639222&r1=639221&r2=639222&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java Thu Mar 20 02:27:34 2008
@@ -23,19 +23,17 @@
 
 import org.w3c.dom.Document;
 
-import org.apache.fop.render.Renderer;
-import org.apache.fop.render.XMLHandler;
-import org.apache.fop.render.RendererContext;
-import org.apache.fop.svg.SVGUserAgent;
-
-// Commons-Logging
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.batik.bridge.GVTBuilder;
 import org.apache.batik.bridge.BridgeContext;
+import org.apache.batik.bridge.GVTBuilder;
 import org.apache.batik.dom.svg.SVGDOMImplementation;
 import org.apache.batik.gvt.GraphicsNode;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.fop.render.Renderer;
+import org.apache.fop.render.RendererContext;
+import org.apache.fop.render.XMLHandler;
+import org.apache.fop.svg.SVGUserAgent;
 
 /**
  * Java2D XML handler for SVG (uses Apache Batik).
@@ -121,8 +119,7 @@
         int x = info.currentXPosition;
         int y = info.currentYPosition;
         
-        float ptom = context.getUserAgent().getSourcePixelUnitToMillimeter();
-        SVGUserAgent ua = new SVGUserAgent(ptom, new AffineTransform());
+        SVGUserAgent ua = new SVGUserAgent(context.getUserAgent(), new AffineTransform());
         
         GVTBuilder builder = new GVTBuilder();
         BridgeContext ctx = new BridgeContext(ua);

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/pdf/PDFSVGHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/pdf/PDFSVGHandler.java?rev=639222&r1=639221&r2=639222&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/pdf/PDFSVGHandler.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/pdf/PDFSVGHandler.java Thu Mar 20 02:27:34 2008
@@ -53,6 +53,7 @@
 import org.apache.fop.svg.PDFAElementBridge;
 import org.apache.fop.svg.PDFBridgeContext;
 import org.apache.fop.svg.PDFGraphics2D;
+import org.apache.fop.svg.SVGEventProducer;
 import org.apache.fop.svg.SVGUserAgent;
 
 /**
@@ -145,8 +146,9 @@
             try {
                 super.renderSVGDocument(context, doc);
             } catch (IOException ioe) {
-                log.error("I/O error while rendering SVG graphic: "
-                                       + ioe.getMessage(), ioe);
+                SVGEventProducer eventProducer = SVGEventProducer.Factory.create(
+                        context.getUserAgent().getEventBroadcaster());
+                eventProducer.svgRenderingError(this, ioe, getDocumentURI(doc));
             }
             return;
         }
@@ -154,15 +156,13 @@
         int yOffset = pdfInfo.currentYPosition;
 
         FOUserAgent userAgent = context.getUserAgent(); 
-        log.debug("Generating SVG at " 
-                + userAgent.getTargetResolution()
-                + "dpi.");
         final float deviceResolution = userAgent.getTargetResolution();
-        log.debug("Generating SVG at " + deviceResolution + "dpi.");
-        log.debug("Generating SVG at " + deviceResolution + "dpi.");
+        if (log.isDebugEnabled()) {
+            log.debug("Generating SVG at " + deviceResolution + "dpi.");
+        }
         
         final float uaResolution = userAgent.getSourceResolution();
-        SVGUserAgent ua = new SVGUserAgent(25.4f / uaResolution, new AffineTransform());
+        SVGUserAgent ua = new SVGUserAgent(userAgent, new AffineTransform());
 
         //Scale for higher resolution on-the-fly images from Batik
         double s = uaResolution / deviceResolution;
@@ -189,8 +189,9 @@
             root = builder.build(ctx, doc);
             builder = null;
         } catch (Exception e) {
-            log.error("svg graphic could not be built: "
-                                   + e.getMessage(), e);
+            SVGEventProducer eventProducer = SVGEventProducer.Factory.create(
+                    context.getUserAgent().getEventBroadcaster());
+            eventProducer.svgNotBuilt(this, e, getDocumentURI(doc));
             return;
         }
         // get the 'width' and 'height' attributes of the SVG document
@@ -262,8 +263,9 @@
             root.paint(graphics);
             pdfInfo.currentStream.add(graphics.getString());
         } catch (Exception e) {
-            log.error("svg graphic could not be rendered: "
-                                   + e.getMessage(), e);
+            SVGEventProducer eventProducer = SVGEventProducer.Factory.create(
+                    context.getUserAgent().getEventBroadcaster());
+            eventProducer.svgRenderingError(this, e, getDocumentURI(doc));
         }
         pdfInfo.pdfState.pop();
         renderer.restoreGraphicsState();

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/ps/PSSVGHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/ps/PSSVGHandler.java?rev=639222&r1=639221&r2=639222&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/ps/PSSVGHandler.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/render/ps/PSSVGHandler.java Thu Mar 20 02:27:34 2008
@@ -23,31 +23,25 @@
 import java.awt.geom.AffineTransform;
 import java.io.IOException;
 
-// DOM
 import org.w3c.dom.Document;
-import org.w3c.dom.svg.SVGDocument;
-import org.w3c.dom.svg.SVGSVGElement;
 
-// Batik
 import org.apache.avalon.framework.configuration.Configuration;
-import org.apache.batik.bridge.GVTBuilder;
 import org.apache.batik.bridge.BridgeContext;
-import org.apache.batik.bridge.ViewBox;
-import org.apache.batik.dom.svg.SVGDOMImplementation;
+import org.apache.batik.bridge.GVTBuilder;
 import org.apache.batik.gvt.GraphicsNode;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.xmlgraphics.java2d.ps.PSGraphics2D;
+import org.apache.xmlgraphics.ps.PSGenerator;
 
-// FOP
 import org.apache.fop.fonts.FontInfo;
+import org.apache.fop.render.AbstractGenericSVGHandler;
 import org.apache.fop.render.Renderer;
-import org.apache.fop.render.XMLHandler;
 import org.apache.fop.render.RendererContext;
+import org.apache.fop.render.XMLHandler;
+import org.apache.fop.svg.SVGEventProducer;
 import org.apache.fop.svg.SVGUserAgent;
-import org.apache.xmlgraphics.java2d.ps.PSGraphics2D;
-import org.apache.xmlgraphics.ps.PSGenerator;
-
-// Commons-Logging
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 
 /**
  * PostScript XML handler for SVG. Uses Apache Batik for SVG processing.
@@ -57,7 +51,8 @@
  *
  * @version $Id$
  */
-public class PSSVGHandler implements XMLHandler, PSRendererContextConstants {
+public class PSSVGHandler extends AbstractGenericSVGHandler
+            implements XMLHandler, PSRendererContextConstants {
 
     /** logging instance */
     private static Log log = LogFactory.getLog(PSSVGHandler.class);
@@ -68,16 +63,6 @@
     public PSSVGHandler() {
     }
 
-    /** {@inheritDoc} */
-    public void handleXML(RendererContext context, 
-                Document doc, String ns) throws Exception {
-        PSInfo psi = getPSInfo(context);
-
-        if (SVGDOMImplementation.SVG_NAMESPACE_URI.equals(ns)) {
-            renderSVGDocument(context, doc, psi);
-        }
-    }
-
     /**
      * Get the pdf information from the render context.
      *
@@ -234,10 +219,10 @@
      * Render the svg document.
      * @param context the renderer context
      * @param doc the svg document
-     * @param psInfo the pdf information of the current context
      */
     protected void renderSVGDocument(RendererContext context,
-            Document doc, PSInfo psInfo) {
+            Document doc) {
+        PSInfo psInfo = getPSInfo(context);
         int xOffset = psInfo.currentXPosition;
         int yOffset = psInfo.currentYPosition;
         PSGenerator gen = psInfo.psGenerator;
@@ -250,9 +235,7 @@
         }
 
         SVGUserAgent ua
-             = new SVGUserAgent(
-                context.getUserAgent().getSourcePixelUnitToMillimeter(),
-                new AffineTransform());
+             = new SVGUserAgent(context.getUserAgent(), new AffineTransform());
 
         PSGraphics2D graphics = new PSGraphics2D(strokeText, gen);
         graphics.setGraphicContext(new org.apache.xmlgraphics.java2d.GraphicContext());
@@ -273,8 +256,9 @@
         try {
             root = builder.build(ctx, doc);
         } catch (Exception e) {
-            log.error("SVG graphic could not be built: "
-                                   + e.getMessage(), e);
+            SVGEventProducer eventProducer = SVGEventProducer.Factory.create(
+                    context.getUserAgent().getEventBroadcaster());
+            eventProducer.svgNotBuilt(this, e, getDocumentURI(doc));
             return;
         }
         // get the 'width' and 'height' attributes of the SVG document
@@ -305,10 +289,10 @@
             // viewBox puts it.
             gen.concatMatrix(sx, 0, 0, sy, xOffset / 1000f, yOffset / 1000f);
 
+            /*
             SVGSVGElement svg = ((SVGDocument)doc).getRootElement();
             AffineTransform at = ViewBox.getPreserveAspectRatioTransform(svg,
-                    psInfo.getWidth() / 1000f, psInfo.getHeight() / 1000f);
-            /*
+                    psInfo.getWidth() / 1000f, psInfo.getHeight() / 1000f, ctx);
             if (!at.isIdentity()) {
                 double[] vals = new double[6];
                 at.getMatrix(vals);
@@ -322,15 +306,17 @@
             try {
                 root.paint(graphics);
             } catch (Exception e) {
-                log.error("SVG graphic could not be rendered: "
-                                       + e.getMessage(), e);
+                SVGEventProducer eventProducer = SVGEventProducer.Factory.create(
+                        context.getUserAgent().getEventBroadcaster());
+                eventProducer.svgRenderingError(this, e, getDocumentURI(doc));
             }
 
             gen.restoreGraphicsState();
             gen.commentln("%FOPEndSVG");
         } catch (IOException ioe) {
-            log.error("SVG graphic could not be rendered: "
-                                   + ioe.getMessage(), ioe);
+            SVGEventProducer eventProducer = SVGEventProducer.Factory.create(
+                    context.getUserAgent().getEventBroadcaster());
+            eventProducer.svgRenderingError(this, ioe, getDocumentURI(doc));
         }
     }
 
@@ -339,10 +325,5 @@
         return (renderer instanceof PSRenderer);
     }
     
-    /** {@inheritDoc} */
-    public String getNamespace() {
-        return SVGDOMImplementation.SVG_NAMESPACE_URI;
-    }
-
 }
 

Added: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGEventProducer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGEventProducer.java?rev=639222&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGEventProducer.java (added)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGEventProducer.java Thu Mar 20 02:27:34 2008
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.svg;
+
+import org.apache.fop.events.EventBroadcaster;
+import org.apache.fop.events.EventProducer;
+
+/**
+ * Event producer interface for SVG-related events.
+ */
+public interface SVGEventProducer extends EventProducer {
+
+    /**
+     * Factory class for the event producer.
+     */
+    class Factory {
+        
+        /**
+         * Creates a new event producer.
+         * @param broadcaster the event broadcaster to use
+         * @return the new event producer
+         */
+        public static SVGEventProducer create(EventBroadcaster broadcaster) {
+            return (SVGEventProducer)broadcaster.getEventProducerFor(
+                    SVGEventProducer.class);
+        }
+    }
+
+    /**
+     * Error during SVG processing. Either message or e must be set.
+     * @param source the event source
+     * @param message the error message (or null)
+     * @param e the exception (or null)
+     * @event.severity ERROR
+     */
+    void error(Object source, String message, Exception e);
+    
+    /**
+     * Alert during SVG processing.
+     * @param source the event source
+     * @param message the error message
+     * @event.severity WARN
+     */
+    void alert(Object source, String message);
+    
+    /**
+     * Info during SVG processing.
+     * @param source the event source
+     * @param message the error message
+     * @event.severity INFO
+     */
+    void info(Object source, String message);
+    
+    /**
+     * SVG graphic could not be built due to an exception.
+     * @param source the event source
+     * @param e the original exception
+     * @param uri the URI of the SVG graphic
+     * @event.severity ERROR
+     */
+    void svgNotBuilt(Object source, Exception e, String uri);
+    
+    /**
+     * SVG graphic could not be rendered due to an exception.
+     * @param source the event source
+     * @param e the original exception
+     * @param uri the URI of the SVG graphic
+     * @event.severity ERROR
+     */
+    void svgRenderingError(Object source, Exception e, String uri);
+    
+}

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGEventProducer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGEventProducer.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGUserAgent.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGUserAgent.java?rev=639222&r1=639221&r2=639222&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGUserAgent.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGUserAgent.java Thu Mar 20 02:27:34 2008
@@ -19,49 +19,42 @@
  
 package org.apache.fop.svg;
 
-import javax.xml.parsers.SAXParserFactory;
-import org.apache.batik.bridge.UserAgentAdapter;
-
-// Java
 import java.awt.geom.AffineTransform;
-import java.awt.geom.Dimension2D;
-import java.awt.Dimension;
 
-// Commons-Logging
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.fop.apps.FOUserAgent;
 
 /**
- * The SVG user agent.
- * This is an implementation of the batik svg user agent
- * for handling errors and getting user agent values.
+ * The SVG user agent. This is an implementation of the Batik SVG user agent.
  */
-public class SVGUserAgent extends UserAgentAdapter {
-    private AffineTransform currentTransform = null;
-    private float pixelUnitToMillimeter = 0.0f;
+public class SVGUserAgent extends SimpleSVGUserAgent {
+    
+    private SVGEventProducer eventProducer;
+    private Exception lastException;
 
     /**
-     * logging instance
+     * Creates a new SVGUserAgent.
+     * @param foUserAgent the FO user agent to associate with this SVG user agent
+     * @param at the current transform
      */
-    private Log logger = LogFactory.getLog(SVGUserAgent.class);
+    public SVGUserAgent(FOUserAgent foUserAgent, AffineTransform at) {
+        super(foUserAgent.getSourcePixelUnitToMillimeter(), at);
+        this.eventProducer = SVGEventProducer.Factory.create(foUserAgent.getEventBroadcaster());
+    }
 
     /**
      * Creates a new SVGUserAgent.
-     * @param pixelUnitToMM the pixel to millimeter conversion factor
-     * currently in effect
-     * @param at the current transform
+     * @param foUserAgent the FO user agent to associate with this SVG user agent
      */
-    public SVGUserAgent(float pixelUnitToMM, AffineTransform at) {
-        pixelUnitToMillimeter = pixelUnitToMM;
-        currentTransform = at;
+    public SVGUserAgent(FOUserAgent foUserAgent) {
+        this(foUserAgent, new AffineTransform());
     }
-
+    
     /**
-     * Returns the logger associated with this user agent.
-     * @return Logger the logger
+     * Returns the last exception sent to the {@link #displayError(Exception)} method.
+     * @return the last exception or null if no exception occurred
      */
-    protected final Log getLogger() {
-        return logger;
+    public Exception getLastException() {
+        return this.lastException;
     }
 
     /**
@@ -69,7 +62,7 @@
      * @param message the message to display
      */
     public void displayError(String message) {
-        logger.error(message);
+        this.eventProducer.error(this, message, null);
     }
 
     /**
@@ -77,7 +70,8 @@
      * @param ex the exception to display
      */
     public void displayError(Exception ex) {
-        logger.error("SVG Error" + ex.getMessage(), ex);
+        this.lastException = ex;
+        this.eventProducer.error(this, ex.getLocalizedMessage(), ex);
     }
 
     /**
@@ -86,7 +80,7 @@
      * @param message the message to display
      */
     public void displayMessage(String message) {
-        logger.info(message);
+        this.eventProducer.info(this, message);
     }
 
     /**
@@ -94,78 +88,7 @@
      * @param message the message to display
      */
     public void showAlert(String message) {
-        logger.warn(message);
-    }
-
-    /**
-     * Returns a customized the pixel to mm factor.
-     * @return the pixel unit to millimeter conversion factor
-     */
-    public float getPixelUnitToMillimeter() {
-        return pixelUnitToMillimeter;
+        this.eventProducer.alert(this, message);
     }
 
-    /**
-     * Returns the language settings.
-     * @return the languages supported
-     */
-    public String getLanguages() {
-        return "en"; // userLanguages;
-    }
-
-    /**
-     * Returns the media type for this rendering.
-     * @return the media for fo documents is "print"
-     */
-    public String getMedia() {
-        return "print";
-    }
-
-    /**
-     * Returns the user stylesheet uri.
-     * @return null if no user style sheet was specified.
-     */
-    public String getUserStyleSheetURI() {
-        return null; // userStyleSheetURI;
-    }
-
-    /**
-     * Returns the class name of the XML parser.
-     * @return the XML parser class name
-     */
-    public String getXMLParserClassName() {
-        try {
-            SAXParserFactory factory = SAXParserFactory.newInstance();
-            return factory.newSAXParser().getXMLReader().getClass().getName();
-        } catch (Exception e) {
-            return null;
-        }
-    }
-
-    /**
-     * Is the XML parser validating.
-     * @return true if the xml parser is validating
-     */
-    public boolean isXMLParserValidating() {
-        return false;
-    }
-
-    /**
-     * Get the transform of the svg document.
-     * @return the transform
-     */
-    public AffineTransform getTransform() {
-        return currentTransform;
-    }
-
-    /**
-     * Get the default viewport size for an svg document.
-     * This returns a default value of 100x100.
-     * @return the default viewport size
-     */
-    public Dimension2D getViewportSize() {
-        return new Dimension(100, 100);
-    }
-
-}
-
+}
\ No newline at end of file

Copied: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SimpleSVGUserAgent.java (from r634269, xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGUserAgent.java)
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SimpleSVGUserAgent.java?p2=xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SimpleSVGUserAgent.java&p1=xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGUserAgent.java&r1=634269&r2=639222&rev=639222&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SVGUserAgent.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/svg/SimpleSVGUserAgent.java Thu Mar 20 02:27:34 2008
@@ -19,84 +19,34 @@
  
 package org.apache.fop.svg;
 
-import javax.xml.parsers.SAXParserFactory;
-import org.apache.batik.bridge.UserAgentAdapter;
-
-// Java
+import java.awt.Dimension;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Dimension2D;
-import java.awt.Dimension;
 
-// Commons-Logging
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.apache.batik.bridge.UserAgentAdapter;
 
 /**
- * The SVG user agent.
- * This is an implementation of the batik svg user agent
- * for handling errors and getting user agent values.
+ * A simple SVG user agent.
+ * This is an implementation of the Batik SVG user agent. It ignores any message output sent
+ * by Batik.
  */
-public class SVGUserAgent extends UserAgentAdapter {
+public class SimpleSVGUserAgent extends UserAgentAdapter {
+    
     private AffineTransform currentTransform = null;
     private float pixelUnitToMillimeter = 0.0f;
 
     /**
-     * logging instance
-     */
-    private Log logger = LogFactory.getLog(SVGUserAgent.class);
-
-    /**
-     * Creates a new SVGUserAgent.
-     * @param pixelUnitToMM the pixel to millimeter conversion factor
-     * currently in effect
+     * Creates a new user agent.
+     * @param pixelUnitToMM the pixel to millimeter conversion factor currently in effect
      * @param at the current transform
      */
-    public SVGUserAgent(float pixelUnitToMM, AffineTransform at) {
+    public SimpleSVGUserAgent(float pixelUnitToMM, AffineTransform at) {
         pixelUnitToMillimeter = pixelUnitToMM;
         currentTransform = at;
     }
-
-    /**
-     * Returns the logger associated with this user agent.
-     * @return Logger the logger
-     */
-    protected final Log getLogger() {
-        return logger;
-    }
-
-    /**
-     * Displays an error message.
-     * @param message the message to display
-     */
-    public void displayError(String message) {
-        logger.error(message);
-    }
-
-    /**
-     * Displays an error resulting from the specified Exception.
-     * @param ex the exception to display
-     */
-    public void displayError(Exception ex) {
-        logger.error("SVG Error" + ex.getMessage(), ex);
-    }
-
-    /**
-     * Displays a message in the User Agent interface.
-     * The given message is typically displayed in a status bar.
-     * @param message the message to display
-     */
-    public void displayMessage(String message) {
-        logger.info(message);
-    }
-
-    /**
-     * Shows an alert dialog box.
-     * @param message the message to display
-     */
-    public void showAlert(String message) {
-        logger.warn(message);
-    }
-
+    
     /**
      * Returns a customized the pixel to mm factor.
      * @return the pixel unit to millimeter conversion factor
@@ -115,14 +65,14 @@
 
     /**
      * Returns the media type for this rendering.
-     * @return the media for fo documents is "print"
+     * @return the media for FO documents is "print"
      */
     public String getMedia() {
         return "print";
     }
 
     /**
-     * Returns the user stylesheet uri.
+     * Returns the user stylesheet URI.
      * @return null if no user style sheet was specified.
      */
     public String getUserStyleSheetURI() {
@@ -144,22 +94,27 @@
 
     /**
      * Is the XML parser validating.
-     * @return true if the xml parser is validating
+     * @return true if the XML parser is validating
      */
     public boolean isXMLParserValidating() {
         return false;
     }
 
     /**
-     * Get the transform of the svg document.
+     * Get the transform of the SVG document.
      * @return the transform
      */
     public AffineTransform getTransform() {
         return currentTransform;
     }
 
+    /** {@inheritDoc} */
+    public void setTransform(AffineTransform at) {
+        this.currentTransform = at;
+    }
+
     /**
-     * Get the default viewport size for an svg document.
+     * Get the default viewport size for an SVG document.
      * This returns a default value of 100x100.
      * @return the default viewport size
      */



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org