package org.mobicents.slee.example.loadtest.sip11;
import gov.nist.javax.sip.Utils;
import java.text.ParseException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sip.ClientTransaction;
import javax.sip.ListeningPoint;
import javax.sip.RequestEvent;
import javax.sip.ServerTransaction;
import javax.sip.address.Address;
import javax.sip.address.AddressFactory;
import javax.sip.address.SipURI;
import javax.sip.header.ContactHeader;
import javax.sip.header.HeaderFactory;
import javax.sip.header.ToHeader;
import javax.sip.message.MessageFactory;
import javax.sip.message.Request;
import javax.sip.message.Response;
import javax.slee.ActivityContextInterface;
import javax.slee.RolledBackContext;
import javax.slee.SbbContext;
import javax.slee.facilities.TimerEvent;
import javax.slee.facilities.TimerFacility;
import javax.slee.facilities.TimerOptions;
import javax.slee.facilities.TimerPreserveMissed;
import net.java.slee.resource.sip.DialogActivity;
import net.java.slee.resource.sip.SipActivityContextInterfaceFactory;
import net.java.slee.resource.sip.SleeSipProvider;
public abstract class SimpleCallSetupTerminatedByServerWithDialogsTestSbb implements javax.slee.Sbb {
private SipActivityContextInterfaceFactory sipActivityContextInterfaceFactory;
private SleeSipProvider sipFactoryProvider;
private AddressFactory addressFactory;
private HeaderFactory headerFactory;
private MessageFactory messageFactory;
private TimerFacility timerFacility;
private static ContactHeader contactHeader;
private ContactHeader getContactHeader() throws ParseException {
if (contactHeader == null) {
ListeningPoint listeningPoint = sipFactoryProvider
.getListeningPoint("udp");
Address address = addressFactory.createAddress(
"Mobicents SIP AS <sip:"+listeningPoint.getIPAddress()+">");
((SipURI) address.getURI()).setPort(listeningPoint.getPort());
contactHeader = headerFactory.createContactHeader(address);
}
return contactHeader;
}
public void onInviteEvent(javax.sip.RequestEvent requestEvent, ActivityContextInterface aci) {
try {
ServerTransaction serverTransaction = requestEvent.getServerTransaction();
// send 100
// serverTransaction.sendResponse(messageFactory.createResponse(100,requestEvent.getRequest()));
// create dialog and attach this entity to it's aci
DialogActivity dialog = (DialogActivity) sipFactoryProvider.getNewDialog(serverTransaction);
sipActivityContextInterfaceFactory.getActivityContextInterface(dialog).attach(this.sbbContext.getSbbLocalObject());
// send 200 ok
Response response = messageFactory
.createResponse(Response.OK,requestEvent.getRequest());
response.addHeader(getContactHeader());
((ToHeader)response.getHeader(ToHeader.NAME)).setTag(Utils.getInstance().generateTag());
serverTransaction.sendResponse(response);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void onAckEvent(RequestEvent requestEvent, ActivityContextInterface aci) {
try {
// set timer of 60 secs
TimerOptions timerOptions = new TimerOptions();
timerOptions.setPreserveMissed(TimerPreserveMissed.ALL);
timerFacility.setTimer(aci, null, System.currentTimeMillis()+60000, timerOptions);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void onTimerEvent(TimerEvent event, ActivityContextInterface aci) {
try {
DialogActivity dialog = (DialogActivity)aci.getActivity();
Request request = dialog.createRequest(Request.BYE);
request.addHeader(getContactHeader());
ClientTransaction clientTransaction = sipFactoryProvider.getNewClientTransaction(request);
clientTransaction.sendRequest();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void setSbbContext(SbbContext context) {
this.sbbContext = context;
try {
Context ctx = (Context)new InitialContext().lookup("java:comp/env");
sipActivityContextInterfaceFactory = (SipActivityContextInterfaceFactory)ctx.lookup("slee/resources/jainsip/1.2/acifactory");
sipFactoryProvider = (SleeSipProvider)ctx.lookup("slee/resources/jainsip/1.2/provider");
addressFactory = sipFactoryProvider.getAddressFactory();
headerFactory = sipFactoryProvider.getHeaderFactory();
messageFactory = sipFactoryProvider.getMessageFactory();
this.timerFacility = (TimerFacility) ctx.lookup("slee/facilities/timer");
} catch (NamingException e) {
e.printStackTrace();
}
}
public void unsetSbbContext() { this.sbbContext = null; }
public void sbbCreate() throws javax.slee.CreateException {}
public void sbbPostCreate() throws javax.slee.CreateException {}
public void sbbActivate() {}
public void sbbPassivate() {}
public void sbbRemove() {}
public void sbbLoad() {}
public void sbbStore() {}
public void sbbExceptionThrown(Exception exception, Object event, ActivityContextInterface activity) {}
public void sbbRolledBack(RolledBackContext context) {}
/**
* Convenience method to retrieve the SbbContext object stored in setSbbContext.
*
* TODO: If your SBB doesn't require the SbbContext object you may remove this
* method, the sbbContext variable and the variable assignment in setSbbContext().
*
* @return this SBB's SbbContext object
*/
protected SbbContext getSbbContext() {
return sbbContext;
}
private SbbContext sbbContext; // This SBB's SbbContext
}