]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Consolidated PropertyListBuilder and PropertyList.
authorGlen Mazza <gmazza@apache.org>
Sun, 14 Dec 2003 01:40:50 +0000 (01:40 +0000)
committerGlen Mazza <gmazza@apache.org>
Sun, 14 Dec 2003 01:40:50 +0000 (01:40 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@197036 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/fo/FObj.java
src/java/org/apache/fop/fo/PropertyList.java
src/java/org/apache/fop/fo/PropertyListBuilder.java [deleted file]

index acacfbf46f32bcd671e8840819b43293065ce197..0cb569789477c16d64cbfb0e430dc2ec95e21b50 100644 (file)
@@ -59,7 +59,6 @@ import java.util.Set;
 
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.fo.flow.Marker;
-import org.apache.fop.fo.properties.FOPropertyMapping;
 import org.xml.sax.Attributes;
 
 /**
@@ -68,20 +67,13 @@ import org.xml.sax.Attributes;
 public class FObj extends FONode {
     private static final String FO_URI = "http://www.w3.org/1999/XSL/Format";
 
-    /**
-     * Static property list builder that converts xml attributes
-     * into fo properties. This is static since the underlying
-     * property mappings for fo are also static.
-     */
-    protected static PropertyListBuilder plb = null;
-
     /**
      * Formatting properties for this fo element.
      */
     public PropertyList properties;
 
     /**
-     * Property manager for handler some common properties.
+     * Property manager for handling some common properties.
      */
     protected PropertyManager propMgr;
 
@@ -127,22 +119,6 @@ public class FObj extends FONode {
         name = "fo:" + str;
     }
 
-    protected PropertyListBuilder getListBuilder() {
-        if (plb == null) {
-            plb = new PropertyListBuilder();
-            plb.addList(FOPropertyMapping.getGenericMappings());
-
-            for (Iterator iter =
-                      FOPropertyMapping.getElementMappings().iterator();
-                    iter.hasNext();) {
-                String elem = (String) iter.next();
-                plb.addElementList(elem,
-                                   FOPropertyMapping.getElementMapping(elem));
-            }
-        }
-        return plb;
-    }
-
     /**
      * Handle the attributes for this element.
      * The attributes must be used immediately as the sax attributes
@@ -151,8 +127,14 @@ public class FObj extends FONode {
      * @throws FOPException for invalid FO data
      */
     public void handleAttrs(Attributes attlist) throws FOPException {
-        properties = getListBuilder().makeList(FO_URI, name, attlist, this);
-        properties.setFObj(this);
+        FObj parentFO = findNearestAncestorFObj();
+        PropertyList parentProperties = null;
+        if (parentFO != null) {
+            parentProperties = parentFO.getPropertiesForNamespace(FO_URI);
+        }
+
+        properties = new PropertyList(this, parentProperties, FO_URI, name);
+        properties.addAttributesToList(attlist);
         this.propMgr = makePropertyManager(properties);
         setWritingMode();
     }
@@ -166,7 +148,7 @@ public class FObj extends FONode {
       while (par != null && !(par instanceof FObj)) {
           par = par.parent;
       }
-      return (FObj)par;
+      return (FObj) par;
     }
 
     /**
index 1f9224f21c5a4d6ed3328d4ef1c43ee54ed4858e..6bbb2225b7bdee2ac04a37f01f66e875592f8843 100644 (file)
  */
 package org.apache.fop.fo;
 
+// Java
 import java.util.HashMap;
+import java.util.Iterator;
+import org.xml.sax.Attributes;
+
+// FOP
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.fo.Property.Maker;
+import org.apache.fop.fo.properties.FOPropertyMapping;
 import org.apache.fop.fo.properties.WritingMode;
 import org.apache.fop.apps.FOPException;
 
+
+
 /**
  * Class containing the collection of properties for a given FObj.
  */
@@ -115,31 +125,42 @@ public class PropertyList extends HashMap {
         });
     }
 
-    private PropertyListBuilder builder;
     private PropertyList parentPropertyList = null;
     private String namespace = "";
     private String element = "";
     private FObj fobj = null;
 
+    private static HashMap propertyListTable = null;
+    private static HashMap elementTable = null;
+    
     /**
      * Basic constructor.
-     * @param parentPropertyList the PropertyList belongin to the new objects
+     * @param parentPropertyList the PropertyList belonging to the new objects
      * parent
      * @param space name of namespace
      * @param el name of element
      */
-    public PropertyList(PropertyList parentPropertyList, String space,
-                        String el) {
+    public PropertyList(FObj fObjToAttach, PropertyList parentPropertyList,
+        String space, String elementName) {
+        this.fobj = fObjToAttach;
         this.parentPropertyList = parentPropertyList;
         this.namespace = space;
-        this.element = el;
-    }
-
-    /**
-     * @param fobj the FObj object to which this propertyList should be attached
-     */
-    public void setFObj(FObj fobj) {
-        this.fobj = fobj;
+        this.element = elementName;
+        
+        if (propertyListTable == null) {
+            propertyListTable = new HashMap();
+            propertyListTable.putAll(FOPropertyMapping.getGenericMappings());
+        }
+        
+        if (elementTable == null) {
+            elementTable = new HashMap();
+            for (Iterator iter =
+                FOPropertyMapping.getElementMappings().iterator();
+                    iter.hasNext();) {
+                String elem = (String) iter.next();
+                elementTable.put(elem, FOPropertyMapping.getElementMapping(elem));
+            }
+        }
     }
 
     /**
@@ -178,10 +199,10 @@ public class PropertyList extends HashMap {
         }
         Property p = getExplicitBaseProp(baseName);
         if (p == null) {
-            p = builder.getShorthand(this, namespace, element, baseName);
+            p = getShorthand(namespace, element, baseName);
         }
         if (p != null && sepchar > -1) {
-            return builder.getSubpropValue(namespace, element, baseName, p,
+            return getSubpropValue(namespace, element, baseName, p,
                                            propertyName.substring(sepchar
                                            + 1));
         }
@@ -201,10 +222,8 @@ public class PropertyList extends HashMap {
             String baseName = propertyName.substring(0, sepchar);
             Property p = getExplicitBaseProp(baseName);
             if (p != null) {
-                return this.builder.getSubpropValue(namespace, element,
-                                                    baseName, p,
-                                                    propertyName.substring(sepchar
-                                                    + 1));
+                return getSubpropValue(namespace, element, baseName, p,
+                    propertyName.substring(sepchar + 1));
             } else {
                 return null;
             }
@@ -229,23 +248,19 @@ public class PropertyList extends HashMap {
      * @return The inherited value, otherwise null.
      */
     public Property getInherited(String propertyName) {
-        if (builder != null) {
-            if (parentPropertyList != null
-                    && builder.isInherited(namespace, element,
-                                           propertyName)) {
-                return parentPropertyList.get(propertyName);
-            } else {
-                // return the "initial" value
-                try {
-                    return builder.makeProperty(this, namespace, element,
-                                                propertyName);
-                } catch (org.apache.fop.apps.FOPException e) {
-                    //log.error("Exception in getInherited(): property="
-                    //                       + propertyName + " : " + e);
-                }
+        if (parentPropertyList != null
+                && isInherited(namespace, element, propertyName)) {
+            return parentPropertyList.get(propertyName);
+        } else {
+            // return the "initial" value
+            try {
+                return makeProperty(namespace, element, propertyName);
+            } catch (org.apache.fop.apps.FOPException e) {
+                //log.error("Exception in getInherited(): property="
+                //                       + propertyName + " : " + e);
             }
         }
-        return null;    // No builder or exception in makeProperty!
+        return null;    // Exception in makeProperty!
     }
 
     /*
@@ -258,25 +273,20 @@ public class PropertyList extends HashMap {
      */
     private Property findProperty(String propertyName, boolean bTryInherit) {
         Property p = null;
-        if (builder.isCorrespondingForced(this, namespace, element,
-                                          propertyName)) {
-            p = builder.computeProperty(this, namespace, element,
-                                        propertyName);
+        if (isCorrespondingForced(namespace, element, propertyName)) {
+            p = computeProperty(namespace, element, propertyName);
         } else {
             p = getExplicitBaseProp(propertyName);
             if (p == null) {
-                p = this.builder.computeProperty(this, namespace, element,
-                                                 propertyName);
+                p = this.computeProperty(namespace, element, propertyName);
             }
             if (p == null) {    // check for shorthand specification
-                p = builder.getShorthand(this, namespace, element,
-                                         propertyName);
+                p = getShorthand(namespace, element, propertyName);
             }
-            if (p == null
-                    && bTryInherit) {    // else inherit (if has parent and is inheritable)
+            if (p == null && bTryInherit) {    
+                // else inherit (if has parent and is inheritable)
                 if (this.parentPropertyList != null
-                        && builder.isInherited(namespace, element,
-                                               propertyName)) {
+                        && isInherited(namespace, element, propertyName)) {
                     p = parentPropertyList.findProperty(propertyName, true);
                 }
             }
@@ -317,10 +327,7 @@ public class PropertyList extends HashMap {
     private Property get(String propertyName, boolean bTryInherit,
                          boolean bTryDefault) {
 
-        if (builder == null) {
-            //log.error("OH OH, builder has not been set");
-        }
-            /* Handle request for one part of a compound property */
+        /* Handle request for one part of a compound property */
         int sepchar = propertyName.indexOf('.');
         String subpropName = null;
         if (sepchar > -1) {
@@ -331,8 +338,7 @@ public class PropertyList extends HashMap {
         Property p = findProperty(propertyName, bTryInherit);
         if (p == null && bTryDefault) {    // default value for this FO!
             try {
-                p = this.builder.makeProperty(this, namespace, element,
-                                              propertyName);
+                p = makeProperty(namespace, element, propertyName);
             } catch (FOPException e) {
                 // don't know what to do here
             }
@@ -347,21 +353,13 @@ public class PropertyList extends HashMap {
         }
 
         if (subpropName != null && p != null) {
-            return this.builder.getSubpropValue(namespace, element,
-                                                propertyName, p, subpropName);
+            return getSubpropValue(namespace, element, propertyName, p,
+                subpropName);
         } else {
             return p;
         }
     }
 
-    /**
-     *
-     * @param builder the PropertyListBuilder to attache to this object
-     */
-    public void setBuilder(PropertyListBuilder builder) {
-        this.builder = builder;
-    }
-
     /**
      * @return the namespace of this element
      */
@@ -392,8 +390,7 @@ public class PropertyList extends HashMap {
         if (p == null) {
             // If no explicit setting found, return initial (default) value.
             try {
-                p = this.builder.makeProperty(this, namespace, element,
-                                              propertyName);
+                p = makeProperty(namespace, element, propertyName);
             } catch (FOPException e) {
                 //log.error("Exception in getNearestSpecified(): property="
                 //                       + propertyName + " : " + e);
@@ -412,17 +409,15 @@ public class PropertyList extends HashMap {
     public Property getFromParent(String propertyName) {
         if (parentPropertyList != null) {
             return parentPropertyList.get(propertyName);
-        } else if (builder != null) {
-            // return the "initial" value
+        } else {
             try {
-                return builder.makeProperty(this, namespace, element,
-                                            propertyName);
+                return makeProperty(namespace, element, propertyName);
             } catch (org.apache.fop.apps.FOPException e) {
                 //log.error("Exception in getFromParent(): property="
                 //                       + propertyName + " : " + e);
             }
         }
-        return null;    // No builder or exception in makeProperty!
+        return null;    // Exception in makeProperty!
     }
 
     /**
@@ -463,5 +458,311 @@ public class PropertyList extends HashMap {
         this.wmtable = (byte[])WRITING_MODE_TABLES.get(new Integer(writingMode));
     }
 
+    /**
+     *
+     * @param nameSpaceURI URI for the namespace of the element to which
+     *     the attributes belong.
+     * @param elementName Local name for the element to which the attributes
+     *     belong.
+     * @param attributes Collection of attributes passed to us from the parser.
+     * @param fo The FObj to which the attributes need to be attached as
+     *     properties.
+     * @throws FOPException If an error occurs while building the PropertyList
+     */
+    public void addAttributesToList(Attributes attributes) 
+        throws FOPException {
+            /*
+             * If font-size is set on this FO, must set it first, since
+             * other attributes specified in terms of "ems" depend on it.
+             */
+            /** @todo When we do "shorthand" properties, must handle the
+             *  "font" property as well to see if font-size is set.
+             */
+            String attributeName = "font-size";
+            String attributeValue = attributes.getValue(attributeName);
+            convertAttributeToProperty(attributes, attributeName, 
+                attributeValue);
+    
+            for (int i = 0; i < attributes.getLength(); i++) {
+                attributeName = attributes.getQName(i);
+                attributeValue = attributes.getValue(i);
+                convertAttributeToProperty(attributes, attributeName, 
+                    attributeValue);
+            }
+    }
+
+    /**
+     *
+     * @param attributes Collection of attributes
+     * @param attributeName Attribute name to convert
+     * @param attributeValue Attribute value to assign to property
+     * @param validProperties Collection of valid properties
+     * @param parentFO Parent FO of the object for which this property is being
+     *     built
+     */
+    private void convertAttributeToProperty(Attributes attributes,
+                                            String attributeName,
+                                            String attributeValue) {
+                                                
+        FObj parentFO = fobj.findNearestAncestorFObj();
+        
+        HashMap validProperties;
+        validProperties = (HashMap) elementTable.get(element);
+                                                
+        /* Handle "compound" properties, ex. space-before.minimum */
+        String basePropertyName = findBasePropertyName(attributeName);
+        String subPropertyName = findSubPropertyName(attributeName);
+
+        Property.Maker propertyMaker = findMaker(validProperties, 
+            basePropertyName);
+        if (propertyMaker == null) {
+            handleInvalidProperty(attributeName);
+            return;
+        }
+        if (attributeValue == null) {
+            return;
+        }
+        try {
+            Property prop = null;
+            if (subPropertyName == null) {
+                prop = propertyMaker.make(this, attributeValue, parentFO);
+            } else {
+                Property baseProperty = findBaseProperty(attributes,
+                        parentFO, basePropertyName, propertyMaker);
+                prop = propertyMaker.make(baseProperty, subPropertyName,
+                        this, attributeValue, parentFO);
+            }
+            if (prop != null) {
+                put(basePropertyName, prop);
+            }
+        } catch (FOPException e) {
+            /**@todo log this exception */
+            // log.error(e.getMessage());
+        }
+    }
+
+    private Property findBaseProperty(Attributes attributes,
+                                      FObj parentFO,
+                                      String basePropName,
+                                      Maker propertyMaker)
+            throws FOPException {
+        // If the baseProperty has already been created, return it
+        Property baseProperty = getExplicitBaseProp(basePropName);
+        if (baseProperty != null) {
+            return baseProperty;
+        }
+        // If it is specified later in this list of Attributes, create it
+        String basePropertyValue = attributes.getValue(basePropName);
+        if (basePropertyValue != null) {
+            baseProperty = propertyMaker.make(this, basePropertyValue,
+                    parentFO);
+            return baseProperty;
+        }
+        // Otherwise it is a compound property ??
+        // baseProperty = propertyMaker.makeCompound(propertyList, parentFO);
+        return baseProperty;
+    }
+
+    private void handleInvalidProperty(String attributeName) {
+        if (!attributeName.startsWith("xmlns")) {
+            //log.error("property '"
+            //                       + attributeName + "' ignored");
+        }
+    }
+
+    /**
+     * Finds the first or base part (up to any period) of an attribute name.
+     * For example, if input is "space-before.minimum", should return
+     * "space-before".
+     * @param attributeName String to be atomized
+     * @return the base portion of the attribute
+     */
+    public static String findBasePropertyName(String attributeName) {
+        int sepCharIndex = attributeName.indexOf('.');
+        String basePropName = attributeName;
+        if (sepCharIndex > -1) {
+            basePropName = attributeName.substring(0, sepCharIndex);
+        }
+        return basePropName;
+    }
+
+    /**
+     * Finds the second or sub part (portion past any period) of an attribute
+     * name. For example, if input is "space-before.minimum", should return
+     * "minimum".
+     * @param attributeName String to be atomized
+     * @return the sub portion of the attribute
+     */
+    public static String findSubPropertyName(String attributeName) {
+        int sepCharIndex = attributeName.indexOf('.');
+        String subPropName = null;
+        if (sepCharIndex > -1) {
+            subPropName = attributeName.substring(sepCharIndex + 1);
+        }
+        return subPropName;
+    }
+
+    /**
+     * @param space namespace of element
+     * @param element name of element
+     * @param propertyName name of property
+     * @param p a Property object
+     * @param subpropName name of the sub-property to get
+     * @return the sub-property
+     */
+    public Property getSubpropValue(String space, String element,
+                                    String propertyName, Property p,
+                                    String subpropName) {
+        Property.Maker maker = findMaker(space, element, propertyName);
+        if (maker != null) {
+            return maker.getSubpropValue(p, subpropName);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * @param space namespace of element
+     * @param element name of element
+     * @param propertyName name of property
+     * @return value from the appropriate Property.Maker
+     */
+    public boolean isCorrespondingForced(String space, String element,
+                                         String propertyName) {
+        Property.Maker propertyMaker = findMaker(space, element,
+                                                 propertyName);
+        if (propertyMaker != null) {
+            return propertyMaker.isCorrespondingForced(this);
+        } else {
+            //log.error("no Maker for " + propertyName);
+        }
+        return false;
+    }
+
+    /**
+     * @param space namespace of element
+     * @param element name of element
+     * @param propertyName name of property
+     * @return new Property object
+     */
+    public Property getShorthand(String space, String element,
+        String propertyName) {
+        Property.Maker propertyMaker = findMaker(space, element,
+                                                 propertyName);
+        if (propertyMaker != null) {
+            return propertyMaker.getShorthand(this);
+        } else {
+            //log.error("no Maker for " + propertyName);
+            return null;
+        }
+    }
+
+    /**
+     * @param space namespace of element
+     * @param element name of element
+     * @param propertyName name of property
+     * @return new Property object
+     * @throws FOPException for errors in the input
+     */
+    public Property makeProperty(String space, String element,
+                                 String propertyName) throws FOPException {
+
+        Property p = null;
+
+        Property.Maker propertyMaker = findMaker(space, element,
+                                                 propertyName);
+        if (propertyMaker != null) {
+            p = propertyMaker.make(this);
+        } else {
+            //log.error("property " + propertyName
+            //                       + " ignored");
+        }
+        return p;
+    }
+
+    /**
+     * @param space namespace of element
+     * @param elementName name of element
+     * @param propertyName name of property
+     * @return the Property.Maker for this property
+     */
+    protected Property.Maker findMaker(String space, String elementName,
+                                       String propertyName) {
+        return findMaker((HashMap)elementTable.get(elementName),
+                         propertyName);
+    }
+
+    /**
+     * Convenience function to return the Maker for a given property
+     * given the HashMap containing properties specific to this element.
+     * If table is non-null and
+     * @param elemTable Element-specific properties or null if none.
+     * @param propertyName Name of property.
+     * @return A Maker for this property.
+     */
+    private Property.Maker findMaker(HashMap elemTable,
+                                     String propertyName) {
+        Property.Maker propertyMaker = null;
+        if (elemTable != null) {
+            propertyMaker = (Property.Maker)elemTable.get(propertyName);
+        }
+        if (propertyMaker == null) {
+            propertyMaker =
+                (Property.Maker)propertyListTable.get(propertyName);
+        }
+        return propertyMaker;
+    }
+
+    /**
+     *
+     * @param propertyList collection of properties
+     * @param space namespace of element
+     * @param element name of element
+     * @param propertyName name of property
+     * @return the requested Property object
+     */
+    public Property computeProperty(String space, String element, 
+        String propertyName) {
+
+        Property p = null;
+        Property.Maker propertyMaker = findMaker(space, element,
+                                                 propertyName);
+        if (propertyMaker != null) {
+            try {
+                p = propertyMaker.compute(this);
+            } catch (FOPException e) {
+                //log.error("exception occurred while computing"
+                //                       + " value of property '"
+                //                       + propertyName + "': "
+                //                       + e.getMessage());
+            }
+        } else {
+            //log.error("property " + propertyName
+            //                       + " ignored");
+        }
+        return p;
+    }
+
+    /**
+     *
+     * @param space namespace of element
+     * @param element name of element
+     * @param propertyName name of property
+     * @return isInherited value from the requested Property.Maker
+     */
+    public boolean isInherited(String space, String element,
+                               String propertyName) {
+        boolean b;
+
+        Property.Maker propertyMaker = findMaker(space, element,
+                                                 propertyName);
+        if (propertyMaker != null) {
+            b = propertyMaker.isInherited();
+        } else {
+            // log.error("Unknown property " + propertyName);
+            b = true;
+        }
+        return b;
+    }    
 }
 
diff --git a/src/java/org/apache/fop/fo/PropertyListBuilder.java b/src/java/org/apache/fop/fo/PropertyListBuilder.java
deleted file mode 100644 (file)
index bb370c8..0000000
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * $Id: PropertyListBuilder.java,v 1.35 2003/03/05 21:48:02 jeremias Exp $
- * ============================================================================
- *                    The Apache Software License, Version 1.1
- * ============================================================================
- *
- * Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modifica-
- * tion, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- *
- * 3. The end-user documentation included with the redistribution, if any, must
- *    include the following acknowledgment: "This product includes software
- *    developed by the Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself, if
- *    and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "FOP" and "Apache Software Foundation" must not be used to
- *    endorse or promote products derived from this software without prior
- *    written permission. For written permission, please contact
- *    apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache", nor may
- *    "Apache" appear in their name, without prior written permission of the
- *    Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
- * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- * ============================================================================
- *
- * This software consists of voluntary contributions made by many individuals
- * on behalf of the Apache Software Foundation and was originally created by
- * James Tauber <jtauber@jtauber.com>. For more information on the Apache
- * Software Foundation, please see <http://www.apache.org/>.
- */
-package org.apache.fop.fo;
-
-// Java
-import java.util.HashMap;
-import org.xml.sax.Attributes;
-
-// FOP
-import org.apache.fop.apps.FOPException;
-import org.apache.fop.fo.Property.Maker;
-
-/**
- * Class for managing the PropertyList objects, including adding items to them
- * and retrieving items from them.
- */
-public class PropertyListBuilder {
-
-    /**
-     * Name of font-size property attribute to set first.
-     */
-    private static final String FONTSIZEATTR = "font-size";
-
-    private HashMap propertyListTable;
-    private HashMap elementTable;
-
-    /**
-     * Basic Constructor, initialized the tables.
-     */
-    public PropertyListBuilder() {
-        this.propertyListTable = new HashMap();
-        this.elementTable = new HashMap();
-    }
-
-    /**
-     * Add the entire propertyListTable to the list
-     * @param list list to which the elements of propertyListTable should be
-     * added
-     */
-    public void addList(HashMap list) {
-        propertyListTable.putAll(list);
-    }
-
-    /**
-     * Adds a single element to the list
-     * @param element name of element to add
-     * @param list list to which the element should be added
-     */
-    public void addElementList(String element, HashMap list) {
-        elementTable.put(element, list);
-    }
-
-    /**
-     *
-     * @param propertyList collection of properties
-     * @param space namespace of element
-     * @param element name of element
-     * @param propertyName name of property
-     * @return the requested Property object
-     */
-    public Property computeProperty(PropertyList propertyList, String space,
-                                    String element, String propertyName) {
-
-        Property p = null;
-        Property.Maker propertyMaker = findMaker(space, element,
-                                                 propertyName);
-        if (propertyMaker != null) {
-            try {
-                p = propertyMaker.compute(propertyList);
-            } catch (FOPException e) {
-                //log.error("exception occurred while computing"
-                //                       + " value of property '"
-                //                       + propertyName + "': "
-                //                       + e.getMessage());
-            }
-        } else {
-            //log.error("property " + propertyName
-            //                       + " ignored");
-        }
-        return p;
-    }
-
-    /**
-     *
-     * @param space namespace of element
-     * @param element name of element
-     * @param propertyName name of property
-     * @return isInherited value from the requested Property.Maker
-     */
-    public boolean isInherited(String space, String element,
-                               String propertyName) {
-        boolean b;
-
-        Property.Maker propertyMaker = findMaker(space, element,
-                                                 propertyName);
-        if (propertyMaker != null) {
-            b = propertyMaker.isInherited();
-        } else {
-            // log.error("Unknown property " + propertyName);
-            b = true;
-        }
-        return b;
-    }
-
-    /**
-     *
-     * @param nameSpaceURI URI for the namespace of the element to which
-     *     the attributes belong.
-     * @param elementName Local name for the element to which the attributes
-     *     belong.
-     * @param attributes Collection of attributes passed to us from the parser.
-     * @param fo The FObj to which the attributes need to be attached as
-     *     properties.
-     * @return PropertyList object containing collection of Properties objects
-     *     appropriate for the FObj
-     * @throws FOPException If an error occurs while building the PropertyList
-     */
-    public PropertyList makeList(String nameSpaceURI, String elementName,
-                                 Attributes attributes,
-                                 FObj fo) throws FOPException {
-        String nameSpaceURIToUse = "http://www.w3.org/TR/1999/XSL/Format";
-        if (nameSpaceURI != null) {
-            nameSpaceURIToUse = nameSpaceURI;
-        }
-        FObj parentFO = fo.findNearestAncestorFObj();
-        PropertyList parentProperties = null;
-        if (parentFO != null) {
-            parentProperties = parentFO.getPropertiesForNamespace(nameSpaceURIToUse);
-        }
-
-        PropertyList p = new PropertyList(parentProperties, nameSpaceURIToUse,
-                                          elementName);
-        p.setBuilder(this);
-        HashMap validProperties;
-        validProperties = (HashMap)elementTable.get(elementName);
-
-        /*
-         * If font-size is set on this FO, must set it first, since
-         * other attributes specified in terms of "ems" depend on it.
-         */
-        /** @todo When we do "shorthand" properties, must handle the "font"
-         * property as well to see if font-size is set.
-         */
-        String attributeName = FONTSIZEATTR;
-        String attributeValue = attributes.getValue(attributeName);
-        convertAttributeToProperty(attributes, attributeName, attributeValue,
-                                   validProperties, p, parentFO);
-
-        for (int i = 0; i < attributes.getLength(); i++) {
-            attributeName = attributes.getQName(i);
-            attributeValue = attributes.getValue(i);
-            convertAttributeToProperty(attributes, attributeName, attributeValue,
-                                       validProperties, p, parentFO);
-        }
-        return p;
-    }
-
-    /**
-     *
-     * @param attributes Collection of attributes
-     * @param attributeName Attribute name to convert
-     * @param attributeValue Attribute value to assign to property
-     * @param validProperties Collection of valid properties
-     * @param propList PropertyList in which to add the newly created Property
-     * @param parentFO Parent FO of the object for which this property is being
-     *     built
-     */
-    private void convertAttributeToProperty(Attributes attributes,
-                                            String attributeName,
-                                            String attributeValue,
-                                            HashMap validProperties,
-                                            PropertyList propList,
-                                            FObj parentFO) {
-        /* Handle "compound" properties, ex. space-before.minimum */
-        String basePropertyName = findBasePropertyName(attributeName);
-        String subPropertyName = findSubPropertyName(attributeName);
-
-        Property.Maker propertyMaker = findMaker(validProperties, basePropertyName);
-        if (propertyMaker == null) {
-            handleInvalidProperty(attributeName);
-            return;
-        }
-        if (attributeValue == null) {
-            return;
-        }
-        try {
-            Property prop = null;
-            if (subPropertyName == null) {
-                prop = propertyMaker.make(propList, attributeValue, parentFO);
-            } else {
-                Property baseProperty = findBaseProperty(attributes, propList,
-                        parentFO, basePropertyName, propertyMaker);
-                prop = propertyMaker.make(baseProperty, subPropertyName,
-                        propList, attributeValue, parentFO);
-            }
-            if (prop != null) {
-                propList.put(basePropertyName, prop);
-            }
-        } catch (FOPException e) {
-            /**@todo log this exception */
-            // log.error(e.getMessage());
-        }
-    }
-
-    private Property findBaseProperty(Attributes attributes,
-                                      PropertyList propertyList,
-                                      FObj parentFO,
-                                      String basePropName,
-                                      Maker propertyMaker)
-            throws FOPException {
-        // If the baseProperty has already been created, return it
-        Property baseProperty = propertyList.getExplicitBaseProp(basePropName);
-        if (baseProperty != null) {
-            return baseProperty;
-        }
-        // If it is specified later in this list of Attributes, create it
-        String basePropertyValue = attributes.getValue(basePropName);
-        if (basePropertyValue != null) {
-            baseProperty = propertyMaker.make(propertyList, basePropertyValue,
-                    parentFO);
-            return baseProperty;
-        }
-        // Otherwise it is a compound property ??
-        // baseProperty = propertyMaker.makeCompound(propertyList, parentFO);
-        return baseProperty;
-    }
-
-    private void handleInvalidProperty(String attributeName) {
-        if (!attributeName.startsWith("xmlns")) {
-            //log.error("property '"
-            //                       + attributeName + "' ignored");
-        }
-    }
-
-    /**
-     * Finds the first or base part (up to any period) of an attribute name.
-     * For example, if input is "space-before.minimum", should return
-     * "space-before".
-     * @param attributeName String to be atomized
-     * @return the base portion of the attribute
-     */
-    public static String findBasePropertyName(String attributeName) {
-        int sepCharIndex = attributeName.indexOf('.');
-        String basePropName = attributeName;
-        if (sepCharIndex > -1) {
-            basePropName = attributeName.substring(0, sepCharIndex);
-        }
-        return basePropName;
-    }
-
-    /**
-     * Finds the second or sub part (portion past any period) of an attribute
-     * name. For example, if input is "space-before.minimum", should return
-     * "minimum".
-     * @param attributeName String to be atomized
-     * @return the sub portion of the attribute
-     */
-    public static String findSubPropertyName(String attributeName) {
-        int sepCharIndex = attributeName.indexOf('.');
-        String subPropName = null;
-        if (sepCharIndex > -1) {
-            subPropName = attributeName.substring(sepCharIndex + 1);
-        }
-        return subPropName;
-    }
-
-    /**
-     * @param space namespace of element
-     * @param element name of element
-     * @param propertyName name of property
-     * @param p a Property object
-     * @param subpropName name of the sub-property to get
-     * @return the sub-property
-     */
-    public Property getSubpropValue(String space, String element,
-                                    String propertyName, Property p,
-                                    String subpropName) {
-        Property.Maker maker = findMaker(space, element, propertyName);
-        if (maker != null) {
-            return maker.getSubpropValue(p, subpropName);
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * @param propertyList collection of properties
-     * @param space namespace of element
-     * @param element name of element
-     * @param propertyName name of property
-     * @return value from the appropriate Property.Maker
-     */
-    public boolean isCorrespondingForced(PropertyList propertyList,
-                                         String space, String element,
-                                         String propertyName) {
-        Property.Maker propertyMaker = findMaker(space, element,
-                                                 propertyName);
-        if (propertyMaker != null) {
-            return propertyMaker.isCorrespondingForced(propertyList);
-        } else {
-            //log.error("no Maker for " + propertyName);
-        }
-        return false;
-    }
-
-    /**
-     * @param propertyList collection of properties
-     * @param space namespace of element
-     * @param element name of element
-     * @param propertyName name of property
-     * @return new Property object
-     */
-    public Property getShorthand(PropertyList propertyList, String space,
-                                 String element, String propertyName) {
-        Property.Maker propertyMaker = findMaker(space, element,
-                                                 propertyName);
-        if (propertyMaker != null) {
-            return propertyMaker.getShorthand(propertyList);
-        } else {
-            //log.error("no Maker for " + propertyName);
-            return null;
-        }
-    }
-
-    /**
-     * @param propertyList collection of properties
-     * @param space namespace of element
-     * @param element name of element
-     * @param propertyName name of property
-     * @return new Property object
-     * @throws FOPException for errors in the input
-     */
-    public Property makeProperty(PropertyList propertyList, String space,
-                                 String element,
-                                 String propertyName) throws FOPException {
-
-        Property p = null;
-
-        Property.Maker propertyMaker = findMaker(space, element,
-                                                 propertyName);
-        if (propertyMaker != null) {
-            p = propertyMaker.make(propertyList);
-        } else {
-            //log.error("property " + propertyName
-            //                       + " ignored");
-        }
-        return p;
-    }
-
-    /**
-     * @param space namespace of element
-     * @param elementName name of element
-     * @param propertyName name of property
-     * @return the Property.Maker for this property
-     */
-    protected Property.Maker findMaker(String space, String elementName,
-                                       String propertyName) {
-        return findMaker((HashMap)elementTable.get(elementName),
-                         propertyName);
-    }
-
-    /**
-     * Convenience function to return the Maker for a given property
-     * given the HashMap containing properties specific to this element.
-     * If table is non-null and
-     * @param elemTable Element-specific properties or null if none.
-     * @param propertyName Name of property.
-     * @return A Maker for this property.
-     */
-    private Property.Maker findMaker(HashMap elemTable,
-                                     String propertyName) {
-        Property.Maker propertyMaker = null;
-        if (elemTable != null) {
-            propertyMaker = (Property.Maker)elemTable.get(propertyName);
-        }
-        if (propertyMaker == null) {
-            propertyMaker =
-                (Property.Maker)propertyListTable.get(propertyName);
-        }
-        return propertyMaker;
-    }
-
-}