|
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) { |
| Free forum by Nabble | Edit this page |
