package org.mobicents.slee.examples.diameter.sh.server;
import java.io.IOException;
import java.util.Arrays;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.slee.ActivityContextInterface;
import javax.slee.ActivityEndEvent;
import javax.slee.RolledBackContext;
import javax.slee.SbbContext;
import javax.slee.facilities.TimerEvent;
import javax.slee.facilities.TimerFacility;
import javax.slee.facilities.TimerOptions;
import javax.slee.serviceactivity.ServiceActivity;
import javax.slee.serviceactivity.ServiceActivityFactory;
import net.java.slee.resource.diameter.base.events.avp.DiameterAvp;
import net.java.slee.resource.diameter.base.events.avp.DiameterIdentity;
import net.java.slee.resource.diameter.sh.client.DiameterShAvpFactory;
import net.java.slee.resource.diameter.sh.client.events.ProfileUpdateAnswer;
import net.java.slee.resource.diameter.sh.client.events.PushNotificationRequest;
import net.java.slee.resource.diameter.sh.client.events.SubscribeNotificationsAnswer;
import net.java.slee.resource.diameter.sh.client.events.UserDataAnswer;
import net.java.slee.resource.diameter.sh.client.events.avp.DiameterShAvpCodes;
import net.java.slee.resource.diameter.sh.client.events.avp.SubsReqType;
import net.java.slee.resource.diameter.sh.server.ShServerActivity;
import net.java.slee.resource.diameter.sh.server.ShServerActivityContextInterfaceFactory;
import net.java.slee.resource.diameter.sh.server.ShServerMessageFactory;
import net.java.slee.resource.diameter.sh.server.ShServerProvider;
import net.java.slee.resource.diameter.sh.server.ShServerSubscriptionActivity;
import net.java.slee.resource.diameter.sh.server.events.ProfileUpdateRequest;
import net.java.slee.resource.diameter.sh.server.events.SubscribeNotificationsRequest;
import net.java.slee.resource.diameter.sh.server.events.UserDataRequest;
import org.apache.log4j.Logger;
/**
*
* DiameterShServerExampleSbb.java
*
* <br>
* Super project: mobicents <br>
* 11:34:16 PM Jan 13, 2009 <br>
*
* @author <a href="mailto:baranowb@gmail.com"> Bartosz Baranowski </a>
* @author <a href="mailto:brainslog@gmail.com"> Alexandre Mendonca </a>
*/
public abstract class DiameterShServerExampleSbb implements javax.slee.Sbb {
private static Logger logger = Logger.getLogger(DiameterShServerExampleSbb.class);
private SbbContext sbbContext = null; // This SBB's context
private Context myEnv = null; // This SBB's environment
private ShServerProvider provider = null;
private ShServerMessageFactory messageFactory = null;
private DiameterShAvpFactory avpFactory = null;
private ShServerActivityContextInterfaceFactory acif = null;
private TimerFacility timerFacility = null;
public void setSbbContext(SbbContext context) {
logger.info("sbbRolledBack invoked.");
this.sbbContext = context;
try {
myEnv = (Context) new InitialContext().lookup("java:comp/env");
provider = (ShServerProvider) myEnv.lookup("slee/resources/diameter-sh-server-ra-interface");
logger.info("Got Provider:" + provider);
messageFactory = provider.getServerMessageFactory();
logger.info("Got Message Factory:" + messageFactory);
avpFactory = provider.getAvpFactory();
logger.info("Got AVP Factory:" + avpFactory);
acif = (ShServerActivityContextInterfaceFactory) myEnv.lookup("slee/resources/JDiameterShServerResourceAdaptor/java.net/0.8.1/acif");
// Get the timer facility
timerFacility = (TimerFacility) myEnv.lookup("slee/facilities/timer");
} catch (Exception e) {
logger.error("Unable to set sbb context.", e);
}
}
public void unsetSbbContext() {
if (logger.isInfoEnabled())
logger.info("unsetSbbContext invoked.");
this.sbbContext = null;
}
public void sbbCreate() throws javax.slee.CreateException {
if (logger.isInfoEnabled())
logger.info("sbbCreate invoked.");
}
public void sbbPostCreate() throws javax.slee.CreateException {
if (logger.isInfoEnabled())
logger.info("sbbPostCreate invoked.");
}
public void sbbActivate() {
if (logger.isInfoEnabled())
logger.info("sbbActivate invoked.");
}
public void sbbPassivate() {
if (logger.isInfoEnabled())
logger.info("sbbPassivate invoked.");
}
public void sbbRemove() {
if (logger.isInfoEnabled())
logger.info("sbbRemove invoked.");
}
public void sbbLoad() {
if (logger.isInfoEnabled())
logger.info("sbbLoad invoked.");
}
public void sbbStore() {
if (logger.isInfoEnabled())
logger.info("sbbStore invoked.");
}
public void sbbExceptionThrown(Exception exception, Object event, ActivityContextInterface activity) {
if (logger.isInfoEnabled())
logger.info("sbbRolledBack invoked.");
}
public void sbbRolledBack(RolledBackContext context) {
if (logger.isInfoEnabled())
logger.info("sbbRolledBack invoked.");
}
protected SbbContext getSbbContext() {
if (logger.isInfoEnabled())
logger.info("getSbbContext invoked.");
return sbbContext;
}
// ##########################################################################
// ## EVENT HANDLERS ##
// ##########################################################################
public void onServiceStartedEvent(javax.slee.serviceactivity.ServiceStartedEvent event, ActivityContextInterface aci) {
logger.info("onServiceStartedEvent invoked.");
try {
// check if it's my service that is starting
ServiceActivity sa = ((ServiceActivityFactory) myEnv.lookup("slee/serviceactivity/factory")).getActivity();
if (sa.equals(aci.getActivity())) {
logger.info("################################################################################");
logger.info("## D I A M E T E R S h S E R V E R E X A M P L E :: S T A R T E D ##");
logger.info("################################################################################");
messageFactory = provider.getServerMessageFactory();
avpFactory = provider.getAvpFactory();
logger.info("Performing sanity check...");
logger.info("Provider [" + provider + "]");
logger.info("Message Factory [" + messageFactory + "]");
logger.info("AVP Factory [" + avpFactory + "]");
logger.info("Check completed. Result: " + ((provider != null ? 1 : 0) + (messageFactory != null ? 1 : 0) + (avpFactory != null ? 1 : 0)) + "/3");
logger.info("Connected to " + provider.getPeerCount() + " peers.");
for (DiameterIdentity peer : provider.getConnectedPeers()) {
logger.info("Connected to Peer[" + peer.toString() + "]");
}
}
} catch (Exception e) {
logger.error("Unable to handle service started event...", e);
}
}
public void onTimerEvent(TimerEvent event, ActivityContextInterface aci) {
ShServerSubscriptionActivity activity = null;
for (ActivityContextInterface _aci : this.getSbbContext().getActivities()) {
if (_aci.getActivity() instanceof ShServerSubscriptionActivity) {
activity = (ShServerSubscriptionActivity) _aci.getActivity();
break;
}
}
if (activity == null) {
logger.error("onTimerEvent :: Activity is null, with list: " + Arrays.toString(this.getSbbContext().getActivities()));
return;
}
PushNotificationRequest request = activity.createPushNotificationRequest();
logger.info("onTimerEvent :: Created PNR:\r\n" + request);
try {
request.setUserData("HEHE, some secrete user data.");
activity.sendPushNotificationRequest(request);
} catch (Exception e) {
logger.error("Failed to send PNR.", e);
}
}
public void onUserDataRequest(UserDataRequest event, ActivityContextInterface aci) {
if (logger.isInfoEnabled())
logger.info("onUserDataRequest :: " + event);
UserDataAnswer answer = ((ShServerActivity) aci.getActivity()).createUserDataAnswer(2001, false);
try {
if (logger.isInfoEnabled())
logger.info("onUserDataRequest :: Created UDA:\r\n" + answer);
((ShServerActivity) aci.getActivity()).sendUserDataAnswer(answer);
} catch (IOException e) {
logger.error("Failed to send UDA.", e);
}
}
public void onSubscribeNotificationsRequest(SubscribeNotificationsRequest event, ActivityContextInterface aci) {
logger.info("onSubscribeNotificationsRequest :: " + event);
SubscribeNotificationsAnswer answer = ((ShServerSubscriptionActivity) aci.getActivity()).createSubscribeNotificationsAnswer(2001, false);
try {
// This will be fixed in B2, we need more accessors
DiameterAvp requestNumber = null;
for (DiameterAvp a : event.getAvps()) {
if (a.getCode() == DiameterShAvpCodes.SUBS_REQ_TYPE) {
requestNumber = a;
break;
}
}
if (requestNumber != null) {
answer.setExtensionAvps(requestNumber);
}
logger.info(" onSubscribeNotificationsRequest :: Created SNA:\r\n" + answer);
((ShServerSubscriptionActivity) aci.getActivity()).sendSubscribeNotificationsAnswer(answer);
if (event.getSubsReqType() == SubsReqType.SUBSCRIBE) {
logger.info("Setting Timer for firing PNR in 15 seconds...");
TimerOptions options = new TimerOptions();
timerFacility.setTimer(aci, null, System.currentTimeMillis() + 3000, options);
}
} catch (Exception e) {
logger.error("Failed to create/send SNA.", e);
}
}
public void onProfileUpdateRequest(ProfileUpdateRequest event, ActivityContextInterface aci) {
try {
logger.info("onProfileUpdateRequest :: " + event);
ProfileUpdateAnswer answer = ((ShServerActivity) aci.getActivity()).createProfileUpdateAnswer(2001, false);
logger.info("Created Profile-Update-Answer:\r\n" + answer);
((ShServerActivity) aci.getActivity()).sendProfileUpdateAnswer(answer);
} catch (Exception e) {
logger.error("Failed to create/send PUA.", e);
}
}
public void onActivityEndEvent(ActivityEndEvent event, ActivityContextInterface aci) {
logger.info(" Activity Ended[" + aci.getActivity() + "]");
}
}