]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Adaptation of MarkerAttribute cache to use WeakHashMap
authorAndreas L. Delmelle <adelmelle@apache.org>
Sat, 23 Dec 2006 11:57:29 +0000 (11:57 +0000)
committerAndreas L. Delmelle <adelmelle@apache.org>
Sat, 23 Dec 2006 11:57:29 +0000 (11:57 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@489885 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/fo/flow/Marker.java

index 44b7bac743cd294bbb0e9de50235a38df8586ee2..8bc37dc3bc8a0a6a3e9a9be679c59706d7d9f9cb 100644 (file)
@@ -196,13 +196,8 @@ public class Marker extends FObjMixed {
                 name = attributes.getLocalName(i);
                 value = attributes.getValue(i);
                 
-                if (namespace == null || "".equals(namespace)) {
-                    this.attribs[i] = 
-                        MarkerAttribute.getFOAttributeInstance(name, value);
-                } else {
-                    this.attribs[i] = 
-                        new MarkerAttribute(namespace, qname, name, value);
-                }
+                this.attribs[i] = 
+                    MarkerAttribute.getInstance(namespace, qname, name, value);
             }
         }
         
@@ -374,8 +369,8 @@ public class Marker extends FObjMixed {
      */
     private static final class MarkerAttribute {
         
-        private static Map foAttributeCache = 
-            Collections.synchronizedMap(new java.util.HashMap());
+        private static Map attributeCache = 
+            Collections.synchronizedMap(new java.util.WeakHashMap());
 
         protected String namespace;
         protected String qname;
@@ -406,26 +401,40 @@ public class Marker extends FObjMixed {
          * @return the single MarkerAttribute instance corresponding to 
          *          the name/value-pair
          */
-        private static MarkerAttribute getFOAttributeInstance(
+        private static MarkerAttribute getInstance(
+                                            String namespace, String qname,
                                             String name, String value) {
-            MarkerAttribute newInstance = null;
-            Map valueCache;
-            if (!foAttributeCache.containsKey(name)) {
-                newInstance = new MarkerAttribute(null, name, name, value);
-                valueCache = Collections.synchronizedMap(
-                                new java.util.HashMap());
-                valueCache.put(value, newInstance);
-                foAttributeCache.put(name, valueCache);
+            MarkerAttribute newInstance = 
+                new MarkerAttribute(namespace, qname, name, value);
+            if (attributeCache.containsKey(newInstance)) {
+                return (MarkerAttribute) attributeCache.get(newInstance);
             } else {
-                valueCache = (Map) foAttributeCache.get(name);
-                if (valueCache.containsKey(value)) {
-                    newInstance = (MarkerAttribute) valueCache.get(value);
-                } else {
-                    newInstance = new MarkerAttribute(null, name, name, value);
-                    valueCache.put(value, newInstance);
-                }
+                attributeCache.put(newInstance, newInstance);
+                return newInstance;
+            }
+        }
+        
+        /**
+         * @see java.lang.Object#equals(Object)
+         */
+        public boolean equals(Object o) {
+            if (o instanceof MarkerAttribute) {
+                MarkerAttribute attr = (MarkerAttribute) o;
+                return ((attr.namespace == this.namespace)
+                            || (attr.namespace != null
+                                    && attr.namespace.equals(this.namespace)))
+                    && ((attr.qname == this.qname)
+                            || (attr.qname != null
+                                    && attr.qname.equals(this.qname)))
+                    && ((attr.name == this.name)
+                            || (attr.name != null
+                                    && attr.name.equals(this.name)))
+                    && ((attr.value == this.value)
+                            || (attr.value != null
+                                    && attr.value.equals(this.value)));
+            } else {
+                return false;
             }
-            return newInstance;
         }
     }
 }