Parent Directory
|
Revision Log
Decreased use of generics
package no.brodwall.insanejava.rest;
import java.io.IOException;
import java.io.Serializable;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RESTRepositoryServlet extends HttpServlet {
private Repository repository;
private EntityToXmlMapper mapper;
public RESTRepositoryServlet(Repository repository, EntityToXmlMapper mapper) {
this.repository = repository;
this.mapper = mapper;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Object entity = getEntity(req);
mapper.entityToWriter(entity).doWithWriter(resp.getWriter());
resp.setContentType("application/xml");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Serializable key = repository.insert(mapper.xmlToEntity(req.getReader()));
String url = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath() + req.getServletPath() + "/" + key;
resp.setHeader("Location", url);
resp.setStatus(HttpServletResponse.SC_CREATED);
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
getEntity(req);
repository.update(getKey(req), mapper.xmlToEntity(req.getReader()));
resp.setStatus(HttpServletResponse.SC_OK);
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) {
repository.delete(getKey(req));
}
private static class ServletRequestException extends RuntimeException {
private final int statusCode;
public ServletRequestException(int statusCode, String message) {
super(message);
this.statusCode = statusCode;
}
public int getStatusCode() {
return statusCode;
}
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
super.service(req, resp);
} catch (ServletRequestException e) {
resp.sendError(e.getStatusCode(), e.getMessage());
}
}
private Serializable getKey(HttpServletRequest req) {
// Called from doDelete, doPut and getEntity
String[] parts = req.getPathInfo().split("/");
if (parts.length <= 1) {
throw new ServletRequestException(HttpServletResponse.SC_BAD_REQUEST, "Missing id");
}
return Long.valueOf(parts[1]);
}
private Object getEntity(HttpServletRequest req) {
Object entity = repository.retrieve(getKey(req));
if (entity == null) {
throw new ServletRequestException(HttpServletResponse.SC_NOT_FOUND, "Can't find " + getKey(req));
}
return entity;
}
}
| Johannes Brodwall | ViewVC Help |
| Powered by ViewVC 1.0.0 |