]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Second phase of performance improvement. Pass the propertyList into
authorFinn Bock <bckfnn@apache.org>
Tue, 19 Oct 2004 12:52:09 +0000 (12:52 +0000)
committerFinn Bock <bckfnn@apache.org>
Tue, 19 Oct 2004 12:52:09 +0000 (12:52 +0000)
processNode(..) and addCharacters(..).

PR: 31699

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

examples/plan/src/org/apache/fop/plan/PlanElement.java
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/UnknownXMLObj.java
src/java/org/apache/fop/fo/XMLObj.java
src/java/org/apache/fop/fo/extensions/svg/SVGElement.java

index 923b7847d9ec266e5779eb697bdb0dc1149cd6b1..bdf6ec7fad4204d78497d484d90dcdf33906e459 100644 (file)
@@ -21,6 +21,7 @@ package org.apache.fop.plan;
 import java.awt.geom.Point2D;
 
 import org.apache.fop.fo.FONode;
+import org.apache.fop.fo.PropertyList;
 
 import org.w3c.dom.Document;
 import org.xml.sax.Attributes;
@@ -48,8 +49,10 @@ public class PlanElement extends PlanObj {
      * @see org.apache.fop.fo.FONode#processNode
      */
     public void processNode(String elementName, Locator locator, 
-                            Attributes attlist) throws SAXParseException {
-        super.processNode(elementName, locator, attlist);
+                            Attributes attlist, PropertyList propertyList)
+        throws SAXParseException
+    {
+        super.processNode(elementName, locator, attlist, propertyList);
         createBasicDocument();
     }
 
index 7f1d376a7fc84437004c071e81901cf5fe027ba8..22a966f48bdee0482f87f489fb3797bb276a50fe 100644 (file)
@@ -107,7 +107,8 @@ public abstract class FONode {
      * @param attlist Collection of attributes passed to us from the parser.
      * @throws SAXParseException for errors or inconsistencies in the attributes
     */
-    public void processNode(String elementName, Locator locator, Attributes attlist) throws SAXParseException {
+    public void processNode(String elementName, Locator locator, 
+            Attributes attlist, PropertyList parent) throws SAXParseException {
         System.out.println("name = " + elementName);
     }
 
@@ -143,6 +144,7 @@ public abstract class FONode {
      * @param locator location in fo source file. 
      */
     protected void addCharacters(char data[], int start, int length,
+                                 PropertyList pList,
                                  Locator locator) throws SAXParseException {
         // ignore
     }
index 9bfc313582491f33054b1a40a138c08dc087447f..54282799e2258f99a7603410614b75c6a256bae2 100644 (file)
@@ -79,6 +79,11 @@ public class FOTreeBuilder extends DefaultHandler {
      */
     protected FONode currentFObj = null;
 
+    /**
+     * Current propertyList for the node being handled.
+     */
+    protected PropertyList currentPropertyList;
+
     /**
      * The class that handles formatting and rendering to a stream
      * (mark-fop@inomial.com)
@@ -188,7 +193,7 @@ public class FOTreeBuilder extends DefaultHandler {
     public void characters(char[] data, int start, int length) 
         throws SAXParseException {
             if (currentFObj != null) {
-                currentFObj.addCharacters(data, start, start + length, locator);
+                currentFObj.addCharacters(data, start, start + length, currentPropertyList, locator);
             }
     }
 
@@ -226,6 +231,7 @@ public class FOTreeBuilder extends DefaultHandler {
 
         /* the node found in the FO document */
         FONode foNode;
+        PropertyList propertyList;
 
         // Check to ensure first node encountered is an fo:root
         if (rootFObj == null) {
@@ -250,7 +256,9 @@ public class FOTreeBuilder extends DefaultHandler {
 
         try {
             foNode = fobjMaker.make(currentFObj);
-            foNode.processNode(localName, locator, attlist);
+            propertyList = foNode.createPropertyList(currentPropertyList, foEventHandler);
+            foNode.processNode(localName, locator, attlist, propertyList);
+            foNode.startOfNode();
         } catch (IllegalArgumentException e) {
             throw new SAXException(e);
         }
@@ -263,6 +271,9 @@ public class FOTreeBuilder extends DefaultHandler {
         }
 
         currentFObj = foNode;
+        if (propertyList != null) {
+            currentPropertyList = propertyList;
+        }
     }
 
     /**
@@ -277,6 +288,9 @@ public class FOTreeBuilder extends DefaultHandler {
             throw e;
         }
 
+        if (currentPropertyList.getFObj() == currentFObj) {
+            currentPropertyList = currentPropertyList.getParentPropertyList();
+        }
         currentFObj = currentFObj.getParent();
     }
 
@@ -341,7 +355,6 @@ public class FOTreeBuilder extends DefaultHandler {
         rootFObj = null;
         foEventHandler = null;
     }
-
 }
 
 // code stolen from org.apache.batik.util and modified slightly
index 682b4480fadf762363f4d741c064722cb52a12d5..d2dafc6b342bfc655a666cc079d8043fa151f64a 100644 (file)
@@ -97,9 +97,12 @@ public class FObj extends FONode implements Constants {
      * @see org.apache.fop.fo.FONode#processNode
      */
     public void processNode(String elementName, Locator locator, 
-                            Attributes attlist) throws SAXParseException {
+                            Attributes attlist, PropertyList pList) throws SAXParseException {
         setLocator(locator);
-        addProperties(attlist);
+        propertyList.addAttributesToList(attlist);
+        propertyList.setWritingMode();
+        bind(propertyList);
+        propMgr = new PropertyManager(propertyList);
     }
 
     /**
@@ -107,7 +110,8 @@ public class FObj extends FONode implements Constants {
      */
     protected PropertyList createPropertyList(PropertyList parent, FOEventHandler foEventHandler) throws SAXParseException {
         //return foEventHandler.getPropertyListMaker().make(this, parent);
-        return null;
+        propertyList = new StaticPropertyList(this, parent);
+        return propertyList;
     }
 
     /**
@@ -139,49 +143,6 @@ public class FObj extends FONode implements Constants {
         }
     }
 
-    /**
-     * Set properties for this FO based on node attributes
-     * @param attlist Collection of attributes passed to us from the parser.
-     */
-    protected void addProperties(Attributes attlist) throws SAXParseException {
-        FObj parentFO = findNearestAncestorFObj();
-        PropertyList parentPL = null;
-
-        if (parentFO != null) {
-            parentPL = parentFO.getPropertiesForNamespace(FO_URI);
-        }
-
-        propertyList = new PropertyList(this, parentPL, FO_URI);
-        propertyList.addAttributesToList(attlist);
-        propMgr = new PropertyManager(propertyList);
-        setWritingMode();
-        
-        // if this FO can have a PR_ID, make sure it is unique
-        if (PropertySets.canHaveId(getNameId())) {
-            setupID();
-        }
-    }
-
-    /**
-     * Setup the id for this formatting object.
-     * Most formatting objects can have an id that can be referenced.
-     * This methods checks that the id isn't already used by another
-     * fo and sets the id attribute of this object.
-     */
-    private void setupID() throws SAXParseException {
-        String str = getPropString(PR_ID);
-        if (str != null && !str.equals("")) {
-            Set idrefs = getFOEventHandler().getIDReferences();
-            if (!idrefs.contains(str)) {
-                idrefs.add(str);
-            } else {
-                throw new SAXParseException("Property id \"" + str + 
-                    "\" previously used; id values must be unique" +
-                    " in document.", locator);
-            }
-        }
-    }
-
     /**
      * Returns Out Of Line FO Descendant indicator.
      * @return true if Out of Line FO or Out Of Line descendant, false otherwise
@@ -280,61 +241,6 @@ public class FObj extends FONode implements Constants {
         return (FObj) par;
     }
 
-    /**
-     * Find nearest ancestor which generates Reference Areas.
-     *
-     * @param includeSelf Set to true to consider the current FObj as an
-     * "ancestor". Set to false to only return a true ancestor.
-     * @param returnRoot Supposing a condition where no appropriate ancestor
-     * FObj is found, setting returnRoot to true will return the FObj with no
-     * parent (presumably the root FO). Otherwise, null will be returned.
-     * Note that this will override a false setting for includeSelf, and return
-     * the current node if it is the root FO. Setting returnRoot to true should
-     * always return a valid FObj.
-     * @return FObj of the nearest ancestor that generates Reference Areas
-     * and fits the parameters.
-     */
-    private FObj findNearestAncestorGeneratingRAs(boolean includeSelf,
-                                                  boolean returnRoot) {
-        FObj p = this;
-        if (includeSelf && p.generatesReferenceAreas()) {
-            return p;
-        }
-        FObj parent = p.findNearestAncestorFObj();
-        if (parent == null && returnRoot) {
-            return p;
-        }
-        do {
-            p = parent;
-            parent = p.findNearestAncestorFObj();
-        } while (parent != null && !p.generatesReferenceAreas());
-        if (p.generatesReferenceAreas()) {
-            return p;
-        }
-        // if we got here, it is because parent is null
-        if (returnRoot) {
-            return p;
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * For a given namespace, determine whether the properties of this object
-     * match that namespace.
-     * @param nameSpaceURI the namespace URI to be tested against
-     * @return this.propertyList, if the namespaces match; otherwise, null
-     */
-    public PropertyList getPropertiesForNamespace(String nameSpaceURI) {
-        if (this.propertyList == null) {
-            return null;
-        }
-        if (!nameSpaceURI.equals(this.propertyList.getNameSpace())) {
-            return null;
-        }
-        return this.propertyList;
-    }
-
     /* This section is the implemenation of the property context. */
 
     /**
@@ -388,17 +294,6 @@ public class FObj extends FONode implements Constants {
         return false;
     }
 
-    /**
-     * Set writing mode for this FO.
-     * Use that from the nearest ancestor, including self, which generates
-     * reference areas, or from root FO if no ancestor found.
-     */
-    protected void setWritingMode() {
-        FObj p = findNearestAncestorGeneratingRAs(true, true);
-        this.propertyList.setWritingMode(
-          p.getPropEnum(PR_WRITING_MODE));
-    }
-
     /**
      * @see org.apache.fop.fo.FONode#getChildNodes()
      */
index cc289bf22fc4582c528aade7f52b20d5631e9a60..c46d311dd93ed5aa76cc72cc9d00daeb1be4ba74 100644 (file)
@@ -82,11 +82,11 @@ public class UnknownXMLObj extends XMLObj {
      *  @see XMLObj#addCharacters
      */
     protected void addCharacters(char data[], int start, int length,
-                                 Locator locator) {
+                                 PropertyList pList, Locator locator) {
         if (doc == null) {
             createBasicDocument();
         }
-        super.addCharacters(data, start, length, locator);
+        super.addCharacters(data, start, length, pList, locator);
     }
 }
 
index 24e260f4e7f81936006519727db23a990467ccd9..3ff83ee68599b40bbbc1537e57661113e3f28ed1 100644 (file)
@@ -69,7 +69,7 @@ public abstract class XMLObj extends FONode {
      * @see org.apache.fop.fo.FONode#processNode
      */
     public void processNode(String elementName, Locator locator, 
-        Attributes attlist) throws SAXParseException {
+        Attributes attlist, PropertyList propertyList) throws SAXParseException {
             setLocator(locator);
             name = elementName;
             attr = attlist;
@@ -211,7 +211,7 @@ public abstract class XMLObj extends FONode {
      * @param locator location in fo source file.
      */
     protected void addCharacters(char data[], int start, int length,
-                                 Locator locator) {
+                                 PropertyList pList, Locator locator) {
         String str = new String(data, start, length - start);
         org.w3c.dom.Text text = doc.createTextNode(str);
         element.appendChild(text);
index 67923a7afa4f68eaa6a854058028236af3cfc346..cd523da5881eb4806ee3398e98340fae2d01934e 100644 (file)
@@ -20,6 +20,7 @@ package org.apache.fop.fo.extensions.svg;
 
 // FOP
 import org.apache.fop.fo.FONode;
+import org.apache.fop.fo.PropertyList;
 
 import org.apache.batik.dom.svg.SVGOMDocument;
 import org.apache.batik.dom.svg.SVGOMElement;
@@ -61,8 +62,8 @@ public class SVGElement extends SVGObj {
      * @see org.apache.fop.fo.FONode#processNode
      */
     public void processNode(String elementName, Locator locator, 
-                            Attributes attlist) throws SAXParseException {
-        super.processNode(elementName, locator, attlist);
+                            Attributes attlist, PropertyList propertyList) throws SAXParseException {
+        super.processNode(elementName, locator, attlist, propertyList);
         init();
     }