package org.mobicents.slee.xdm.server.subscription;
import java.util.Map;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sip.ServerTransaction;
import javax.sip.header.HeaderFactory;
import javax.slee.ActivityContextInterface;
import javax.slee.ChildRelation;
import javax.slee.CreateException;
import javax.slee.RolledBackContext;
import javax.slee.SLEEException;
import javax.slee.Sbb;
import javax.slee.SbbContext;
import javax.slee.TransactionRequiredLocalException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import net.java.slee.resource.sip.SleeSipProvider;
import org.apache.log4j.Logger;
import org.mobicents.slee.sipevent.server.subscription.ImplementedSubscriptionControlParentSbbLocalObject;
import org.mobicents.slee.sipevent.server.subscription.NotifyContent;
import org.mobicents.slee.sipevent.server.subscription.pojo.Subscription;
import org.mobicents.slee.sipevent.server.subscription.pojo.SubscriptionKey;
import org.mobicents.slee.xdm.server.XDMClientControlParentSbbLocalObject;
import org.mobicents.slee.xdm.server.XDMClientControlSbbLocalObject;
import org.openxdm.xcap.common.key.XcapUriKey;
import org.openxdm.xcap.common.uri.AttributeSelector;
import org.openxdm.xcap.common.uri.DocumentSelector;
import org.openxdm.xcap.common.uri.NodeSelector;
import org.openxdm.xcap.server.slee.resource.datasource.DataSourceSbbInterface;
/**
* Subscription control sbb for a XDM Server.
*
* @author eduardomartins
*
*/
public abstract class XcapDiffSubscriptionControlSbb implements Sbb,
XcapDiffSubscriptionControlSbbLocalObject {
private static Logger logger = Logger
.getLogger(XcapDiffSubscriptionControlSbb.class);
// private AppUsageCacheResourceAdaptorSbbInterface appUsageCache;
private DataSourceSbbInterface dataSourceSbbInterface = null;
// private DataSourceActivityContextInterfaceFactory dataSourceACIF = null;
/**
* JAIN-SIP provider & factories
*
* @return
*/
// private SipActivityContextInterfaceFactory
// sipActivityContextInterfaceFactory;
protected SleeSipProvider sipProvider;
// private AddressFactory addressFactory;
// private MessageFactory messageFactory;
protected HeaderFactory headerFactory;
/**
* SbbObject's sbb context
*/
private SbbContext sbbContext;
public void setSbbContext(SbbContext sbbContext) {
this.sbbContext = sbbContext;
// retrieve factories, facilities & providers
try {
Context context = (Context) new InitialContext()
.lookup("java:comp/env");
// sipActivityContextInterfaceFactory =
// (SipActivityContextInterfaceFactory) context
// .lookup("slee/resources/jainsip/1.2/acifactory");
sipProvider = (SleeSipProvider) context
.lookup("slee/resources/jainsip/1.2/provider");
// addressFactory = sipProvider.getAddressFactory();
headerFactory = sipProvider.getHeaderFactory();
// messageFactory = sipProvider.getMessageFactory();
// appUsageCache = (AppUsageCacheResourceAdaptorSbbInterface)
// context.lookup("slee/resources/xdm/appusagecache/sbbrainterface");
dataSourceSbbInterface = (DataSourceSbbInterface) context
.lookup("slee/resources/xdm/datasource/sbbrainterface");
// dataSourceACIF = (DataSourceActivityContextInterfaceFactory)
// context.lookup("slee/resources/xdm/datasource/1.0/acif");
} catch (NamingException e) {
logger.error("Can't set sbb context.", e);
}
}
// ------------ ImplementedSubscriptionControlSbbLocalObject
public abstract ImplementedSubscriptionControlParentSbbLocalObject getParentSbbCMP();
public abstract void setParentSbbCMP(
ImplementedSubscriptionControlParentSbbLocalObject sbbLocalObject);
public void setParentSbb(
ImplementedSubscriptionControlParentSbbLocalObject sbbLocalObject) {
setParentSbbCMP(sbbLocalObject);
}
public String[] getEventPackages() {
return new XcapDiffSubscriptionControl(this).getEventPackages();
}
public void isSubscriberAuthorized(String subscriber,
String subscriberDisplayName, String notifier, SubscriptionKey key,
int expires, String content, String contentType,
String contentSubtype, boolean eventList,ServerTransaction serverTransaction) {
// exposing to XcapDiffSubscriptionControl
new XcapDiffSubscriptionControl(this).isSubscriberAuthorized(
subscriber, subscriberDisplayName, notifier, key, expires,
content, contentType, contentSubtype,eventList,serverTransaction);
}
public void removingSubscription(Subscription subscription) {
// delegate to XcapDiffSubscriptionControl
new XcapDiffSubscriptionControl(this)
.removingSubscription(subscription);
}
public NotifyContent getNotifyContent(Subscription subscription) {
// delegate to XcapDiffSubscriptionControl
return new XcapDiffSubscriptionControl(this)
.getNotifyContent(subscription);
}
public Object filterContentPerSubscriber(String subscriber,
String notifier, String eventPackage, Object unmarshalledContent) {
// delegate to XcapDiffSubscriptionControl
return new XcapDiffSubscriptionControl(this)
.filterContentPerSubscriber(subscriber, notifier, eventPackage,
unmarshalledContent);
}
public Marshaller getMarshaller() {
try {
return jaxbContext.createMarshaller();
} catch (JAXBException e) {
logger.error("failed to create marshaller", e);
return null;
}
}
// ------------ XcapDiffSubscriptionControlSbbLocalObject
// --- XDM CLIENT CHILD SBB
public abstract ChildRelation getXDMClientControlChildRelation();
public abstract XDMClientControlSbbLocalObject getXDMClientControlChildSbbCMP();
public abstract void setXDMClientControlChildSbbCMP(
XDMClientControlSbbLocalObject value);
public XDMClientControlSbbLocalObject getXDMClientControlSbb() {
XDMClientControlSbbLocalObject childSbb = getXDMClientControlChildSbbCMP();
if (childSbb == null) {
try {
childSbb = (XDMClientControlSbbLocalObject) getXDMClientControlChildRelation()
.create();
} catch (Exception e) {
logger.error("Failed to create child sbb",e);
return null;
}
setXDMClientControlChildSbbCMP(childSbb);
childSbb
.setParentSbb((XDMClientControlParentSbbLocalObject) this.sbbContext
.getSbbLocalObject());
}
return childSbb;
}
// --- CMP
public abstract void setSubscriptionsMap(Map rules);
public abstract Map getSubscriptionsMap();
public DataSourceSbbInterface getDataSourceSbbInterface() {
return dataSourceSbbInterface;
}
public HeaderFactory getHeaderFactory() {
return headerFactory;
}
public Unmarshaller getUnmarshaller() {
try {
return jaxbContext.createUnmarshaller();
} catch (JAXBException e) {
logger.error("failed to create unmarshaller", e);
return null;
}
}
// ------------ XDMClientControlParentSbbLocalObject
public void attributeUpdated(DocumentSelector documentSelector,
NodeSelector nodeSelector, AttributeSelector attributeSelector,
Map<String, String> namespaces, String oldETag, String newETag,
String documentAsString, String attributeValue) {
documentUpdated(documentSelector, oldETag, newETag, documentAsString);
}
public void documentUpdated(DocumentSelector documentSelector,
String oldETag, String newETag, String documentAsString) {
// delegate to XcapDiffSubscriptionControl
new XcapDiffSubscriptionControl(this).documentUpdated(documentSelector,
oldETag, newETag, documentAsString);
}
public void elementUpdated(DocumentSelector documentSelector,
NodeSelector nodeSelector, Map<String, String> namespaces,
String oldETag, String newETag, String documentAsString,
String elementAsString) {
// delegate to documentUpdated
documentUpdated(documentSelector, oldETag, newETag, documentAsString);
}
// --- not used
public void deleteResponse(XcapUriKey key, int responseCode, String responseContent, String tag) {
throw new UnsupportedOperationException();
}
public void putResponse(XcapUriKey key, int responseCode,
String responseContent, String tag) {
throw new UnsupportedOperationException();
}
public void getResponse(XcapUriKey key, int responseCode, String mimetype,
String content, String tag) {
throw new UnsupportedOperationException();
}
// --------- JAXB
/*
* JAXB context is thread safe
*/
private static final JAXBContext jaxbContext = initJAXBContext();
private static JAXBContext initJAXBContext() {
try {
return JAXBContext.newInstance("org.openxdm.xcap.common.xcapdiff"
+ ":org.openxdm.xcap.client.appusage.resourcelists.jaxb");
} catch (JAXBException e) {
logger.error("failed to create jaxb context");
return null;
}
}
// ----------- SBB OBJECT's LIFE CYCLE
public void sbbActivate() {
}
public void sbbCreate() throws CreateException {
}
public void sbbExceptionThrown(Exception arg0, Object arg1,
ActivityContextInterface arg2) {
}
public void sbbLoad() {
}
public void sbbPassivate() {
}
public void sbbPostCreate() throws CreateException {
}
public void sbbRemove() {
}
public void sbbRolledBack(RolledBackContext arg0) {
}
public void sbbStore() {
}
public void unsetSbbContext() {
this.sbbContext = null;
}
}