package org.mobicents.slee.sipevent.server.subscription.sip;
import javax.persistence.EntityManager;
import javax.sip.Dialog;
import javax.sip.ResponseEvent;
import javax.sip.header.EventHeader;
import javax.slee.ActivityContextInterface;
import org.apache.log4j.Logger;
import org.mobicents.slee.sipevent.server.subscription.ImplementedSubscriptionControlSbbLocalObject;
import org.mobicents.slee.sipevent.server.subscription.SubscriptionControlSbb;
import org.mobicents.slee.sipevent.server.subscription.pojo.Subscription;
import org.mobicents.slee.sipevent.server.subscription.pojo.Subscription.Status;
/**
* Handles the removal of a SIP subscription
*
* @author martins
*
*/
public class RemoveSipSubscriptionHandler {
private static Logger logger = Logger
.getLogger(SubscriptionControlSbb.class);
private SipSubscriptionHandler sipSubscriptionHandler;
public RemoveSipSubscriptionHandler(
SipSubscriptionHandler sipSubscriptionHandler) {
this.sipSubscriptionHandler = sipSubscriptionHandler;
}
/**
*
* Handles a request to remove an existing SIP subscription
*
* @param aci
* @param eventPackage
* @param eventId
* @param subscription
* @param entityManager
* @param childSbb
*/
public void removeSipSubscription(ActivityContextInterface aci,
Subscription subscription, EntityManager entityManager,
ImplementedSubscriptionControlSbbLocalObject childSbb) {
// cancel timer
sipSubscriptionHandler.sbb.getTimerFacility().cancelTimer(
subscription.getTimerID());
if (!subscription.getStatus().equals(Status.terminated) && !subscription.getStatus().equals(Status.waiting)) {
// change subscription state
subscription.setStatus(Subscription.Status.terminated);
subscription.setLastEvent(null);
}
// get dialog from aci
Dialog dialog = (Dialog) aci.getActivity();
// notify subscriber
try {
sipSubscriptionHandler.getSipSubscriberNotificationHandler()
.createAndSendNotify(entityManager, subscription, dialog,
childSbb);
} catch (Exception e) {
logger.error("failed to notify subscriber", e);
}
// notify winfo subscription(s)
sipSubscriptionHandler.sbb
.getWInfoSubscriptionHandler()
.notifyWinfoSubscriptions(entityManager, subscription, childSbb);
// check resulting subscription state
if (subscription.getStatus().equals(Subscription.Status.terminated)) {
if (logger.isInfoEnabled()) {
logger.info("Status changed for " + subscription);
}
// remove subscription data
sipSubscriptionHandler.sbb.removeSubscriptionData(entityManager,
subscription, dialog, aci, childSbb);
} else if (subscription.getStatus().equals(Subscription.Status.waiting)) {
if (logger.isInfoEnabled()) {
logger.info("Status changed for " + subscription);
}
// keep the subscription for default waiting time so notifier may
// know about this attemp to subscribe him
// refresh subscription
int defaultWaitingExpires = sipSubscriptionHandler.sbb
.getConfiguration().getDefaultWaitingExpires();
subscription.refresh(defaultWaitingExpires);
// set waiting timer
sipSubscriptionHandler.sbb
.setSubscriptionTimerAndPersistSubscription(entityManager,
subscription, defaultWaitingExpires + 1, aci);
}
}
/**
* removes a subscription due to error response on notify
*
* @param event
*/
public void removeSipSubscriptionOnNotifyError(ResponseEvent event) {
EntityManager entityManager = sipSubscriptionHandler.sbb
.getEntityManager();
EventHeader eventHeader = (EventHeader) event.getResponse().getHeader(
EventHeader.NAME);
Dialog dialog = event.getDialog();
if (eventHeader != null && dialog != null) {
Subscription subscription = Subscription.getSubscription(
entityManager, dialog.getCallId().getCallId(), dialog
.getRemoteTag(), eventHeader.getEventType(),
eventHeader.getEventId());
if (subscription != null) {
if (logger.isInfoEnabled()) {
logger.info("Removing " + subscription.getKey()
+ " data due to error on notify response.");
}
if (!subscription.getResourceList()) {
sipSubscriptionHandler.sbb.getEventListControlChildSbb().removeSubscription(subscription);
}
sipSubscriptionHandler.sbb.removeSubscriptionData(
entityManager, subscription, dialog,
sipSubscriptionHandler.sbb
.getActivityContextNamingfacility().lookup(
subscription.getKey().toString()),
sipSubscriptionHandler.sbb
.getImplementedControlChildSbb());
entityManager.flush();
}
}
entityManager.close();
}
}