1 package org.apache.commons.digester3.substitution;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.Map;
23 import java.util.ArrayList;
24
25
26
27
28
29
30
31
32 public class MultiVariableExpander
33 implements VariableExpander
34 {
35
36 private int nEntries = 0;
37
38 private final ArrayList<String> markers = new ArrayList<String>( 2 );
39
40 private final ArrayList<Map<String, Object>> sources = new ArrayList<Map<String, Object>>( 2 );
41
42
43
44
45
46
47
48 public void addSource( String marker, Map<String, Object> source )
49 {
50 ++nEntries;
51 markers.add( marker );
52 sources.add( source );
53 }
54
55
56
57
58 public String expand( String param )
59 {
60 for ( int i = 0; i < nEntries; ++i )
61 {
62 param = expand( param, markers.get( i ), sources.get( i ) );
63 }
64 return param;
65 }
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 public String expand( String str, String marker, Map<String, Object> source )
82 {
83 String startMark = marker + "{";
84 int markLen = startMark.length();
85
86 int index = 0;
87 for ( ;; )
88 {
89 index = str.indexOf( startMark, index );
90 if ( index == -1 )
91 {
92 return str;
93 }
94
95 int startIndex = index + markLen;
96 if ( startIndex > str.length() )
97 {
98 throw new IllegalArgumentException( "var expression starts at end of string" );
99 }
100
101 int endIndex = str.indexOf( "}", index + markLen );
102 if ( endIndex == -1 )
103 {
104 throw new IllegalArgumentException( "var expression starts but does not end" );
105 }
106
107 String key = str.substring( index + markLen, endIndex );
108 Object value = source.get( key );
109 if ( value == null )
110 {
111 throw new IllegalArgumentException( "parameter [" + key + "] is not defined." );
112 }
113 String varValue = value.toString();
114
115 str = str.substring( 0, index ) + varValue + str.substring( endIndex + 1 );
116 index += varValue.length();
117 }
118 }
119
120 }