Removed unused code, comments and variables. Also, added delegatedClassLoaderMap to handle delegatedClassLoader as per Tomcat.

This commit is contained in:
Luigi Fugaro
2014-07-29 18:44:50 +02:00
parent 4586d1f148
commit c826d97caf
@@ -87,14 +87,12 @@ import java.util.concurrent.ConcurrentMap;
public class LocalizedTextUtil {
private static final ConcurrentMap<Integer, List<String>> classLoaderMap = new ConcurrentHashMap<Integer, List<String>>();
// private static final List<String> DEFAULT_RESOURCE_BUNDLES = new CopyOnWriteArrayList<String>();
private static final Logger LOG = LoggerFactory.getLogger(LocalizedTextUtil.class);
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 ConcurrentMap<MessageFormatKey, MessageFormat> messageFormats = new ConcurrentHashMap<MessageFormatKey, MessageFormat>();
private static final ConcurrentMap<Integer, ClassLoader> delegatedClassLoaderMap = new ConcurrentHashMap<Integer, ClassLoader>();
private static ClassLoader delegatedClassLoader;
private static final String RELOADED = "com.opensymphony.xwork2.util.LocalizedTextUtil.reloaded";
private static final String XWORK_MESSAGES_BUNDLE = "com/opensymphony/xwork2/xwork-messages";
@@ -107,9 +105,7 @@ public class LocalizedTextUtil {
* Clears the internal list of resource bundles.
*/
public static void clearDefaultResourceBundles() {
// DEFAULT_RESOURCE_BUNDLES.clear();
// DEFAULT_RESOURCE_BUNDLES.add(XWORK_MESSAGES_BUNDLE);
ClassLoader ccl = Thread.currentThread().getContextClassLoader();
ClassLoader ccl = getThreadCurrentThreadGetContextClassLoader();
List<String> bundles = new ArrayList<String>();
classLoaderMap.put(ccl.hashCode(), bundles);
bundles.add(0, XWORK_MESSAGES_BUNDLE);
@@ -133,8 +129,9 @@ public class LocalizedTextUtil {
*/
public static void addDefaultResourceBundle(String resourceBundleName) {
//make sure this doesn't get added more than once
ClassLoader ccl = null;
synchronized (classLoaderMap) {
ClassLoader ccl = Thread.currentThread().getContextClassLoader();
ccl = getThreadCurrentThreadGetContextClassLoader();
List<String> bundles = classLoaderMap.get(ccl.hashCode());
if (bundles == null) {
bundles = new ArrayList<String>();
@@ -146,7 +143,7 @@ public class LocalizedTextUtil {
}
if (LOG.isDebugEnabled()) {
//LOG.debug("Added default resource bundle '" + resourceBundleName + "' to default resource bundles = " + DEFAULT_RESOURCE_BUNDLES);
LOG.debug("Added default resource bundle '" + resourceBundleName + "' to default resource bundles for the following classloader " + ccl.toString());
}
}
@@ -201,7 +198,7 @@ public class LocalizedTextUtil {
* @return a localized message based on the specified key, or null if no localized message can be found for it
*/
public static String findDefaultText(String aTextName, Locale locale) {
List<String> localList = classLoaderMap.get(Thread.currentThread().getContextClassLoader().hashCode());
List<String> localList = classLoaderMap.get(getThreadCurrentThreadGetContextClassLoader().hashCode());
for (String bundleName : localList) {
ResourceBundle bundle = findResourceBundle(bundleName, locale);
@@ -240,8 +237,6 @@ public class LocalizedTextUtil {
* Finds the given resorce bundle by it's name.
* <p/>
* Will use <code>Thread.currentThread().getContextClassLoader()</code> as the classloader.
* If {@link #delegatedClassLoader} is defined and the bundle cannot be found the current
* classloader it will delegate to that.
*
* @param aBundleName the name of the bundle (usually it's FQN classname).
* @param locale the locale.
@@ -250,34 +245,32 @@ public class LocalizedTextUtil {
public static ResourceBundle findResourceBundle(String aBundleName, Locale locale) {
String key = createMissesKey(aBundleName, locale);
ResourceBundle bundle;
ResourceBundle bundle = null;
ClassLoader classLoader = getThreadCurrentThreadGetContextClassLoader();
try {
key = classLoader.hashCode()+key;
if (!bundlesMap.containsKey(key)) {
bundle = ResourceBundle.getBundle(aBundleName, locale, Thread.currentThread().getContextClassLoader());
bundle = ResourceBundle.getBundle(aBundleName, locale, classLoader);
bundlesMap.putIfAbsent(key, bundle);
} else {
bundle = bundlesMap.get(key);
}
} catch (MissingResourceException ex) {
if (delegatedClassLoader != null) {
if (delegatedClassLoaderMap.containsKey(classLoader.hashCode())) {
try {
if (!bundlesMap.containsKey(key)) {
bundle = ResourceBundle.getBundle(aBundleName, locale, delegatedClassLoader);
bundle = ResourceBundle.getBundle(aBundleName, locale, delegatedClassLoaderMap.get(classLoader.hashCode()));
bundlesMap.putIfAbsent(key, bundle);
} else {
bundle = bundlesMap.get(key);
}
} catch (MissingResourceException e) {
bundle = EMPTY_BUNDLE;
// bundlesMap.putIfAbsent(key, bundle);
}
} else {
bundle = EMPTY_BUNDLE;
// bundlesMap.putIfAbsent(key, bundle);
}
}
return (bundle == EMPTY_BUNDLE) ? null : bundle;
return bundle;
}
/**
@@ -287,7 +280,7 @@ public class LocalizedTextUtil {
*/
public static void setDelegatedClassLoader(final ClassLoader classLoader) {
synchronized (bundlesMap) {
delegatedClassLoader = classLoader;
delegatedClassLoaderMap.put(getThreadCurrentThreadGetContextClassLoader().hashCode(), classLoader);
}
}
@@ -297,7 +290,7 @@ public class LocalizedTextUtil {
* @param bundleName
*/
public static void clearBundle(final String bundleName) {
bundlesMap.remove(bundleName);
bundlesMap.remove(getThreadCurrentThreadGetContextClassLoader().hashCode() + bundleName);
}
@@ -819,7 +812,7 @@ public class LocalizedTextUtil {
private static void clearTomcatCache() {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
ClassLoader loader = getThreadCurrentThreadGetContextClassLoader();
// no need for compilation here.
Class cl = loader.getClass();
@@ -896,6 +889,10 @@ public class LocalizedTextUtil {
}
}
private static ClassLoader getThreadCurrentThreadGetContextClassLoader() {
return Thread.currentThread().getContextClassLoader();
}
static class GetDefaultMessageReturnArg {
String message;
boolean foundInBundle;