Sony Manuel's blog
Monday Feb 09, 2009
Using B2BUAHelper for writing a b2bua application.
JSR 289 introduces B2BUAHelper class which greatly simplifies developing b2bua applications. In SipServlet 1.0 developing b2bua class of applications was cumbersome. We had to rely on storing requests and responses for later access. The callflow and state transitions had to be sort of co-ordinated.
Following is a basic b2bua servlet. I've highlighted the code where we use the B2BUAHelper class. If you are familiar with developing b2bua applications with the previous specification you would find this lot more easy and clean.
| import java.io.IOException; import java.util.List; import java.util.logging.Logger; import javax.annotation.Resource; import javax.servlet.ServletException; import javax.servlet.sip.B2buaHelper; import javax.servlet.sip.SipFactory; import javax.servlet.sip.SipServletMessage; import javax.servlet.sip.SipServletRequest; import javax.servlet.sip.SipServletResponse; import javax.servlet.sip.SipSession; import javax.servlet.sip.SipURI; import javax.servlet.sip.UAMode; @javax.servlet.sip.annotation.SipServlet public class B2BUAServlet extends javax.servlet.sip.SipServlet { @Resource public SipFactory sipFactory; public static Logger logger = Logger.getLogger("b2bua"); @Override protected void doInvite(SipServletRequest request) throws ServletException, IOException { B2buaHelper helper = request.getB2buaHelper(); SipServletRequest nextRequest = helper.createRequest(request); helper.linkSipSessions(request.getSession(), nextRequest.getSession()); SipURI uri = (SipURI) sipFactory.createURI(request.getHeader("Callee")); nextRequest.setRequestURI(uri); nextRequest.send(); } @Override protected void doResponse(SipServletResponse response) throws ServletException, IOException { SipSession toSS = response.getSession(); B2buaHelper b2b = response.getRequest().getB2buaHelper(); SipSession fromSS = b2b.getLinkedSession(toSS); List<SipServletMessage> pendingMessages = b2b.getPendingMessages(fromSS, UAMode.UAS); if (pendingMessages.size() > 0) { SipServletRequest request = (SipServletRequest) pendingMessages.get(0); SipServletResponse b2bResponse = request.createResponse( response.getStatus(),response.getReasonPhrase()); b2bResponse.send(); } else { logger.severe("No pending messages for Session " + fromSS); } } @Override protected void doAck(SipServletRequest request) throws ServletException, IOException { B2buaHelper helper = request.getB2buaHelper(); SipSession toSS = helper.getLinkedSession(request.getSession()); List<SipServletMessage> pendingMessages = helper.getPendingMessages(toSS, UAMode.UAC); SipServletResponse response = (SipServletResponse) pendingMessages.get(0); SipServletRequest toAck = response.createAck(); toAck.send(); } @Override protected void doBye(SipServletRequest request) throws ServletException, IOException { B2buaHelper helper = request.getB2buaHelper(); SipSession toSS = helper.getLinkedSession(request.getSession()); SipServletRequest byeRequest = helper.createRequest(toSS, request, null); byeRequest.send(); } } |
Posted at 11:46PM Feb 09, 2009 by sonymanuel in Sun |
Comments: