aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFinn Bock <bckfnn@apache.org>2004-10-19 12:52:09 +0000
committerFinn Bock <bckfnn@apache.org>2004-10-19 12:52:09 +0000
commit62c8d560657a1f79cb7bae7fcda7b801f0930249 (patch)
tree4bbe80b59bbfe6665a20ed62936b2cd1958f3bf3
parent2b474e12edfb521006d9c095f936c805067adbe7 (diff)
downloadxmlgraphics-fop-62c8d560657a1f79cb7bae7fcda7b801f0930249.tar.gz
xmlgraphics-fop-62c8d560657a1f79cb7bae7fcda7b801f0930249.zip
Second phase of performance improvement. Pass the propertyList into
processNode(..) and addCharacters(..). PR: 31699 git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@198056 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--examples/plan/src/org/apache/fop/plan/PlanElement.java7
-rw-r--r--src/java/org/apache/fop/fo/FONode.java4
-rw-r--r--src/java/org/apache/fop/fo/FOTreeBuilder.java19
-rw-r--r--src/java/org/apache/fop/fo/FObj.java119
-rw-r--r--src/java/org/apache/fop/fo/UnknownXMLObj.java4
-rw-r--r--src/java/org/apache/fop/fo/XMLObj.java4
-rw-r--r--src/java/org/apache/fop/fo/extensions/svg/SVGElement.java5
7 files changed, 38 insertions, 124 deletions
diff --git a/examples/plan/src/org/apache/fop/plan/PlanElement.java b/examples/plan/src/org/apache/fop/plan/PlanElement.java
index 923b7847d..bdf6ec7fa 100644
--- a/examples/plan/src/org/apache/fop/plan/PlanElement.java
+++ b/examples/plan/src/org/apache/fop/plan/PlanElement.java
@@ -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();
}
diff --git a/src/java/org/apache/fop/fo/FONode.java b/src/java/org/apache/fop/fo/FONode.java
index 7f1d376a7..22a966f48 100644
--- a/src/java/org/apache/fop/fo/FONode.java
+++ b/src/java/org/apache/fop/fo/FONode.java
@@ -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
}
diff --git a/src/java/org/apache/fop/fo/FOTreeBuilder.java b/src/java/org/apache/fop/fo/FOTreeBuilder.java
index 9bfc31358..54282799e 100644
--- a/src/java/org/apache/fop/fo/FOTreeBuilder.java
+++ b/src/java/org/apache/fop/fo/FOTreeBuilder.java
@@ -80,6 +80,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
diff --git a/src/java/org/apache/fop/fo/FObj.java b/src/java/org/apache/fop/fo/FObj.java
index 682b4480f..d2dafc6b3 100644
--- a/src/java/org/apache/fop/fo/FObj.java
+++ b/src/java/org/apache/fop/fo/FObj.java
@@ -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;
}
/**
@@ -140,49 +144,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. */
/**
@@ -389,17 +295,6 @@ public class FObj extends FONode implements Constants {
}
/**
- * 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()
*/
public ListIterator getChildNodes() {
diff --git a/src/java/org/apache/fop/fo/UnknownXMLObj.java b/src/java/org/apache/fop/fo/UnknownXMLObj.java
index cc289bf22..c46d311dd 100644
--- a/src/java/org/apache/fop/fo/UnknownXMLObj.java
+++ b/src/java/org/apache/fop/fo/UnknownXMLObj.java
@@ -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);
}
}
diff --git a/src/java/org/apache/fop/fo/XMLObj.java b/src/java/org/apache/fop/fo/XMLObj.java
index 24e260f4e..3ff83ee68 100644
--- a/src/java/org/apache/fop/fo/XMLObj.java
+++ b/src/java/org/apache/fop/fo/XMLObj.java
@@ -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);
diff --git a/src/java/org/apache/fop/fo/extensions/svg/SVGElement.java b/src/java/org/apache/fop/fo/extensions/svg/SVGElement.java
index 67923a7af..cd523da58 100644
--- a/src/java/org/apache/fop/fo/extensions/svg/SVGElement.java
+++ b/src/java/org/apache/fop/fo/extensions/svg/SVGElement.java
@@ -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();
}