/* * TeleStax, Open Source Cloud Communications Copyright 2012. * and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * 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.smsc.slee.resources.persistence; import java.util.ArrayList; import java.util.Date; import java.util.UUID; import javax.slee.Address; import javax.slee.facilities.Tracer; import javax.slee.resource.ActivityHandle; import javax.slee.resource.ConfigProperties; import javax.slee.resource.FailureReason; import javax.slee.resource.FireableEventType; import javax.slee.resource.InvalidConfigurationException; import javax.slee.resource.Marshaler; import javax.slee.resource.ReceivableService; import javax.slee.resource.ResourceAdaptor; import javax.slee.resource.ResourceAdaptorContext; import org.mobicents.smsc.cassandra.DBOperations; import org.mobicents.smsc.cassandra.PersistenceException; import org.mobicents.smsc.cassandra.PreparedStatementCollection; import org.mobicents.smsc.library.QuerySmResponse; import org.mobicents.smsc.library.Sms; import org.mobicents.smsc.library.SmsSet; import org.mobicents.smsc.library.SmsSetCache; import org.mobicents.smsc.library.TargetAddress; /** * * @author sergey vetyutnev * */ public class PersistenceResourceAdaptor implements ResourceAdaptor { private static final String CONF_CLUSTER_NAME = "cluster.name"; private static final String CONF_CLUSTER_HOSTS = "cluster.hosts"; private static final String CONF_CLUSTER_KEYSPACE = "cluster.keyspace"; private Tracer tracer = null; private ResourceAdaptorContext raContext = null; // private DBOperations_C1 dbOperations_C1 = null; private DBOperations dbOperations_C2 = null; // this is to avoid wicked SLEE spec - it mandates this.raSbbInterface to be // available before RA starts... private PersistenceRAInterface raSbbInterface; // private String hosts = null; // private String keyspaceName = null; // private String clusterName = null; public PersistenceResourceAdaptor() { this.raSbbInterface = new PersistenceRAInterface() { @Override public TargetAddress obtainSynchroObject(TargetAddress ta) { return SmsSetCache.getInstance().addSmsSet(ta); } @Override public void releaseSynchroObject(TargetAddress ta) { SmsSetCache.getInstance().removeSmsSet(ta); } public boolean isDatabaseAvailable() { if (dbOperations_C2 == null) return false; else return dbOperations_C2.isDatabaseAvailable(); } // C1 // @Override // public boolean checkSmsSetExists(TargetAddress ta) throws PersistenceException { // return dbOperations_C1.checkSmsSetExists(ta); // } // // @Override // public SmsSet obtainSmsSet(TargetAddress ta) throws PersistenceException { // return dbOperations_C1.obtainSmsSet(ta); // } // // @Override // public void setNewMessageScheduled(SmsSet smsSet, Date newDueDate) throws PersistenceException { // dbOperations_C1.setNewMessageScheduled(smsSet, newDueDate); // } // // @Override // public void setDeliveringProcessScheduled(SmsSet smsSet, Date newDueDate, int newDueDelay) // throws PersistenceException { // dbOperations_C1.setDeliveringProcessScheduled(smsSet, newDueDate, newDueDelay); // } // // @Override // public void setDestination(SmsSet smsSet, String destClusterName, String destSystemId, String destEsmeId, // SmType type) { // dbOperations_C1.setDestination(smsSet, destClusterName, destSystemId, destEsmeId, type); // } // // @Override // public void setRoutingInfo(SmsSet smsSet, IMSI imsi, LocationInfoWithLMSI locationInfoWithLMSI) { // dbOperations_C1.setRoutingInfo(smsSet, imsi, locationInfoWithLMSI); // } // // @Override // public void setDeliveryStart(SmsSet smsSet, Date inSystemDate) throws PersistenceException { // dbOperations_C1.setDeliveryStart(smsSet, inSystemDate); // } // // @Override // public void setDeliveryStart(Sms sms) throws PersistenceException { // dbOperations_C1.setDeliveryStart(sms); // } // // @Override // public void setDeliverySuccess(SmsSet smsSet, Date lastDelivery) throws PersistenceException { // dbOperations_C1.setDeliverySuccess(smsSet, lastDelivery); // } // // @Override // public void setDeliveryFailure(SmsSet smsSet, ErrorCode smStatus, Date lastDelivery) // throws PersistenceException { // dbOperations_C1.setDeliveryFailure(smsSet, smStatus, lastDelivery); // } // // @Override // public void setAlertingSupported(String targetId, boolean alertingSupported) throws PersistenceException { // dbOperations_C1.setAlertingSupported(targetId, alertingSupported); // } // // @Override // public boolean deleteSmsSet(SmsSet smsSet) throws PersistenceException { // return dbOperations_C1.deleteSmsSet(smsSet); // } // // @Override // public void createLiveSms(Sms sms) throws PersistenceException { // dbOperations_C1.createLiveSms(sms); // } // // @Override // public Sms obtainLiveSms(UUID dbId) throws PersistenceException { // return dbOperations_C1.obtainLiveSms(dbId); // } // // @Override // public Sms obtainLiveSms(long messageId) throws PersistenceException { // return dbOperations_C1.obtainLiveSms(messageId); // } // // @Override // public void updateLiveSms(Sms sms) throws PersistenceException { // dbOperations_C1.updateLiveSms(sms); // } // // @Override // public void archiveDeliveredSms(Sms sms, Date deliveryDate) throws PersistenceException { // dbOperations_C1.archiveDeliveredSms(sms, deliveryDate); // } // // @Override // public void archiveFailuredSms(Sms sms) throws PersistenceException { // dbOperations_C1.archiveFailuredSms(sms); // } // // @Override // public List<SmsSet> fetchSchedulableSmsSets(int maxRecordCount, Tracer tracer) throws PersistenceException { // return dbOperations_C1.fetchSchedulableSmsSets(maxRecordCount, tracer); // } // // @Override // public void fetchSchedulableSms(SmsSet smsSet, boolean excludeNonScheduleDeliveryTime) throws PersistenceException { // dbOperations_C1.fetchSchedulableSms(smsSet, excludeNonScheduleDeliveryTime); // } // C2 @Override public long c2_getDueSlotForTime(Date time) { return dbOperations_C2.c2_getDueSlotForTime(time); } @Override public Date c2_getTimeForDueSlot(long dueSlot) { return dbOperations_C2.c2_getTimeForDueSlot(dueSlot); } @Override public long c2_getCurrentDueSlot() { return dbOperations_C2.c2_getCurrentDueSlot(); } @Override public void c2_setCurrentDueSlot(long newDueSlot) throws PersistenceException { dbOperations_C2.c2_setCurrentDueSlot(newDueSlot); } @Override public long c2_getNextMessageId() { return dbOperations_C2.c2_getNextMessageId(); } @Override public long c2_getIntimeDueSlot() { return dbOperations_C2.c2_getIntimeDueSlot(); } @Override public long c2_getDueSlotForNewSms() { return dbOperations_C2.c2_getDueSlotForNewSms(); } @Override public void c2_registerDueSlotWriting(long dueSlot) { dbOperations_C2.c2_registerDueSlotWriting(dueSlot); } @Override public void c2_unregisterDueSlotWriting(long dueSlot) { dbOperations_C2.c2_unregisterDueSlotWriting(dueSlot); } @Override public boolean c2_checkDueSlotNotWriting(long dueSlot) { return dbOperations_C2.c2_checkDueSlotNotWriting(dueSlot); } @Override public long c2_getDueSlotForTargetId(String targetId) throws PersistenceException { return dbOperations_C2.c2_getDueSlotForTargetId(targetId); } @Override public long c2_getDueSlotForTargetId(PreparedStatementCollection psc, String targetId) throws PersistenceException { return dbOperations_C2.c2_getDueSlotForTargetId(psc, targetId); } @Override public void c2_updateDueSlotForTargetId(String targetId, long newDueSlot) throws PersistenceException { dbOperations_C2.c2_updateDueSlotForTargetId(targetId, newDueSlot); } @Override public void c2_updateDueSlotForTargetId_WithTableCleaning(String targetId, long newDueSlot) throws PersistenceException { dbOperations_C2.c2_updateDueSlotForTargetId_WithTableCleaning(targetId, newDueSlot); } @Override public void c2_createRecordCurrent(Sms sms) throws PersistenceException { dbOperations_C2.c2_createRecordCurrent(sms); } @Override public void c2_createRecordArchive(Sms sms, String dlvMessageId, String dlvDestId, boolean deliveryReceipts, boolean incomingDeliveryReceipts) throws PersistenceException { dbOperations_C2 .c2_createRecordArchive(sms, dlvMessageId, dlvDestId, deliveryReceipts, incomingDeliveryReceipts); } @Override public ArrayList<SmsSet> c2_getRecordList(long dueSlot) throws PersistenceException { return dbOperations_C2.c2_getRecordList(dueSlot); } @Override public SmsSet c2_getRecordListForTargeId(long dueSlot, String targetId) throws PersistenceException { return dbOperations_C2.c2_getRecordListForTargeId(dueSlot, targetId); } @Override public ArrayList<SmsSet> c2_sortRecordList(ArrayList<SmsSet> sourceLst) { return dbOperations_C2.c2_sortRecordList(sourceLst); } @Override public void c2_updateInSystem(Sms sms, int isSystemStatus, boolean fastStoreAndForwordMode) throws PersistenceException { dbOperations_C2.c2_updateInSystem(sms, isSystemStatus, fastStoreAndForwordMode); } @Override public void c2_updateAlertingSupport(long dueSlot, String targetId, UUID dbId) throws PersistenceException { dbOperations_C2.c2_updateAlertingSupport(dueSlot, targetId, dbId); } @Override public PreparedStatementCollection[] c2_getPscList() throws PersistenceException { return dbOperations_C2.c2_getPscList(); } @Override public void c2_scheduleMessage_ReschedDueSlot(Sms sms, boolean fastStoreAndForwordMode, boolean removeExpiredValidityPeriod) throws PersistenceException { dbOperations_C2.c2_scheduleMessage_ReschedDueSlot(sms, fastStoreAndForwordMode, removeExpiredValidityPeriod); } @Override public void c2_scheduleMessage_NewDueSlot(Sms sms, long dueSlot, ArrayList<Sms> lstFailured, boolean fastStoreAndForwordMode) throws PersistenceException { dbOperations_C2.c2_scheduleMessage_NewDueSlot(sms, dueSlot, lstFailured, fastStoreAndForwordMode); } @Override public long c2_checkDueSlotWritingPossibility(long dueSlot) { return dbOperations_C2.c2_checkDueSlotWritingPossibility(dueSlot); } @Override public Sms c2_getRecordArchiveForMessageId(long messageId) throws PersistenceException { return dbOperations_C2.c2_getRecordArchiveForMessageId(messageId); } @Override public QuerySmResponse c2_getQuerySmResponse(long messageId) throws PersistenceException { return dbOperations_C2.c2_getQuerySmResponse(messageId); } @Override public Long c2_getMessageIdByRemoteMessageId(String remoteMessageId, String destId) throws PersistenceException { return dbOperations_C2.c2_getMessageIdByRemoteMessageId(remoteMessageId, destId); } }; } @Override public void activityEnded(ActivityHandle activityHandle) { if (this.tracer.isFineEnabled()) { this.tracer.fine("Activity with handle " + activityHandle + " ended."); } } @Override public void activityUnreferenced(ActivityHandle activityHandle) { if (this.tracer.isFineEnabled()) { this.tracer.fine("Activity unreferenced with handle " + activityHandle + "."); } } @Override public void administrativeRemove(ActivityHandle activityHandle) { if (this.tracer.isFineEnabled()) { this.tracer.fine("Activity administrative remove with handle " + activityHandle + "."); } } @Override public void eventProcessingFailed(ActivityHandle activityHandle, FireableEventType arg1, Object arg2, Address arg3, ReceivableService arg4, int arg5, FailureReason arg6) { if (this.tracer.isFineEnabled()) { this.tracer.fine("Event processing failed on activity with handle " + activityHandle + "."); } } @Override public void eventProcessingSuccessful(ActivityHandle activityHandle, FireableEventType arg1, Object arg2, Address arg3, ReceivableService arg4, int arg5) { if (this.tracer.isFineEnabled()) { this.tracer.fine("Event processing succeeded on activity with handle " + activityHandle + "."); } } @Override public void eventUnreferenced(ActivityHandle activityHandle, FireableEventType arg1, Object arg2, Address arg3, ReceivableService arg4, int arg5) { if (this.tracer.isFineEnabled()) { this.tracer.fine("Event unreferenced on activity with handle " + activityHandle + "."); } } @Override public Object getActivity(ActivityHandle activityHandle) { return null; } @Override public ActivityHandle getActivityHandle(Object activity) { return null; } @Override public Marshaler getMarshaler() { return null; } @Override public Object getResourceAdaptorInterface(String arg0) { return this.raSbbInterface; } @Override public void queryLiveness(ActivityHandle activityHandle) { } @Override public void raActive() { // dbOperations_C1 = DBOperations_C1.getInstance(); // if (!this.dbOperations_C1.isStarted()) { // throw new RuntimeException("DBOperations_1 not started yet!"); // } dbOperations_C2 = DBOperations.getInstance(); if (!this.dbOperations_C2.isStarted()) { throw new RuntimeException("DBOperations_2 not started yet!"); } if (tracer.isInfoEnabled()) { tracer.info("PersistenceResourceAdaptor " + this.raContext.getEntityName() + " Activated"); } } @Override public void raConfigurationUpdate(ConfigProperties properties) { throw new UnsupportedOperationException(); } @Override public void raConfigure(ConfigProperties properties) { if (tracer.isFineEnabled()) { tracer.fine("Configuring RA Entity " + this.raContext.getEntityName()); } } @Override public void raInactive() { if (tracer.isInfoEnabled()) { tracer.info("Inactivated RA Entity " + this.raContext.getEntityName()); } } @Override public void raStopping() { if (tracer.isInfoEnabled()) { tracer.info("Stopping RA Entity " + this.raContext.getEntityName()); } } @Override public void raUnconfigure() { if (tracer.isInfoEnabled()) { tracer.info("Unconfigure RA Entity " + this.raContext.getEntityName()); } } @Override public void raVerifyConfiguration(ConfigProperties properties) throws InvalidConfigurationException { if (tracer.isInfoEnabled()) { tracer.info("Verify configuration in RA Entity " + this.raContext.getEntityName()); } } @Override public void serviceActive(ReceivableService arg0) { // TODO Auto-generated method stub } @Override public void serviceInactive(ReceivableService arg0) { // TODO Auto-generated method stub } @Override public void serviceStopping(ReceivableService arg0) { // TODO Auto-generated method stub } @Override public void setResourceAdaptorContext(ResourceAdaptorContext raContext) { this.tracer = raContext.getTracer(getClass().getSimpleName()); this.raContext = raContext; } @Override public void unsetResourceAdaptorContext() { this.raContext = null; } }