< prev index next >

src/java.base/share/classes/java/util/ResourceBundle.java

Print this page

        

@@ -648,10 +648,11 @@
         // These four are the actual keys for lookup in Map.
         private String name;
         private Locale locale;
         private KeyElementReference<ClassLoader> loaderRef;
         private KeyElementReference<Module> moduleRef;
+        private KeyElementReference<Module> callerRef;
 
 
         // bundle format which is necessary for calling
         // Control.needsReload().
         private String format;

@@ -678,21 +679,23 @@
         private boolean providersChecked;
 
         // 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;
             this.locale = locale;
             if (loader == null) {
                 this.loaderRef = null;
             } else {
                 this.loaderRef = new KeyElementReference<>(loader, referenceQueue, this);
             }
             this.moduleRef = new KeyElementReference<>(module, referenceQueue, this);
+            this.callerRef = new KeyElementReference<>(caller, referenceQueue, this);
+
             calculateHashCode();
         }
 
         String getName() {
             return name;

@@ -724,10 +727,14 @@
 
         Module getModule() {
             return moduleRef.get();
         }
 
+        Module getCallerModule() {
+            return callerRef.get();
+        }
+
         ServiceLoader<ResourceBundleProvider> getProviders() {
             if (!providersChecked) {
                 providers = getServiceLoader(getModule(), name);
                 providersChecked = true;
             }

@@ -765,18 +772,22 @@
                 if (loaderRef == null) {
                     return otherEntry.loaderRef == null;
                 }
                 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
                         // treat it as unequal
                         && (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;
         }
 

@@ -794,10 +805,14 @@
             }
             Module module = getModule();
             if (module != null) {
                 hashCodeCache ^= module.hashCode();
             }
+            Module caller = getCallerModule();
+            if (caller != null) {
+                hashCodeCache ^= caller.hashCode();
+            }
         }
 
         @Override
         public Object clone() {
             try {

@@ -806,10 +821,13 @@
                     clone.loaderRef = new KeyElementReference<>(getLoader(),
                                                                 referenceQueue, clone);
                 }
                 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;
                 // Clear the reference to a Throwable
                 clone.cause = null;

@@ -1663,11 +1681,11 @@
 
         // We create a CacheKey here for use by this call. The base name
         // 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.
         BundleReference bundleRef = cacheList.get(cacheKey);
         if (bundleRef != null) {

@@ -2301,11 +2319,12 @@
         clearCache(module.getClassLoader(), module);
     }
 
     private static void clearCache(ClassLoader loader, Module module) {
         Set<CacheKey> set = cacheList.keySet();
-        set.stream().filter((key) -> (key.getLoader() == loader && key.getModule() == module))
+        set.stream()
+           .filter((key) -> (key.getLoader() == loader && key.getModule() == module))
                 .forEach(set::remove);
     }
 
     /**
      * Gets an object for the given key from this resource bundle.
< prev index next >