01: /*
02: * Licensed to the Apache Software Foundation (ASF) under one or more
03: * contributor license agreements. The ASF licenses this file to You
04: * under the Apache License, Version 2.0 (the "License"); you may not
05: * use this file except in compliance with the License.
06: * You may obtain a copy of the License at
07: *
08: * http://www.apache.org/licenses/LICENSE-2.0
09: *
10: * Unless required by applicable law or agreed to in writing, software
11: * distributed under the License is distributed on an "AS IS" BASIS,
12: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13: * See the License for the specific language governing permissions and
14: * limitations under the License. For additional information regarding
15: * copyright in this work, please see the NOTICE file in the top level
16: * directory of this distribution.
17: */
18:
19: package org.apache.roller.util;
20:
21: import java.util.Map;
22: import java.util.regex.Matcher;
23: import java.util.regex.Pattern;
24:
25: /**
26: * Property expansion utility. This utility provides static methods to expand properties appearing in strings.
27: *
28: * @author <a href="mailto:anil@busybuddha.org">Anil Gangolli</a> (Portions based on code from David Graff submitted for
29: * ROL-613)
30: * @since Roller 1.3
31: */
32: public class PropertyExpander {
33: private PropertyExpander() {
34: }
35:
36: // The pattern for a system property. Matches ${property.name}, with the interior matched reluctantly.
37: private static final Pattern EXPANSION_PATTERN = Pattern.compile(
38: "(\\$\\{([^}]+?)\\})", java.util.regex.Pattern.MULTILINE);
39:
40: /**
41: * Expand property expressions in the input. Expands property expressions of the form <code>${propertyname}</code>
42: * in the input, replacing each such expression with the value associated to the respective key
43: * <code>propertyname</code> in the supplied map. If for a given expression, the property is undefined (has null
44: * value) in the map supplied, that expression is left unexpanded in the resulting string.
45: * <p/>
46: * Note that expansion is not recursive. If the value of one property contains another expression, the expression
47: * appearing in the value will not be expanded further.
48: *
49: * @param input the input string. This may be null, in which case null is returned.
50: * @param props the map of property values to use for expansion. This map should have <code>String</code> keys and
51: * <code>String</code> values. Any object of class {@link java.util.Properties} works here, as will
52: * other implementations of such maps.
53: * @return the result of replacing property expressions with the values of the corresponding properties from the
54: * supplied property map, null if the input string is null.
55: */
56: public static String expandProperties(String input, Map props) {
57: if (input == null)
58: return null;
59:
60: Matcher matcher = EXPANSION_PATTERN.matcher(input);
61:
62: StringBuffer expanded = new StringBuffer(input.length());
63: while (matcher.find()) {
64: String propName = matcher.group(2);
65: String value = (String) props.get(propName);
66: // if no value is found, use a value equal to the original expression
67: if (value == null)
68: value = matcher.group(0);
69: // Fake a literal replacement since Matcher.quoteReplacement() is not present in 1.4.
70: matcher.appendReplacement(expanded, "");
71: expanded.append(value);
72: }
73: matcher.appendTail(expanded);
74:
75: return expanded.toString();
76: }
77:
78: /**
79: * Expand system properties in the input string. This is equivalent to calling <code>expandProperties(input,
80: * System.getProperties())</code>.
81: *
82: * @param input
83: * @return the result of replacing property expressions with the values of the corresponding system properties.
84: * @see System#getProperties()
85: */
86: public static String expandSystemProperties(String input) {
87: return expandProperties(input, System.getProperties());
88: }
89: }
|