Author: lukaszlenart Date: Fri Mar 4 06:46:42 2011 New Revision: 1077832 URL: http://svn.apache.org/viewvc?rev=1077832&view=rev Log: Solves WW-3550 - LocalizedTextUtil's messageFormats property should be a ConcurrentHashMap and clears unneeded synchronize() blocks
Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java?rev=1077832&r1=1077831&r2=1077832&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java (original) +++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java Fri Mar 4 06:46:42 2011 @@ -28,7 +28,13 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.MessageFormat; -import java.util.*; +import java.util.Enumeration; +import java.util.List; +import java.util.Locale; +import java.util.MissingResourceException; +import java.util.ResourceBundle; +import java.util.Set; +import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CopyOnWriteArrayList; @@ -85,10 +91,10 @@ public class LocalizedTextUtil { private static boolean reloadBundles = false; private static final ResourceBundle EMPTY_BUNDLE = new EmptyResourceBundle(); private static final ConcurrentMap<String, ResourceBundle> bundlesMap = new ConcurrentHashMap<String, ResourceBundle>(); - private static final Map<MessageFormatKey, MessageFormat> messageFormats = new HashMap<MessageFormatKey, MessageFormat>(); + private static final ConcurrentMap<MessageFormatKey, MessageFormat> messageFormats = new ConcurrentHashMap<MessageFormatKey, MessageFormat>(); private static ClassLoader delegatedClassLoader; - + static { clearDefaultResourceBundles(); } @@ -242,27 +248,21 @@ public class LocalizedTextUtil { try { if (!bundlesMap.containsKey(key)) { - bundle = ResourceBundle.getBundle( - aBundleName, - locale, - Thread.currentThread().getContextClassLoader()); + bundle = ResourceBundle.getBundle(aBundleName, locale, Thread.currentThread().getContextClassLoader()); bundlesMap.put(key, bundle); } bundle = bundlesMap.get(key); } catch (MissingResourceException ex) { - if ( delegatedClassLoader != null) { + if (delegatedClassLoader != null) { try { if (!bundlesMap.containsKey(key)) { - bundle = ResourceBundle.getBundle( - aBundleName, - locale, - delegatedClassLoader); + bundle = ResourceBundle.getBundle(aBundleName, locale, delegatedClassLoader); bundlesMap.put(key, bundle); } bundle = bundlesMap.get(key); - + } catch (MissingResourceException e) { bundle = EMPTY_BUNDLE; bundlesMap.put(key, bundle); @@ -292,9 +292,7 @@ public class LocalizedTextUtil { * @param bundleName */ public static void clearBundle(final String bundleName) { - synchronized (bundlesMap) { - bundlesMap.remove(bundleName); - } + bundlesMap.remove(bundleName); } @@ -305,10 +303,7 @@ public class LocalizedTextUtil { * @param locale the locale. * @return the key to use for lookup/storing in the bundle misses cache. */ - private static String createMissesKey - (String - aBundleName, Locale - locale) { + private static String createMissesKey(String aBundleName, Locale locale) { return aBundleName + "_" + locale.toString(); } @@ -318,11 +313,7 @@ public class LocalizedTextUtil { * * @see #findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args) */ - public static String findText - (Class - aClass, String - aTextName, Locale - locale) { + public static String findText(Class aClass, String aTextName, Locale locale) { return findText(aClass, aTextName, locale, aTextName, new Object[0]); } @@ -364,12 +355,7 @@ public class LocalizedTextUtil { * resource bundle * @return the localized text, or null if none can be found and no defaultMessage is provided */ - public static String findText - (Class - aClass, String - aTextName, Locale - locale, String - defaultMessage, Object[] args) { + public static String findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args) { ValueStack valueStack = ActionContext.getContext().getValueStack(); return findText(aClass, aTextName, locale, defaultMessage, args, valueStack); @@ -417,13 +403,8 @@ public class LocalizedTextUtil { * one in the ActionContext ThreadLocal * @return the localized text, or null if none can be found and no defaultMessage is provided */ - public static String findText - (Class - aClass, String - aTextName, Locale - locale, String - defaultMessage, Object[] args, ValueStack - valueStack) { + public static String findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args, + ValueStack valueStack) { String indexedTextName = null; if (aTextName == null) { LOG.warn("Trying to find text with null key!"); @@ -537,8 +518,7 @@ public class LocalizedTextUtil { } } } - } - catch (Exception e) { + } catch (Exception e) { LOG.debug("unable to find property " + prop, e); } } @@ -575,9 +555,7 @@ public class LocalizedTextUtil { * @param result the result so far * @return <tt>true</tt> if we could <b>not</b> find the text, <tt>false</tt> if the text was found (=success). */ - private static boolean unableToFindTextForKey - (GetDefaultMessageReturnArg - result) { + private static boolean unableToFindTextForKey(GetDefaultMessageReturnArg result) { if (result == null || result.message == null) { return true; } @@ -600,11 +578,7 @@ public class LocalizedTextUtil { * * @see #findText(java.util.ResourceBundle, String, java.util.Locale, String, Object[]) */ - public static String findText - (ResourceBundle - bundle, String - aTextName, Locale - locale) { + public static String findText(ResourceBundle bundle, String aTextName, Locale locale) { return findText(bundle, aTextName, locale, aTextName, new Object[0]); } @@ -623,12 +597,7 @@ public class LocalizedTextUtil { * @param defaultMessage the default message to use if no message was found in the bundle * @param args arguments for the message formatter. */ - public static String findText - (ResourceBundle - bundle, String - aTextName, Locale - locale, String - defaultMessage, Object[] args) { + public static String findText(ResourceBundle bundle, String aTextName, Locale locale, String defaultMessage, Object[] args) { ValueStack valueStack = ActionContext.getContext().getValueStack(); return findText(bundle, aTextName, locale, defaultMessage, args, valueStack); } @@ -649,13 +618,8 @@ public class LocalizedTextUtil { * @param args arguments for the message formatter. * @param valueStack the OGNL value stack. */ - public static String findText - (ResourceBundle - bundle, String - aTextName, Locale - locale, String - defaultMessage, Object[] args, ValueStack - valueStack) { + public static String findText(ResourceBundle bundle, String aTextName, Locale locale, String defaultMessage, Object[] args, + ValueStack valueStack) { try { reloadBundles(); @@ -677,12 +641,8 @@ public class LocalizedTextUtil { /** * Gets the default message. */ - private static GetDefaultMessageReturnArg getDefaultMessage - (String - key, Locale - locale, ValueStack - valueStack, Object[] args, String - defaultMessage) { + private static GetDefaultMessageReturnArg getDefaultMessage(String key, Locale locale, ValueStack valueStack, Object[] args, + String defaultMessage) { GetDefaultMessageReturnArg result = null; boolean found = true; @@ -709,12 +669,7 @@ public class LocalizedTextUtil { /** * Gets the message from the named resource bundle. */ - private static String getMessage - (String - bundleName, Locale - locale, String - key, ValueStack - valueStack, Object[] args) { + private static String getMessage(String bundleName, Locale locale, String key, ValueStack valueStack, Object[] args) { ResourceBundle bundle = findResourceBundle(bundleName, locale); if (bundle == null) { return null; @@ -740,20 +695,14 @@ public class LocalizedTextUtil { } } - private static MessageFormat buildMessageFormat - (String - pattern, Locale - locale) { + private static MessageFormat buildMessageFormat(String pattern, Locale locale) { MessageFormatKey key = new MessageFormatKey(pattern, locale); - MessageFormat format = null; - synchronized (messageFormats) { - format = (MessageFormat) messageFormats.get(key); - if (format == null) { - format = new MessageFormat(pattern); - format.setLocale(locale); - format.applyPattern(pattern); - messageFormats.put(key, format); - } + MessageFormat format = messageFormats.get(key); + if (format == null) { + format = new MessageFormat(pattern); + format.setLocale(locale); + format.applyPattern(pattern); + messageFormats.put(key, format); } return format; @@ -763,14 +712,8 @@ public class LocalizedTextUtil { * Traverse up class hierarchy looking for message. Looks at class, then implemented interface, * before going up hierarchy. */ - private static String findMessage - (Class - clazz, String - key, String - indexedKey, Locale - locale, Object[] args, Set<String> - checked, ValueStack - valueStack) { + private static String findMessage(Class clazz, String key, String indexedKey, Locale locale, Object[] args, Set<String> checked, + ValueStack valueStack) { if (checked == null) { checked = new TreeSet<String>(); } else if (checked.contains(clazz.getName())) { @@ -839,8 +782,7 @@ public class LocalizedTextUtil { // now, for the true and utter hack, if we're running in tomcat, clear // it's class loader resource cache as well. clearTomcatCache(); - } - catch (Exception e) { + } catch (Exception e) { LOG.error("Could not reload resource bundles", e); } } @@ -860,20 +802,15 @@ public class LocalizedTextUtil { LOG.debug("class loader " + cl.getName() + " is not tomcat loader."); } } - } - catch (Exception e) { + } catch (Exception e) { LOG.warn("couldn't clear tomcat cache", e); } } - private static void clearMap - (Class - cl, Object - obj, String - name) - throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, - InvocationTargetException { + private static void clearMap(Class cl, Object obj, String name) + throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { + Field field = cl.getDeclaredField(name); field.setAccessible(true); @@ -884,21 +821,15 @@ public class LocalizedTextUtil { Method clearMethod = ccl.getMethod("clear"); clearMethod.invoke(cache); } - } /** * Clears all the internal lists. */ - public static void reset - () { + public static void reset() { clearDefaultResourceBundles(); - bundlesMap.clear(); - - synchronized (messageFormats) { - messageFormats.clear(); - } + messageFormats.clear(); } static class MessageFormatKey {