--- a/jdk/src/java.base/share/classes/java/util/ResourceBundle.java Fri Dec 09 21:25:54 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/ResourceBundle.java Fri Dec 09 16:38:34 2016 -0800
@@ -650,6 +650,7 @@
private Locale locale;
private KeyElementReference<ClassLoader> loaderRef;
private KeyElementReference<Module> moduleRef;
+ private KeyElementReference<Module> callerRef;
// bundle format which is necessary for calling
@@ -680,7 +681,7 @@
// Boolean.TRUE if the factory method caller provides a ResourceBundleProvier.
private Boolean callerHasProvider;
- CacheKey(String baseName, Locale locale, ClassLoader loader, Module module) {
+ CacheKey(String baseName, Locale locale, ClassLoader loader, Module module, Module caller) {
Objects.requireNonNull(module);
this.name = baseName;
@@ -691,6 +692,8 @@
this.loaderRef = new KeyElementReference<>(loader, referenceQueue, this);
}
this.moduleRef = new KeyElementReference<>(module, referenceQueue, this);
+ this.callerRef = new KeyElementReference<>(caller, referenceQueue, this);
+
calculateHashCode();
}
@@ -726,6 +729,10 @@
return moduleRef.get();
}
+ Module getCallerModule() {
+ return callerRef.get();
+ }
+
ServiceLoader<ResourceBundleProvider> getProviders() {
if (!providersChecked) {
providers = getServiceLoader(getModule(), name);
@@ -767,6 +774,8 @@
}
ClassLoader loader = getLoader();
Module module = getModule();
+ Module caller = getCallerModule();
+
return (otherEntry.loaderRef != null)
// with a null reference we can no longer find
// out which class loader or module was referenced; so
@@ -774,7 +783,9 @@
&& (loader != null)
&& (loader == otherEntry.getLoader())
&& (module != null)
- && (module.equals(otherEntry.getModule()));
+ && (module.equals(otherEntry.getModule()))
+ && (caller != null)
+ && (caller.equals(otherEntry.getCallerModule()));
} catch (NullPointerException | ClassCastException e) {
}
return false;
@@ -796,6 +807,10 @@
if (module != null) {
hashCodeCache ^= module.hashCode();
}
+ Module caller = getCallerModule();
+ if (caller != null) {
+ hashCodeCache ^= caller.hashCode();
+ }
}
@Override
@@ -808,6 +823,9 @@
}
clone.moduleRef = new KeyElementReference<>(getModule(),
referenceQueue, clone);
+ clone.callerRef = new KeyElementReference<>(getCallerModule(),
+ referenceQueue, clone);
+
// Clear the reference to ResourceBundleProviders and the flag
clone.providers = null;
clone.providersChecked = false;
@@ -1665,7 +1683,7 @@
// loader, and module will never change during the bundle loading
// process. We have to make sure that the locale is set before
// using it as a cache key.
- CacheKey cacheKey = new CacheKey(baseName, locale, loader, module);
+ CacheKey cacheKey = new CacheKey(baseName, locale, loader, module, callerModule);
ResourceBundle bundle = null;
// Quick lookup of the cache.
@@ -1869,7 +1887,7 @@
bundle = loadBundleFromProviders(baseName,
targetLocale,
cacheKey.getProviders(),
- cacheKey);
+ cacheKey);
}
}
@@ -2303,8 +2321,9 @@
private static void clearCache(ClassLoader loader, Module module) {
Set<CacheKey> set = cacheList.keySet();
- set.stream().filter((key) -> (key.getLoader() == loader && key.getModule() == module))
- .forEach(set::remove);
+ set.stream()
+ .filter((key) -> (key.getLoader() == loader && key.getModule() == module))
+ .forEach(set::remove);
}
/**