import java.util.Properties;
/**
* A subclass of Properties that allows recursive
* references for property values. For example,
*
* <pre><code>
* A=12345678
* B={A}90
* C={B} plus more
* </code></pre>
*
* will result in <code>getProperty("C")</code>
* returning the value "1234567890 plus more".
*
* @author: Chris Mair
*/
public class XProperties extends Properties {
// The prefix and suffix for constant names
// within property values
private static final String START_CONST = "{";
private static final String END_CONST = "}";
// The maximum depth for recursive substitution
// of constants within property values
// (e.g., A={B} .. B={C} .. C={D} .. etc.)
private static final int MAX_SUBST_DEPTH = 5;
/**
* Creates an empty property list with no default
* values.
*/
public XProperties() {
super();
}
/**
* Creates an empty property list with the
* specified defaults.
* @param defaults java.util.Properties
*/
public XProperties(Properties defaults) {
super(defaults);
}
/**
* Searches for the property with the specified
* key in this property list. If the key is not
* found in this property list, the default
* property list, and its defaults, recursively,
* are then checked. The method returns
* <code>null</code> if the property is not found.
*
* @param key the property key.
* @return the value in this property list with
* the specified key value.
*/
public String getProperty(String key) {
// Return the property value starting at level 0
return getProperty(key, 0);
}
/**
* Searches for the property with the specified
* key in this property list. If the key is not
* found in this property list, the default
* property list, and its defaults, recursively,
* are then checked. The method returns
* <code>null</code> if the property is not found.
*
* <p>The level parameter specifies the current
* level of recursive constant substitution. If
* the requested property value includes a
* constant, its value is substituted in place
* through a recursive call to this method,
* incrementing the level. Once level exceeds
* MAX_SUBST_DEPTH, no further constant
* substitutions are performed within the
* current requested value.
*
* @param key the property key.
* @param level the level of recursion so far
* @return the value in this property list with
* the specified key value.
*/
private String getProperty(String key, int level) {
String value = super.getProperty(key);
if (value != null) {
// Get the index of the first constant, if any
int beginIndex = 0;
int startName = value.indexOf(START_CONST, beginIndex);
while (startName != -1) {
if (level+1 > MAX_SUBST_DEPTH) {
// Exceeded MAX_SUBST_DEPTH
// Return the value as is
return value;
}
int endName = value.indexOf(END_CONST, startName);
if (endName == -1) {
// Terminating symbol not found
// Return the value as is
return value;
}
String constName = value.substring(startName+1, endName);
String constValue = getProperty(constName, level+1);
if (constValue == null) {
// Property name not found
// Return the value as is
return value;
}
// Insert the constant value into the
// original property value
String newValue = (startName>0)
? value.substring(0, startName) : "";
newValue += constValue;
// Start checking for constants at this index
beginIndex = newValue.length();
// Append the remainder of the value
newValue += value.substring(endName+1);
value = newValue;
// Look for the next constant
startName = value.indexOf(START_CONST, beginIndex);
}
}
// Return the value as is
return value;
}
}
星期四, 6月 30, 2011
[Java] Enabling Constant Substitution in Property Values
擴充原本JDK Properties Class,讓Properties裡面的可以宣告變數。
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言
留個話吧:)