package edu.pdx.cs410J.servlets; import edu.pdx.cs410J.family.FamilyTree; import edu.pdx.cs410J.family.Person; import edu.pdx.cs410J.family.XmlDumper; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import java.util.Collection; /** * A servlet that provides access to a {@link edu.pdx.cs410J.family.FamilyTree} via REST * * @since Summer 2008 */ public class FamilyTreeServlet extends HttpServlet { private FamilyTree tree; private int nextPersonId = 1; public void init(ServletConfig servletConfig) throws ServletException { tree = new FamilyTree(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { createPerson(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uri = request.getRequestURI(); String lastPart = uri.substring(uri.lastIndexOf('/') + 1, uri.length()); if (lastPart.equals("person")) { Collection<Person> all = this.tree.getPeople(); writePeople(response, all.toArray(new Person[all.size()])); } else { try { int id = Integer.parseInt(lastPart); Person person = this.tree.getPerson(id); if (person == null) { response.sendError(HttpServletResponse.SC_NOT_FOUND); } else { writePeople(response, person); } } catch (NumberFormatException ex) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Malformed person id: " + lastPart); return; } } } private void createPerson(HttpServletRequest request, HttpServletResponse response) throws IOException { String gender = getParameter("Gender", request); if (gender == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing Gender"); return; } Person person; try { person = new Person(nextPersonId++, Person.Gender.valueOf(gender.toUpperCase())); } catch (IllegalArgumentException ex) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Bad Gender: " + gender); return; } person.setFirstName(getParameter("FirstName", request)); person.setMiddleName(getParameter("MiddleName", request)); person.setLastName(getParameter("LastName", request)); String motherId = getParameter("MotherId", request); if (motherId != null) { try { Person mother = tree.getPerson(Integer.parseInt(motherId)); if (mother == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Unknown mother: " + motherId); return; } else { person.setMother(mother); } } catch (NumberFormatException ex) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Bad mother id: " + motherId); return; } } String fatherId = getParameter("FatherId", request); if (fatherId != null) { try { Person father = tree.getPerson(Integer.parseInt(fatherId)); if (father == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Unknown father: " + fatherId); return; } else { person.setFather(father); } } catch (NumberFormatException ex) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Bad father id: " + fatherId); return; } } String dob = getParameter("DateOfBirth", request); if (dob != null) { try { person.setDateOfBirth(new Date(Long.parseLong(dob))); } catch (NumberFormatException ex) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Bad date of birth: " + dob); return; } } String dod = getParameter("DateOfDeath", request); if (dod != null) { try { person.setDateOfDeath(new Date(Long.parseLong(dod))); } catch (NumberFormatException ex) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Bad date of death: " + dod); return; } } tree.addPerson(person); writePeople(response, person); } /** * Writes people to the response */ private void writePeople(HttpServletResponse response, Person... people) throws IOException { FamilyTree tree = new FamilyTree(); for (Person person : people) { tree.addPerson(person); } new XmlDumper(new PrintWriter(response.getWriter(), true)).dump(tree); } private String getParameter(String name, HttpServletRequest request) { String value = request.getParameter(name); if (value == null || "".equals(value)) { return null; } else { return value; } } }