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

View of /insanejava/trunk/rest-demo/src/test/java/no/brodwall/insanejava/rest/RESTServletClient.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 161 - (download) (as text) (annotate)
Sun Mar 4 03:11:44 2007 UTC (3 years, 6 months ago) by johannes
File size: 4237 byte(s)
Updated for article
package no.brodwall.insanejava.rest;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;

import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;

public class RESTServletClient implements RESTHttpClient {

    private final Servlet restServlet;
    private final String servletPath;

    public RESTServletClient(Servlet restServlet, String servletPath) {
        this.restServlet = restServlet;
        this.servletPath = servletPath;
    }

    public void doDelete(URL url) {
        MockHttpServletRequest request = new MockHttpServletRequest("DELETE", url.getFile());
        MockHttpServletResponse response = new MockHttpServletResponse();
        service(request, response);
        checkResponseCode(response, HttpServletResponse.SC_OK, HttpServletResponse.SC_NOT_FOUND);
    }

    public Reader doGet(URL url) {
        MockHttpServletRequest request = new MockHttpServletRequest("GET", url.getFile());
        MockHttpServletResponse response = new MockHttpServletResponse();
        service(request, response);
        checkResponseCode(response, HttpServletResponse.SC_NOT_FOUND, HttpServletResponse.SC_OK);

        if (response.getStatus() == HttpServletResponse.SC_NOT_FOUND) {
            return null;
        } else {
            try {
                return new StringReader(response.getContentAsString());
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }
        }
    }


    public URL doPostAndReturnLocation(URL url, WriterTemplate writerTemplate) {
        MockHttpServletRequest request = new MockHttpServletRequest("POST", url.getFile());
        request.setContent(toString(writerTemplate).getBytes());
        MockHttpServletResponse response = new MockHttpServletResponse();
        service(request, response);
        checkResponseCode(response, HttpServletResponse.SC_CREATED);
        try {
            return new URL((String)response.getHeader("Location"));
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
    }

    public void doPut(URL url, WriterTemplate content) {
        MockHttpServletRequest request = new MockHttpServletRequest("PUT", url.getFile());
        request.setContent(toString(content).getBytes());

        MockHttpServletResponse response = new MockHttpServletResponse();
        service(request, response);
        checkResponseCode(response);
    }

    private void checkResponseCode(MockHttpServletResponse response, int... validCodes) {
        if (validCodes.length == 0) {
            validCodes = new int[] { HttpServletResponse.SC_OK };
        }
        for (int code : validCodes) {
            if (response.getStatus() == code) {
                return;
            }
        }
        throw new RuntimeException("Error from server " + response.getStatus() + " " + response.getErrorMessage());
    }

    private void service(MockHttpServletRequest request, HttpServletResponse response) {
        String pathInfo = request.getRequestURI();
        if (pathInfo.startsWith(servletPath)) {
            pathInfo = pathInfo.substring(servletPath.length());
        }
        request.setPathInfo(pathInfo);
        try {
            restServlet.service(request, response);
        } catch (ServletException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private String toString(WriterTemplate writerTemplate) {
        StringWriter writer = new StringWriter();
        try {
            writerTemplate.doWithWriter(writer);
            return writer.toString();
        } catch (IOException e) {
            throw new RuntimeException("Should never happen with StringWriter", e);
        }
    }

}

Johannes Brodwall
ViewVC Help
Powered by ViewVC 1.0.0