StringPropertyReplacer.java |
/*************************************** * * * JBoss: The OpenSource J2EE WebOS * * * * Distributable under LGPL license. * * See terms of license at gnu.org. * * * ***************************************/ package org.jboss.util; import java.util.Properties; /** * A utility class for replacing properties in strings. * * @version <tt>$Revision: 1.2.6.1 $</tt> * @author <a href="mailto:jason@planet57.com">Jason Dillon</a> * @author <a href="Scott.Stark@jboss.org">Scott Stark</a> * @author <a href="claudio.vesco@previnet.it">Claudio Vesco</a> * @author <a href="mailto:adrian@jboss.com">Adrian Brock</a> */ public final class StringPropertyReplacer { /** New line string constant */ public static final String NEWLINE = org.jboss.util.platform.Constants.LINE_SEPARATOR; /** File separator value */ private static final String FILE_SEPARATOR = org.jboss.util.platform.Constants.FILE_SEPARATOR; /** Path separator value */ private static final String PATH_SEPARATOR = org.jboss.util.platform.Constants.PATH_SEPARATOR; /** File separator alias */ private static final String FILE_SEPARATOR_ALIAS = "/"; /** Path separator alias */ private static final String PATH_SEPARATOR_ALIAS = ":"; // States used in property parsing private static final int NORMAL = 0; private static final int SEEN_DOLLAR = 1; private static final int IN_BRACKET = 2; /** * Go through the input string and replace any occurance of ${p} with * the System.getProperty(p) value. If there is no such property p defined, then * the ${p} reference will remain unchanged. The property ${/} is replaced with * System.getProperty("file.separator") value and the property ${:} is replaced with * system.getProperty("path.separator"). * * @param string - the string with possible ${} references * @return the input string with all property references replaced if any. * If there are no valid references the input string will be returned. */ public static String replaceProperties(final String string) { return replaceProperties(string, System.getProperties()); } /** * Go through the input string and replace any occurance of ${p} with * the System.getProperty(p) value. If there is no such property p defined, then * the ${p} reference will remain unchanged. If the property reference is * of the form ${p:v} and there is no such property p, then the default * value v will be returned. * The property ${/} is replaced with System.getProperty("file.separator") * value and the property ${:} is replaced with * system.getProperty("path.separator"). * * @param string - the string with possible ${} references * @param props - the source for ${x} property ref values * @return the input string with all property references replaced if any. * If there are no valid references the input string will be returned. */ public static String replaceProperties(final String string, final Properties props) { final char[] chars = string.toCharArray(); StringBuffer buffer = new StringBuffer(); boolean properties = false; int state = NORMAL; int start = 0; for (int i = 0; i < chars.length; ++i) { char c = chars[i]; // Dollar sign outside brackets if (c == '$' && state != IN_BRACKET) state = SEEN_DOLLAR; // Open bracket immediatley after dollar else if (c == '{' && state == SEEN_DOLLAR) { buffer.append(string.substring(start, i - 1)); state = IN_BRACKET; start = i - 1; } // No open bracket after dollar else if (state == SEEN_DOLLAR) state = NORMAL; // Closed bracket after open bracket else if (c == '}' && state == IN_BRACKET) { // No content if (start + 2 == i) { buffer.append("${}"); // REVIEW: Correct? } else // Collect the system property { String value = null; String key = string.substring(start + 2, i); // check for alias if (FILE_SEPARATOR_ALIAS.equals(key)) { value = FILE_SEPARATOR; } else if (PATH_SEPARATOR_ALIAS.equals(key)) { value = PATH_SEPARATOR; } else { // check from System properties value = props.getProperty(key); if( value == null ) { // Check for a default value ${key:default} int colon = key.indexOf(':'); if( colon > 0 ) { String realKey = key.substring(0, colon); value = System.getProperty(realKey); if( value == null ) value = key.substring(colon+1); } } } if (value != null) { properties = true; buffer.append(value); } } start = i + 1; state = NORMAL; } } // No properties if (properties == false) return string; // Collect the trailing characters if (start != chars.length) buffer.append(string.substring(start, chars.length)); // Done return buffer.toString(); } }
StringPropertyReplacer.java |