📄 refcapablepropertyresourcebundle.java
字号:
Matcher matcher = posPattern.matcher(s);
int previousEnd = 0;
StringBuffer sb = new StringBuffer();
String varValue;
int varIndex;
String condlVal; // Conditional : value
while (matcher.find()) {
varIndex = Integer.parseInt(matcher.group(1)) - 1;
condlVal = ((matcher.groupCount() > 1) ? matcher.group(2) : null);
varValue = ((varIndex < subs.length) ? subs[varIndex] : null);
if (condlVal != null) {
// Replace varValue (the value to be substituted), with
// the post-:+ portion of the expression.
varValue = ((varValue == null)
? ""
: condlVal.replaceAll("\\Q%" + (varIndex+1) + "\\E\\b",
RefCapablePropertyResourceBundle.literalize(
varValue)));
}
// System.err.println("Behavior: " + behavior);
if (varValue == null) switch (behavior) {
case THROW_BEHAVIOR:
throw new RuntimeException(
Integer.toString(subs.length)
+ " positional values given, but property string "
+ "contains (" + matcher.group() + ").");
case EMPTYSTRING_BEHAVIOR:
varValue = "";
case NOOP_BEHAVIOR:
break;
default:
throw new RuntimeException(
"Undefined value for behavior: " + behavior);
}
sb.append(s.substring(previousEnd, matcher.start())
+ ((varValue == null) ? matcher.group() : varValue));
previousEnd = matcher.end();
}
return (previousEnd < 1) ? s
: (sb.toString() + s.substring(previousEnd));
}
public String getExpandedString(String key, String[] subs,
int missingPropertyBehavior, int missingPosValueBehavior) {
return posSubst(getExpandedString(key, missingPropertyBehavior), subs,
missingPosValueBehavior);
}
public String getString(String key, String[] subs, int behavior) {
return posSubst(getString(key), subs, behavior);
}
/**
* Just identifies this RefCapablePropertyResourceBundle instance.
*/
public String toString() {
return baseName + " for " + language + " / " + country + " / "
+ variant;
}
/**
* 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.
*
* @see ResourceBundle#get(String)
*/
public String getString(String key) {
String value = wrappedBundle.getString(key);
if (value.length() > 0) return value;
value = getStringFromFile(key);
// For conciseness and sanity, get rid of all \r's so that \n
// will definitively be our line breaks.
if (value.indexOf('\r') > -1)
value = value.replaceAll("\\r\\n", "\n").replaceAll("\\r", "\n");
if (value.length() > 0 && value.charAt(value.length() - 1) == '\n')
value = value.substring(0, value.length() - 1);
if (!LS.equals("\n")) value = value.replaceAll("\\n", LS);
return value;
}
/**
* 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).
*
* @see ResourceBundle#getBundle(String)
*/
public static RefCapablePropertyResourceBundle getBundle(String baseName,
ClassLoader loader) {
return getRef(baseName, ResourceBundle.getBundle(baseName,
Locale.getDefault(), loader), loader);
}
/**
* Use exactly like java.util.ResourceBundle.get(String, Locale, ClassLoader).
*
* @see ResourceBundle#getBundle(String, Locale, ClassLoader)
*/
public static RefCapablePropertyResourceBundle
getBundle(String baseName, Locale locale, ClassLoader loader) {
return getRef(baseName,
ResourceBundle.getBundle(baseName, locale, loader), loader);
}
/**
* Return a ref to a new or existing RefCapablePropertyResourceBundle,
* or throw a MissingResourceException.
*/
static private RefCapablePropertyResourceBundle getRef(String baseName,
ResourceBundle rb, ClassLoader loader) {
if (!(rb instanceof PropertyResourceBundle))
throw new MissingResourceException(
"Found a Resource Bundle, but it is a "
+ rb.getClass().getName(),
PropertyResourceBundle.class.getName(), null);
if (allBundles.containsKey(rb))
return (RefCapablePropertyResourceBundle) allBundles.get(rb);
RefCapablePropertyResourceBundle newPRAFP =
new RefCapablePropertyResourceBundle(baseName,
(PropertyResourceBundle) rb, loader);
allBundles.put(rb, newPRAFP);
return newPRAFP;
}
/**
* Recursive
*/
private InputStream getMostSpecificStream(
String key, String l, String c, String v) {
String filePath = baseName.replace('.', '/') + '/' + key
+ ((l == null) ? "" : ("_" + l))
+ ((c == null) ? "" : ("_" + c))
+ ((v == null) ? "" : ("_" + v))
+ ".text";
// System.err.println("Seeking " + filePath);
InputStream is = loader.getResourceAsStream(filePath);
// N.b. If were using Class.getRes... instead of ClassLoader.getRes...
// we would need to previx the path with "/".
return (is == null && l != null)
? getMostSpecificStream(key, ((c == null) ? null : l),
((v == null) ? null : c), null)
: is;
}
private String getStringFromFile(String key) {
byte[] ba = null;
int bytesread = 0;
int retval;
InputStream inputStream =
getMostSpecificStream(key, language, country, variant);
if (inputStream == null)
throw new MissingResourceException(
"Key '" + key
+ "' is present in .properties file with no value, yet "
+ "text file resource is missing",
RefCapablePropertyResourceBundle.class.getName(), key);
try {
try {
ba = new byte[inputStream.available()];
} catch (RuntimeException re) {
throw new MissingResourceException(
"Resource is too big to read in '" + key + "' value in one "
+ "gulp.\nPlease run the program with more RAM "
+ "(try Java -Xm* switches).: " + re,
RefCapablePropertyResourceBundle.class.getName(), key);
} catch (IOException ioe) {
throw new MissingResourceException(
"Failed to read in value for key '" + key + "': " + ioe,
RefCapablePropertyResourceBundle.class.getName(), key);
}
try {
while (bytesread < ba.length &&
(retval = inputStream.read(
ba, bytesread, ba.length - bytesread)) > 0) {
bytesread += retval;
}
} catch (IOException ioe) {
throw new MissingResourceException(
"Failed to read in value for '" + key + "': " + ioe,
RefCapablePropertyResourceBundle.class.getName(), key);
}
} finally {
try {
inputStream.close();
} catch (IOException ioe) {
System.err.println("Failed to close input stream: " + ioe);
}
}
if (bytesread != ba.length) {
throw new MissingResourceException(
"Didn't read all bytes. Read in "
+ bytesread + " bytes out of " + ba.length
+ " bytes for key '" + key + "'",
RefCapablePropertyResourceBundle.class.getName(), key);
}
try {
return new String(ba, "ISO-8859-1");
} catch (UnsupportedEncodingException uee) {
throw new RuntimeException(uee);
} catch (RuntimeException re) {
throw new MissingResourceException(
"Value for key '" + key + "' too big to convert to String. "
+ "Please run the program with more RAM "
+ "(try Java -Xm* switches).: " + re,
RefCapablePropertyResourceBundle.class.getName(), key);
}
}
/**
* Escape \ and $ characters in replacement strings so that nothing
* funny happens.
*
* Once we can use Java 1.5, wipe out this method and use
* java.util.regex.matcher.QuoteReplacement() instead.
*/
public static String literalize(String s) {
if ((s.indexOf('\\') == -1) && (s.indexOf('$') == -1)) {
return s;
}
StringBuffer sb = new StringBuffer();
for (int i=0; i<s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '\\':
sb.append('\\'); sb.append('\\');
break;
case '$':
sb.append('\\'); sb.append('$');
break;
default:
sb.append(c);
break;
}
}
return sb.toString();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -