5 public class ParameterExpander {
7 final static String DEFAULT_KEY = "(default)";
8 final static String NODE_SEPARATOR = ".";
10 private static List splitString(String aString, String aSeparator) {
11 List result= new Vector();
12 int previousPosition = 0;
14 int endOfNamePosition;
16 while ((position = aString.indexOf(aSeparator, previousPosition))>=0) {
17 result.add(aString.substring(previousPosition, position));
18 previousPosition = position + aSeparator.length();
21 result.add(aString.substring(previousPosition, aString.length()));
26 public static String findValueForKey(Map aMap, String aKey) throws Exception {
29 List parts = splitString(aKey, NODE_SEPARATOR);
37 String part = (String) i.next();
39 if (!(node instanceof Map)) {
40 throw new Exception( "Can't expand key " + aKey + ": " + location + " is not a map" );
43 node = ((Map) node).get(part);
45 if (location.length()>0) {
46 location=location + NODE_SEPARATOR;
49 location = location + part;
52 throw new Exception( "Can't expand key " + aKey + ": "+ location + " does not exist" );
56 if (node instanceof Map) {
57 node = ((Map) node).get(DEFAULT_KEY);
60 if (!(node instanceof String))
61 throw new Exception( "Can't expand key " + aKey + ": "+ location + " is not a string but a " + node.getClass().getName() );
66 public static String expandExpression(Map aMap, String anExpression) throws Exception {
67 int previousPosition = 0;
69 int endOfNamePosition;
70 StringBuffer result = new StringBuffer();
72 while ((position=anExpression.indexOf("$", previousPosition))>=0) {
73 result.append(anExpression.substring(previousPosition, position));
75 if (position>=anExpression.length()-1) {
76 result.append(anExpression.substring(position, anExpression.length()));
77 previousPosition=anExpression.length();
81 if (anExpression.charAt(position+1) == '{') {
82 endOfNamePosition=anExpression.indexOf('}', position);
83 if (endOfNamePosition>=0) {
84 result.append(findValueForKey(aMap, anExpression.substring(position+2, endOfNamePosition)));
85 previousPosition=endOfNamePosition+1;
88 throw new Exception("Missing } in " + anExpression);
93 previousPosition=position+2;
94 result.append(anExpression.charAt(position+1));
98 result.append(anExpression.substring(previousPosition, anExpression.length()));
100 return result.toString();