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 {


Reply via email to