The RegistrarServlet allows users to register soft-phones with the application, and stores the user's data in a database using the Java Persistence API.
RegistrarServlet has three methods: doRegister, handleRegister, and handleUnregister.
The doRegister method responds to REGISTER messages and performs some checks on the incoming request, extracts the user name from the request, looks the user up in the database of users, and examines the EXPIRES header of the request to determine whether the request is a registration or unregistration request. If it is a registration request, the handleRegister private helper method is called. If it is an unregistration request, the handleUnregister private helper method is called. These methods will return a SIP response to send back to the client.
@Override protected void doRegister(SipServletRequest req) throws ServletException, IOException { logger.info("Received register request: " + req.getTo()); int response = SipServletResponse.SC_SERVER_INTERNAL_ERROR; ModelFacade mf = (ModelFacade) getServletContext().getAttribute("Model"); // Figure out the name the user is registering with. This is the // user portion of the SIP URI, e.g. "Bob" in "sip:Bob@x.y.z:port" String username = null; if (req.getTo().getURI().isSipURI()) { username = ((SipURI) req.getTo().getURI()).getUser(); } // get the Person object from the database Person p = mf.getPerson(username); if (p != null) { // the Expires header tells us if this is a registration or // unregistration attempt. An expires value of 0 or no Expires // header means it is an unregistration. int expires = 0; String expStr = req.getHeader("Expires"); if (expStr != null) { expires = Integer.parseInt(expStr); } if (expires == 0) { // unregister response = handleUnregister(req, p); } else { // register response = handleRegister(req, p); } } else { // no person found in the database response = SipServletResponse.SC_NOT_FOUND; } // send the response SipServletResponse resp = req.createResponse(response); resp.send(); }
The handleRegister method extracts the user's SIP address from the request, stores it in the user database, and returns a SIP OK response. The user can now place and receive calls.
private int handleRegister(SipServletRequest req, Person p) throws ServletException { // Get the contact address from the request. Prefer the // "Contact" address if given, otherwise use the "To" address Address addr = req.getTo(); String contact = req.getHeader("Contact"); if (contact != null) { addr = sf.createAddress(contact); } logger.info("Register address: " + addr); // store the contact address in the database p.setTelephone(addr.getURI().toString()); ModelFacade mf = (ModelFacade) getServletContext().getAttribute("Model"); mf.updatePerson(p); return SipServletResponse.SC_OK; }
The handleUnregister method removes the user's SIP address from the database by setting it to null, then sends a SIP OK response back. The user cannot place or receive calls after being unregistered.
private int handleUnregister(SipServletRequest req, Person p) { // store the contact address in the database p.setTelephone(null); ModelFacade mf = (ModelFacade) getServletContext().getAttribute("Model"); mf.updatePerson(p); return SipServletResponse.SC_OK; }