/*
* Copyright (c) 2017, PostgreSQL Global Development Group
* See the LICENSE file in the project root for more information.
*/
package org.postgresql.util;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExpressionProperties extends Properties {
private static final Pattern EXPRESSION = Pattern.compile("\\$\\{([^}]+)\\}");
private final Properties[] defaults;
Creates an empty property list with the specified defaults.
Params: - defaults – java.util.Properties
/**
* Creates an empty property list with the specified defaults.
*
* @param defaults java.util.Properties
*/
public ExpressionProperties(Properties ...defaults) {
this.defaults = defaults;
}
Returns property value with all ${propKey}
like references replaced with the value of the relevant property with recursive resolution.
The method returns null
if the property is not found.
Params: - key – the property key.
Returns: the value in this property list with
the specified key value.
/**
* <p>Returns property value with all {@code ${propKey}} like references replaced with the value of
* the relevant property with recursive resolution.</p>
*
* <p>The method returns <code>null</code> if the property is not found.</p>
*
* @param key the property key.
*
* @return the value in this property list with
* the specified key value.
*/
@Override
public String getProperty(String key) {
String value = getRawPropertyValue(key);
return replaceProperties(value);
}
@Override
public String getProperty(String key, String defaultValue) {
String value = getRawPropertyValue(key);
if (value == null) {
value = defaultValue;
}
return replaceProperties(value);
}
Returns raw value of a property without any replacements.
Params: - key – property name
Returns: raw property value
/**
* Returns raw value of a property without any replacements.
* @param key property name
* @return raw property value
*/
public String getRawPropertyValue(String key) {
String value = super.getProperty(key);
if (value != null) {
return value;
}
for (Properties properties : defaults) {
value = properties.getProperty(key);
if (value != null) {
return value;
}
}
return null;
}
private String replaceProperties(String value) {
if (value == null) {
return null;
}
Matcher matcher = EXPRESSION.matcher(value);
StringBuffer sb = null;
while (matcher.find()) {
if (sb == null) {
sb = new StringBuffer();
}
String propValue = getProperty(matcher.group(1));
if (propValue == null) {
// Use original content like ${propKey} if property is not found
propValue = matcher.group();
}
matcher.appendReplacement(sb, Matcher.quoteReplacement(propValue));
}
if (sb == null) {
return value;
}
matcher.appendTail(sb);
return sb.toString();
}
}