]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Tweak:
authorAndreas L. Delmelle <adelmelle@apache.org>
Thu, 8 May 2008 13:56:14 +0000 (13:56 +0000)
committerAndreas L. Delmelle <adelmelle@apache.org>
Thu, 8 May 2008 13:56:14 +0000 (13:56 +0000)
-> add 'runtimeType' member and toString() to PropertyCache to facilitate debugging
-> modify the initial assignment in the related Property types accordingly

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

13 files changed:
src/java/org/apache/fop/fo/properties/BackgroundPositionShorthand.java
src/java/org/apache/fop/fo/properties/CharacterProperty.java
src/java/org/apache/fop/fo/properties/ColorProperty.java
src/java/org/apache/fop/fo/properties/CommonFont.java
src/java/org/apache/fop/fo/properties/CommonHyphenation.java
src/java/org/apache/fop/fo/properties/EnumNumber.java
src/java/org/apache/fop/fo/properties/EnumProperty.java
src/java/org/apache/fop/fo/properties/FixedLength.java
src/java/org/apache/fop/fo/properties/FontFamilyProperty.java
src/java/org/apache/fop/fo/properties/KeepProperty.java
src/java/org/apache/fop/fo/properties/NumberProperty.java
src/java/org/apache/fop/fo/properties/PropertyCache.java
src/java/org/apache/fop/fo/properties/StringProperty.java

index de74d4be6b88433597726845d4cf9670d7a82ec0..6307ad1c564996be7eb1bbf1a37bbfa1188c37e9 100644 (file)
@@ -41,7 +41,11 @@ public class BackgroundPositionShorthand extends ListProperty {
      */
     public static class Maker extends ListProperty.Maker {
 
-        /** {@inheritDoc} */
+        /**
+         * Construct an instance of a Maker for the given property.
+         * 
+         * @param propId The Constant ID of the property to be made.
+         */
         public Maker(int propId) {
             super(propId);
         }
@@ -72,7 +76,7 @@ public class BackgroundPositionShorthand extends ListProperty {
          * Returns a {@link org.apache.fop.datatypes.PercentBase} whose
          * <code>getDimension()</code> returns 1.
          */
-        public PercentBase getPercentBase() {
+        public PercentBase getPercentBase(PropertyList pl) {
             return new PercentBase() {
                 /** {@inheritDoc} */
                 public int getBaseLength(PercentBaseContext context) throws PropertyException {
index 1496f5f861665addd51c818c7e2666fd8b120509..f42591fe86c6188d2193ab2a8fdaa32807cf9a32 100644 (file)
@@ -48,7 +48,7 @@ public final class CharacterProperty extends Property {
     }
 
     /** cache containing all canonical CharacterProperty instances */
-    private static final PropertyCache cache = new PropertyCache();
+    private static final PropertyCache cache = new PropertyCache(CharacterProperty.class);
 
     private final char character;
 
index de648420b0f84f83a8b6adb29cea236eb9197584..a2a3d21506069a447c171e3ffc04b7627e994457 100644 (file)
@@ -33,7 +33,7 @@ import org.apache.fop.util.ColorUtil;
 public final class ColorProperty extends Property  {
     
     /** cache holding canonical ColorProperty instances */
-    private static final PropertyCache cache = new PropertyCache();
+    private static final PropertyCache cache = new PropertyCache(ColorProperty.class);
     
     /**
      * The color represented by this property.
@@ -92,6 +92,8 @@ public final class ColorProperty extends Property  {
      * 
      * @param foUserAgent FOP user agent
      * @param value RGB value as String to be parsed
+     * @return the canonical ColorProperty instance corresponding 
+     *         to the given value
      * @throws PropertyException if the value can't be parsed
      * @see ColorUtil#parseColorString(FOUserAgent, String)
      */
@@ -99,18 +101,9 @@ public final class ColorProperty extends Property  {
         ColorProperty instance = new ColorProperty(
                                        ColorUtil.parseColorString(
                                                foUserAgent, value));
-        return (ColorProperty) cache.fetch(instance);
+        return (ColorProperty)cache.fetch(instance);
     }
 
-    /**
-     * Returns an instance of a color property given a color
-     * @param color the color value
-     * @return the color property
-     */
-    public static ColorProperty getInstance(Color color) {
-        return (ColorProperty) cache.fetch(new ColorProperty(color));
-    }
-    
     /**
      * Create a new ColorProperty with a given color.
      * 
index a2d01ffa36a2eeb01d2e40caa2c4d2384a90d576..1e3f8d43d2f3c7f3378d9f9d7f807ffc11232943 100755 (executable)
@@ -37,7 +37,7 @@ public final class CommonFont {
 
     /** cache holding canonical CommonFont instances (only those with
      *  absolute font-size and font-size-adjust) */
-    private static final PropertyCache cache = new PropertyCache();
+    private static final PropertyCache cache = new PropertyCache(CommonFont.class);
     
     /**
      * Class holding canonical instances of bundles of the
@@ -47,7 +47,7 @@ public final class CommonFont {
     protected static final class CachedCommonFont {
         
         /** cache holding all canonical instances */
-        private static final PropertyCache cache = new PropertyCache();
+        private static final PropertyCache cache = new PropertyCache(CachedCommonFont.class);
         
         private int hash = 0;
         
index dfafa3b16539e2bcbfd74908901f49b700a5c63c..a294b2bbde99341c365b61fb4edb7c8eefb0baab 100644 (file)
@@ -38,7 +38,7 @@ public final class CommonHyphenation {
     /** Logger */
     protected static Log log = LogFactory.getLog(CommonHyphenation.class);
     
-    private static final PropertyCache cache = new PropertyCache();
+    private static final PropertyCache cache = new PropertyCache(CommonHyphenation.class);
     
     private int hash = 0;
     
index 2cfc67f279aeb7de63db81f66fc75d85ed6988aa..5e60b4e3501cc4efd67c6ac125b2829721b88bea 100755 (executable)
@@ -29,7 +29,7 @@ import org.apache.fop.fo.expr.PropertyException;
 public final class EnumNumber extends Property implements Numeric {
 
     /** cache holding all canonical EnumNumber instances */
-    private static final PropertyCache cache = new PropertyCache();
+    private static final PropertyCache cache = new PropertyCache(EnumNumber.class);
 
     private final EnumProperty enumProperty;
     
index 328ed85a95ff31792e2a28ac6b3b66945cc46a78..d3043c5c30952934a5ebb10cfa14948182475fa0 100644 (file)
@@ -29,7 +29,7 @@ import org.apache.fop.fo.expr.PropertyException;
 public final class EnumProperty extends Property {
     
     /** cache holding all canonical EnumProperty instances */
-    private static final PropertyCache cache = new PropertyCache();
+    private static final PropertyCache cache = new PropertyCache(EnumProperty.class);
 
     /**
      * Inner class for creating EnumProperty instances
index 6debdd145cdd1b2d086efe73a9d4ee8bf3928280..5636a4225ecc49efbc3a49ad42ec93080f3b0344 100644 (file)
@@ -45,7 +45,7 @@ public final class FixedLength extends LengthProperty {
     public static final String MPT = "mpt";
 
     /** cache holding all canonical FixedLength instances */
-    private static final PropertyCache cache = new PropertyCache();
+    private static final PropertyCache cache = new PropertyCache(FixedLength.class);
     
     /** canonical zero-length instance */
     public static final FixedLength ZERO_FIXED_LENGTH = new FixedLength(0, FixedLength.MPT, 1.0f);
index 610882aa4f069cee7189872afe610e883e3db98b..7404dbe9b3c3bbe6dbc1530f5260cb13b7dc981c 100644 (file)
@@ -31,7 +31,7 @@ import org.apache.fop.fo.expr.PropertyException;
 public final class FontFamilyProperty extends ListProperty {
 
     /** cache holding all canonical FontFamilyProperty instances */
-    private static final PropertyCache cache = new PropertyCache();
+    private static final PropertyCache cache = new PropertyCache(FontFamilyProperty.class);
     
     private int hash = 0;
     
index 2701c3f5972fba63a5d06424d44a9ed7d0113308..67961b6e56df2dafad9b9ac0d06633c11682de1e 100644 (file)
@@ -30,7 +30,7 @@ import org.apache.fop.fo.expr.PropertyException;
 public final class KeepProperty extends Property implements CompoundDatatype {
     
     /** class holding all canonical KeepProperty instances*/
-    private static final PropertyCache cache = new PropertyCache();
+    private static final PropertyCache cache = new PropertyCache(KeepProperty.class);
     
     private boolean isCachedValue = false;
     private Property withinLine;
index 58400d76e0adc8062bdb5926d61742f77b7ce0a8..0ba5300ae4757ab26bbfff2ba6b7ea5e31a60839 100644 (file)
@@ -103,7 +103,7 @@ public final class NumberProperty extends Property implements Numeric {
     }
     
     /** cache holding all canonical NumberProperty instances */
-    private static final PropertyCache cache = new PropertyCache();
+    private static final PropertyCache cache = new PropertyCache(NumberProperty.class);
     
     private final Number number;
 
index 26ec2e611ccba7cf5fce0130e4fc257d966a98ed..2c51bc0818a6f31effd22a2946c192049af81658 100644 (file)
@@ -42,7 +42,9 @@ public final class PropertyCache {
     /** the table of hash-buckets */
     private CacheEntry[] table = new CacheEntry[8];
     
-    boolean[] votesForRehash = new boolean[SEGMENT_MASK + 1];
+    private Class runtimeType;
+    
+    final boolean[] votesForRehash = new boolean[SEGMENT_MASK + 1];
     
     /* same hash function as used by java.util.HashMap */
     private static int hash(Object x) {
@@ -80,10 +82,10 @@ public final class PropertyCache {
     /* Wrapper objects to synchronize on */
     private final class CacheSegment {
         private int count = 0;
-        private ReferenceQueue staleEntries = new ReferenceQueue();
+        private volatile ReferenceQueue staleEntries = new ReferenceQueue();
     }    
     
-    private final void cleanSegment(int segmentIndex) {
+    private void cleanSegment(int segmentIndex) {
         CacheEntry entry;
         CacheSegment segment = segments[segmentIndex];
         int bucketIndex;
@@ -113,29 +115,26 @@ public final class PropertyCache {
         }
         synchronized (votesForRehash) {
             if (oldCount > segment.count) {
-                if (votesForRehash[segmentIndex]) {
-                    votesForRehash[segmentIndex] = false;
-                }
+                votesForRehash[segmentIndex] = false;
                 return;
-            } else {
-                /* cleanup had no effect */
-                if (!votesForRehash[segmentIndex]) {
-                    /* first time for this segment */
-                    votesForRehash[segmentIndex] = true;
-                    int voteCount = 0;
-                    for (int i = SEGMENT_MASK + 1; --i >= 0; ) {
-                        if (votesForRehash[i]) {
-                            voteCount++;
-                        }
+            }
+            /* cleanup had no effect */
+            if (!votesForRehash[segmentIndex]) {
+                /* first time for this segment */
+                votesForRehash[segmentIndex] = true;
+                int voteCount = 0;
+                for (int i = SEGMENT_MASK + 1; --i >= 0; ) {
+                    if (votesForRehash[i]) {
+                        voteCount++;
                     }
-                    if (voteCount > SEGMENT_MASK / 4) {
-                        rehash(SEGMENT_MASK);
-                        /* reset votes */
-                        for (int i = SEGMENT_MASK + 1; --i >= 0;) {
-                            votesForRehash[i] = false;
-                        }
-    
+                }
+                if (voteCount > SEGMENT_MASK / 4) {
+                    rehash(SEGMENT_MASK);
+                    /* reset votes */
+                    for (int i = SEGMENT_MASK + 1; --i >= 0;) {
+                        votesForRehash[i] = false;
                     }
+
                 }
             }
         }
@@ -148,7 +147,7 @@ public final class PropertyCache {
      * cleanup will be performed to try and remove obsolete
      * entries.
      */
-    private final void put(Object o) {
+    private void put(Object o) {
         
         int hash = hash(o);
         CacheSegment segment = segments[hash & SEGMENT_MASK];
@@ -180,7 +179,7 @@ public final class PropertyCache {
     
 
     /* Gets a cached instance. Returns null if not found */
-    private final Object get(Object o) {
+    private Object get(Object o) {
         
         int hash = hash(o);
         int index = hash & (table.length - 1);
@@ -219,7 +218,7 @@ public final class PropertyCache {
      * extends the cache and redistributes the entries.
      * 
      */
-    private final void rehash(int index) {
+    private void rehash(int index) {
         
         CacheSegment seg = segments[index];
         synchronized (seg) {
@@ -258,12 +257,15 @@ public final class PropertyCache {
     }
     
     /**
-     *  Default constructor. 
+     *  Default constructor.
+     *  
+     *  @param c    Runtime type of the objects that will be stored in the cache
      */
-    public PropertyCache() {
+    public PropertyCache(Class c) {
         for (int i = SEGMENT_MASK + 1; --i >= 0;) {
             segments[i] = new CacheSegment();
         }
+        this.runtimeType = c;
     }
     
     /**
@@ -275,7 +277,7 @@ public final class PropertyCache {
      *  @param obj   the Object to check for
      *  @return  the cached instance
      */
-    private final Object fetch(Object obj) {
+    private Object fetch(Object obj) {
         if (obj == null) {
             return null;
         }
@@ -339,4 +341,11 @@ public final class PropertyCache {
         
         return (CommonFont) fetch((Object) cf);
     }
+
+    /** {@inheritDoc} */
+    public String toString() {
+        return super.toString() + "[runtimeType=" + this.runtimeType + "]";
+    }
+    
+    
 }
index f84a76c830eddfc0e15ee54d2614d5da810ca8cc..194170fecbddfe8780b39ad87342677e7ca7e1b0 100644 (file)
@@ -72,13 +72,16 @@ public final class StringProperty extends Property {
                     value = str;
                 }
             }
-            return new StringProperty(value);
+            return StringProperty.getInstance(value);
         }
 
-    }    // end String.Maker
+    }
 
     /** cache containing all canonical StringProperty instances */
-    private static final PropertyCache cache = new PropertyCache();
+    private static final PropertyCache cache = new PropertyCache(StringProperty.class);
+    
+    /** canonical instance for empty strings */
+    public static final StringProperty EMPTY_STRING_PROPERTY = new StringProperty("");
     
     private final String str;
 
@@ -97,40 +100,38 @@ public final class StringProperty extends Property {
      * @return  the canonical instance
      */
     public static StringProperty getInstance(String str) {
-        return (StringProperty)cache.fetch(
-                   new StringProperty(str));
+        if ("".equals(str) || str == null) {
+            return EMPTY_STRING_PROPERTY;
+        } else {
+            return (StringProperty)cache.fetch(
+                       new StringProperty(str));
+        }
     }
     
-    /**
-     * @return the Object equivalent of this property
-     */
+    /** @return the Object equivalent of this property */
     public Object getObject() {
         return this.str;
     }
 
-    /**
-     * @return the String equivalent of this property
-     */
+    /** @return the String equivalent of this property */
     public String getString() {
         return this.str;
     }
 
-    /**
-     * {@inheritDoc}
-     */
+    /** {@inheritDoc} */
     public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
         if (obj instanceof StringProperty) {
             StringProperty sp = (StringProperty)obj;
             return (sp.str == this.str
                     || sp.str.equals(this.str));
-        } else {
-            return false;
         }
+        return false;
     }
     
-    /**
-     * {@inheritDoc}
-     */
+    /** {@inheritDoc} */
     public int hashCode() {
         return str.hashCode();
     }