/* | |
* Licensed to the Apache Software Foundation (ASF) under one or more | |
* contributor license agreements. The ASF licenses this file to You | |
* under the Apache License, Version 2.0 (the "License"); you may not | |
* use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. For additional information regarding | |
* copyright in this work, please see the NOTICE file in the top level | |
* directory of this distribution. | |
*/ | |
package org.apache.roller.util; | |
import java.util.Map; | |
import java.util.regex.Matcher; | |
import java.util.regex.Pattern; | |
/** | |
* Property expansion utility. This utility provides static methods to expand properties appearing in strings. | |
* | |
* @author <a href="mailto:anil@busybuddha.org">Anil Gangolli</a> (Portions based on code from David Graff submitted for | |
* ROL-613) | |
* @since Roller 1.3 | |
*/ | |
public final class PropertyExpander { | |
// The pattern for a system property. Matches ${property.name}, with the interior matched reluctantly. | |
private static final Pattern EXPANSION_PATTERN = Pattern.compile("(\\$\\{([^}]+?)\\})", java.util.regex.Pattern.MULTILINE); | |
// non-instantiable | |
private PropertyExpander() {} | |
/** | |
* Expand property expressions in the input. Expands property expressions of the form <code>${propertyname}</code> | |
* in the input, replacing each such expression with the value associated to the respective key | |
* <code>propertyname</code> in the supplied map. If for a given expression, the property is undefined (has null | |
* value) in the map supplied, that expression is left unexpanded in the resulting string. | |
* <p/> | |
* Note that expansion is not recursive. If the value of one property contains another expression, the expression | |
* appearing in the value will not be expanded further. | |
* | |
* @param input the input string. This may be null, in which case null is returned. | |
* @param props the map of property values to use for expansion. This map should have <code>String</code> keys and | |
* <code>String</code> values. Any object of class {@link java.util.Properties} works here, as will | |
* other implementations of such maps. | |
* @return the result of replacing property expressions with the values of the corresponding properties from the | |
* supplied property map, null if the input string is null. | |
*/ | |
public static String expandProperties(String input, Map props) { | |
if (input == null) { | |
return null; | |
} | |
Matcher matcher = EXPANSION_PATTERN.matcher(input); | |
StringBuffer expanded = new StringBuffer(input.length()); | |
while (matcher.find()) { | |
String propName = matcher.group(2); | |
String value = (String) props.get(propName); | |
// if no value is found, use a value equal to the original expression | |
if (value == null) { | |
value = matcher.group(0); | |
} | |
// Fake a literal replacement since Matcher.quoteReplacement() is not present in 1.4. | |
matcher.appendReplacement(expanded, ""); | |
expanded.append(value); | |
} | |
matcher.appendTail(expanded); | |
return expanded.toString(); | |
} | |
/** | |
* Expand system properties in the input string. This is equivalent to calling <code>expandProperties(input, | |
* System.getProperties())</code>. | |
* | |
* @param input | |
* @return the result of replacing property expressions with the values of the corresponding system properties. | |
* @see System#getProperties() | |
*/ | |
public static String expandSystemProperties(String input) { | |
return expandProperties(input, System.getProperties()); | |
} | |
} |