/** * @author Hyacinthe MENIET * Created on 22 août 07 */ package net.dotmyself.weatherws; import java.io.IOException; import java.io.OutputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; /** * Servlet which uses HTTP verbs (GET,POST,PUT and DELETE) to perform a REST web service. */ public class CityServlet extends HttpServlet { private static final long serialVersionUID = 7159907909932997509L; private static final String characterEncoding = "iso-8859-1"; private static final String contentType = "application/xml"; private CityMemory memory; public CityServlet () { this.memory = new CityMemory(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { try { City city = getCityFromMemory(request); city.setLastUpdate(getCurrentDate()); city.setUri(getCityUri(request,city.getId())); // Marshalling retrieved City to the given OutputStream JAXBContext context = JAXBContext.newInstance(City.class); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty(Marshaller.JAXB_ENCODING, "ISO-8859-1"); response.setContentType(contentType); response.setCharacterEncoding(characterEncoding); OutputStream os = response.getOutputStream(); marshaller.marshal(city,os); } catch (IllegalStateException e) { response.sendError(HttpServletResponse.SC_NOT_FOUND, e.getMessage()); } catch (Exception e) { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { try { City city = getCityFromXml(request); Long key = memory.create(city); response.setHeader("Location", getCityUri(request, key)); response.setStatus(HttpServletResponse.SC_CREATED); } catch (Exception e) { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); } } @Override protected void doPut(HttpServletRequest request, HttpServletResponse response) throws IOException { try { City city = getCityFromMemory(request); city.setLastUpdate(getCurrentDate()); memory.update(city.getId(), getCityFromXml(request)); response.setStatus(HttpServletResponse.SC_NO_CONTENT); } catch (Exception e) { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); } } @Override protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws IOException { memory.delete(getKey(request)); response.setStatus(HttpServletResponse.SC_NO_CONTENT); } private String getCityUri(HttpServletRequest request, Long key) { return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + request.getServletPath() + "/" + key; } private String getCurrentDate() { DateFormat dateFormat = new SimpleDateFormat("dd-MM-yy 'à' hh':'mm"); return dateFormat.format(new Date()); } private City getCityFromXml(HttpServletRequest request) throws JAXBException, IOException { JAXBContext context = JAXBContext.newInstance(City.class); Unmarshaller unmarshaller = context.createUnmarshaller(); City city = (City) unmarshaller.unmarshal(request.getReader()); return city; } private City getCityFromMemory(HttpServletRequest request) { City city = memory.retrieve(getKey(request)); if (city == null) { throw new NullPointerException("Can't find the requested city"); } return city; } private Long getKey(HttpServletRequest request) { String[] parts = request.getPathInfo().split("/"); if (parts.length <= 1) { throw new IllegalStateException("Missing id"); } return Long.valueOf(parts[1]); } }