/* * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.mobicents.slee.service.alerting; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.slee.ActivityContextInterface; import javax.slee.CreateException; import javax.slee.Sbb; import javax.slee.SbbContext; import net.java.slee.resource.smpp.ActivityContextInterfaceFactory; import net.java.slee.resource.smpp.ClientTransaction; import net.java.slee.resource.smpp.Dialog; import net.java.slee.resource.smpp.ShortMessage; import net.java.slee.resource.smpp.SmppProvider; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mobicents.slee.service.events.SmsAlertingCustomEvent; /** * * @author <A HREF="mailto:jean.deruelle@gmail.com">Jean Deruelle</A> * */ public abstract class SmsAlertingSbb implements Sbb { // the sbb's sbbContext private SbbContext sbbContext; private Log logger = LogFactory.getLog(SmsAlertingSbb.class); private SmppProvider smppProvider; private ActivityContextInterfaceFactory smppAcif; public SmsAlertingSbb() { super(); } protected SbbContext getSbbContext() { return this.sbbContext; } /** * implements javax.slee.Sbb Please refer to JSLEE v1.1 Specification, Early * Draft Review Page 54 for further information. <br> * The SLEE invokes this method after a new instance of the SBB abstract * class is created. During this method, an SBB entity has not been assigned * to the SBB object. The SBB object can take advantage of this method to * allocate and initialize state or connect to resources that are to be held * by the SBB object during its lifetime. Such state and resources cannot be * specific to an SBB entity because the SBB object might be reused during * its lifetime to serve multiple SBB entities. <br> * This method indicates a transition from state "DOES NOT EXIST" to * "POOLED" (see page 52) */ public void setSbbContext(SbbContext sbbContext) { this.sbbContext = sbbContext; try { Context ctx = (Context) new InitialContext() .lookup("java:comp/env"); smppProvider = (SmppProvider) ctx.lookup("slee/resources/smpp/3.4/smppinterface"); smppAcif = (ActivityContextInterfaceFactory) ctx.lookup("slee/resources/smpp/3.4/factoryprovider"); } catch (NamingException ne) { logger.error("Could not set SBB context: " + ne.toString(), ne); } } public void onSendSmsAlert(SmsAlertingCustomEvent event, ActivityContextInterface aci) { logger.info("****** org.mobicents.slee.service.alerting.SEND_SMS ******* "); logger.info(this + ": received a SEND_SMS event. alertId = " + event.getAlertId() + ". alertText = " + event.getAlertText() + ", tel = " + event.getTel()); Dialog dialog = smppProvider.getDialog(event.getTel(), "0020"); ShortMessage sms = dialog.createMessage(); sms.setText("alertId = "+ event.getAlertId() + ". alertText = " + event.getAlertText()); ClientTransaction tx = dialog.createSubmitSmTransaction(); try { ActivityContextInterface ac = smppAcif.getActivityContextInterface(tx); ac.attach(sbbContext.getSbbLocalObject()); tx.send(sms); } catch (Exception e) { logger.error("couldn't send the alerting sms (alertId = " + event.getAlertId() + ". alertText = " + event.getAlertText() + ", tel = " + event.getTel() + ")", e); } } /** * implements javax.slee.Sbb Please refer to JSLEE v1.1 Specification, Early * Draft Review Page 54 for further information. <br> * The SLEE invokes this method before terminating the life of the SBB * object. The SBB object can take advantage of this method to free state or * resources that are held by the SBB object. These state and resources * typically had been allocated by the setSbbContext method. <br> * This method indicates a transition from state "POOLED" to "DOES NOT * EXIST" (see page 52) */ public void unsetSbbContext() { logger.info("CommonSbb: " + this + ": unsetSbbContext() called."); } /** * implements javax.slee.Sbb Please refer to JSLEE v1.1 Specification, Early * Draft Review Page 55 for further information. <br> * The SLEE invokes this method on an SBB object before the SLEE creates a * new SBB entity in response to an initial event or an invocation of the * create method on a ChildRelation object. This method should initialize * the SBB object using the CMP field get and set accessor methods, such * that when this method returns, the persistent representation of the SBB * entity can be created. <br> * This method is the first part of a transition from state "POOLED" to * "READY" (see page 52) */ public void sbbCreate() throws javax.slee.CreateException { logger.info("CommonSbb: " + this + ": sbbCreate() called."); } /** * implements javax.slee.Sbb Please refer to JSLEE v1.1 Specification, Early * Draft Review Page 55 for further information. <br> * The SLEE invokes this method on an SBB object after the SLEE creates a * new SBB entity. The SLEE invokes this method after the persistent * representation of the SBB entity has been created and the SBB object is * assigned to the created SBB entity. This method gives the SBB object a * chance to initialize additional transient state and acquire additional * resources that it needs while it is in the Ready state. <br> * This method is the second part of a transition from state "POOLED" to * "READY" (see page 52) */ public void sbbPostCreate() throws CreateException { logger.info("CommonSbb: " + this + ": sbbPostCreate() called."); } /** * implements javax.slee.Sbb Please refer to JSLEE v1.1 Specification, Early * Draft Review Page 55 for further information. <br> * The SLEE invokes this method on an SBB object when the SLEE picks the SBB * object in the pooled state and assigns it to a specific SBB entity. This * method gives the SBB object a chance to initialize additional transient * state and acquire additional resources that it needs while it is in the * Ready state. <br> * This method indicates a transition from state "POOLED" to "READY" (see * page 52) */ public void sbbActivate() { logger.info("CommonSbb: " + this + ": sbbActivate() called."); } /** * implements javax.slee.Sbb Please refer to JSLEE v1.1 Specification, Early * Draft Review Page 56 for further information. <br> * The SLEE invokes this method on an SBB object when the SLEE decides to * disassociate the SBB object from the SBB entity, and to put the SBB * object back into the pool of available SBB objects. This method gives the * SBB object the chance to release any state or resources that should not * be held while the SBB object is in the pool. These state and resources * typically had been allocated during the sbbActivate method. <br> * This method indicates a transition from state "READY" to "POOLED" (see * page 52) */ public void sbbPassivate() { logger.info("CommonSbb: " + this + ": sbbPassivate() called."); } /** * implements javax.slee.Sbb Please refer to JSLEE v1.1 Specification, Early * Draft Review Page 56 for further information. <br> * The SLEE invokes the sbbRemove method on an SBB object before the SLEE * removes the SBB entity assigned to the SBB object. <br> * This method indicates a transition from state "READY" to "POOLED" (see * page 52) */ public void sbbRemove() { logger.info("CommonSbb: " + this + ": sbbRemove() called."); } /** * implements javax.slee.Sbb Please refer to JSLEE v1.1 Specification, Early * Draft Review Page 56 for further information. <br> * The SLEE calls this method to synchronize the state of an SBB object with * its assigned SBB entity�s persistent state. The SBB Developer can assume * that the SBB object�s persistent state has been loaded just before this * method is invoked. <br> * This method indicates a transition from state "READY" to "READY" (see * page 52) */ public void sbbLoad() { logger.info("CommonSbb: " + this + ": sbbLoad() called."); } /** * implements javax.slee.Sbb Please refer to JSLEE v1.1 Specification, Early * Draft Review Page 57 for further information. <br> * The SLEE calls this method to synchronize the state of the SBB entity�s * persistent state with the state of the SBB object. The SBB Developer * should use this method to update the SBB object using the CMP field * accessor methods before its persistent state is synchronized. <br> * This method indicates a transition from state "READY" to "READY" (see * page 52) */ public void sbbStore() { logger.info("CommonSbb: " + this + ": sbbStore() called."); } /** * implements javax.slee.Sbb Please refer to JSLEE v1.1 Specification, Early * Draft Review Page 67 for further information. <br> * The SLEE invokes the sbbRolledBack callback method after a transaction * used in a SLEE originated invocation has rolled back. */ public void sbbRolledBack(javax.slee.RolledBackContext rolledBackContext) { logger.info("CommonSbb: " + this + ": sbbRolledBack() called."); } /** * implements javax.slee.Sbb Please refer to JSLEE v1.1 Specification, Early * Draft Review Page 65 for further information. <br> * The SLEE invokes this method after a SLEE originated invocation of a * transactional method of the SBB object returns by throwing a * RuntimeException. */ public void sbbExceptionThrown(Exception exception, Object obj, javax.slee.ActivityContextInterface activityContextInterface) { logger.info("CommonSbb: " + this + ": sbbExceptionThrown() called."); } }