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.
java.util.PropertyResourceBundle , java.util.ResourceBundle
| Modifier and Type | Field and Description |
|---|---|
| private static Map | |
| private String | |
| private String | |
| public static final int | |
| private String | |
| private Class | |
| public static final String | |
| public static final int | |
| private Pattern | |
| private Pattern | |
| public static final int | |
| private String | |
| private PropertyResourceBundle |
| Access | Constructor and Description |
|---|---|
| private | RefCapablePropertyResourceBundle(String baseName, PropertyResourceBundle wrappedBundle, Class<? extends Enum<?>> loaderClass)
|
| Modifier and Type | Method and Description |
|---|---|
| public static RefCapablePropertyResourceBundle | Returns: RefCapablePropertyResourceBundleString baseName, ClassLoader ClassLoader loader, Class<? extends Enum<?>> Class loaderClass)Use like java.util.ResourceBundle.getBundle(String). |
| public static RefCapablePropertyResourceBundle | |
| public String | Returns: StringString key, int int behavior)Same as getString(), but expands System Variables specified in property values like ${sysvarname}. |
| public String | getExpandedString(String key, String[] subs, int missingPropertyBehavior, int missingPosValueBehavior)
|
| public Enumeration | |
| private InputStream | |
| private static RefCapablePropertyResourceBundle | Returns: RefCapablePropertyResourceBundleString baseName, ResourceBundle ResourceBundle rb, Class<? extends Enum<?>> Class loaderClass)Return a ref to a new or existing RefCapablePropertyResourceBundle, or throw a MissingResourceException. |
| public String | |
| public String | |
| private String | |
| public String | |
| public static String | toNativeLs(String
Input string with \n definitively indicating desired
position for line separators. inString)Returns: If platform's line-separator is \n, then just returns inString. |
| public String | Returns: StringOverrides java. Just identifies this RefCapablePropertyResourceBundle instance. |
| allBundles | back to summary |
|---|---|
| private static Map<ResourceBundle, RefCapablePropertyResourceBundle> allBundles | |
| baseName | back to summary |
|---|---|
| private String baseName | |
| country | back to summary |
|---|---|
| private String country | |
| EMPTYSTRING_BEHAVIOR | back to summary |
|---|---|
| public static final int EMPTYSTRING_BEHAVIOR | |
| language | back to summary |
|---|---|
| private String language | |
| loaderClass | back to summary |
|---|---|
| private Class<? extends Enum<?>> loaderClass | |
| LS | back to summary |
|---|---|
| public static final String LS | |
| NOOP_BEHAVIOR | back to summary |
|---|---|
| public static final int NOOP_BEHAVIOR | |
| posPattern | back to summary |
|---|---|
| private Pattern posPattern | |
| sysPropVarPattern | back to summary |
|---|---|
| private Pattern sysPropVarPattern | |
| THROW_BEHAVIOR | back to summary |
|---|---|
| public static final int THROW_BEHAVIOR | |
| variant | back to summary |
|---|---|
| private String variant | |
| wrappedBundle | back to summary |
|---|---|
| private PropertyResourceBundle wrappedBundle | |
| RefCapablePropertyResourceBundle | back to summary |
|---|---|
| private RefCapablePropertyResourceBundle(String baseName, PropertyResourceBundle wrappedBundle, Class<? extends Enum<?>> loaderClass) | |
| getBundle | back to summary |
|---|---|
| public static RefCapablePropertyResourceBundle getBundle(String baseName, ClassLoader loader, Class<? extends 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).
| |
| getBundle | back to summary |
|---|---|
| public static RefCapablePropertyResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader, Class<? extends Enum<?>> loaderClass) Use exactly like java.util.ResourceBundle.get(String, Locale, ClassLoader).
| |
| getExpandedString | back to summary |
|---|---|
| public String getExpandedString(String key, int behavior) Same as getString(), but expands System Variables specified in property values like ${sysvarname}. | |
| getExpandedString | back to summary |
|---|---|
| public String getExpandedString(String key, String[] subs, int missingPropertyBehavior, int missingPosValueBehavior) | |
| getKeys | back to summary |
|---|---|
| public Enumeration | |
| getMostSpecificStream | back to summary |
|---|---|
| private InputStream getMostSpecificStream(String key, String l, String c, String v) Recursive. For consistency we do not allow paths relative to anything other than root. Even though we load via Class, baseNames are resolved as if absolute, just like ClassLoader lookups. | |
| getRef | back to summary |
|---|---|
| private static RefCapablePropertyResourceBundle getRef(String baseName, ResourceBundle rb, Class<? extends Enum<?>> loaderClass) Return a ref to a new or existing RefCapablePropertyResourceBundle, or throw a MissingResourceException.
| |
| getString | back to summary |
|---|---|
| public String getString(String key, String[] subs, int behavior) | |
| getString | back to summary |
|---|---|
| public String getString(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.
| |
| getStringFromFile | back to summary |
|---|---|
| private String getStringFromFile(String key) | |
| posSubst | back to summary |
|---|---|
| public String posSubst(String s, 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]. | |
| toNativeLs | back to summary |
|---|---|
| public static String toNativeLs(String inString) | |
| toString | back to summary |
|---|---|
| public String toString() Overrides java. Just identifies this RefCapablePropertyResourceBundle instance.
| |