8 public class ParameterExpander {
10 final static String DEFAULT_KEY = "(default)";
11 final static String NODE_SEPARATOR = ".";
13 private static List splitString(String aString, String aSeparator) {
14 List result= new Vector();
15 int previousPosition = 0;
17 int endOfNamePosition;
19 while ((position = aString.indexOf(aSeparator, previousPosition))>=0) {
20 result.add(aString.substring(previousPosition, position));
21 previousPosition = position + aSeparator.length();
24 result.add(aString.substring(previousPosition, aString.length()));
29 public static String findValueForKey(Map aMap, String aKey) throws Exception {
32 List parts = splitString(aKey, NODE_SEPARATOR);
40 String part = (String) i.next();
42 if (!(node instanceof Map)) {
43 throw new Exception( "Can't expand key " + aKey + ": " + location + " is not a map" );
46 node = ((Map) node).get(part);
48 if (location.length()>0) {
49 location=location + NODE_SEPARATOR;
52 location = location + part;
55 throw new ParameterExpanderExc( "Can't expand key {1}: {2} does not exist", new Object[]{aKey,location} );
59 if (node instanceof Map) {
60 node = ((Map) node).get(DEFAULT_KEY);
63 if (!(node instanceof String))
64 throw new ParameterExpanderExc( "Can't expand key {1}: {2} is not a string but a {3}", new Object[]{aKey,location,node.getClass().getName()} );
69 public static String expandExpression(Map aMap, String anExpression) throws Exception {
70 int previousPosition = 0;
72 int endOfNamePosition;
73 StringBuffer result = new StringBuffer();
75 while ((position=anExpression.indexOf("$", previousPosition))>=0) {
76 result.append(anExpression.substring(previousPosition, position));
78 if (position>=anExpression.length()-1) {
79 result.append(anExpression.substring(position, anExpression.length()));
80 previousPosition=anExpression.length();
84 if (anExpression.charAt(position+1) == '{') {
85 endOfNamePosition=anExpression.indexOf('}', position);
86 if (endOfNamePosition>=0) {
87 result.append(findValueForKey(aMap, anExpression.substring(position+2, endOfNamePosition)));
88 previousPosition=endOfNamePosition+1;
91 throw new ParameterExpanderExc("Missing } in {1}",new Object[]{anExpression});
96 previousPosition=position+2;
97 result.append(anExpression.charAt(position+1));
101 result.append(anExpression.substring(previousPosition, anExpression.length()));
103 return result.toString();
106 public static class ParameterExpanderExc extends Exc {
107 public ParameterExpanderExc(String msg, Object[] objects) {