groovy.servlet.ServletBinding Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of groovy-all-minimal Show documentation
Show all versions of groovy-all-minimal Show documentation
Groovy: A powerful, dynamic language for the JVM
/*
* Copyright 2003-2007 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package groovy.servlet;
import groovy.lang.Binding;
import groovy.xml.MarkupBuilder;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet-specific binding extension to lazy load the writer or the output
* stream from the response.
*
*
*
Default variables bound
*
* - "request" : the HttpServletRequest object
* - "response" : the HttpServletResponse object
* - "context" : the ServletContext object
* - "application" : same as context
* - "session" : convenient for
request.getSession(false)
- can be null!
* - "params" : map of all form parameters - can be empty
* - "headers" : map of all request header fields
*
*
*
*
Implicite bound variables
*
* - "out" : response.getWriter()
* - "sout" : response.getOutputStream()
* - "html" : new MarkupBuilder(response.getWriter())
*
*
*
* @author Guillaume Laforge
* @author Christian Stein
*/
public class ServletBinding extends Binding {
private final Binding binding;
private final ServletContext context;
private final HttpServletRequest request;
private final HttpServletResponse response;
private MarkupBuilder html;
/**
* Initializes a servlet binding.
*/
public ServletBinding(HttpServletRequest request, HttpServletResponse response, ServletContext context) {
this.binding = new Binding();
this.request = request;
this.response = response;
this.context = context;
/*
* Bind the default variables.
*/
binding.setVariable("request", request);
binding.setVariable("response", response);
binding.setVariable("context", context);
binding.setVariable("application", context);
/*
* Bind the HTTP session object - if there is one.
* Note: we don't create one here!
*/
binding.setVariable("session", request.getSession(false));
/*
* Bind form parameter key-value hash map.
*
* If there are multiple, they are passed as an array.
*/
Map params = new HashMap();
for (Enumeration names = request.getParameterNames(); names.hasMoreElements();) {
String name = (String) names.nextElement();
if (!binding.getVariables().containsKey(name)) {
String[] values = request.getParameterValues(name);
if (values.length == 1) {
params.put(name, values[0]);
} else {
params.put(name, values);
}
}
}
binding.setVariable("params", params);
/*
* Bind request header key-value hash map.
*/
Map headers = new HashMap();
for (Enumeration names = request.getHeaderNames(); names.hasMoreElements();) {
String headerName = (String) names.nextElement();
String headerValue = request.getHeader(headerName);
headers.put(headerName, headerValue);
}
binding.setVariable("headers", headers);
}
public void setVariable(String name, Object value) {
/*
* Check sanity.
*/
if (name == null) {
throw new IllegalArgumentException("Can't bind variable to null key.");
}
if (name.length() == 0) {
throw new IllegalArgumentException("Can't bind variable to blank key name. [length=0]");
}
/*
* Check implicite key names. See getVariable(String)!
*/
if ("out".equals(name)) {
throw new IllegalArgumentException("Can't bind variable to key named '" + name + "'.");
}
if ("sout".equals(name)) {
throw new IllegalArgumentException("Can't bind variable to key named '" + name + "'.");
}
if ("html".equals(name)) {
throw new IllegalArgumentException("Can't bind variable to key named '" + name + "'.");
}
/*
* TODO Check default key names. See constructor(s).
*/
/*
* All checks passed, set the variable.
*/
binding.setVariable(name, value);
}
public Map getVariables() {
return binding.getVariables();
}
/**
* @return a writer, an output stream, a markup builder or another requested object
*/
public Object getVariable(String name) {
/*
* Check sanity.
*/
if (name == null) {
throw new IllegalArgumentException("No variable with null key name.");
}
if (name.length() == 0) {
throw new IllegalArgumentException("No variable with blank key name. [length=0]");
}
/*
* Check implicite key names. See setVariable(String, Object)!
*/
try {
if ("out".equals(name)) {
return response.getWriter();
}
if ("sout".equals(name)) {
return response.getOutputStream();
}
if ("html".equals(name)) {
if (html == null) {
html = new MarkupBuilder(response.getWriter());
}
return html;
}
} catch (IOException e) {
String message = "Failed to get writer or output stream from response.";
context.log(message, e);
throw new RuntimeException(message, e);
}
/*
* Still here? Delegate to the binding object.
*/
return binding.getVariable(name);
}
}