bckfnn 2004/10/20 14:04:43 Modified: src/java/org/apache/fop/fo FOEventHandler.java FOTreeBuilder.java FObj.java src/java/org/apache/fop/fo/flow Marker.java RetrieveMarker.java src/java/org/apache/fop/layoutmgr RetrieveMarkerLayoutManager.java Added: src/java/org/apache/fop/fo PropertyListMaker.java Log: Fourth phase of performance improvement. - Add PropertyListMaker to support fo:maker and fo:retrieve-marker. PR: 31699 Revision Changes Path 1.4 +20 -1 xml-fop/src/java/org/apache/fop/fo/FOEventHandler.java Index: FOEventHandler.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/FOEventHandler.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- FOEventHandler.java 30 Sep 2004 19:55:35 -0000 1.3 +++ FOEventHandler.java 20 Oct 2004 21:04:43 -0000 1.4 @@ -82,6 +82,11 @@ */ private Set idReferences = new HashSet(); + /* + * The property list maker. + */ + protected PropertyListMaker propertyListMaker; + /** * Main constructor * @param FOUserAgent the apps.FOUserAgent instance for this process @@ -121,6 +126,20 @@ */ public FontInfo getFontInfo() { return this.fontInfo; + } + + /** + * Return the propertyListMaker. + */ + public PropertyListMaker getPropertyListMaker() { + return propertyListMaker; + } + + /** + * Set a new propertyListMaker. + */ + public void setPropertyListMaker(PropertyListMaker propertyListMaker) { + this.propertyListMaker = propertyListMaker; } /** 1.56 +6 -1 xml-fop/src/java/org/apache/fop/fo/FOTreeBuilder.java Index: FOTreeBuilder.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/FOTreeBuilder.java,v retrieving revision 1.55 retrieving revision 1.56 diff -u -r1.55 -r1.56 --- FOTreeBuilder.java 19 Oct 2004 12:52:09 -0000 1.55 +++ FOTreeBuilder.java 20 Oct 2004 21:04:43 -0000 1.56 @@ -106,7 +106,12 @@ //This creates either an AreaTreeHandler and ultimately a Renderer, or //one of the RTF-, MIF- etc. Handlers. foEventHandler = RendererFactory.createFOEventHandler(foUserAgent, renderType, stream); - + foEventHandler.setPropertyListMaker(new PropertyListMaker() { + public PropertyList make(FObj fobj, PropertyList parentPropertyList) { + return new StaticPropertyList(fobj, parentPropertyList); + } + }); + // Add standard element mappings setupDefaultMappings(); 1.84 +1 -2 xml-fop/src/java/org/apache/fop/fo/FObj.java Index: FObj.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/FObj.java,v retrieving revision 1.83 retrieving revision 1.84 diff -u -r1.83 -r1.84 --- FObj.java 20 Oct 2004 18:21:27 -0000 1.83 +++ FObj.java 20 Oct 2004 21:04:43 -0000 1.84 @@ -101,8 +101,7 @@ * Create a default property list for this element. */ protected PropertyList createPropertyList(PropertyList parent, FOEventHandler foEventHandler) throws SAXParseException { - //return foEventHandler.getPropertyListMaker().make(this, parent); - return new StaticPropertyList(this, parent); + return foEventHandler.getPropertyListMaker().make(this, parent); } /** 1.1 xml-fop/src/java/org/apache/fop/fo/PropertyListMaker.java Index: PropertyListMaker.java =================================================================== /* * Copyright 2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* $Id: PropertyListMaker.java,v 1.1 2004/10/20 21:04:43 bckfnn Exp $ */ package org.apache.fop.fo; /** * A PropertyListMaker is a factory that creates PropertyLists. */ public interface PropertyListMaker { PropertyList make(FObj fobj, PropertyList parentPropertyList); } 1.18 +85 -0 xml-fop/src/java/org/apache/fop/fo/flow/Marker.java Index: Marker.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/flow/Marker.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- Marker.java 19 Oct 2004 13:45:37 -0000 1.17 +++ Marker.java 20 Oct 2004 21:04:43 -0000 1.18 @@ -18,14 +18,21 @@ package org.apache.fop.fo.flow; +import java.util.HashMap; +import java.util.Iterator; + // XML import org.xml.sax.Locator; import org.xml.sax.SAXParseException; // FOP import org.apache.fop.fo.FONode; +import org.apache.fop.fo.FObj; import org.apache.fop.fo.FObjMixed; +import org.apache.fop.fo.FOEventHandler; +import org.apache.fop.fo.properties.Property; import org.apache.fop.fo.PropertyList; +import org.apache.fop.fo.PropertyListMaker; /** * Marker formatting object. @@ -35,6 +42,10 @@ private String markerClassName; // End of property values + private MarkerPropertyList propertyList; + private PropertyListMaker savePropertyListMaker; + private HashMap children = new HashMap(); + /** * Create a marker fo. * @param parent the parent fo node @@ -49,6 +60,52 @@ public void bind(PropertyList pList) throws SAXParseException { markerClassName = pList.get(PR_MARKER_CLASS_NAME).getString(); } + + /** + * Rebind the marker and all the children using the specified + * parentPropertyList which comes from the fo:retrieve-marker element. + * @param parentPropertyList The property list from fo:retrieve-marker. + */ + public void rebind(PropertyList parentPropertyList) throws SAXParseException { + // Set a new parent property list and bind all the children again. + propertyList.setParentPropertyList(parentPropertyList); + for (Iterator i = children.keySet().iterator(); i.hasNext(); ) { + FObj child = (FObj) i.next(); + PropertyList childList = (PropertyList) children.get(child); + child.bind(childList); + } + } + + protected PropertyList createPropertyList(PropertyList parent, FOEventHandler foEventHandler) throws SAXParseException { + propertyList = new MarkerPropertyList(this, parent); + return propertyList; + } + + protected void startOfNode() { + FOEventHandler foEventHandler = getFOEventHandler(); + // Push a new property list maker which will make MarkerPropertyLists. + savePropertyListMaker = foEventHandler.getPropertyListMaker(); + foEventHandler.setPropertyListMaker(new PropertyListMaker() { + public PropertyList make(FObj fobj, PropertyList parentPropertyList) { + PropertyList pList = new MarkerPropertyList(fobj, parentPropertyList); + children.put(fobj, pList); + return pList; + } + }); + } + + protected void addChildNode(FONode child) throws SAXParseException { + if (!children.containsKey(child)) { + children.put(child, propertyList); + } + super.addChildNode(child); + } + + protected void endOfNode() { + // Pop the MarkerPropertyList maker. + getFOEventHandler().setPropertyListMaker(savePropertyListMaker); + savePropertyListMaker = null; + } /** * @see org.apache.fop.fo.FONode#validateChildNode(Locator, String, String) @@ -85,4 +142,32 @@ public int getNameId() { return FO_MARKER; } + + /** + * An implementation of PropertyList which only stores the explicit + * assigned properties. It is memory efficient but slow. + */ + public class MarkerPropertyList extends PropertyList { + HashMap explicit = new HashMap(); + public MarkerPropertyList(FObj fobj, PropertyList parentPropertyList) { + super(fobj, parentPropertyList); + } + + /** + * Set the parent property list. Used to assign a new parent + * before re-binding all the child elements. + */ + public void setParentPropertyList(PropertyList parentPropertyList) { + this.parentPropertyList = parentPropertyList; + } + + public void putExplicit(int propId, Property value) { + explicit.put(new Integer(propId), value); + } + + public Property getExplicit(int propId) { + return (Property) explicit.get(new Integer(propId)); + } + } + } 1.22 +17 -0 xml-fop/src/java/org/apache/fop/fo/flow/RetrieveMarker.java Index: RetrieveMarker.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/flow/RetrieveMarker.java,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- RetrieveMarker.java 19 Oct 2004 13:45:37 -0000 1.21 +++ RetrieveMarker.java 20 Oct 2004 21:04:43 -0000 1.22 @@ -28,7 +28,9 @@ // FOP import org.apache.fop.fo.FONode; import org.apache.fop.fo.FObjMixed; +import org.apache.fop.fo.FOEventHandler; import org.apache.fop.fo.PropertyList; +import org.apache.fop.fo.StaticPropertyList; import org.apache.fop.layoutmgr.RetrieveMarkerLayoutManager; @@ -44,6 +46,8 @@ private int retrieveBoundary; // End of property values + private PropertyList propertyList; + /** * Create a retrieve marker object. * @@ -69,6 +73,19 @@ protected void validateChildNode(Locator loc, String nsURI, String localName) throws SAXParseException { invalidChildError(loc, nsURI, localName); + } + + protected PropertyList createPropertyList(PropertyList parent, + FOEventHandler foEventHandler) throws SAXParseException { + // TODO: A special RetrieveMarkerPropertyList would be more memory + // efficient. Storing a StaticPropertyList like this will keep all + // the parent PropertyLists alive. + propertyList = new StaticPropertyList(this, parent); + return propertyList; + } + + public PropertyList getPropertyList() { + return propertyList; } /** 1.13 +9 -2 xml-fop/src/java/org/apache/fop/layoutmgr/RetrieveMarkerLayoutManager.java Index: RetrieveMarkerLayoutManager.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/RetrieveMarkerLayoutManager.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- RetrieveMarkerLayoutManager.java 20 Oct 2004 13:19:24 -0000 1.12 +++ RetrieveMarkerLayoutManager.java 20 Oct 2004 21:04:43 -0000 1.13 @@ -22,6 +22,8 @@ import java.util.List; import java.util.LinkedList; +import org.xml.sax.SAXParseException; + import org.apache.fop.area.Area; import org.apache.fop.fo.flow.Marker; import org.apache.fop.fo.flow.RetrieveMarker; @@ -108,15 +110,20 @@ List list = new ArrayList(); Marker marker = retrieveMarker(name, position, boundary); if (marker != null) { + try { + marker.rebind(fobj.getPropertyList()); + } catch (SAXParseException exc) { + log.error("fo:retrieve-marker unable to rebind property values", exc); + } marker.addLayoutManager(list); if (list.size() > 0) { replaceLM = (LayoutManager)list.get(0); replaceLM.setParent(this); replaceLM.initialize(); log.debug("retrieved: " + replaceLM + ":" + list.size()); - } else { - log.debug("found no marker with name: " + name); } + } else { + log.debug("found no marker with name: " + name); } } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]