package org.mobicents.slee.sipevent.server.internal;
import javax.persistence.EntityManager;
import javax.sip.message.Response;
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.SubscriptionKey;
import org.mobicents.slee.sipevent.server.subscription.pojo.Subscription.Status;
/**
* Handles the removal of a SIP subscription
*
* @author martins
*
*/
public class RemoveInternalSubscriptionHandler {
private static Logger logger = Logger
.getLogger(SubscriptionControlSbb.class);
private InternalSubscriptionHandler internalSubscriptionHandler;
public RemoveInternalSubscriptionHandler(
InternalSubscriptionHandler sipSubscriptionHandler) {
this.internalSubscriptionHandler = sipSubscriptionHandler;
}
public void removeInternalSubscription(String subscriber, String notifier,
String eventPackage, String subscriptionId,
EntityManager entityManager,
ImplementedSubscriptionControlSbbLocalObject childSbb) {
SubscriptionControlSbb sbb = internalSubscriptionHandler.sbb;
// create subscription key
SubscriptionKey subscriptionKey = new SubscriptionKey(
SubscriptionKey.NO_CALL_ID, SubscriptionKey.NO_REMOTE_TAG,
eventPackage, subscriptionId);
// find subscription
Subscription subscription = entityManager.find(Subscription.class,
subscriptionKey);
if (subscription == null) {
// subscription does not exists
sbb.getParentSbbCMP().unsubscribeError(subscriber, notifier,
eventPackage, subscriptionId,
Response.CONDITIONAL_REQUEST_FAILED);
return;
}
ActivityContextInterface aci = sbb.getActivityContextNamingfacility()
.lookup(subscriptionKey.toString());
if (aci == null) {
logger
.error("Failed to retrieve aci for internal subscription with key "
+ subscriptionKey);
sbb.getParentSbbCMP().unsubscribeError(subscriber, notifier,
eventPackage, subscriptionId,
Response.SERVER_INTERNAL_ERROR);
return;
}
// send OK response
sbb.getParentSbbCMP().unsubscribeOk(subscriber, notifier, eventPackage,
subscriptionId);
if (subscription.getResourceList()) {
internalSubscriptionHandler.sbb.getEventListControlChildSbb().removeSubscription(subscription);
}
removeInternalSubscription(aci, subscription, entityManager, childSbb);
}
public void removeInternalSubscription(ActivityContextInterface aci,
Subscription subscription, EntityManager entityManager,
ImplementedSubscriptionControlSbbLocalObject childSbb) {
// cancel timer
internalSubscriptionHandler.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);
}
// notify subscriber
internalSubscriptionHandler.getInternalSubscriberNotificationHandler()
.notifyInternalSubscriber(entityManager, subscription, aci,
childSbb);
// notify winfo subscription(s)
internalSubscriptionHandler.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
internalSubscriptionHandler.sbb.removeSubscriptionData(
entityManager, subscription, null, 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 = internalSubscriptionHandler.sbb
.getConfiguration().getDefaultWaitingExpires();
subscription.refresh(defaultWaitingExpires);
// set waiting timer
internalSubscriptionHandler.sbb
.setSubscriptionTimerAndPersistSubscription(entityManager,
subscription, defaultWaitingExpires + 1, aci);
}
}
}