package org.jboss.mobicents.seam;
import java.io.IOException;
import java.io.Serializable;
import javax.annotation.Resource;
import javax.ejb.Local;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.servlet.sip.SipServletMessage;
import javax.servlet.sip.SipServletRequest;
import javax.servlet.sip.SipServletResponse;
import javax.slee.EventTypeID;
import javax.slee.connection.ExternalActivityHandle;
import javax.slee.connection.SleeConnection;
import javax.slee.connection.SleeConnectionFactory;
import org.jboss.seam.annotations.JndiName;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Synchronized;
import org.jboss.seam.log.Log;
import org.mobicents.slee.service.events.InteropCustomEvent;
@Local
@Stateful
@Name("CallManagerBean")
@JndiName("jslee-sips/#{ejbName}/local")
@Synchronized
public class CallManagerBean implements CallManager, Serializable {
@Logger private Log log;
@Resource(mappedName="java:/MobicentsConnectionFactory")
SleeConnectionFactory factory;
SipServletResponse sipServletResponse;
ExternalActivityHandle handle;
/*
* (non-Javadoc)
* @see org.jboss.mobicents.seam.CallManager#initMediaConnection(javax.servlet.sip.SipServletRequest)
*/
public void initMediaConnection(SipServletRequest request) throws IOException {
log.info("initiating media connection");
sipServletResponse = request.createResponse(SipServletResponse.SC_OK);
fireEvent(
null,
(byte[])request.getContent(),
"org.mobicents.slee.service.interopdemo.INIT_MEDIA",
request.getSession().getAttribute("callManagerRef"));
}
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
private void fireEvent(String boothNumber, byte[] sdpContent, String eventType, Object callManagerRef) {
log.info("firing event into slee with following sdp : "+ sdpContent);
try {
SleeConnection conn1 = factory.getConnection();
if(handle == null) {
handle = conn1.createActivityHandle();
}
EventTypeID requestType = conn1.getEventTypeID(
eventType,
"org.mobicents", "1.0");
InteropCustomEvent interopCustomEvent = new InteropCustomEvent(boothNumber, sdpContent, callManagerRef);
conn1.fireEvent(interopCustomEvent, requestType, handle, null);
conn1.close();
} catch (Exception e) {
log.error("unexpected exception while firing the event " + eventType + " into jslee", e);
}
}
/*
* (non-Javadoc)
* @see org.jboss.mobicents.seam.CallManager#mediaConnectionCreated(java.lang.String)
*/
public void mediaConnectionCreated(String sdpContent) throws IOException {
sipServletResponse.setContentLength(sdpContent.length());
sipServletResponse.setContent(sdpContent.getBytes(), "application/sdp");
sipServletResponse.send();
}
/*
* (non-Javadoc)
* @see org.jboss.mobicents.seam.CallManager#playAnnouncement(javax.servlet.sip.SipServletMessage, java.lang.String)
*/
public void playAnnouncement(SipServletMessage message, String annoucementType) {
fireEvent(
(String) message.getSession().getAttribute("boothNumber"),
null,
"org.mobicents.slee.service.interopdemo." + annoucementType,
message.getSession().getAttribute("callManagerRef"));
}
/*
* (non-Javadoc)
* @see org.jboss.mobicents.seam.CallManager#endCall(javax.servlet.sip.SipServletMessage, boolean)
*/
public void endCall(SipServletMessage message, boolean callerTerminating) throws IOException {
if(callerTerminating) {
fireEvent(
(String) message.getSession().getAttribute("boothNumber"),
null,
"org.mobicents.slee.service.interopdemo.END_MEDIA",
message.getSession().getAttribute("callManagerRef"));
} else {
sipServletResponse.getSession().createRequest("BYE").send();
}
}
@Remove
public void destroy() {
}
}