#set( $symbol_pound = '#' )
#set( $symbol_dollar = '$' )
#set( $symbol_escape = '\' )
package ${package};
import com.google.common.annotations.VisibleForTesting;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
/**
* This servlet ultimately provides a REST API for working with an
* <code>Airline</code>. However, in its current state, it is an example
* of how to use HTTP and Java servlets to store simple key/value pairs.
*/
public class AirlineServlet extends HttpServlet {
private final Map<String, String> data = new HashMap<>();
/**
* Handles an HTTP GET request from a client by writing the value of the key
* specified in the "key" HTTP parameter to the HTTP response. If the "key"
* parameter is not specified, all of the key/value pairs are written to the
* HTTP response.
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain");
String key = getParameter("key", request);
if (key != null) {
writeValue(key, response);
} else {
writeAllMappings(response);
}
}
/**
* Handles an HTTP POST request by storing the key/value pair specified by the
* "key" and "value" request parameters. It writes the key/value pair to the
* HTTP response.
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain");
String key = getParameter("key", request);
if (key == null) {
missingRequiredParameter(response, "key");
return;
}
String value = getParameter("value", request);
if (value == null) {
missingRequiredParameter(response, "value");
return;
}
this.data.put(key, value);
PrintWriter pw = response.getWriter();
pw.println(Messages.mappedKeyValue(key, value));
pw.flush();
response.setStatus(HttpServletResponse.SC_OK);
}
/**
* Handles an HTTP DELETE request by removing all key/value pairs. This
* behavior is exposed for testing purposes only. It's probably not
* something that you'd want a real application to expose.
*/
@Override
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain");
this.data.clear();
PrintWriter pw = response.getWriter();
pw.println(Messages.allMappingsDeleted());
pw.flush();
response.setStatus(HttpServletResponse.SC_OK);
}
/**
* Writes an error message about a missing parameter to the HTTP response.
*
* The text of the error message is created by {@link Messages${symbol_pound}missingRequiredParameter(String)}
*/
private void missingRequiredParameter(HttpServletResponse response, String parameterName)
throws IOException {
String message = Messages.missingRequiredParameter(parameterName);
response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED, message);
}
/**
* Writes the value of the given key to the HTTP response.
*
* The text of the message is formatted with {@link Messages${symbol_pound}getMappingCount(int)}
* and {@link Messages${symbol_pound}formatKeyValuePair(String, String)}
*/
private void writeValue(String key, HttpServletResponse response) throws IOException {
String value = this.data.get(key);
PrintWriter pw = response.getWriter();
pw.println(Messages.getMappingCount(value != null ? 1 : 0));
pw.println(Messages.formatKeyValuePair(key, value));
pw.flush();
response.setStatus(HttpServletResponse.SC_OK);
}
/**
* Writes all of the key/value pairs to the HTTP response.
*
* The text of the message is formatted with
* {@link Messages${symbol_pound}formatKeyValuePair(String, String)}
*/
private void writeAllMappings(HttpServletResponse response) throws IOException {
PrintWriter pw = response.getWriter();
pw.println(Messages.getMappingCount(data.size()));
for (Map.Entry<String, String> entry : this.data.entrySet()) {
pw.println(Messages.formatKeyValuePair(entry.getKey(), entry.getValue()));
}
pw.flush();
response.setStatus(HttpServletResponse.SC_OK);
}
/**
* Returns the value of the HTTP request parameter with the given name.
*
* @return <code>null</code> if the value of the parameter is
* <code>null</code> or is the empty string
*/
private String getParameter(String name, HttpServletRequest request) {
String value = request.getParameter(name);
if (value == null || "".equals(value)) {
return null;
} else {
return value;
}
}
@VisibleForTesting
void setValueForKey(String key, String value) {
this.data.put(key, value);
}
@VisibleForTesting
String getValueForKey(String key) {
return this.data.get(key);
}
}