From: Glen Mazza Date: Fri, 26 Dec 2003 22:11:17 +0000 (+0000) Subject: ---------------------------------------------------------------------- X-Git-Tag: Root_Temp_KnuthStylePageBreaking~965 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=76e4b6356c06ab387c6220c11998441bb38d161c;p=xmlgraphics-fop.git ---------------------------------------------------------------------- Bug #25646 (Patch by Finn Bock): setting SAX Locator (line and column index of input fo stream) for debugging and better error feedback. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@197054 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/fop/fo/FONode.java b/src/java/org/apache/fop/fo/FONode.java index fd118c1e1..0d9681a1c 100644 --- a/src/java/org/apache/fop/fo/FONode.java +++ b/src/java/org/apache/fop/fo/FONode.java @@ -55,6 +55,7 @@ import java.util.ListIterator; // XML import org.xml.sax.Attributes; +import org.xml.sax.Locator; // Avalon import org.apache.avalon.framework.logger.Logger; @@ -90,6 +91,14 @@ public abstract class FONode { name = str; } + /** + * Sets the name of the node. + * @param str the name + */ + public void setLocation(Locator locator) { + // do nothing by default + } + /** * Returns the logger for the node. * @return the logger @@ -127,8 +136,10 @@ public abstract class FONode { * @param data text * @param start start position * @param length length of the text + * @param locator location in fo source file. */ - protected void addCharacters(char data[], int start, int length) { + protected void addCharacters(char data[], int start, int length, + Locator locator) { // ignore } diff --git a/src/java/org/apache/fop/fo/FOTreeBuilder.java b/src/java/org/apache/fop/fo/FOTreeBuilder.java index 1152ac416..a3e4f993f 100644 --- a/src/java/org/apache/fop/fo/FOTreeBuilder.java +++ b/src/java/org/apache/fop/fo/FOTreeBuilder.java @@ -67,6 +67,7 @@ import org.apache.fop.apps.FOUserAgent; import org.apache.fop.fo.ElementMapping.Maker; import org.apache.fop.fo.pagination.Root; import org.xml.sax.Attributes; +import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; @@ -110,6 +111,9 @@ public class FOTreeBuilder extends DefaultHandler { /** The FOTreeControl object managing the FO Tree that is being built */ public FOTreeControl foTreeControl; + /** The SAX locator object maneging the line and column counters */ + private Locator locator; + /** * Default constructor */ @@ -204,13 +208,21 @@ public class FOTreeBuilder extends DefaultHandler { } } + /** + * SAX Handler for locator + * @see org.xml.sax.ContentHandler#setDocumentLocator(Locator) + */ + public void setDocumentLocator(Locator locator) { + this.locator = locator; + } + /** * SAX Handler for characters * @see org.xml.sax.ContentHandler#characters(char[], int, int) */ public void characters(char data[], int start, int length) { if (currentFObj != null) { - currentFObj.addCharacters(data, start, start + length); + currentFObj.addCharacters(data, start, start + length, locator); } } @@ -264,6 +276,7 @@ public class FOTreeBuilder extends DefaultHandler { try { fobj = fobjMaker.make(currentFObj); fobj.setName(localName); + fobj.setLocation(locator); fobj.handleAttrs(attlist); } catch (FOPException e) { throw new SAXException(e); diff --git a/src/java/org/apache/fop/fo/FObj.java b/src/java/org/apache/fop/fo/FObj.java index 79a6fdcd0..8066ff138 100644 --- a/src/java/org/apache/fop/fo/FObj.java +++ b/src/java/org/apache/fop/fo/FObj.java @@ -61,6 +61,7 @@ import org.apache.fop.apps.FOPException; import org.apache.fop.fo.flow.Marker; import org.apache.fop.fo.properties.FOPropertyMapping; import org.xml.sax.Attributes; +import org.xml.sax.Locator; /** * Base class for representation of formatting objects and their processing. @@ -130,6 +131,12 @@ public class FObj extends FONode { name = "fo:" + str; } + public void setLocation(Locator locator) { + line = locator.getLineNumber(); + column = locator.getColumnNumber(); + systemId = locator.getSystemId(); + } + /** * Handle the attributes for this element. * The attributes must be used immediately as the sax attributes @@ -420,5 +427,13 @@ public class FObj extends FONode { public void acceptVisitor(FOTreeVisitor fotv) { fotv.serveFObj(this); } + + /** + * Return a string representation of the fo element. + */ + public String toString() { + return getName() + " at line " + line + ":" + column; + } + } diff --git a/src/java/org/apache/fop/fo/FObjMixed.java b/src/java/org/apache/fop/fo/FObjMixed.java index 2bae957d7..17b3e7abd 100644 --- a/src/java/org/apache/fop/fo/FObjMixed.java +++ b/src/java/org/apache/fop/fo/FObjMixed.java @@ -50,6 +50,8 @@ */ package org.apache.fop.fo; +import org.xml.sax.Locator; + /** * Base class for representation of mixed content formatting objects * and their processing @@ -69,8 +71,10 @@ public class FObjMixed extends FObj { * @param data array of characters containing text to be added * @param start starting array element to add * @param length number of characters to add + * @param locator location in fo source file. */ - protected void addCharacters(char data[], int start, int length) { + protected void addCharacters(char data[], int start, int length, + Locator locator) { if (textInfo == null) { // Really only need one of these, but need to get fontInfo // stored in propMgr for later use. @@ -79,6 +83,8 @@ public class FObjMixed extends FObj { } FOText ft = new FOText(data, start, length, textInfo, this); + ft.setLocation(locator); + ft.setName("text"); /* characters() processing empty for FOTreeHandler, not empty for RTF & MIFHandlers */ getFOTreeControl().getFOInputHandler().characters(ft.ca, ft.start, ft.length); diff --git a/src/java/org/apache/fop/fo/UnknownXMLObj.java b/src/java/org/apache/fop/fo/UnknownXMLObj.java index fb353f181..5a8865b34 100644 --- a/src/java/org/apache/fop/fo/UnknownXMLObj.java +++ b/src/java/org/apache/fop/fo/UnknownXMLObj.java @@ -50,6 +50,8 @@ */ package org.apache.fop.fo; +import org.xml.sax.Locator; + /** * Class for handling generic XML from a namespace not recognized by FOP */ @@ -111,11 +113,12 @@ public class UnknownXMLObj extends XMLObj { /** * @see XMLObj#addCharacters */ - protected void addCharacters(char data[], int start, int length) { + protected void addCharacters(char data[], int start, int length, + Locator locator) { if (doc == null) { createBasicDocument(); } - super.addCharacters(data, start, length); + super.addCharacters(data, start, length, locator); } /** diff --git a/src/java/org/apache/fop/fo/XMLObj.java b/src/java/org/apache/fop/fo/XMLObj.java index 613fca806..783d43ad0 100644 --- a/src/java/org/apache/fop/fo/XMLObj.java +++ b/src/java/org/apache/fop/fo/XMLObj.java @@ -57,6 +57,7 @@ import java.util.HashMap; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.Attributes; +import org.xml.sax.Locator; import javax.xml.parsers.DocumentBuilderFactory; // FOP @@ -224,8 +225,10 @@ public abstract class XMLObj extends FONode { * @param data array of characters contaning the text to add * @param start starting array element to add * @param length number of characters from the array to add + * @param locator location in fo source file. */ - protected void addCharacters(char data[], int start, int length) { + protected void addCharacters(char data[], int start, int length, + Locator locator) { String str = new String(data, start, length - start); org.w3c.dom.Text text = doc.createTextNode(str); element.appendChild(text); diff --git a/src/java/org/apache/fop/fo/extensions/Label.java b/src/java/org/apache/fop/fo/extensions/Label.java index 914309203..15b3491b0 100644 --- a/src/java/org/apache/fop/fo/extensions/Label.java +++ b/src/java/org/apache/fop/fo/extensions/Label.java @@ -50,6 +50,8 @@ */ package org.apache.fop.fo.extensions; +import org.xml.sax.Locator; + import org.apache.fop.fo.FONode; import org.apache.fop.fo.FOTreeVisitor; @@ -77,8 +79,10 @@ public class Label extends ExtensionObj { * @param data the character data * @param start the start position in the data array * @param end the end position in the character array + * @param locator location in fo source file. */ - protected void addCharacters(char data[], int start, int end) { + protected void addCharacters(char data[], int start, int end, + Locator locator) { label += new String(data, start, end - start); }