1 package org.mortbay.jetty.handler.rewrite;
2
3 import java.io.IOException;
4
5 import javax.servlet.http.HttpServletRequest;
6 import javax.servlet.http.HttpServletResponse;
7
8 import org.mortbay.jetty.HttpConnection;
9 import org.mortbay.jetty.Request;
10 import org.mortbay.jetty.servlet.PathMap;
11 import org.mortbay.log.Log;
12 import org.mortbay.util.LazyList;
13
14
15
16
17
18
19
20
21 public class RuleContainer extends Rule
22 {
23 protected Rule[] _rules;
24 protected boolean _handled;
25
26 protected String _originalPathAttribute;
27 protected boolean _rewriteRequestURI=true;
28 protected boolean _rewritePathInfo=true;
29
30 protected LegacyRule _legacy;
31
32
33 private LegacyRule getLegacyRule()
34 {
35 if (_legacy==null)
36 {
37 _legacy= new LegacyRule();
38 addRule(_legacy);
39 }
40 return _legacy;
41 }
42
43
44
45
46
47
48
49
50
51 public void setLegacyRule(LegacyRule legacyRule)
52 {
53 _legacy = legacyRule;
54 }
55
56
57
58
59
60
61 public Rule[] getRules()
62 {
63 return _rules;
64 }
65
66
67
68
69
70
71 public void setRules(Rule[] rules)
72 {
73 if (_legacy==null)
74 _rules = rules;
75 else
76 {
77 _rules=null;
78 addRule(_legacy);
79 if (rules!=null)
80 for (Rule rule:rules)
81 addRule(rule);
82 }
83 }
84
85
86
87
88
89
90 public void addRule(Rule rule)
91 {
92 _rules = (Rule[])LazyList.addToArray(_rules,rule,Rule.class);
93 }
94
95
96
97
98
99
100
101 public boolean isRewriteRequestURI()
102 {
103 return _rewriteRequestURI;
104 }
105
106
107
108
109
110
111 public void setRewriteRequestURI(boolean rewriteRequestURI)
112 {
113 _rewriteRequestURI=rewriteRequestURI;
114 }
115
116
117
118
119
120
121 public boolean isRewritePathInfo()
122 {
123 return _rewritePathInfo;
124 }
125
126
127
128
129
130
131 public void setRewritePathInfo(boolean rewritePathInfo)
132 {
133 _rewritePathInfo=rewritePathInfo;
134 }
135
136
137
138
139
140
141 public String getOriginalPathAttribute()
142 {
143 return _originalPathAttribute;
144 }
145
146
147
148
149
150
151 public void setOriginalPathAttribute(String originalPathAttribte)
152 {
153 _originalPathAttribute=originalPathAttribte;
154 }
155
156
157
158
159
160
161 public PathMap getRewrite()
162 {
163 return getLegacyRule().getRewrite();
164 }
165
166
167
168
169
170 public void setRewrite(PathMap rewrite)
171 {
172 getLegacyRule().setRewrite(rewrite);
173 }
174
175
176
177
178
179 public void addRewriteRule(String pattern, String prefix)
180 {
181 getLegacyRule().addRewriteRule(pattern,prefix);
182 }
183
184
185
186
187
188
189
190
191
192 public boolean isHandled()
193 {
194 return _handled;
195 }
196
197
198
199
200
201
202
203 public void setHandled(boolean handled)
204 {
205 _handled=handled;
206 }
207
208
209
210
211
212
213
214
215 @Override
216 public String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException
217 {
218 return apply(target, request, response);
219 }
220
221
222
223
224
225
226
227 protected String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException
228 {
229 _handled=false;
230
231 boolean original_set=_originalPathAttribute==null;
232
233 for (Rule rule : _rules)
234 {
235 String applied=rule.matchAndApply(target,request, response);
236 if (applied!=null)
237 {
238 Log.debug("applied {}",rule);
239 if (!target.equals(applied))
240 {
241 Log.debug("rewrote {} to {}",target,applied);
242 if (!original_set)
243 {
244 original_set=true;
245 request.setAttribute(_originalPathAttribute, target);
246 }
247
248 if (_rewriteRequestURI)
249 ((Request)request).setRequestURI(applied);
250
251 if (_rewritePathInfo)
252 ((Request)request).setPathInfo(applied);
253
254 target=applied;
255 }
256
257 if (rule.isHandling())
258 {
259 Log.debug("handling {}",rule);
260 _handled=true;
261 (request instanceof Request?(Request)request:HttpConnection.getCurrentConnection().getRequest()).setHandled(true);
262 }
263
264 if (rule.isTerminating())
265 {
266 Log.debug("terminating {}",rule);
267 break;
268 }
269 }
270 }
271
272 return target;
273 }
274 }