]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Created a validateChildNode() in FONode for better syntax checking in the
authorGlen Mazza <gmazza@apache.org>
Sat, 12 Jun 2004 23:18:53 +0000 (23:18 +0000)
committerGlen Mazza <gmazza@apache.org>
Sat, 12 Jun 2004 23:18:53 +0000 (23:18 +0000)
fo document:  e.g., preventing two fo:layout-master-set's from occurring within
an fo:root, requiring fo:page-sequence to follow the fo:l-m-s
(and fo:declarations, if present).  Currently just validates fo:root's children--validateChildNode() needs to be overridden in other FObj subclasses
to do the same for other formatting objects.  Comments most welcome.

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

63 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/extensions/Label.java
src/java/org/apache/fop/fo/extensions/Outline.java
src/java/org/apache/fop/fo/flow/BasicLink.java
src/java/org/apache/fop/fo/flow/BidiOverride.java
src/java/org/apache/fop/fo/flow/Block.java
src/java/org/apache/fop/fo/flow/BlockContainer.java
src/java/org/apache/fop/fo/flow/Character.java
src/java/org/apache/fop/fo/flow/ExternalGraphic.java
src/java/org/apache/fop/fo/flow/Float.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/InitialPropertySet.java
src/java/org/apache/fop/fo/flow/Inline.java
src/java/org/apache/fop/fo/flow/InlineContainer.java
src/java/org/apache/fop/fo/flow/InstreamForeignObject.java
src/java/org/apache/fop/fo/flow/Leader.java
src/java/org/apache/fop/fo/flow/ListBlock.java
src/java/org/apache/fop/fo/flow/ListItem.java
src/java/org/apache/fop/fo/flow/ListItemBody.java
src/java/org/apache/fop/fo/flow/ListItemLabel.java
src/java/org/apache/fop/fo/flow/Marker.java
src/java/org/apache/fop/fo/flow/MultiCase.java
src/java/org/apache/fop/fo/flow/MultiProperties.java
src/java/org/apache/fop/fo/flow/MultiPropertySet.java
src/java/org/apache/fop/fo/flow/MultiSwitch.java
src/java/org/apache/fop/fo/flow/MultiToggle.java
src/java/org/apache/fop/fo/flow/PageNumber.java
src/java/org/apache/fop/fo/flow/PageNumberCitation.java
src/java/org/apache/fop/fo/flow/RetrieveMarker.java
src/java/org/apache/fop/fo/flow/Table.java
src/java/org/apache/fop/fo/flow/TableAndCaption.java
src/java/org/apache/fop/fo/flow/TableBody.java
src/java/org/apache/fop/fo/flow/TableCaption.java
src/java/org/apache/fop/fo/flow/TableCell.java
src/java/org/apache/fop/fo/flow/TableColumn.java
src/java/org/apache/fop/fo/flow/TableFooter.java
src/java/org/apache/fop/fo/flow/TableHeader.java
src/java/org/apache/fop/fo/flow/TableRow.java
src/java/org/apache/fop/fo/flow/Wrapper.java
src/java/org/apache/fop/fo/pagination/ColorProfile.java
src/java/org/apache/fop/fo/pagination/ConditionalPageMasterReference.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/PageMasterReference.java
src/java/org/apache/fop/fo/pagination/PageNumberGenerator.java
src/java/org/apache/fop/fo/pagination/PageSequence.java
src/java/org/apache/fop/fo/pagination/PageSequenceMaster.java
src/java/org/apache/fop/fo/pagination/RegionAfter.java
src/java/org/apache/fop/fo/pagination/RegionBefore.java
src/java/org/apache/fop/fo/pagination/RegionBody.java
src/java/org/apache/fop/fo/pagination/RegionEnd.java
src/java/org/apache/fop/fo/pagination/RegionStart.java
src/java/org/apache/fop/fo/pagination/RepeatablePageMasterAlternatives.java
src/java/org/apache/fop/fo/pagination/RepeatablePageMasterReference.java
src/java/org/apache/fop/fo/pagination/Root.java
src/java/org/apache/fop/fo/pagination/SimplePageMaster.java
src/java/org/apache/fop/fo/pagination/SinglePageMasterReference.java
src/java/org/apache/fop/fo/pagination/StaticContent.java
src/java/org/apache/fop/fo/pagination/Title.java

index 7d293ad77a58637a35895875e47fa4c7d8f06156..cf74fbde1d89b6d53044e1970c70eee0c20f8451 100644 (file)
@@ -89,6 +89,17 @@ public abstract class FONode {
         return this.name;
     }
 
+    /**
+     * Checks to make sure, during SAX processing of input document, that the
+     * incoming node is valid for the this (parent) node (e.g., checking to
+     * see that fo:table is not an immediate child of fo:root)
+     * called within FObj constructor
+     * @param namespaceURI namespace of incoming node
+     * @param localName (e.g. "table" for "fo:table")
+     * @throws IllegalArgumentException if incoming node not valid for parent
+     */
+    protected void validateChildNode(String namespaceURI, String localName) {}
+
     /**
      * Adds characters (does nothing here)
      * @param data text
index f49439a41211f15f2e7fcddcb33276e141dc286b..3da7c857e1e622e74cce0d5771a3fe4dcdbe0a23 100644 (file)
@@ -227,18 +227,25 @@ public class FOTreeBuilder extends DefaultHandler {
         // Check to ensure first node encountered is an fo:root
         if (rootFObj == null) {
             if (!namespaceURI.equals(FObj.FO_URI) || !localName.equals("root")) {
-                throw new SAXException(new FOPException("Error:  Root element" +
-                    " must be fo:root formatting object"));
+                throw new SAXException(new IllegalArgumentException(
+                    "Error:  First element must be fo:root formatting object"));
+            }
+        } else { // check that incoming node is valid for currentFObj
+            try {
+                currentFObj.validateChildNode(namespaceURI, localName);
+            } catch (IllegalArgumentException e) {
+                throw new SAXException(e);
             }
         }
         
         ElementMapping.Maker fobjMaker = findFOMaker(namespaceURI, localName);
-
 //      System.out.println("found a " + fobjMaker.toString());
 
         try {
             foNode = fobjMaker.make(currentFObj);
             foNode.processNode(localName, locator, attlist);
+        } catch (IllegalArgumentException e) {
+            throw new SAXException(e);
         } catch (FOPException e) {
             throw new SAXException(e);
         }
@@ -269,7 +276,7 @@ public class FOTreeBuilder extends DefaultHandler {
      * @param localName name of the Element
      * @return the ElementMapping.Maker that can create an FO object for this element
      */
-    public Maker findFOMaker(String namespaceURI, String localName) {
+    private Maker findFOMaker(String namespaceURI, String localName) {
       Map table = (Map)fobjTable.get(namespaceURI);
       Maker fobjMaker = null;
       if (table != null) {
index 1ecfc1aa706933d82c2bf110870d723ecbced0c9..dfc87d43d18b623739316a3419b2482abac0825c 100644 (file)
@@ -91,7 +91,6 @@ public class FObj extends FONode implements Constants {
      */
     public void processNode(String elementName, Locator locator, 
                             Attributes attlist) throws FOPException {
-        setName(elementName);
         setLocation(locator);
         addProperties(attlist);
     }
index 2efe8f75db01a2def52b69865c73f987edab4c7a..a60226cb2d93ea82cede07ccaa6bf29d6edfe74f 100644 (file)
@@ -66,5 +66,9 @@ public class Label extends ExtensionObj {
     public void acceptVisitor(FOTreeVisitor fotv) {
         fotv.serveLabel(this);
     }
+    
+    public String getName() {
+        return "(http://xml.apache.org/fop/extensions) label";
+    }
 
 }
index 548ee0c05cf905601b0be06daaacadd433201122..c6f6194f86a876a2f994c05e3ec6aaecbf2f43d8 100644 (file)
@@ -108,4 +108,7 @@ public class Outline extends ExtensionObj {
         return outlines;
     }
 
+    public String getName() {
+        return "(http://xml.apache.org/fop/extensions) outline";
+    }
 }
index a541ac27f214b0457ed79df0abd69d5d2be2809a..002650c67f69a719c5aeb33777bd720716c9e918 100644 (file)
@@ -145,4 +145,8 @@ public class BasicLink extends Inline {
         
         getFOTreeControl().getFOInputHandler().endLink();
     }
+    
+    public String getName() {
+        return "fo:basic-link";
+    }
 }
index 040bbb8a4b4a4f57ea2e1c9a47f29edcab5037e9..ffb022206b30e9b448a51282ea018fe42a2ca9a3 100644 (file)
@@ -79,4 +79,7 @@ public class BidiOverride extends FObjMixed {
         fotv.serveBidiOverride(this);
     }
 
+    public String getName() {
+        return "fo:bidi-override";
+    }
 }
index bd99ced067695ea5401e09cd894276d7c6680ca0..e1f90ea9ad1b051e3b295ff7a18787034f557428 100644 (file)
@@ -401,4 +401,8 @@ public class Block extends FObjMixed {
         fotv.serveBlock(this);
     }
 
+    public String getName() {
+        return "fo:block";
+    }
+
 }
index 1d8e8e90f5295445bc133ccc689f3651484d0f23..d3d243db9b88263417a29f3a13881094c4650ae3 100644 (file)
@@ -140,5 +140,8 @@ public class BlockContainer extends FObj {
         fotv.serveBlockContainer(this);
     }
 
+    public String getName() {
+        return "fo:block-container";
+    }
 }
 
index 7aefd25fc7e4dea0f1c3496132bb8af6529bf7ac..8bc70f0c29bfe9ae4cc1bd1d9b9a73850eaedf42 100644 (file)
@@ -126,4 +126,7 @@ public class Character extends FObj {
         fotv.serveCharacter(this);
     }
 
+    public String getName() {
+        return "fo:character";
+    }
 }
index 842be76411ffadeefd89cc80e616688412eb95f5..adcac83ca6478ae2556b338a9097b9bd274f9b13 100644 (file)
@@ -242,4 +242,8 @@ public class ExternalGraphic extends FObj {
         return placement;
     }
 
+    public String getName() {
+        return "fo:external-graphic";
+    }
+
 }
index 3ca56f3e0f4e43aad708305da91d096f2ce37f41..28f255ba769d9e6a983333474f3e9a43779eeaaf 100644 (file)
@@ -47,4 +47,7 @@ public class Float extends ToBeImplementedElement {
         fotv.serveFloat(this);
     }
 
+    public String getName() {
+        return "fo:float";
+    }
 }
index 136e15363bde1bc75ff1005d3745812cfa71bc1e..4f74945a52a1e4df80f0938270dbf468c5d239d7 100644 (file)
@@ -81,5 +81,9 @@ public class Footnote extends FObj {
         super.end();
         getFOTreeControl().getFOInputHandler().endFootnote(this);
     }
+    
+    public String getName() {
+        return "fo:footnote";
+    }
 }
 
index 162a1bcecf71bed4cade7137a3d218a072a755e6..5b9a2c3a64bcc1ad1d049b9f6541c8eb9b5b0d75 100644 (file)
@@ -64,4 +64,8 @@ public class FootnoteBody extends FObj {
         
         getFOTreeControl().getFOInputHandler().endFootnoteBody(this);
     }
+    
+    public String getName() {
+        return "fo:footnote-body";
+    }
 }
index d065c74145b1ff6cb94b00511474c286c427874a..0c9a7867de8d09048752805a91fa6e958bb38ad1 100644 (file)
@@ -76,4 +76,7 @@ public class InitialPropertySet extends ToBeImplementedElement {
         fotv.serveInitialPropertySet(this);
     }
 
+    public String getName() {
+        return "fo:initial-property-set";
+    }
 }
index 1441e03962d3ba2bd59bd8c92280d792bc6cb774..ebe49bd49c64ca881fe91911dcdea1873f4b6c46 100644 (file)
@@ -142,4 +142,7 @@ public class Inline extends FObjMixed {
         getFOTreeControl().getFOInputHandler().endInline(this);
     }
 
+    public String getName() {
+        return "fo:inline";
+    }
 }
index 2889034d088cf17084dfba848b7a5bcbf1ebc571..bd9607a055ab2e9a55c6ee671bcdaee8f9e29477 100644 (file)
@@ -98,4 +98,7 @@ public class InlineContainer extends FObj {
         fotv.serveInlineContainer(this);
     }
 
+    public String getName() {
+        return "fo:inline-container";
+    }
 }
index 53ba21d88128b46b62d2352e2e58586caa5b8548..5e27d6983300b012decf89dc67507ad289fa67da 100644 (file)
@@ -168,4 +168,7 @@ public class InstreamForeignObject extends FObj {
         fotv.serveInstreamForeignObject(this);
     }
 
+    public String getName() {
+        return "fo:instream-foreign-object";
+    }
 }
index 5e1fdd0ccc89969093f0f656fe23eab8f0197414..f9c3ac8c418b80b72d839ba4f6433ab591d24f48 100644 (file)
@@ -172,4 +172,7 @@ public class Leader extends FObjMixed {
         fotv.serveLeader(this);
     }
 
+    public String getName() {
+        return "fo:leader";
+    }
 }
index b0fd8c4b6a38525b3d288825237542d3989a18c3..23d4da5ef5fad6d9c463122929f60c0c145803b3 100644 (file)
@@ -141,5 +141,9 @@ public class ListBlock extends FObj {
         
         getFOTreeControl().getFOInputHandler().endList(this);
     }
+    
+    public String getName() {
+        return "fo:list-block";
+    }
 }
 
index 69f2a9c2972a0b6790d63546629950ed1caadf48..6c5ed254b4b3519dd7b95e3264b2e72c94b48b89 100644 (file)
@@ -150,5 +150,9 @@ public class ListItem extends FObj {
         super.end();
         getFOTreeControl().getFOInputHandler().endListItem(this);
     }
+
+    public String getName() {
+        return "fo:list-item";
+    }
 }
 
index 59f2e15b68045d11084c4c8114e8843226380b27..c5fec56dd6bc0c82fb85a96c10aaac4aefe6d546 100644 (file)
@@ -71,5 +71,8 @@ public class ListItemBody extends FObj {
         fotv.serveListItemBody(this);
     }
 
+    public String getName() {
+        return "fo:list-item-body";
+    }
 }
 
index c04dece44c3adaff3d58df5ccc7302966778beb8..cead94f88db6edcd043bab64c84e4052cba27613 100644 (file)
@@ -88,5 +88,9 @@ public class ListItemLabel extends FObj {
         
         getFOTreeControl().getFOInputHandler().endListLabel();
     }
+    
+    public String getName() {
+        return "fo:list-item-label";
+    }
 }
 
index 81e681650edc2e4ee2268c94eca3652b27a09f5b..215557bfcab7f8a104466934cc7e94f5ca008ef0 100644 (file)
@@ -74,4 +74,7 @@ public class Marker extends FObjMixed {
         fotv.serveMarker(this);
     }
 
+    public String getName() {
+        return "fo:marker";
+    }
 }
index 4b599f624f1734bda3d97dc116f509a519ed631b..c4945ff1570149516b40bd1c1401c0cf154b83a4 100644 (file)
@@ -53,4 +53,7 @@ public class MultiCase extends ToBeImplementedElement {
         fotv.serveMultiCase(this);
     }
 
+    public String getName() {
+        return "fo:multi-case";
+    }
 }
index 2c5c8b03edd5d140ff4e3434ea80e3290b1dcba3..d35f747d523dc0602d3bf3596225a2a5ddd39bc0 100644 (file)
@@ -50,4 +50,7 @@ public class MultiProperties extends ToBeImplementedElement {
         fotv.serveMultiProperties(this);
     }
 
+    public String getName() {
+        return "fo:multi-properties";
+    }
 }
index fabd2e7f6c1a54a5c0c56bbf2e9b44b357d5e7b0..8472962fac325f5cfa60c75841bea48931600f99 100644 (file)
@@ -47,4 +47,7 @@ public class MultiPropertySet extends ToBeImplementedElement {
         fotv.serveMultiPropertySet(this);
     }
 
+    public String getName() {
+        return "fo:multi-property-set";
+    }
 }
index 6c350836b4366981d6c24b92870487ce4613f1d0..5535327c72aad6a3c311f10a2efb0c23e7acb052 100644 (file)
@@ -51,4 +51,7 @@ public class MultiSwitch extends ToBeImplementedElement {
         fotv.serveMultiSwitch(this);
     }
 
+    public String getName() {
+        return "fo:multi-switch";
+    }
 }
index 60f8a4848070c6c05e7ed522c93909e90788dbbe..da77e7da8b0db502a427692bd2de0d2d3715d6bd 100644 (file)
@@ -51,4 +51,7 @@ public class MultiToggle extends ToBeImplementedElement {
         fotv.serveMultiToggle(this);
     }
 
+    public String getName() {
+        return "fo:multi-toggle";
+    }
 }
index b092cf75c8975f2d0b6b6903fb63da22fc13a58a..1871e813336220145afdd6f6ae71fc16c759e0f0 100644 (file)
@@ -131,4 +131,8 @@ public class PageNumber extends FObj {
     protected void end() {
         getFOTreeControl().getFOInputHandler().endPageNumber(this);
     }
+    
+    public String getName() {
+        return "fo:page-number";
+    }
 }
index 865de762c757363c054c4666085d0e6111df1463..b1907b05b1d5940e64eac5562045e22327a1a83d 100644 (file)
@@ -142,4 +142,7 @@ public class PageNumberCitation extends FObj {
         return fontState;
     }
 
+    public String getName() {
+        return "fo:page-number-citation";
+    }
 }
index 826a6faf9704edb35f4b3be8a5d0c46c4facbf05..dee50c989f592b737ecb8d1120639244eb53f021 100644 (file)
@@ -80,4 +80,7 @@ public class RetrieveMarker extends FObjMixed {
         fotv.serveRetrieveMarker(this);
     }
 
+    public String getName() {
+        return "fo:retrieve-marker";
+    }
 }
index 8c81cf79682be9e4c47fff96c839bca8d21c49a7..94fada6c11f8f56ee8272e81246fafd27db74a7d 100644 (file)
@@ -206,4 +206,7 @@ public class Table extends FObj {
         getFOTreeControl().getFOInputHandler().endTable(this);
     }
 
+    public String getName() {
+        return "fo:table";
+    }
 }
index 5b98a4e80a59bb4c293ebc4f03f3794b77cca6cb..8585fb59b1bc0bc43655474ae01c545f14d7795c 100644 (file)
@@ -86,5 +86,9 @@ public class TableAndCaption extends ToBeImplementedElement {
         fotv.serveTableAndCaption(this);
     }
 
+    public String getName() {
+        return "fo:table-and-caption";
+    }
+
 }
 
index 23b02e2ec2440e8ceb2ce0ad96af5bde743d2fba..ce5048a67f2889b9183c6f27b0512dbcadbfa3af 100644 (file)
@@ -107,5 +107,8 @@ public class TableBody extends FObj {
         getFOTreeControl().getFOInputHandler().endBody(this);
     }
 
+    public String getName() {
+        return "fo:table-body";
+    }
 }
 
index 001ce23875173cd3bb96529c02396b1affbe3ea1..c167dabe2c62da8b693b12679b2e3340783ea9e0 100644 (file)
@@ -79,5 +79,8 @@ public class TableCaption extends ToBeImplementedElement {
         fotv.serveTableCaption(this);
     }
 
+    public String getName() {
+        return "fo:table-caption";
+    }
 }
 
index a63eedd79c086fa9c39cc166ce2e731ef2969299..b9d4e2b6ab664fc80c42f0a72d26db8e4339acb9 100644 (file)
@@ -350,4 +350,9 @@ public class TableCell extends FObj {
     protected void end() {
         getFOTreeControl().getFOInputHandler().endCell(this);
     }
+    
+    public String getName() {
+        return "fo:table-cell";
+    }
+    
 }
index 067aec266b23c30a3fb54719a6a3a5270818518b..232d6b0ea3f5fae602e1d58c61a29b0ca1a19f42 100644 (file)
@@ -126,5 +126,9 @@ public class TableColumn extends FObj {
     protected void end() {
         getFOTreeControl().getFOInputHandler().endColumn(this);
     }
+    
+    public String getName() {
+        return "fo:table-column";
+    }
 }
 
index ced2e68c2717e9a34fcaf2d30e1f2913365358d5..e1681f787a6735393fc55fb1c24be109af790858 100644 (file)
@@ -39,4 +39,7 @@ public class TableFooter extends TableBody {
         fotv.serveTableFooter(this);
     }
 
+    public String getName() {
+        return "fo:table-footer";
+    }
 }
index 0232bfeb08348c4eff1b868eb8d8bee6f1bfc65f..0e6b809fc0f879c7994285e90eb1db6846f1738c 100644 (file)
@@ -39,4 +39,7 @@ public class TableHeader extends TableBody {
         fotv.serveTableHeader(this);
     }
 
+    public String getName() {
+        return "fo:table-header";
+    }
 }
index fabde75a0d1e574bf07bf7fad3bc8616217ce058..9ecc3ec127d92d7fa00a8ca74a4c7b1e96bf5ecc 100644 (file)
@@ -147,5 +147,9 @@ public class TableRow extends FObj {
     protected void end() {
         getFOTreeControl().getFOInputHandler().endRow(this);
     }
+    
+    public String getName() {
+        return "fo:table-row";
+    }
 
 }
index 6a073be37695a8ed545386cb8ffc143e51996b86..90e35a5936d1fba6f5a1e39f4de0722e939d889b 100644 (file)
@@ -50,6 +50,10 @@ public class Wrapper extends FObjMixed {
     public void acceptVisitor(FOTreeVisitor fotv) {
         fotv.serveWrapper(this);
     }
+    
+    public String getName() {
+        return "fo:wrapper";
+    }
 
 }
 
index 78a38a13317002b86722bc74bedc5aecc3feec59..a35ac93118f36a69acc89cfa6efd0813be73a543 100644 (file)
@@ -103,4 +103,7 @@ public class ColorProfile extends FObj {
         fotv.serveColorProfile(this);
     }
 
+    public String getName() {
+        return "fo:color-profile";
+    }
 }
index b98276462d1901fedc6467125003d9e7037a2784..a2a931a917b992a7df14814778cc3ef8f815c315 100644 (file)
@@ -167,4 +167,7 @@ public class ConditionalPageMasterReference extends FObj {
         fotv.serveConditionalPageMasterReference(this);
     }
 
+    public String getName() {
+        return "fo:conditional-page-master-reference";
+    }
 }
index c9aeda8fb1b1c8dc34b4cefef9efa17909f9cb5e..d48af48a89abd2adccbc6cdc43f7afa414eb916f 100644 (file)
@@ -87,4 +87,7 @@ public class Declarations extends FObj {
         fotv.serveDeclarations(this);
     }
 
+    public String getName() {
+        return "fo:declarations";
+    }
 }
index e46eb8201a9991d1f4abc05fe5535b462295e604..8ceba89569986424112a2fbb34c95fc04705c59f 100644 (file)
@@ -152,4 +152,8 @@ public class Flow extends FObj {
     public void acceptVisitor(FOTreeVisitor fotv) {
         fotv.serveFlow(this);
     }
+    
+    public String getName() {
+        return "fo:flow";
+    }
 }
index 44d033b81d80db286ee6f80a50d08ecf9954f23c..8ad7f982bc6ffbbe02cf569e503330a31a68da8a 100644 (file)
@@ -60,10 +60,6 @@ public class LayoutMasterSet extends FObj {
 
         if (parent.getName().equals("fo:root")) {
             Root root = (Root)parent;
-            if (root.getLayoutMasterSet() != null) {
-                throw new FOPException("Multiple fo:layout-master-sets " +
-                "found; only one allowed per document");
-            }
             root.setLayoutMasterSet(this);
         } else {
             throw new FOPException("fo:layout-master-set must be child of fo:root, not "
@@ -197,5 +193,8 @@ public class LayoutMasterSet extends FObj {
         fotv.serveLayoutMasterSet(this);
     }
 
+    public String getName() {
+        return "fo:layout-master-set";
+    }
 }
 
index 409bb92c24d2122a1f97d39f655e8f3686ed11b2..910c31ce772b799279c0fcb0be857ad22802fb74 100644 (file)
@@ -90,4 +90,7 @@ public abstract class PageMasterReference extends FObj
         fotv.servePageMasterReference(this);
     }
 
+    public String getName() {
+        return "fo:page-master-reference";
+    }
 }
index 47a84dab54ee9c6c822ae6a10e4ea541089973da..85ef7b63ffd62486be86ba0a17e2f4923523117b 100644 (file)
@@ -193,5 +193,9 @@ public class PageNumberGenerator {
         return alphaNumber.reverse().toString();
     }
 
+    public String getName() {
+        return "fo:page-number-generator";
+    }
+
 }
 
index 92a389aa2cbf6e8bef3918994aa3ba6ba0a46e50..91755ce13f6086e4c70180e434084ade44328a90 100644 (file)
@@ -134,20 +134,11 @@ public class PageSequence extends FObj {
      */
     protected void addProperties(Attributes attlist) throws FOPException {
         super.addProperties(attlist);
-        if (parent.getName().equals("fo:root")) {
-            this.root = (Root)parent;
-            // this.root.addPageSequence(this);
-        } else {
-            throw new FOPException("Error: page-sequence must be child of root, not "
-                                   + parent.getName());
-        }
 
+        this.root = (Root) parent;
+//      this.root.addPageSequence(this);
         layoutMasterSet = root.getLayoutMasterSet();
         
-        if (layoutMasterSet == null) {
-            throw new FOPException("Error: fo:layout-master-set undefined for this document");
-        }
-        
         // best time to run some checks on LayoutMasterSet
         layoutMasterSet.checkRegionNames();
 
@@ -174,7 +165,6 @@ public class PageSequence extends FObj {
             }
         }
 
-
         String masterName = this.propertyList.get(PR_MASTER_REFERENCE).getString();
         this.simplePageMaster =
                 this.layoutMasterSet.getSimplePageMaster(masterName);
@@ -745,4 +735,7 @@ public class PageSequence extends FObj {
         return root;
     }
 
+    public String getName() {
+        return "fo:page-sequence";
+    }
 }
index 199ff0fb3199f638f45d46d3fe25042855b3f0ff..f5b53214fc94b1d6c3a4d133514521810887d08a 100644 (file)
@@ -168,5 +168,8 @@ public class PageSequenceMaster extends FObj {
         fotv.servePageSequenceMaster(this);
     }
 
+    public String getName() {
+        return "fo:page-sequence-master";
+    }
 }
 
index 38049c3e6c4f76eed1d13a9559001102f776da7a..c9502462933d88c0c2f4f24ec50c95ad99ad0ed0 100644 (file)
@@ -79,5 +79,8 @@ public class RegionAfter extends RegionBA {
         fotv.serveRegionAfter(this);
     }
 
+    public String getName() {
+        return "fo:region-after";
+    }
 }
 
index f9d3ec66f98281cdcb75708e43ff79aeba3256a9..0257d251004b3a5cf57a3bb5bfd0a8ebcf94b854 100644 (file)
@@ -84,5 +84,8 @@ public class RegionBefore extends RegionBA {
         fotv.serveRegionBefore(this);
     }
 
+    public String getName() {
+        return "fo:region-before";
+    }
 }
 
index 797889271470cd5915e0b1d7dccc0b7b4a5f519d..427ed33b6ea9b4e152d2c2e1e3c2f30af2d0e9e4 100644 (file)
@@ -112,4 +112,7 @@ public class RegionBody extends Region {
         fotv.serveRegionBody(this);
     }
 
+    public String getName() {
+        return "fo:region-body";
+    }
 }
index 597517c5d6ebfdd45c6cc6b4af340990e3767ad3..5d32912ded92eb3385fed196ebcd79635bd4d7f9 100644 (file)
@@ -80,5 +80,8 @@ public class RegionEnd extends RegionSE {
         fotv.serveRegionEnd(this);
     }
 
+    public String getName() {
+        return "fo:region-end";
+    }
 }
 
index 9fb29b1b5d4777b4e8e98a5faa974026e4e9c838..71919edcfeb498857c407860a8b752ecfce8f654 100644 (file)
@@ -79,5 +79,8 @@ public class RegionStart extends RegionSE {
         fotv.serveRegionStart(this);
     }
 
+    public String getName() {
+        return "fo:region-start";
+    }
 }
 
index 2d1f54819dd15b8451139d3973c5733691bbf55e..93b688734ee89fd374e57887532352053c22952a 100644 (file)
@@ -137,4 +137,7 @@ public class RepeatablePageMasterAlternatives extends FObj
         fotv.serveRepeatablePageMasterAlternatives(this);
     }
 
+    public String getName() {
+        return "fo:repeatable-page-master-alternatives";
+    }
 }
index c75be5b1601018c90e78468e3eee9dea8f20c7e0..bf954cddd82139814597c75cfd4aa4143bdf3125 100644 (file)
@@ -98,4 +98,7 @@ public class RepeatablePageMasterReference extends PageMasterReference
         fotv.serveRepeatablePageMasterReference(this);
     }
 
+    public String getName() {
+        return "fo:repeatable-page-master-reference";
+    }
 }
index 61a805f3b94b0d316f12866689c1b9e3fa7c8451..db4da1247c8b82e9ee93e3430eb7a1b19c341997 100644 (file)
@@ -32,6 +32,7 @@ import org.apache.fop.fo.FOTreeVisitor;
  */
 public class Root extends FObj {
     private LayoutMasterSet layoutMasterSet;
+    private Declarations declarations;
     private List pageSequences;
 
     /**
@@ -53,6 +54,42 @@ public class Root extends FObj {
         }
     }
 
+    /**
+     * @see org.apache.fop.fo.FONode#validateChildNode(String, String)
+     */
+    protected void validateChildNode(String namespaceURI, String localName) {
+        if (namespaceURI == FObj.FO_URI) {
+            if (localName.equals("layout-master-set")) {   
+                if (layoutMasterSet != null) { // only one fo:declarations
+                    throw new IllegalArgumentException("Error: Only one" +
+                        " fo:layout-master-set may be defined per fo:root");
+                }
+            } else if (localName.equals("declarations")) { 
+                if (layoutMasterSet == null) { // must already have a l-m-s
+                    throw new IllegalArgumentException("Error:" +
+                        " fo:layout-master-set must be first child of" +
+                        " fo:root");
+                } else if (declarations != null) { // only one fo:declarations
+                    throw new IllegalArgumentException("Error: Only one" +
+                        " fo:declarations may be defined per fo:root");
+                } else if (!pageSequences.isEmpty()) { // no page-seqs yet
+                    throw new IllegalArgumentException("Error: fo:declarations" +
+                        " must be defined before fo:page-sequence declarations");
+                }
+            } else if (localName.equals("page-sequence")) { 
+                if (layoutMasterSet == null) { // must already have a l-m-s
+                    throw new IllegalArgumentException("Error:" +
+                    " fo:layout-master-set must be first child of fo:root");
+                }
+            } else
+                throw new IllegalArgumentException("Error: Invalid child" +
+                    " node \"fo:" + localName + "\" of fo:root");
+        } else {
+            throw new IllegalArgumentException("Error: Invalid child node (" 
+                + namespaceURI + ") \"" + localName + "\" of fo:root");
+        }
+    }
+
     /**
      * Returns the number of pages generated (over all PageSequence instances).
      * @return the number of pages
@@ -139,4 +176,7 @@ public class Root extends FObj {
         fotv.serveRoot(this);
     }
 
+    public String getName() {
+        return "fo:root";
+    }
 }
index 73b4846527dcc8c68cbb7e613a3dbd2e0b7b3880..1fbdb06208d7b9ad5ad47caaf3e1425ab79d4413 100644 (file)
@@ -162,4 +162,7 @@ public class SimplePageMaster extends FObj {
         fotv.serveSimplePageMaster(this);
     }
 
+    public String getName() {
+        return "fo:simple-page-master";
+    }
 }
index 04d4e020e680a71198faf4dcb9ecf1feb7fd8154..905f08dbadb001ac842ad9a03526b153bb5ef21d 100644 (file)
@@ -67,5 +67,8 @@ public class SinglePageMasterReference extends PageMasterReference
         fotv.serveSinglePageMasterReference(this);
     }
 
+    public String getName() {
+        return "fo:single-page-master-reference";
+    }
 }
 
index 9de77ec3f549078ac458e63662eee36d36a2e31e..6fe6a67f165989dc58d5da55dd7642fc92427488 100644 (file)
@@ -64,4 +64,7 @@ public class StaticContent extends Flow {
         fotv.serveStaticContent(this);
     }
 
+    public String getName() {
+        return "fo:static-content";
+    }
 }
index 9d3d3b0e23e580d14460bcc17fb2b8f51d0e2ea5..f90ed6d0081646db7af19e9ad90a499e9ac993d1 100644 (file)
@@ -90,5 +90,8 @@ public class Title extends FObjMixed {
         fotv.serveTitle(this);
     }
 
+    public String getName() {
+        return "fo:title";
+    }
 }