]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
1. Valid node checking for LayoutMasterSet done.
authorGlen Mazza <gmazza@apache.org>
Wed, 16 Jun 2004 23:40:58 +0000 (23:40 +0000)
committerGlen Mazza <gmazza@apache.org>
Wed, 16 Jun 2004 23:40:58 +0000 (23:40 +0000)
2.  Additional error message provided for missing required child elements of a node.
3.  Removal of elementName from property list; redundant (retrievable via getFObj.getName()).  Adding getName() to FObj so the element so fObj.getName() works.
(Vielen Dank, Simon!)
4.  Moving locator information from FObj to FONode so non-XSL NS elements will also have this information.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@197720 13f79535-47bb-0310-9956-ffa450edef68

22 files changed:
src/java/org/apache/fop/fo/FONode.java
src/java/org/apache/fop/fo/FOTreeBuilder.java
src/java/org/apache/fop/fo/FObj.java
src/java/org/apache/fop/fo/PropertyList.java
src/java/org/apache/fop/fo/XMLObj.java
src/java/org/apache/fop/fo/expr/PPColWidthFunction.java
src/java/org/apache/fop/fo/extensions/Bookmarks.java
src/java/org/apache/fop/fo/flow/BasicLink.java
src/java/org/apache/fop/fo/flow/Block.java
src/java/org/apache/fop/fo/flow/Footnote.java
src/java/org/apache/fop/fo/flow/FootnoteBody.java
src/java/org/apache/fop/fo/flow/Inline.java
src/java/org/apache/fop/fo/flow/TableBody.java
src/java/org/apache/fop/fo/flow/TableCell.java
src/java/org/apache/fop/fo/pagination/ColorProfile.java
src/java/org/apache/fop/fo/pagination/Declarations.java
src/java/org/apache/fop/fo/pagination/Flow.java
src/java/org/apache/fop/fo/pagination/LayoutMasterSet.java
src/java/org/apache/fop/fo/pagination/PageSequence.java
src/java/org/apache/fop/fo/pagination/RegionBA.java
src/java/org/apache/fop/fo/pagination/RegionBASE.java
src/java/org/apache/fop/fo/pagination/Root.java

index 90775eacf35ec3c3be27ad95942178f4e610769a..15593de469cb1a413ff0adc22cc5ecd24c8a8c90 100644 (file)
@@ -46,6 +46,15 @@ public abstract class FONode {
     /** Name of the node */
     protected String name;
 
+    /** Marks input file containing this object **/
+    public String systemId;
+
+    /** Marks line number of this object in the input file **/
+    public int line;
+
+    /** Marks column number of this object in the input file **/
+    public int column;
+
     /**
      * Main constructor.
      * @param parent parent of this node
@@ -54,6 +63,18 @@ public abstract class FONode {
         this.parent = parent;
     }
 
+    /**
+     * Set the location information for this element
+     * @param locator the org.xml.sax.Locator object
+     */
+    public void setLocation(Locator locator) {
+        if (locator != null) {
+            line = locator.getLineNumber();
+            column = locator.getColumnNumber();
+            systemId = locator.getSystemId();
+        }
+    }
+
     /**
      * Returns the user agent for the node.
      * @return FOUserAgent
@@ -80,6 +101,7 @@ public abstract class FONode {
      * @throws FOPException for errors or inconsistencies in the attributes
     */
     public void processNode(String elementName, Locator locator, Attributes attlist) throws FOPException {
+        System.out.println("name = " + elementName);
         this.name = elementName;
     }
 
@@ -223,6 +245,7 @@ public abstract class FONode {
     /**
      * Helper function to standardize "too many" error exceptions
      * (e.g., two fo:declarations within fo:root)
+     * @param loc org.xml.sax.Locator object of the error (*not* parent node)
      * @param offendingNode incoming node that would cause a duplication.
      */
     protected void tooManyNodesError(Locator loc, String offendingNode) {
@@ -234,6 +257,7 @@ public abstract class FONode {
     /**
      * Helper function to standardize "out of order" exceptions
      * (e.g., fo:layout-master-set appearing after fo:page-sequence)
+     * @param loc org.xml.sax.Locator object of the error (*not* parent node)
      * @param tooLateNode string name of node that should be earlier in document
      * @param tooEarlyNode string name of node that should be later in document
      */
@@ -247,22 +271,47 @@ public abstract class FONode {
     /**
      * Helper function to return "invalid child" exceptions
      * (e.g., fo:block appearing immediately under fo:root)
+     * @param loc org.xml.sax.Locator object of the error (*not* parent node)
      * @param nsURI namespace URI of incoming invalid node
      * @param lName local name (i.e., no prefix) of incoming node 
      */
     protected void invalidChildError(Locator loc, String nsURI, String lName) {
         throw new IllegalArgumentException(
             errorText(loc) + getNodeString(nsURI, lName) + 
-            " is not valid child element of " + getName() + ".");
+            " is not valid child element of " + getName() + ".");
     }
     
+    /**
+     * Helper function to return missing child element errors
+     * (e.g., fo:layout-master-set not having any page-master child element)
+     * @param contentModel The XSL Content Model for the fo: object.
+     * or a similar description indicating child elements needed.
+     */
+    protected void missingChildElementError(String contentModel) {
+        throw new IllegalArgumentException(
+            errorText(line, column) + getName() + " is missing child elements. \n" + 
+            "Required Content Model: " + contentModel);
+    }
+
     /**
      * Helper function to return "Error (line#/column#)" string for
      * above exception messages
      * @param loc org.xml.sax.Locator object
+     * @return String opening error text
      */
     protected static String errorText(Locator loc) {
         return "Error(" + loc.getLineNumber() + "/" + loc.getColumnNumber() + "): ";
     }
+    
+    /**
+     * Helper function to return "Error (line#/column#)" string for
+     * above exception messages
+     * @param lineNumber - line number of node with error
+     * @param columnNumber - column number of node with error
+     * @return String opening error text
+     */
+    protected static String errorText(int lineNumber, int columnNumber) {
+        return "Error(" + lineNumber + "/" + columnNumber + "): ";
+    }
 }
 
index 95bb1402cc2915232081bc281b17cabfc60954aa..ffb45bfb700f8b4705e788fa579ccf0823817588 100644 (file)
@@ -268,7 +268,12 @@ public class FOTreeBuilder extends DefaultHandler {
      */
     public void endElement(String uri, String localName, String rawName)
                 throws SAXException {
-        currentFObj.end();
+        try {
+            currentFObj.end();
+        } catch (IllegalArgumentException e) {
+            throw new SAXException(e);
+        }
+
         currentFObj = currentFObj.getParent();
     }
 
index 38a8738a40592d0be6d330eebe1d991dd36e4eb6..ac90c68a8bbbdc8bc57808b3577254590d631e28 100644 (file)
@@ -56,15 +56,6 @@ public class FObj extends FONode implements Constants {
     /** Dynamic layout dimension. Used to resolve relative lengths. */
     protected Map layoutDimension = null;
 
-    /** Marks input file containing this object **/
-    public String systemId;
-
-    /** Marks line number of this object in the input file **/
-    public int line;
-
-    /** Marks column number of this object in the input file **/
-    public int column;
-
     /**
      * Create a new formatting object.
      * All formatting object classes extend this class.
@@ -102,18 +93,6 @@ public class FObj extends FONode implements Constants {
         name = "fo:" + str;
     }
 
-    /**
-     * Set the location information for this element
-     * @param locator the org.xml.sax.Locator object
-     */
-    public void setLocation(Locator locator) {
-        if (locator != null) {
-            line = locator.getLineNumber();
-            column = locator.getColumnNumber();
-            systemId = locator.getSystemId();
-        }
-    }
-
     /**
      * Set properties for this FO based on node attributes
      * @param attlist Collection of attributes passed to us from the parser.
@@ -126,7 +105,7 @@ public class FObj extends FONode implements Constants {
             parentPL = parentFO.getPropertiesForNamespace(FOElementMapping.URI);
         }
 
-        propertyList = new PropertyList(this, parentPL, FOElementMapping.URI, name);
+        propertyList = new PropertyList(this, parentPL, FOElementMapping.URI);
         propertyList.addAttributesToList(attlist);
         propMgr = new PropertyManager(propertyList);
         setWritingMode();
@@ -457,5 +436,10 @@ public class FObj extends FONode implements Constants {
         return getName() + " at line " + line + ":" + column;
     }
 */    
+
+    public String getName() {
+        return null;
+    }
+
 }
 
index d5421c085940f21f14691be3189ce98c26bed9f4..e03a4cacde2ee254a5885e528e28ba44eb109a5a 100644 (file)
@@ -95,7 +95,6 @@ public class PropertyList extends HashMap {
 
     private PropertyList parentPropertyList = null;
     private String namespace = "";
-    private String elementName = "";
     private FObj fobj = null;
 
     /**
@@ -103,14 +102,12 @@ public class PropertyList extends HashMap {
      * @param parentPropertyList the PropertyList belonging to the new objects
      * parent
      * @param space name of namespace
-     * @param elementName name of element
      */
     public PropertyList(FObj fObjToAttach, PropertyList parentPropertyList,
-        String space, String elementName) {
+        String space) {
         this.fobj = fObjToAttach;
         this.parentPropertyList = parentPropertyList;
         this.namespace = space;
-        this.elementName = elementName;
     }
 
     /**
@@ -145,13 +142,6 @@ public class PropertyList extends HashMap {
         return namespace;
     }
 
-    /**
-     * @return element name for this
-     */
-    public String getElement() {
-        return elementName;
-    }
-
     /**
      * Return the value explicitly specified on this FO.
      * @param propertyName The name of the property whose value is desired.
index 91baef3fe59549553d27a2cf73e8e3cc563f291b..9d6b7f4cf45a6564ca33345d4d33b9e06f95374d 100644 (file)
@@ -58,6 +58,7 @@ public abstract class XMLObj extends FONode {
      * @see org.apache.fop.fo.FONode#processNode
      */
     public void processNode(String elementName, Locator locator, Attributes attlist) throws FOPException {
+        setLocation(locator);
         name = elementName;
         attr = attlist;
     }
index 6eefd263785ea88c49e45bc67b5114246ae62859..ccdbf98295555afc89315e07230eb8e7b6d9c812 100644 (file)
@@ -52,7 +52,7 @@ public class PPColWidthFunction extends FunctionBase {
             throw new PropertyException("Non numeric operand to "
                     + "proportional-column-width function");
         }
-        if (!pInfo.getPropertyList().getElement().equals("fo:table-column")) {
+        if (!pInfo.getPropertyList().getFObj().getName().equals("fo:table-column")) {
             throw new PropertyException("proportional-column-width function "
                     + "may only be used on table-column FO");
         }
index 8b53390127ba647b90628c6e7af9d24066e57cbe..e7d45f50819376dddb5405e6ba33ff4fd8efd436 100644 (file)
 
 package org.apache.fop.fo.extensions;
 
+// Java
+import java.util.ArrayList;
+
+// FOP
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FOTreeVisitor;
 import org.apache.fop.fo.pagination.Root;
 
-import java.util.ArrayList;
-
 /**
  * Bookmarks data is the top level element of the pdf bookmark extension.
  * This handles the adding of outlines. When the element is ended it
@@ -58,7 +60,7 @@ public class Bookmarks extends ExtensionObj {
      * the bookmark data from the child elements and add
      * the extension to the area tree.
      */
-    public void end() {
+    protected void end() {
         ((Root) parent).setBookmarks(this);
     }
 
index 728c12ae92efae20fd8f475e51fccb217b257e86..61edb839f414eb12b8e81ea865bb3a2e2d1fc3b3 100644 (file)
@@ -140,7 +140,7 @@ public class BasicLink extends Inline {
     /**
      * @see org.apache.fop.fo.FONode#end
      */
-    public void end() {
+    protected void end() {
         super.end();
         getFOInputHandler().endLink();
     }
index ade2ce9b1b2c0fadbcf3109a12c4070b7e90e8a1..f7f57ab54ba12d1a068cdd342dc0427b28e5ab10 100644 (file)
@@ -20,6 +20,7 @@ package org.apache.fop.fo.flow;
 
 // XML
 import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
 
 // FOP
 import org.apache.fop.apps.FOPException;
@@ -236,7 +237,7 @@ public class Block extends FObjMixed {
     /**
      * @see org.apache.fop.fo.FONode#end
      */
-    public void end() {
+    protected void end() {
         handleWhiteSpace();
         getFOInputHandler().endBlock(this);
     }
index d2b5e9361da388002db99b8f7c3158a1986afea6..83a50e50a48b58d4b96f965782785b3953c700da 100644 (file)
@@ -20,6 +20,7 @@ package org.apache.fop.fo.flow;
 
 // XML
 import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
 
 // FOP
 import org.apache.fop.apps.FOPException;
index 94fd388488b28bc89309260bc5982790da4bd918..c0319d86a53b36541cbf56add30739a14670c6c8 100644 (file)
@@ -20,6 +20,7 @@ package org.apache.fop.fo.flow;
 
 // XML
 import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
 
 // FOP
 import org.apache.fop.apps.FOPException;
index 076cb00eef4be1b1f937e74677787110c31b2174..6de4dd77a10d60c9f455ba81341c1d08f5f8aeb1 100644 (file)
@@ -22,6 +22,7 @@ package org.apache.fop.fo.flow;
 import org.xml.sax.Attributes;
 
 // FOP
+import org.apache.fop.apps.FOPException;
 import org.apache.fop.fo.CharIterator;
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObjMixed;
@@ -33,7 +34,6 @@ import org.apache.fop.fo.properties.CommonBackground;
 import org.apache.fop.fo.properties.CommonBorderAndPadding;
 import org.apache.fop.fo.properties.CommonMarginInline;
 import org.apache.fop.fo.properties.CommonRelativePosition;
-import org.apache.fop.apps.FOPException;
 
 /**
  * Class modelling the fo:inline object. See Sec. 6.6.7 of the XSL-FO Standard.
@@ -138,7 +138,7 @@ public class Inline extends FObjMixed {
     /**
      * @see org.apache.fop.fo.FONode#end
      */
-    public void end() {
+    protected void end() {
         getFOInputHandler().endInline(this);
     }
 
index ab8424d8b22a722aca616253a0d509d84a80d258..90825dc18408a78f68909f822b9c94b21f882f8e 100644 (file)
@@ -20,6 +20,7 @@ package org.apache.fop.fo.flow;
 
 // XML
 import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
 
 // FOP
 import org.apache.fop.apps.FOPException;
index 7a2a09b02495542f2ba5367d64504e50698b8d20..b03d2c40801175514b01b89b0775a7f62bbdb10e 100644 (file)
@@ -20,6 +20,7 @@ package org.apache.fop.fo.flow;
 
 // XML
 import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
 
 // FOP
 import org.apache.fop.apps.FOPException;
index 56a415c1bea3958e1fe695d4f2a58b9ad0b18ffe..f47654f6c57cf0b7f62fd67e0a231ec903be0617 100644 (file)
@@ -24,7 +24,10 @@ import java.awt.color.ICC_ColorSpace;
 import java.net.URL;
 import java.io.IOException;
 import java.io.InputStream;
+
+// XML
 import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
 
 // FOP
 import org.apache.fop.datatypes.ColorType;
@@ -50,7 +53,7 @@ public class ColorProfile extends FObj {
     }
 
     /**
-     * @see org.apache.fop.fo.FONode#validateChildNode(String, String)
+     * @see org.apache.fop.fo.FONode#validateChildNode(Locator, String, String)
         XSL 1.0/FOP: EMPTY (no child nodes permitted)
      */
     protected void validateChildNode(Locator loc, String nsURI, String localName) {
@@ -62,7 +65,7 @@ public class ColorProfile extends FObj {
      * Extract instance variables from the collection of properties for this
      * object.
      */
-    public void end() {
+    protected void end() {
         src = this.propertyList.get(PR_SRC).getString();
         profileName = this.propertyList.get(PR_COLOR_PROFILE_NAME).getString();
         intent = this.propertyList.get(PR_RENDERING_INTENT).getEnum();
index 3e0d3aa36b7ac79d04283455da04232ced6db0a4..0a6c6c094ee487bdde6b90fe24548527d150bb42 100644 (file)
@@ -23,13 +23,16 @@ import java.util.List;
 import java.util.Map;
 import java.util.Iterator;
 
+// XML
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+
 // FOP
 import org.apache.fop.fo.FOElementMapping;
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.FOTreeVisitor;
 import org.apache.fop.fo.XMLObj;
-import org.xml.sax.Locator;
 
 
 /**
@@ -53,7 +56,7 @@ public class Declarations extends FObj {
     }
 
     /**
-     * @see org.apache.fop.fo.FONode#validateChildNode(String, String)
+     * @see org.apache.fop.fo.FONode#validateChildNode(Locator, String, String)
         XSL 1.0: (color-profile)+ (and non-XSL NS nodes)
         FOP/XSL 1.1: (color-profile)* (and non-XSL NS nodes)
      */
@@ -69,7 +72,7 @@ public class Declarations extends FObj {
      * At the end of this element sort out the child into
      * a hashmap of color profiles and a list of external xml.
      */
-    public void end() {
+    protected void end() {
         if (children != null) {
             for (Iterator iter = children.iterator(); iter.hasNext();) {
                 FONode node = (FONode)iter.next();
index 64037dfc201a9d68906c47c71b67b0cebd1dc4b2..ac2911e9de41e37a4d0c4551bf3eb2cb6914bc00 100644 (file)
@@ -98,7 +98,7 @@ public class Flow extends FObj {
     /**
      * Tell the StructureRenderer that we are at the end of the flow.
      */
-    public void end() {
+    protected void end() {
         getFOInputHandler().endFlow(this);
     }
 
index 8ad7f982bc6ffbbe02cf569e503330a31a68da8a..16e54948900f62897bb2a997093660942601eb4e 100644 (file)
@@ -28,8 +28,10 @@ import org.xml.sax.Attributes;
 // FOP
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.FOElementMapping;
 import org.apache.fop.fo.FOTreeVisitor;
 import org.apache.fop.apps.FOPException;
+import org.xml.sax.Locator;
 
 /**
  * The layout-master-set formatting object.
@@ -52,6 +54,27 @@ public class LayoutMasterSet extends FObj {
         super(parent);
     }
 
+    /**
+     * @see org.apache.fop.fo.FONode#validateChildNode(Locator, String, String)
+        XSL/FOP: (simple-page-master|page-sequence-master)+
+     */
+    protected void validateChildNode(Locator loc, String nsURI, String localName) {
+        if (nsURI == FOElementMapping.URI) {
+            if (!localName.equals("simple-page-master") 
+                && !localName.equals("page-sequence-master")) {   
+                    invalidChildError(loc, nsURI, localName);
+            }
+        } else {
+            invalidChildError(loc, nsURI, localName);
+        }
+    }
+
+    protected void end() {
+        if (children == null) {
+           missingChildElementError("(simple-page-master|page-sequence-master)+");
+        }
+    }
+
     /**
      * @see org.apache.fop.fo.FObj#addProperties
      */
index cc04488e1bb63ffd732dc005469fe85f7eb227ef..fc4d041d75ea14883d4b4d0a70f1fb62e34ad7cc 100644 (file)
 
 package org.apache.fop.fo.pagination;
 
+// Java
+import java.util.HashMap;
+
+// XML
+import org.xml.sax.Attributes;
+
 // FOP
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.FOTreeVisitor;
 import org.apache.fop.apps.FOPException;
 
-// Java
-import java.util.HashMap;
-
-import org.xml.sax.Attributes;
-
 /**
  * This provides pagination of flows onto pages. Much of the
  * logic for paginating flows is contained in this class.
@@ -301,7 +302,7 @@ public class PageSequence extends FObj {
      * This passes the end page sequence to the structure handler
      * so it can act upon that.
      */
-    public void end() {
+    protected void end() {
         try {
             getFOInputHandler().endPageSequence(this);
         } catch (FOPException fopex) {
index ca9622af35250699d530d6031f6d8ce28ea1da4b..64ef93b92e85f9715a0af973c4108876096017b4 100644 (file)
@@ -25,6 +25,7 @@ import java.awt.Rectangle;
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FOTreeVisitor;
 
+
 /**
  * Abstract base class for fo:region-before and fo:region-after.
  */
@@ -49,7 +50,7 @@ public abstract class RegionBA extends RegionBASE {
     /**
      * @see org.apache.fop.fo.FONode#end()
      */
-    public void end() {
+    protected void end() {
         super.end();
         bPrecedence =
             (this.propertyList.get(PR_PRECEDENCE).getEnum() == Precedence.TRUE);
index a411d10980d6b9e70ac2e94060991bbdd3d19df5..4a960c864bcd4191275737327a8fba2252b909b6 100644 (file)
 
 package org.apache.fop.fo.pagination;
 
+// XML
+import org.xml.sax.SAXException;
+
 // FOP
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FOTreeVisitor;
 
+
 /**
  * Base class for Before, After, Start and End regions (BASE).
  */
@@ -39,7 +43,7 @@ public abstract class RegionBASE extends Region {
     /**
      * @see org.apache.fop.fo.FONode#end()
      */
-    public void end() {
+    protected void end() {
         // The problem with this is that it might not be known yet....
         // Supposing extent is calculated in terms of percentage
         this.extent = this.propertyList.get(PR_EXTENT).getLength().getValue();
index 46a9bf36c5819995d104ea974f6df15d906914bc..1b7cd2f7fd1eddd69e9448cd3e82b02df6baf5fe 100644 (file)
@@ -66,7 +66,7 @@ public class Root extends FObj {
     }
 
     /**
-     * @see org.apache.fop.fo.FONode#validateChildNode(String, String)
+     * @see org.apache.fop.fo.FONode#validateChildNode(Locator, String, String)
         XSL 1.0 Spec: (layout-master-set,declarations?,page-sequence+)
         FOP: (layout-master-set, declarations?, fox:bookmarks?, page-sequence+)
      */