package org.mobicents.slee.sipevent.server.internal; import java.io.IOException; import java.io.StringWriter; import java.text.ParseException; import javax.persistence.EntityManager; import javax.sip.header.ContentTypeHeader; import javax.slee.ActivityContextInterface; import javax.xml.bind.JAXBException; import org.apache.log4j.Logger; import org.mobicents.slee.sipevent.server.subscription.ImplementedSubscriptionControlSbbLocalObject; import org.mobicents.slee.sipevent.server.subscription.NotifyContent; import org.mobicents.slee.sipevent.server.subscription.SubscriptionControlSbb; import org.mobicents.slee.sipevent.server.subscription.pojo.Subscription; /** * Handles the notification of a SIP subscriber * * @author martins * */ public class InternalSubscriberNotificationHandler { private static Logger logger = Logger .getLogger(SubscriptionControlSbb.class); private InternalSubscriptionHandler internalSubscriptionHandler; public InternalSubscriberNotificationHandler( InternalSubscriptionHandler sbb) { this.internalSubscriptionHandler = sbb; } public void notifyInternalSubscriber(EntityManager entityManager, Subscription subscription, ActivityContextInterface aci, ImplementedSubscriptionControlSbbLocalObject childSbb) { NotifyContent notifyContent = null; // only get notify content if subscription status is active if (subscription.getStatus().equals(Subscription.Status.active)) { notifyContent = childSbb.getNotifyContent(subscription); } if (notifyContent != null) { notifyInternalSubscriber(entityManager, subscription, notifyContent .getContent(), notifyContent.getContentTypeHeader(), childSbb); } else { notifyInternalSubscriber(entityManager, subscription, null, null, childSbb); } } public void notifyInternalSubscriber(EntityManager entityManager, Subscription subscription, String content, ContentTypeHeader contentTypeHeader, ActivityContextInterface subscriptionACI) { String contentType = null; String contentSubtype = null; if (contentTypeHeader != null) { contentType = contentTypeHeader.getContentType(); contentSubtype = contentTypeHeader.getContentSubType(); } // if subscription status is waiting notify terminated status Subscription.Status status = subscription.getStatus(); if (status.equals(Subscription.Status.waiting)) { status = Subscription.Status.terminated; } // put last event if subscription terminated Subscription.Event lastEvent = null; if (status.equals(Subscription.Status.terminated)) { lastEvent = subscription.getLastEvent(); } InternalNotifyEvent internalNotifyEvent = new InternalNotifyEvent( subscription.getSubscriber(), subscription.getNotifier(), subscription.getKey().getEventPackage(), subscription.getKey() .getRealEventId(), lastEvent, status, content, contentType, contentSubtype); internalSubscriptionHandler.sbb.fireInternalNotifyEvent( internalNotifyEvent, subscriptionACI, null); if (logger.isDebugEnabled()) { logger.debug("Notifying Internal Subscriber:" + internalNotifyEvent.toString()); } } public void notifyInternalSubscriber(EntityManager entityManager, Subscription subscription, Object content, ContentTypeHeader contentTypeHeader, ImplementedSubscriptionControlSbbLocalObject childSbb) { try { // get subscription aci ActivityContextInterface aci = internalSubscriptionHandler.sbb .getActivityContextNamingfacility().lookup( subscription.getKey().toString()); if (aci != null) { if (!subscription.getResourceList()) { notifyInternalSubscriber(entityManager, subscription, (content != null ? getFilteredNotifyContent(subscription, content, childSbb) : null), contentTypeHeader, aci); } else { // resource list subscription, no filtering notifyInternalSubscriber(entityManager, subscription, (content != null ? (String)content : null), contentTypeHeader, aci); } } else { // clean up logger.warn("Unable to find subscription aci to notify " + subscription.getKey() + ". Removing subscription data"); internalSubscriptionHandler.sbb.removeSubscriptionData( entityManager, subscription, null, null, childSbb); } } catch (Exception e) { logger.error("failed to notify internal subscriber", e); } } private String getFilteredNotifyContent(Subscription subscription, Object content, ImplementedSubscriptionControlSbbLocalObject childSbb) throws JAXBException, ParseException, IOException { // filter content per subscriber (notifier rules) Object filteredContent = childSbb.filterContentPerSubscriber( subscription.getSubscriber(), subscription.getNotifier(), subscription.getKey().getEventPackage(), content); // filter content per notifier (subscriber rules) // TODO // marshall content to string StringWriter stringWriter = new StringWriter(); childSbb.getMarshaller().marshal(filteredContent, stringWriter); String result = stringWriter.toString(); stringWriter.close(); return result; } }