[demo] / insanejava / trunk / rest-demo / src / main / java / no / brodwall / insanejava / rest / RESTRepositoryServlet.java Repository:
ViewVC logotype

View of /insanejava/trunk/rest-demo/src/main/java/no/brodwall/insanejava/rest/RESTRepositoryServlet.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 187 - (download) (as text) (annotate)
Thu Aug 30 22:15:18 2007 UTC (3 years ago) by johannes
File size: 3102 byte(s)
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