Class ShadowResourceBundle

java.lang.Object
java.util.ResourceBundle
org.eigenbase.resgen.ShadowResourceBundle

public abstract class ShadowResourceBundle extends ResourceBundle
ShadowResourceBundle is an abstract base class for ResourceBundle classes which are backed by a properties file. When the class is created, it loads a properties file with the same name as the class.

In the standard scheme (see ResourceBundle), if you call ResourceBundle.getBundle(java.lang.String)("foo.MyResource"), it first looks for a class called foo.MyResource, then looks for a file called foo/MyResource.properties. If it finds the file, it creates a PropertyResourceBundle and loads the class. The problem is if you want to load the .properties file into a dedicated class; ShadowResourceBundle helps with this case.

You should create a class as follows:

package foo;
class MyResource extends org.eigenbase.resgen.ShadowResourceBundle {
    public MyResource() throws java.io.IOException {
    }
}
Then when you call ResourceBundle.getBundle("foo.MyResource"), it will find the class before the properties file, but still automatically load the properties file based upon the name of the class.
  • Field Details

    • emptyObjectArray

      protected static final Object[] emptyObjectArray
  • Constructor Details

    • ShadowResourceBundle

      protected ShadowResourceBundle() throws IOException
      Creates a ShadowResourceBundle, and reads resources from a .properties file with the same name as the current class. For example, if the class is called foo.MyResource_en_US, reads from foo/MyResource_en_US.properties, then foo/MyResource_en.properties, then foo/MyResource.properties.
      Throws:
      IOException
  • Method Details

    • getKeys

      public Enumeration getKeys()
      Specified by:
      getKeys in class ResourceBundle
    • handleGetObject

      protected Object handleGetObject(String key) throws MissingResourceException
      Specified by:
      handleGetObject in class ResourceBundle
      Throws:
      MissingResourceException
    • instance

      protected static ResourceBundle instance(String baseName)
      Deprecated.
      This method does not work correctly in dynamically loaded jars.
      Returns the instance of the baseName resource bundle for the current thread's locale. For example, if called with "mondrian.olap.MondrianResource", from a thread which has called setThreadLocale(java.util.Locale)(Locale.FRENCH), will get an instance of "mondrian.olap.MondrianResource_FR" from the cache.

      This method should be called from a derived class, with the proper casting:

      class MyResource extends ShadowResourceBundle {
          ...
          /**
            * Retrieves the instance of {@link MyResource} appropriate
            * to the current locale. If this thread has specified a locale
            * by calling {@link #setThreadLocale}, this locale is used,
            * otherwise the default locale is used.
            **/
          public static MyResource instance() {
             return (MyResource) instance(MyResource.class.getName());
          }
          ...
       }
    • instance

      protected static ShadowResourceBundle instance(String baseName, Locale locale)
      Deprecated.
      This method does not work correctly in dynamically loaded jars.
      Returns the instance of the baseName resource bundle for the given locale.

      This method should be called from a derived class, with the proper casting:

      class MyResource extends ShadowResourceBundle {
          ...
      
          /**
            * Retrieves the instance of {@link MyResource} appropriate
            * to the given locale.
            **/
          public static MyResource instance(Locale locale) {
             return (MyResource) instance(MyResource.class.getName(), locale);
          }
          ...
       }
    • instance

      protected static ShadowResourceBundle instance(String baseName, Locale locale, ResourceBundle bundle)
      Returns the instance of the baseName resource bundle for the given locale.

      This method should be called from a derived class, with the proper casting:

      class MyResource extends ShadowResourceBundle {
          ...
      
          /**
            * Retrieves the instance of {@link MyResource} appropriate
            * to the given locale.
            **/
          public static MyResource instance(Locale locale) {
             return (MyResource) instance(
                 MyResource.class.getName(), locale,
                 ResourceBundle.getBundle(MyResource.class.getName(), locale));
          }
          ...
       }
    • getThreadOrDefaultLocale

      protected static Locale getThreadOrDefaultLocale()
      Returns the preferred locale of the current thread, or the default locale if the current thread has not called setThreadLocale(java.util.Locale).
    • setThreadLocale

      public static void setThreadLocale(Locale locale)
      Sets the locale for the current thread. Used by instance(String,Locale).
    • getThreadLocale

      public static Locale getThreadLocale()
      Returns the preferred locale of the current thread, or null if the thread has not called setThreadLocale(java.util.Locale).