Module org.hsqldb
Package org.hsqldb.lib

## Class RefCapablePropertyResourceBundle

- java.lang.Object
- - org.hsqldb.lib.RefCapablePropertyResourceBundle

-     public class RefCapablePropertyResourceBundle
      extends java.lang.Object

  Just like PropertyResourceBundle, except keys mapped to nothing in the properties file will load the final String value from a text file. The use case is where one wants to use a ResourceBundle for Strings, but some of the Strings are long-- too long to maintain in a Java .properties file. By using this class, you can put each such long String in its own separate file, yet all keys mapped to (non-empty) values in the .properties file will behave just like regular PropertyResourceBundle properties. In this documentation, I call these values read in atomically from other files referenced values, because the values are not directly in the .properties file, but are "referenced" in the .properties file by virtue of the empty value for the key. You use this class in the same way as you would traditionally use ResourceBundle:

        import org.hsqldb.util..RefCapablePropertyResourceBundle;
        ...
            RefCapablePropertyResourceBundle bundle =
                    RefCapablePropertyResourceBundle.getBundle("subdir.xyz");
            System.out.println("Value for '1' = (" + bundle.getString("1") + ')');

  Just like PropertyResourceBundle, the .properties file and the referenced files are read in from the classpath by a class loader, according to the normal ResourceBundle rules. To eliminate the need to prohibit the use of any strings in the .properties values, and to enforce consistency, you must use the following rules to when putting your referenced files into place.

  REFERENCED FILE DIRECTORY is a directory named with the base name of the properties file, and in the same parent directory. So, the referenced file directory `/a/b/c/greentea` is used to hold all reference files for properties files `/a/b/c/greentea_en_us.properties`, `/a/b/c/greentea_de.properties`, `/a/b/c/greentea.properties`, etc. (BTW, according to ResourceBundle rules, this resource should be looked up with name "a.b.c.greentea", not "/a/b/c..." or "a/b/c"). REFERENCED FILES themselves all have the base name of the property key, with locale appendages exactly as the referring properties files has, plus the suffix `.text`.

  So, if we have the following line in `/a/b/c/greentea_de.properties`:

           1: eins

  then you must have a reference text file `/a/b/c/greentea/1_de.properties`:

  In reference text files, sequences of "\r", "\n" and "\r\n" are all translated to the line delimiter for your platform (System property `line.separator`). If one of those sequences exists at the very end of the file, it will be eliminated (so, if you really want getString() to end with a line delimiter, end your file with two of them). (The file itself is never modified-- I'm talking about the value returned by `getString(String)`).

  To prevent throwing at runtime due to unset variables, use a wrapper class like SqltoolRB (use SqltoolRB.java as a template). To prevent throwing at runtime due to unset System Properties, or insufficient parameters passed to getString(String, String[]), set the behavior values appropriately.

  Just like all Properties files, referenced files must use ISO-8859-1 encoding, with unicode escapes for characters outside of ISO-8859-1 character set. But, unlike Properties files, \ does not need to be escaped for normal usage.

  The getString() methods with more than one parameter substitute for "positional" parameters of the form "%{1}". The getExpandedString() methods substitute for System Property names of the form "${1}". In both cases, you can interpose :+ and a string between the variable name and the closing }. This works just like the Bourne shell ${x:+y} feature. If "x" is set, then "y" is returned, and "y" may contain references to the original variable without the curly braces. In this file, I refer to the y text as the "conditional string". One example of each type:

           Out val = (${condlSysProp:+Prop condlSysProp is set to $condlSysProp.})
           Out val = (%{2:+Pos Var #2 is set to %2.})
       OUTPUT if neither are set:
           Out val = ()
           Out val = ()
       OUTPUT if condlSysProp=alpha and condlPLvar=beta:
           Out val = (Prop condlSysProp is set to alpha.)
           Out val = (Pos Var #2 is set to beta.)

  This feature has the following limitations.
  - The conditional string may only contain the primary variable.
  - Inner instances of the primary variable may not use curly braces, and therefore the variable name must end at a word boundary.
  The conditional string may span newlines, and it is often very useful to do so.
  Author:
    Blaine Simpson (blaine dot simpson at admc dot com)
  See Also:
    `PropertyResourceBundle`, `ResourceBundle`

- - ### Field Summary

    Fields
    Modifier and Type | Field | Description
    --- | --- | ---
    `static int` | `EMPTYSTRING_BEHAVIOR` |
    `static java.lang.String` | `LS` |
    `static int` | `NOOP_BEHAVIOR` |
    `static int` | `THROW_BEHAVIOR` |

  - ### Method Summary

    All Methods Static Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `static RefCapablePropertyResourceBundle` | `getBundle​(java.lang.String baseName, java.lang.ClassLoader loader, java.lang.Class<? extends java.lang.Enum<?>> loaderClass)` | Use like java.util.ResourceBundle.getBundle(String).
    `static RefCapablePropertyResourceBundle` | `getBundle​(java.lang.String baseName, java.util.Locale locale, java.lang.ClassLoader loader, java.lang.Class<? extends java.lang.Enum<?>> loaderClass)` | Use exactly like java.util.ResourceBundle.get(String, Locale, ClassLoader).
    `java.lang.String` | `getExpandedString​(java.lang.String key, int behavior)` | Same as getString(), but expands System Variables specified in property values like ${sysvarname}.
    `java.lang.String` | `getExpandedString​(java.lang.String key, java.lang.String[] subs, int missingPropertyBehavior, int missingPosValueBehavior)` |
    `java.util.Enumeration<java.lang.String>` | `getKeys()` |
    `java.lang.String` | `getString​(java.lang.String key)` | Returns value defined in this RefCapablePropertyResourceBundle's .properties file, unless that value is empty.
    `java.lang.String` | `getString​(java.lang.String key, java.lang.String[] subs, int behavior)` |
    `java.lang.String` | `posSubst​(java.lang.String s, java.lang.String[] subs, int behavior)` | Replaces positional substitution patterns of the form %{\d} with corresponding element of the given subs array.
    `static java.lang.String` | `toNativeLs​(java.lang.String inString)` |
    `java.lang.String` | `toString()` | Just identifies this RefCapablePropertyResourceBundle instance.

    - ### Methods inherited from class java.lang.Object

      `equals, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- - ### Field Detail

    - #### LS

          public static final java.lang.String LS

    - #### THROW_BEHAVIOR

          public static final int THROW_BEHAVIOR

      See Also:
        Constant Field Values

    - #### EMPTYSTRING_BEHAVIOR

          public static final int EMPTYSTRING_BEHAVIOR

      See Also:
        Constant Field Values

    - #### NOOP_BEHAVIOR

          public static final int NOOP_BEHAVIOR

      See Also:
        Constant Field Values

  - ### Method Detail

    - #### getKeys

          public java.util.Enumeration<java.lang.String> getKeys()

    - #### getExpandedString

          public java.lang.String getExpandedString​(java.lang.String key,
                                                    int behavior)

      Same as getString(), but expands System Variables specified in property values like ${sysvarname}.
      Parameters:
        `key` - String
        `behavior` - int
      Returns:
        String

    - #### posSubst

          public java.lang.String posSubst​(java.lang.String s,
                                           java.lang.String[] subs,
                                           int behavior)

      Replaces positional substitution patterns of the form %{\d} with corresponding element of the given subs array. Note that %{\d} numbers are 1-based, so we lok for subs[x-1].
      Parameters:
        `s` - String
        `subs` - String[]
        `behavior` - int
      Returns:
        String

    - #### getExpandedString

          public java.lang.String getExpandedString​(java.lang.String key,
                                                    java.lang.String[] subs,
                                                    int missingPropertyBehavior,
                                                    int missingPosValueBehavior)

    - #### getString

          public java.lang.String getString​(java.lang.String key,
                                            java.lang.String[] subs,
                                            int behavior)

    - #### toString

          public java.lang.String toString()

      Just identifies this RefCapablePropertyResourceBundle instance.
      Overrides:
        `toString` in class `java.lang.Object`
      Returns:
        String

    - #### getString

          public java.lang.String getString​(java.lang.String key)

      Returns value defined in this RefCapablePropertyResourceBundle's .properties file, unless that value is empty. If the value in the .properties file is empty, then this returns the entire contents of the referenced text file.
      Parameters:
        `key` - String
      Returns:
        String
      See Also:
        `ResourceBundle.getString(String)`

    - #### toNativeLs

          public static java.lang.String toNativeLs​(java.lang.String inString)

      Parameters:
        `inString` - Input string with \n definitively indicating desired position for line separators.
      Returns:
        If platform's line-separator is \n, then just returns inString. Otherwise returns a copy of inString, with all \n's transformed to the platform's line separators.

    - #### getBundle

          public static RefCapablePropertyResourceBundle getBundle​(java.lang.String baseName,
                                                                   java.lang.ClassLoader loader,
                                                                   java.lang.Class<? extends java.lang.Enum<?>> loaderClass)

      Use like java.util.ResourceBundle.getBundle(String). ClassLoader is required for our getBundles()s, since it is impossible to get the "caller's" ClassLoader without using JNI (i.e., with pure Java).
      Parameters:
        `baseName` - String
        `loader` - ClassLoader
        `loaderClass` - Class
      Returns:
        RefCapablePropertyResourceBundle
      See Also:
        `ResourceBundle.getBundle(String)`

    - #### getBundle

          public static RefCapablePropertyResourceBundle getBundle​(java.lang.String baseName,
                                                                   java.util.Locale locale,
                                                                   java.lang.ClassLoader loader,
                                                                   java.lang.Class<? extends java.lang.Enum<?>> loaderClass)

      Use exactly like java.util.ResourceBundle.get(String, Locale, ClassLoader).
      Parameters:
        `baseName` - String
        `locale` - Locale
        `loader` - ClassLoader
        `loaderClass` - Class
      Returns:
        RefCapablePropertyResourceBundle
      See Also:
        `ResourceBundle.getBundle(String, Locale, ClassLoader)`