You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by do...@apache.org on 2010/02/22 16:39:40 UTC

svn commit: r912624 - /ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java

Author: doogie
Date: Mon Feb 22 15:39:40 2010
New Revision: 912624

URL: http://svn.apache.org/viewvc?rev=912624&view=rev
Log:
Use an internal key class, which shares the same character array, as the
key in the cache.

Modified:
    ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java?rev=912624&r1=912623&r2=912624&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java Mon Feb 22 15:39:40 2010
@@ -55,7 +55,7 @@
     public static final String module = FlexibleStringExpander.class.getName();
     public static final String openBracket = "${";
     public static final String closeBracket = "}";
-    protected static final UtilCache<String, FlexibleStringExpander> exprCache = UtilCache.createUtilCache("flexibleStringExpander.ExpressionCache");
+    protected static final UtilCache<Key, FlexibleStringExpander> exprCache = UtilCache.createUtilCache("flexibleStringExpander.ExpressionCache");
     protected static final FlexibleStringExpander nullExpr = new ConstSimpleElem(new char[0]);
 
     /** Evaluate an expression and return the result as a <code>String</code>.
@@ -179,16 +179,57 @@
                 return new ConstOffsetElem(chars, offset, length);
             }
         }
-        FlexibleStringExpander fse = exprCache.get(expression);
+        Key key = chars.length == length ? new SimpleKey(chars) : new OffsetKey(chars, offset, length);
+        FlexibleStringExpander fse = exprCache.get(key);
         if (fse == null) {
             synchronized (exprCache) {
                 fse = parse(chars, offset, length);
-                exprCache.put(expression, fse);
+                exprCache.put(key, fse);
             }
         }
         return fse;
     }
 
+    private static abstract class Key {
+        public final boolean equals(Object o) {
+            // No class test here, nor null, as this class is only used
+            // internally
+            return toString().equals(o.toString());
+        }
+
+        public final int hashCode() {
+            return toString().hashCode();
+        }
+    }
+
+    private static final class SimpleKey extends Key {
+        private final char[] chars;
+
+        protected SimpleKey(char[] chars) {
+            this.chars = chars;
+        }
+
+        public String toString() {
+            return new String(chars);
+        }
+    }
+
+    private static final class OffsetKey extends Key {
+        private final char[] chars;
+        private final int offset;
+        private final int length;
+
+        protected OffsetKey(char[] chars, int offset, int length) {
+            this.chars = chars;
+            this.offset = offset;
+            this.length = length;
+        }
+
+        public String toString() {
+            return new String(chars, offset, length);
+        }
+    }
+
     private static FlexibleStringExpander parse(char[] chars, int offset, int length) {
         FlexibleStringExpander[] strElems = getStrElems(chars, offset, length);
         if (strElems.length == 1) {