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();
    }    
}



Comments:

Post a Comment:
Comments are closed for this entry.

Calendar

Feeds

Search

Links

Navigation

Referrers