1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 package groovy.servlet;
47
48 import groovy.lang.Binding;
49 import groovy.xml.MarkupBuilder;
50
51 import java.io.IOException;
52 import java.util.Enumeration;
53 import java.util.HashMap;
54 import java.util.Map;
55
56 import javax.servlet.ServletContext;
57 import javax.servlet.http.HttpServletRequest;
58 import javax.servlet.http.HttpServletResponse;
59
60 /***
61 * Servlet-specific binding extension to lazy load the writer or the output
62 * stream from the response.
63 *
64 * <p>
65 * <h3>Default variables bound</h3>
66 * <ul>
67 * <li><tt>"request"</tt> : the HttpServletRequest object</li>
68 * <li><tt>"response"</tt> : the HttpServletResponse object</li>
69 * <li><tt>"context"</tt> : the ServletContext object </li>
70 * <li><tt>"application"</tt> : same as context</li>
71 * <li><tt>"session"</tt> : convenient for <code>request.getSession(<b>false</b>)</code> - can be null!</li>
72 * <li><tt>"params"</tt> : map of all form parameters - can be empty</li>
73 * <li><tt>"headers"</tt> : map of all <b>request</b> header fields</li>
74 * </ul>
75 *
76 * <p>
77 * <h3>Implicite bound variables</h3>
78 * <ul>
79 * <li><tt>"out"</tt> : response.getWriter() </li>
80 * <li><tt>"sout"</tt> : response.getOutputStream() </li>
81 * <li><tt>"html"</tt> : new MarkupBuilder(response.getWriter()) </li>
82 * </ul>
83 * </p>
84 *
85 * @author Guillaume Laforge
86 * @author Christian Stein
87 */
88 public class ServletBinding extends Binding {
89
90 private final Binding binding;
91
92 private final ServletContext context;
93
94 private final HttpServletRequest request;
95
96 private final HttpServletResponse response;
97
98 private MarkupBuilder html;
99
100 /***
101 * Initializes a servlet binding.
102 */
103 public ServletBinding(HttpServletRequest request, HttpServletResponse response, ServletContext context) {
104 this.binding = new Binding();
105 this.request = request;
106 this.response = response;
107 this.context = context;
108
109
110
111
112 binding.setVariable("request", request);
113 binding.setVariable("response", response);
114 binding.setVariable("context", context);
115 binding.setVariable("application", context);
116
117
118
119
120
121 binding.setVariable("session", request.getSession(false));
122
123
124
125
126
127
128 Map params = new HashMap();
129 for (Enumeration names = request.getParameterNames(); names.hasMoreElements();) {
130 String name = (String) names.nextElement();
131 if (!binding.getVariables().containsKey(name)) {
132 String[] values = request.getParameterValues(name);
133 if (values.length == 1) {
134 params.put(name, values[0]);
135 } else {
136 params.put(name, values);
137 }
138 }
139 }
140 binding.setVariable("params", params);
141
142
143
144
145 Map headers = new HashMap();
146 for (Enumeration names = request.getHeaderNames(); names.hasMoreElements();) {
147 String headerName = (String) names.nextElement();
148 String headerValue = request.getHeader(headerName);
149 headers.put(headerName, headerValue);
150 }
151 binding.setVariable("headers", headers);
152 }
153
154 public void setVariable(String name, Object value) {
155
156
157
158 if (name == null) {
159 throw new IllegalArgumentException("Can't bind variable to null key.");
160 }
161 if (name.length() == 0) {
162 throw new IllegalArgumentException("Can't bind variable to blank key name. [length=0]");
163 }
164
165
166
167 if ("out".equals(name)) {
168 throw new IllegalArgumentException("Can't bind variable to key named '" + name + "'.");
169 }
170 if ("sout".equals(name)) {
171 throw new IllegalArgumentException("Can't bind variable to key named '" + name + "'.");
172 }
173 if ("html".equals(name)) {
174 throw new IllegalArgumentException("Can't bind variable to key named '" + name + "'.");
175 }
176
177
178
179
180
181
182
183 binding.setVariable(name, value);
184 }
185
186 public Map getVariables() {
187 return binding.getVariables();
188 }
189
190 /***
191 * @return a writer, an output stream, a markup builder or another requested object
192 */
193 public Object getVariable(String name) {
194
195
196
197 if (name == null) {
198 throw new IllegalArgumentException("No variable with null key name.");
199 }
200 if (name.length() == 0) {
201 throw new IllegalArgumentException("No variable with blank key name. [length=0]");
202 }
203
204
205
206 try {
207 if ("out".equals(name)) {
208 return response.getWriter();
209 }
210 if ("sout".equals(name)) {
211 return response.getOutputStream();
212 }
213 if ("html".equals(name)) {
214 if (html == null) {
215 html = new MarkupBuilder(response.getWriter());
216 }
217 return html;
218 }
219 } catch (IOException e) {
220 String message = "Failed to get writer or output stream from response.";
221 context.log(message, e);
222 throw new RuntimeException(message, e);
223 }
224
225
226
227 return binding.getVariable(name);
228 }
229 }