/*
* TeleStax, Open Source Cloud Communications
* Copyright 2012, Telestax Inc 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.domain;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Map;
import java.util.Map.Entry;
import javolution.text.TextBuilder;
import javolution.util.FastMap;
import javolution.xml.XMLBinding;
import javolution.xml.XMLObjectReader;
import javolution.xml.XMLObjectWriter;
import javolution.xml.stream.XMLStreamException;
import org.apache.log4j.Logger;
import org.mobicents.protocols.ss7.indicator.GlobalTitleIndicator;
import org.mobicents.protocols.ss7.map.primitives.ArrayListSerializingBase;
import org.restcomm.smpp.GenerateType;
import org.restcomm.smpp.SmppEncoding;
/**
*
* @author Amit Bhayani
* @author sergey vetyutnev
*
*/
public class SmscPropertiesManagement implements SmscPropertiesManagementMBean {
private static final Logger logger = Logger.getLogger(SmscPropertiesManagement.class);
private static final String SC_GT = "scgt";
private static final String SC_GT_LIST = "scgtList";
private static final String SC_SSN = "scssn";
private static final String HLR_SSN = "hlrssn";
private static final String MSC_SSN = "mscssn";
private static final String MAX_MAP_VERSION = "maxmapv";
private static final String DEFAULT_VALIDITY_PERIOD_HOURS = "defaultValidityPeriodHours";
private static final String MAX_VALIDITY_PERIOD_HOURS = "maxValidityPeriodHours";
private static final String DEFAULT_TON = "defaultTon";
private static final String DEFAULT_NPI = "defaultNpi";
private static final String SUBSCRIBER_BUSY_DUE_DELAY = "subscriberBusyDueDelay";
private static final String FIRST_DUE_DELAY = "firstDueDelay";
private static final String SECOND_DUE_DELAY = "secondDueDelay";
private static final String MAX_DUE_DELAY = "maxDueDelay";
private static final String DUE_DELAY_MULTIPLICATOR = "dueDelayMultiplicator";
private static final String MAX_MESSAGE_LENGTH_REDUCER = "maxMessageLengthReducer";
private static final String HOSTS = "hosts";
private static final String DB_HOSTS = "dbHosts";
private static final String DB_PORT = "dbPort";
private static final String KEYSPACE_NAME = "keyspaceName";
private static final String CLUSTER_NAME = "clusterName";
private static final String FETCH_PERIOD = "fetchPeriod";
private static final String FETCH_MAX_ROWS = "fetchMaxRows";
private static final String MAX_ACTIVITY_COUNT = "maxActivityCount";
private static final String DELIVERY_TIMEOUT = "deliveryTimeout";
private static final String VP_PROLONG = "vpProlong";
private static final String SMPP_ENCODING_FOR_UCS2 = "smppEncodingForUCS2";
private static final String SMPP_ENCODING_FOR_GSM7 = "smppEncodingForGsm7";
private static final String SMS_HOME_ROUTING = "smsHomeRouting";
// private static final String CDR_DATABASE_EXPORT_DURATION =
// "cdrDatabaseExportDuration";
private static final String ESME_DEFAULT_CLUSTER_NAME = "esmeDefaultCluster";
private static final String REVISE_SECONDS_ON_SMSC_START = "reviseSecondsOnSmscStart";
private static final String PROCESSING_SMS_SET_TIMEOUT = "processingSmsSetTimeout";
private static final String GENERATE_RECEIPT_CDR = "generateReceiptCdr";
private static final String GENERATE_TEMP_FAILURE_CDR = "generateTempFailureCdr";
private static final String CALCULATE_MSG_PARTS_LEN_CDR = "calculateMsgPartsLenCdr";
private static final String DELAY_PARAMETERS_IN_CDR = "delayParametersInCdr";
private static final String RECEIPTS_DISABLING = "receiptsDisabling";
private static final String INCOME_RECEIPTS_PROCESSING = "incomeReceiptsProcessing";
private static final String ENABLE_INTERMEDIATE_RECEIPTS = "enableIntermediateReceipts";
private static final String ORIG_NETWORK_ID_FOR_RECEIPTS = "origNetworkIdForReceipts";
private static final String MO_DEFAULT_MESSAGING_MODE = "moDefaultMessagingMode";
private static final String HR_DEFAULT_MESSAGING_MODE = "hrDefaultMessagingMode";
private static final String SIP_DEFAULT_MESSAGING_MODE = "sipDefaultMessagingMode";
private static final String GENERATE_CDR = "generateCdr";
private static final String GENERATE_ARCHIVE_TABLE = "generateArchiveTable";
private static final String STORE_AND_FORWORD_MODE = "storeAndForwordMode";
private static final String MO_CHARGING = "moCharging";
private static final String HR_CHARGING = "hrCharging";
private static final String TX_SMPP_CHARGING = "txSmppCharging";
private static final String TX_SIP_CHARGING = "txSipCharging";
private static final String TX_HTTP_CHARGING = "txHttpCharging";
private static final String GLOBAL_TITLE_INDICATOR = "globalTitleIndicator";
private static final String TRANSLATION_TYPE = "translationType";
private static final String CORRELATION_ID_LIVE_TIME = "correlationIdLiveTime";
private static final String SRI_RESPONSE_LIVE_TIME = "sriResponseLiveTime";
private static final String DIAMETER_DEST_REALM = "diameterDestRealm";
private static final String DIAMETER_DEST_HOST = "diameterDestHost";
private static final String DIAMETER_DEST_PORT = "diameterDestPort";
private static final String DIAMETER_USER_NAME = "diameterUserName";
private static final String REMOVING_LIVE_TABLES_DAYS = "removingLiveTablesDays";
private static final String REMOVING_ARCHIVE_TABLES_DAYS = "removingArchiveTablesDays";
private static final String MO_UNKNOWN_TYPE_OF_NUMBER_PREFIX = "moUnknownTypeOfNumberPrefix";
private static final String HR_HLR_NUMBER = "hrHlrNumber";
private static final String HR_HLR_NUMBER_LIST = "hrHlrNumberList";
private static final String HR_SRI_BYPASS = "hrSriBypass";
private static final String HR_SRI_BYPASS_LIST = "hrSriBypassList";
private static final String NATIONAL_LANGUAGE_SINGLE_SHIFT = "nationalLanguageSingleShift";
private static final String NATIONAL_LANGUAGE_LOCKING_SHIFT = "nationalLanguageLockingShift";
private static final String HTTP_DEFAULT_SOURCE_TON = "httpDefaultSourceTon";
private static final String HTTP_DEFAULT_SOURCE_NPI = "httpDefaultSourceNpi";
private static final String HTTP_DEFAULT_DEST_TON = "httpDefaultDestTon";
private static final String HTTP_DEFAULT_DEST_NPI = "httpDefaultDestNpi";
private static final String HTTP_DEFAULT_NETWORK_ID = "httpDefaultNetworkId";
private static final String HTTP_DEFAULT_MESSAGING_MODE = "httpDefaultMessagingMode";
private static final String HTTP_DEFAULT_RD_DELIVERY_RECEIPT = "httpDefaultRDDeliveryReceipt";
private static final String HTTP_DEFAULT_RD_INTERMEDIATE_NOTIFICATION = "httpDefaultRDIntermediateNotification";
private static final String HTTP_DEFAULT_DATA_CODING = "httpDefaultDataCoding";
private static final String HTTP_ENCODING_FOR_UCS2 = "httpEncodingForUCS2";
private static final String HTTP_ENCODING_FOR_GSM7 = "httpEncodingForGsm7";
private static final String MIN_MESSAGE_ID = "minMessageId";
private static final String MAX_MESSAGE_ID = "maxMessageId";
private static final String DELIVERY_PAUSE = "deliveryPause";
private static final String CASSANDRA_USER = "cassandraUser";
private static final String CASSANDRA_PASS = "cassandraPass";
private static final String TAB_INDENT = "\t";
private static final String CLASS_ATTRIBUTE = "type";
private static final XMLBinding binding = new XMLBinding();
private static final String PERSIST_FILE_NAME = "smscproperties.xml";
private static SmscPropertiesManagement instance;
private final String name;
private String persistDir = null;
private final TextBuilder persistFile = TextBuilder.newInstance();
// private DatabaseType databaseType = DatabaseType.Cassandra_2;
private String serviceCenterGt = "0";
private FastMap<Integer, String> networkIdVsServiceCenterGt = new FastMap<Integer, String>();
private int serviceCenterSsn = -1;
private int hlrSsn = -1;
private int mscSsn = -1;
private int maxMapVersion = 3;
private int defaultValidityPeriodHours = 3 * 24;
private int maxValidityPeriodHours = 10 * 24;
private int defaultTon = 1;
private int defaultNpi = 1;
// delay after delivering failure with cause "subscriber busy" (sec)
private int subscriberBusyDueDelay = 60 * 2;
// delay before first a delivering try after incoming message receiving
// (sec)
private int firstDueDelay = 20;
// delay after first delivering failure (sec)
private int secondDueDelay = 60 * 5;
// max possible delay between delivering failure (sec)
private int maxDueDelay = 3600 * 24;
// next delay (after failure will be calculated as
// "prevDueDelay * dueDelayMultiplicator / 100")
private int dueDelayMultiplicator = 200;
// Empty TC-BEGIN will be used if messageLength > maxPossibleMessageLength -
// maxMessageLengthReducer
// Recommended value = 6 Possible values from 0 to 12
private int maxMessageLengthReducer = 6;
// Encoding type at SMPP part for data coding schema==0 (GSM7)
// 0-UTF8, 1-UNICODE, 3-GSM7
private SmppEncoding smppEncodingForGsm7 = SmppEncoding.Utf8;
// Encoding type at SMPP part for data coding schema==8 (UCS2)
// 0-UTF8, 1-UNICODE, 3-GSM7
private SmppEncoding smppEncodingForUCS2 = SmppEncoding.Utf8;
// time duration of exporting CDR's to a log based on cassandra database
// possible values: 1, 2, 5, 10, 15, 20, 30, 60 (minutes) or 0 (export is
// turned off)
// private int cdrDatabaseExportDuration = 0;
// parameters for cassandra database access
// private String hosts = "127.0.0.1:9042";
private String dbHosts = "127.0.0.1";
private int dbPort = 9042;
private String keyspaceName = "RestCommSMSC";
private String clusterName = "RestCommSMSC";
// credential for cassandra
private String cassandraUser = "cassandra";
private String cassandraPass = "cassandra";
// period of fetching messages from a database for delivering
// private long fetchPeriod = 5000; // that was C1
private long fetchPeriod = 200;
// max message fetching count for one fetching step
private int fetchMaxRows = 100;
// max count of delivering Activities that are possible at the same time
private int maxActivityCount = 500;
// delivery process timeout in seconds (timeout occurs if no actions for delivering (delivery confirmation or deliver a new
// item) for long time)
private int deliveryTimeout = 120;
// Validity period scheduling prolongation.
// Conditions when a message with validity period will be scheduled after delivery failure:
// a) validity period end time >= the time for next schedule time
// or
// b) validity period end time >= now + Validity period scheduling prolongation
// By changing of "Validity period scheduling prolongation" you can specify will a message be scheduled after validity period end time or not.
// Setting this parameter to 0 lead that all messages will be scheduled.
// Setting this parameter to a very big value lead that no message will be scheduled.
// The general rule is - you can allow messages to be scheduled for after validity period end time when scheduling is for after long time from now.
private int vpProlong = 120;
// if destinationAddress does not match to any esme (any ClusterName) or
// a message will be routed to defaultClusterName (only for
// DatabaseSmsRoutingRule)
// (if it is specified)
private String esmeDefaultClusterName;
// if SMSHomeRouting is enabled, SMSC will accept MtForwardSMS and forwardSm
// like mobile station
// private boolean isSMSHomeRouting = false;
// After SMSC restart it will revise previous reviseSecondsOnSmscStart
// seconds dueSlot's for unsent messages
private int reviseSecondsOnSmscStart = 60;
// Timeout of life cycle of SmsSet in SmsSetCashe.ProcessingSmsSet in
// seconds
private int processingSmsSetTimeout = 10 * 60;
// true: we generate CDR for both receipt and regular messages
// false: we generate CDR only for regular messages
private boolean generateReceiptCdr = false;
// true: we generate CDR also for temp failures (along with success and permanent failure cases)
// false: we generate CDR only for success and permanent failure cases (no CDRs for temp failures)
private boolean generateTempFailureCdr = true;
// true: when CDR generating SMSC GW will calculate MSG_PARTS and CHAR_NUMBERS fields (that demands extra calculating)
// false: not calculate
private boolean calculateMsgPartsLenCdr = false;
// true: when CDR generating SMSC GW will calculate processingTime, deliveryDelay, scheduleDeliveryDelay and deliveryCount (that demands extra calculating)
// false: not calculate
private boolean delayParametersInCdr = false;
// true: generating of delivery receipts will be disabled for all messages
private boolean receiptsDisabling = false;
// true: processing of incoming delivery receipts from remote SMSC GW: replacing of messageId in a receipt by a local
// messageId
private boolean incomeReceiptsProcessing = false;
// true: allowing of generating of receipts for temporary failures
private boolean enableIntermediateReceipts = false;
// true: for receipts the original networkId will be assigned
private boolean origNetworkIdForReceipts = false;
// default messaging mode for MO originated messages (0-default SMSC mode, 1-datagram, 2-transaction, 3-storeAndForward)
private int moDefaultMessagingMode = 3;
// default messaging mode for HR originated messages (0-default SMSC mode, 1-datagram, 2-transaction, 3-storeAndForward)
private int hrDefaultMessagingMode = 3;
// default messaging mode for SIP originated messages (0-default SMSC mode, 1-datagram, 3-storeAndForward) (we do not support transactions so far)
private int sipDefaultMessagingMode = 3;
// generating CDR's option
private GenerateType generateCdr = new GenerateType(true, true, true);
// generating archive table records option
private GenerateType generateArchiveTable = new GenerateType(true, true, true);
// options for storeAndForward mode: will messages be store into a database
// firstly (normal mode) or not
private StoreAndForwordMode storeAndForwordMode = StoreAndForwordMode.fast;
// option for processing of incoming SS7 mobile originated messages
// accept - all incoming messages are accepted
// reject - all incoming messages will be rejected
// diameter - all incoming messages are checked by Diameter peer before
// delivering
private MoChargingType moCharging = MoChargingType.accept;
// option for processing of incoming SS7 "mobile terminated" messages
// (home routing mode, messages are coming from upper SMSC)
// accept - all incoming messages are accepted
// reject - all incoming messages will be rejected
// diameter - all incoming messages are checked by Diameter peer before
// delivering
private MoChargingType hrCharging = MoChargingType.accept;
// Defualt is None: none of SMPP originated messages will be charged by OCS
// via Diameter before sending
private ChargingType txSmppCharging = ChargingType.None;
// Defualt is None: none of SIP originated messages will be charged by OCS
// via Diameter before sending
private ChargingType txSipCharging = ChargingType.None;
// option for processing of incoming HTTP originated messages
// accept - all incoming messages are accepted
// reject - all incoming messages will be rejected
// diameter - all incoming messages are checked by Diameter peer before
// delivering
private MoChargingType txHttpCharging = MoChargingType.accept;
// Type of SCCP GlobalTytle for outgoing SCCP messages
private GlobalTitleIndicator globalTitleIndicator = GlobalTitleIndicator.GLOBAL_TITLE_INCLUDES_TRANSLATION_TYPE_NUMBERING_PLAN_ENCODING_SCHEME_AND_NATURE_OF_ADDRESS;
// TranslationType value
private int translationType = 0;
// min lifetime of elements in correlationIdCache (in seconds)
private int correlationIdLiveTime = 60;
// min lifetime of elements in SRI responses Cache (in seconds)
// default value is 0 - no caching
private int sriResponseLiveTime = 0;
// Diameter destination Realm for connection to OCS
private String diameterDestRealm = "telestax.com";
// Diameter destination Host for connection to OCS
private String diameterDestHost = "127.0.0.1"; // "127.0.0.2"
// Diameter destination port for connection to OCS
private int diameterDestPort = 3868;
// Diameter UserName for connection to OCS
private String diameterUserName = "";
// Days after which old cassandra live tables will be removed
// min value is 3 days (this means at least 2 days before today tables must be alive),
// if less value is defined data tables will not be deleted
// set this option to 0 to disable this option
private int removingLiveTablesDays = 3;
// Days after which old cassandra archive tables will be removed
// min value is 3 days (this means at least 2 days before today tables must be alive),
// if less value is defined data tables will not be deleted
// set this option to 0 to disable this option
private int removingArchiveTablesDays = 3;
// if this value != null and != "" and incoming mo message has TypeOfNumber==Unknown
// moUnknownTypeOfNumberPrefix will be added as a prefix to a dest address
// private String moUnknownTypeOfNumberPrefix = "";
// if !=null and !=""
// this address will be inserted as CalledPartyAddress SCCP into all SRI
// outgoing requests
private String hrHlrNumber = "";
private FastMap<Integer, String> networkIdVsHrHlrNumber = new FastMap<Integer, String>();
// if true - SRI request to local HLR will be skipped
private boolean hrSriBypass = false;
private FastMap<Integer, Boolean> networkIdVsHrSriBypass = new FastMap<Integer, Boolean>();
// national single and locking shift tables for the case when a message is SMPP originated and does not have included UDH
private int nationalLanguageSingleShift = 0;
private int nationalLanguageLockingShift = 0;
// TxHttp: default TON value for source addresses
// -1: autodetect - international / national / alphanumerical
// -2: autodetect - international / alphanumerical
private int httpDefaultSourceTon = -2;
// TxHttp: default NPI value for source addresses
// -1: autodetect - international / national / alphanumerical
// -2: autodetect - international / alphanumerical
private int httpDefaultSourceNpi = -2;
// TxHttp: default TON value for destination addresses
private int httpDefaultDestTon = 1;
// TxHttp: default NPI value for destination addresses
private int httpDefaultDestNpi = 1;
// TxHttp: default networkId area
private int httpDefaultNetworkId = 0;
// TxHttp: default messaging mode (0-default SMSC mode, 1-datagram, 2-transaction, 3-storeAndForward)
private int httpDefaultMessagingMode = 1;
// TxHttp: default delivery receipt requests (0-no, 1-on success or failure, 2-on failure, 3-on success)
private int httpDefaultRDDeliveryReceipt = 0;
// TxHttp: default intermediate delivery notification requests (0-no, 1-yes)
private int httpDefaultRDIntermediateNotification = 0;
// TxHttp: default data coding schema that will be used in delivery (common values: 0-GSM7, 8-UCS2)
private int httpDefaultDataCoding = 0;
// Encoding type at HTTP part for data coding schema==0 (GSM7)
// 0-UTF8, 1-UNICODE
private HttpEncoding httpEncodingForGsm7 = HttpEncoding.Utf8;
// Encoding type at HTTP part for data coding schema==8 (UCS2)
// 0-UTF8, 1-UNICODE
private HttpEncoding httpEncodingForUCS2 = HttpEncoding.Utf8;
// Min value of messageId value for SMPP responses
private long minMessageId = 1;
// Max value of messageId value for SMPP responses
private long maxMessageId = 10000000000L;
// if set to true:
// SMSC does not try to deliver any messages from cassandra database to SS7
// / ESMEs / SIP
// SMSC accepts any incoming messages from SS7 / ESMEs / SIP (and storing
// them into a database)
private boolean deliveryPause = false;
// this flag is not a storable option but a flag
// this flag is set to true when Schedule RA is inactivated or inactivating
// and is set to false when Schedule RA is activated
private boolean smscStopped = true;
// this flag is set for SMSC GW skip of processing of unsent messages for
// previous dueSlots. Value of this message means time offset in seconds
// before actual time.
private int skipUnsentMessages = -1;
private SmscPropertiesManagement(String name) {
this.name = name;
binding.setClassAttribute(CLASS_ATTRIBUTE);
}
public static SmscPropertiesManagement getInstance(String name) {
if (instance == null) {
instance = new SmscPropertiesManagement(name);
}
return instance;
}
public static SmscPropertiesManagement getInstance() {
return instance;
}
public String getName() {
return name;
}
public String getPersistDir() {
return persistDir;
}
public void setPersistDir(String persistDir) {
this.persistDir = persistDir;
}
// public DatabaseType getDatabaseType() {
// return this.databaseType;
// }
public String getServiceCenterGt() {
return serviceCenterGt;
}
public String getServiceCenterGt(int networkId) {
String res = networkIdVsServiceCenterGt.get(networkId);
if (res != null)
return res;
else
return serviceCenterGt;
}
public Map<Integer, String> getNetworkIdVsServiceCenterGt() {
return networkIdVsServiceCenterGt;
}
public void setServiceCenterGt(String serviceCenterGt) {
this.setServiceCenterGt(0, serviceCenterGt);
}
public void setServiceCenterGt(int networkId, String serviceCenterGt) {
if (networkId == 0) {
this.serviceCenterGt = serviceCenterGt;
} else {
if (serviceCenterGt == null || serviceCenterGt.equals("") || serviceCenterGt.equals("0")) {
this.networkIdVsServiceCenterGt.remove(networkId);
} else {
this.networkIdVsServiceCenterGt.put(networkId, serviceCenterGt);
}
}
this.store();
}
public int getServiceCenterSsn() {
return serviceCenterSsn;
}
public void setServiceCenterSsn(int serviceCenterSsn) {
this.serviceCenterSsn = serviceCenterSsn;
this.store();
}
public int getHlrSsn() {
return hlrSsn;
}
public void setHlrSsn(int hlrSsn) {
this.hlrSsn = hlrSsn;
this.store();
}
public int getMscSsn() {
return mscSsn;
}
public void setMscSsn(int mscSsn) {
this.mscSsn = mscSsn;
this.store();
}
public int getMaxMapVersion() {
return maxMapVersion;
}
public void setMaxMapVersion(int maxMapVersion) {
this.maxMapVersion = maxMapVersion;
this.store();
}
public int getDefaultValidityPeriodHours() {
return defaultValidityPeriodHours;
}
public void setDefaultValidityPeriodHours(int defaultValidityPeriodHours) {
this.defaultValidityPeriodHours = defaultValidityPeriodHours;
this.store();
}
public int getMaxValidityPeriodHours() {
return maxValidityPeriodHours;
}
public void setMaxValidityPeriodHours(int maxValidityPeriodHours) {
this.maxValidityPeriodHours = maxValidityPeriodHours;
this.store();
}
public int getDefaultTon() {
return defaultTon;
}
public void setDefaultTon(int defaultTon) {
this.defaultTon = defaultTon;
this.store();
}
public int getDefaultNpi() {
return defaultNpi;
}
public void setDefaultNpi(int defaultNpi) {
this.defaultNpi = defaultNpi;
this.store();
}
public int getSubscriberBusyDueDelay() {
return subscriberBusyDueDelay;
}
public void setSubscriberBusyDueDelay(int subscriberBusyDueDelay) {
this.subscriberBusyDueDelay = subscriberBusyDueDelay;
this.store();
}
public int getFirstDueDelay() {
return firstDueDelay;
}
public void setFirstDueDelay(int firstDueDelay) {
this.firstDueDelay = firstDueDelay;
this.store();
}
public int getSecondDueDelay() {
return secondDueDelay;
}
public void setSecondDueDelay(int secondDueDelay) {
this.secondDueDelay = secondDueDelay;
this.store();
}
public int getMaxDueDelay() {
return maxDueDelay;
}
public void setMaxDueDelay(int maxDueDelay) {
this.maxDueDelay = maxDueDelay;
this.store();
}
public int getDueDelayMultiplicator() {
return dueDelayMultiplicator;
}
public void setDueDelayMultiplicator(int dueDelayMultiplicator) {
this.dueDelayMultiplicator = dueDelayMultiplicator;
this.store();
}
public void setCassandraUser(String user) throws IllegalArgumentException {
if (user.trim().equals("")) {
throw new IllegalArgumentException("User name can not be empty");
}
this.cassandraUser = user.trim();
this.store();
}
public String getCassandraUser() {
return this.cassandraUser;
}
public void setCassandraPass(String pass) throws IllegalArgumentException {
if (pass.trim().equals("")) {
throw new IllegalArgumentException("Password can not be empty");
}
this.cassandraPass = pass.trim();
this.store();
}
public String getCassandraPass() {
return this.cassandraPass;
}
@Override
public int getMaxMessageLengthReducer() {
return maxMessageLengthReducer;
}
@Override
public void setMaxMessageLengthReducer(int maxMessageLengReducer) {
this.maxMessageLengthReducer = maxMessageLengReducer;
this.store();
}
@Override
public SmppEncoding getSmppEncodingForGsm7() {
return smppEncodingForGsm7;
}
@Override
public void setSmppEncodingForGsm7(SmppEncoding smppEncodingForGsm7) {
this.smppEncodingForGsm7 = smppEncodingForGsm7;
this.store();
}
@Override
public SmppEncoding getSmppEncodingForUCS2() {
return smppEncodingForUCS2;
}
@Override
public void setSmppEncodingForUCS2(SmppEncoding smppEncodingForUCS2) {
this.smppEncodingForUCS2 = smppEncodingForUCS2;
this.store();
}
@Override
public HttpEncoding getHttpEncodingForGsm7() {
return httpEncodingForGsm7;
}
@Override
public void setHttpEncodingForGsm7(HttpEncoding httpEncodingForGsm7) {
this.httpEncodingForGsm7 = httpEncodingForGsm7;
this.store();
}
@Override
public HttpEncoding getHttpEncodingForUCS2() {
return httpEncodingForUCS2;
}
@Override
public void setHttpEncodingForUCS2(HttpEncoding httpEncodingForUCS2) {
this.httpEncodingForUCS2 = httpEncodingForUCS2;
this.store();
}
@Override
public long getMinMessageId() {
return minMessageId;
}
@Override
public void setMinMessageId(long minMessageId) throws IllegalArgumentException {
if (minMessageId < 0)
throw new IllegalArgumentException("minMessageId must be geater or equal 0");
if (minMessageId > maxMessageId)
throw new IllegalArgumentException("minMessageId must be less then maxMessageId");
if (maxMessageId - minMessageId < 1000000)
throw new IllegalArgumentException("minMessageId must be less then maxMessageId at least for 1000000");
this.minMessageId = minMessageId;
this.store();
}
@Override
public long getMaxMessageId() {
return maxMessageId;
}
@Override
public void setMaxMessageId(long maxMessageId) throws IllegalArgumentException {
if (maxMessageId < 0)
throw new IllegalArgumentException("maxMessageId must be geater or equal 0");
if (minMessageId > maxMessageId)
throw new IllegalArgumentException("maxMessageId must be more then minMessageId");
if (maxMessageId - minMessageId < 1000000)
throw new IllegalArgumentException("minMessageId must be less then maxMessageId at least for 1000000");
this.maxMessageId = maxMessageId;
this.store();
}
// TODO : Let port be defined independently instead of ip:prt. Also when
// cluster will be used there will be more ip's. Hosts should be comma
// separated ip's
@Override
public String getDbHosts() {
return dbHosts;
}
@Override
public void setDbHosts(String dbHosts) {
this.dbHosts = dbHosts;
this.store();
}
@Override
public int getDbPort() {
return dbPort;
}
@Override
public void setDbPort(int dbPort) {
this.dbPort = dbPort;
this.store();
}
@Override
public String getKeyspaceName() {
return keyspaceName;
}
@Override
public void setKeyspaceName(String keyspaceName) {
this.keyspaceName = keyspaceName;
this.store();
}
@Override
public String getClusterName() {
return clusterName;
}
@Override
public void setClusterName(String clusterName) {
this.clusterName = clusterName;
this.store();
}
@Override
public long getFetchPeriod() {
return fetchPeriod;
}
@Override
public void setFetchPeriod(long fetchPeriod) {
this.fetchPeriod = fetchPeriod;
this.store();
}
@Override
public int getFetchMaxRows() {
return fetchMaxRows;
}
@Override
public void setFetchMaxRows(int fetchMaxRows) {
this.fetchMaxRows = fetchMaxRows;
this.store();
}
@Override
public int getMaxActivityCount() {
return maxActivityCount;
}
@Override
public void setMaxActivityCount(int maxActivityCount) {
this.maxActivityCount = maxActivityCount;
this.store();
}
@Override
public int getDeliveryTimeout() {
return deliveryTimeout;
}
@Override
public void setDeliveryTimeout(int deliveryTimeout) {
this.deliveryTimeout = deliveryTimeout;
this.store();
}
@Override
public int getVpProlong() {
return vpProlong;
}
@Override
public void setVpProlong(int vpProlong) {
this.vpProlong = vpProlong;
this.store();
}
@Override
public String getEsmeDefaultClusterName() {
return esmeDefaultClusterName;
}
@Override
public void setEsmeDefaultClusterName(String val) {
esmeDefaultClusterName = val;
this.store();
}
@Override
public int getReviseSecondsOnSmscStart() {
return this.reviseSecondsOnSmscStart;
}
@Override
public void setReviseSecondsOnSmscStart(int reviseSecondsOnSmscStart) {
this.reviseSecondsOnSmscStart = reviseSecondsOnSmscStart;
this.store();
}
@Override
public int getProcessingSmsSetTimeout() {
return this.processingSmsSetTimeout;
}
@Override
public void setProcessingSmsSetTimeout(int processingSmsSetTimeout) {
this.processingSmsSetTimeout = processingSmsSetTimeout;
this.store();
}
@Override
public boolean getGenerateReceiptCdr() {
return this.generateReceiptCdr;
}
@Override
public void setGenerateReceiptCdr(boolean generateReceiptCdr) {
this.generateReceiptCdr = generateReceiptCdr;
this.store();
}
@Override
public boolean getGenerateTempFailureCdr() {
return this.generateTempFailureCdr;
}
@Override
public void setGenerateTempFailureCdr(boolean generateTempFailureCdr) {
this.generateTempFailureCdr = generateTempFailureCdr;
this.store();
}
@Override
public boolean getCalculateMsgPartsLenCdr() {
return this.calculateMsgPartsLenCdr;
}
@Override
public void setCalculateMsgPartsLenCdr(boolean calculateMsgPartsLenCdr) {
this.calculateMsgPartsLenCdr = calculateMsgPartsLenCdr;
this.store();
}
@Override
public boolean getDelayParametersInCdr() {
return this.delayParametersInCdr;
}
@Override
public void setDelayParametersInCdr(boolean delayParametersInCdr) {
this.delayParametersInCdr = delayParametersInCdr;
this.store();
}
@Override
public boolean getReceiptsDisabling() {
return this.receiptsDisabling;
}
@Override
public void setReceiptsDisabling(boolean receiptsDisabling) {
this.receiptsDisabling = receiptsDisabling;
this.store();
}
@Override
public boolean getEnableIntermediateReceipts() {
return this.enableIntermediateReceipts;
}
@Override
public void setEnableIntermediateReceipts(boolean enableIntermediateReceipts) {
this.enableIntermediateReceipts = enableIntermediateReceipts;
this.store();
}
@Override
public boolean getIncomeReceiptsProcessing() {
return incomeReceiptsProcessing;
}
@Override
public void setIncomeReceiptsProcessing(boolean incomeReceiptsProcessing) {
this.incomeReceiptsProcessing = incomeReceiptsProcessing;
this.store();
}
@Override
public boolean getOrigNetworkIdForReceipts() {
return this.origNetworkIdForReceipts;
}
@Override
public void setOrigNetworkIdForReceipts(boolean origNetworkIdForReceipts) {
this.origNetworkIdForReceipts = origNetworkIdForReceipts;
this.store();
}
@Override
public int getMoDefaultMessagingMode() {
return this.moDefaultMessagingMode;
}
@Override
public void setMoDefaultMessagingMode(int moDefaultMessagingMode) {
this.moDefaultMessagingMode = moDefaultMessagingMode;
this.store();
}
@Override
public int getHrDefaultMessagingMode() {
return this.hrDefaultMessagingMode;
}
@Override
public void setHrDefaultMessagingMode(int hrDefaultMessagingMode) {
this.hrDefaultMessagingMode = hrDefaultMessagingMode;
this.store();
}
@Override
public int getSipDefaultMessagingMode() {
return this.sipDefaultMessagingMode;
}
@Override
public void setSipDefaultMessagingMode(int sipDefaultMessagingMode) {
this.sipDefaultMessagingMode = sipDefaultMessagingMode;
this.store();
}
@Override
public MoChargingType getMoCharging() {
return moCharging;
}
@Override
public void setMoCharging(MoChargingType moCharging) {
this.moCharging = moCharging;
this.store();
}
@Override
public MoChargingType getHrCharging() {
return hrCharging;
}
@Override
public void setHrCharging(MoChargingType mtCharging) {
this.hrCharging = mtCharging;
this.store();
}
@Override
public StoreAndForwordMode getStoreAndForwordMode() {
return storeAndForwordMode;
}
@Override
public void setStoreAndForwordMode(StoreAndForwordMode storeAndForwordMode) {
this.storeAndForwordMode = storeAndForwordMode;
this.store();
}
@Override
public ChargingType getTxSmppChargingType() {
return txSmppCharging;
}
@Override
public void setTxSmppChargingType(ChargingType txSmppCharging) {
this.txSmppCharging = txSmppCharging;
this.store();
}
@Override
public ChargingType getTxSipChargingType() {
return this.txSipCharging;
}
@Override
public void setTxSipChargingType(ChargingType txSipCharging) {
this.txSipCharging = txSipCharging;
this.store();
}
@Override
public MoChargingType getTxHttpCharging() {
return txHttpCharging;
}
@Override
public void setTxHttpCharging(MoChargingType txHttpCharging) {
this.txHttpCharging = txHttpCharging;
this.store();
}
public GlobalTitleIndicator getGlobalTitleIndicator() {
return globalTitleIndicator;
}
public void setGlobalTitleIndicator(GlobalTitleIndicator globalTitleIndicator) {
this.globalTitleIndicator = globalTitleIndicator;
this.store();
}
public int getTranslationType() {
return translationType;
}
public void setTranslationType(int translationType) {
this.translationType = translationType;
this.store();
}
public int getCorrelationIdLiveTime() {
return correlationIdLiveTime;
}
public void setCorrelationIdLiveTime(int correlationIdLiveTime) {
this.correlationIdLiveTime = correlationIdLiveTime;
this.store();
}
public int getSriResponseLiveTime() {
return sriResponseLiveTime;
}
public void setSriResponseLiveTime(int sriresponselivetime) {
this.sriResponseLiveTime = sriresponselivetime;
this.store();
}
@Override
public String getDiameterDestRealm() {
return diameterDestRealm;
}
@Override
public void setDiameterDestRealm(String diameterDestRealm) {
this.diameterDestRealm = diameterDestRealm;
this.store();
}
@Override
public String getDiameterDestHost() {
return diameterDestHost;
}
@Override
public void setDiameterDestHost(String diameterDestHost) {
this.diameterDestHost = diameterDestHost;
this.store();
}
@Override
public int getDiameterDestPort() {
return diameterDestPort;
}
@Override
public void setDiameterDestPort(int diameterDestPort) {
this.diameterDestPort = diameterDestPort;
this.store();
}
@Override
public String getDiameterUserName() {
return diameterUserName;
}
@Override
public void setDiameterUserName(String diameterUserName) {
this.diameterUserName = diameterUserName;
this.store();
}
public int getRemovingLiveTablesDays() {
return removingLiveTablesDays;
}
public void setRemovingLiveTablesDays(int removingLiveTablesDays) {
this.removingLiveTablesDays = removingLiveTablesDays;
this.store();
}
public int getRemovingArchiveTablesDays() {
return removingArchiveTablesDays;
}
public void setRemovingArchiveTablesDays(int removingArchiveTablesDays) {
this.removingArchiveTablesDays = removingArchiveTablesDays;
this.store();
}
public String getHrHlrNumber() {
return hrHlrNumber;
}
public String getHrHlrNumber(int networkId) {
if (networkId == 0)
return hrHlrNumber;
else
return networkIdVsHrHlrNumber.get(networkId);
}
public Map<Integer, String> getNetworkIdVsHrHlrNumber() {
return networkIdVsHrHlrNumber;
}
public void setHrHlrNumber(String hrHlrNumber) {
this.setHrHlrNumber(0, hrHlrNumber);
}
public void setHrHlrNumber(int networkId, String hrHlrNumber) {
if (networkId == 0) {
this.hrHlrNumber = hrHlrNumber;
} else {
if (hrHlrNumber == null || hrHlrNumber.equals("") || hrHlrNumber.equals("0")) {
this.networkIdVsHrHlrNumber.remove(networkId);
} else {
this.networkIdVsHrHlrNumber.put(networkId, hrHlrNumber);
}
}
this.store();
}
public boolean getHrSriBypass() {
return hrSriBypass;
}
public boolean getHrSriBypass(int networkId) {
Boolean res = networkIdVsHrSriBypass.get(networkId);
if (res != null)
return res;
else
return hrSriBypass;
}
public Map<Integer, Boolean> getNetworkIdVsHrSriBypass() {
return networkIdVsHrSriBypass;
}
public void setHrSriBypass(boolean hrSriBypass) {
this.setHrSriBypass(0, hrSriBypass);
}
public void setHrSriBypass(int networkId, boolean hrSriBypass) {
if (networkId == 0) {
this.hrSriBypass = hrSriBypass;
} else {
this.networkIdVsHrSriBypass.put(networkId, hrSriBypass);
}
this.store();
}
public void removeHrSriBypassForNetworkId(int networkId) {
this.networkIdVsHrSriBypass.remove(networkId);
this.store();
}
public int getNationalLanguageSingleShift() {
return nationalLanguageSingleShift;
}
public void setNationalLanguageSingleShift(int nationalLanguageSingleShift) {
this.nationalLanguageSingleShift = nationalLanguageSingleShift;
this.store();
}
public int getNationalLanguageLockingShift() {
return nationalLanguageLockingShift;
}
public void setNationalLanguageLockingShift(int nationalLanguageLockingShift) {
this.nationalLanguageLockingShift = nationalLanguageLockingShift;
this.store();
}
@Override
public boolean isDeliveryPause() {
return deliveryPause;
}
@Override
public void setDeliveryPause(boolean deliveryPause) {
this.deliveryPause = deliveryPause;
this.store();
}
@Override
public boolean isSmscStopped() {
return smscStopped;
}
public void setSmscStopped(boolean smscStopped) {
this.smscStopped = smscStopped;
}
@Override
public int getSkipUnsentMessages() {
return skipUnsentMessages;
}
@Override
public void setSkipUnsentMessages(int skipUnsentMessages) {
this.skipUnsentMessages = skipUnsentMessages;
}
@Override
public GenerateType getGenerateCdr() {
return generateCdr;
}
@Override
public void setGenerateCdr(GenerateType generateCdr) {
this.generateCdr = generateCdr;
this.store();
}
@Override
public int getGenerateCdrInt() {
return this.generateCdr.getValue();
}
@Override
public void setGenerateCdrInt(int generateCdr) {
this.generateCdr = new GenerateType(generateCdr);
this.store();
}
@Override
public GenerateType getGenerateArchiveTable() {
return generateArchiveTable;
}
@Override
public void setGenerateArchiveTable(GenerateType generateArchiveTable) {
this.generateArchiveTable = generateArchiveTable;
this.store();
}
@Override
public int getGenerateArchiveTableInt() {
return generateArchiveTable.getValue();
}
@Override
public void setGenerateArchiveTableInt(int generateArchiveTable) {
this.generateArchiveTable = new GenerateType(generateArchiveTable);
this.store();
}
@Override
public int getHttpDefaultSourceTon() {
return httpDefaultSourceTon;
}
@Override
public void setHttpDefaultSourceTon(int httpDefaultSourceTon) {
this.httpDefaultSourceTon = httpDefaultSourceTon;
this.store();
}
@Override
public int getHttpDefaultSourceNpi() {
return httpDefaultSourceNpi;
}
@Override
public void setHttpDefaultSourceNpi(int httpDefaultSourceNpi) {
this.httpDefaultSourceNpi = httpDefaultSourceNpi;
this.store();
}
@Override
public int getHttpDefaultDestTon() {
return httpDefaultDestTon;
}
@Override
public void setHttpDefaultDestTon(int httpDefaultDestTon) {
this.httpDefaultDestTon = httpDefaultDestTon;
this.store();
}
@Override
public int getHttpDefaultDestNpi() {
return httpDefaultDestNpi;
}
@Override
public void setHttpDefaultDestNpi(int httpDefaultDestNpi) {
this.httpDefaultDestNpi = httpDefaultDestNpi;
this.store();
}
@Override
public int getHttpDefaultNetworkId() {
return httpDefaultNetworkId;
}
@Override
public void setHttpDefaultNetworkId(int httpDefaultNetworkId) {
this.httpDefaultNetworkId = httpDefaultNetworkId;
this.store();
}
@Override
public int getHttpDefaultMessagingMode() {
return httpDefaultMessagingMode;
}
@Override
public void setHttpDefaultMessagingMode(int httpDefaultMessagingMode) {
this.httpDefaultMessagingMode = httpDefaultMessagingMode;
this.store();
}
@Override
public int getHttpDefaultRDDeliveryReceipt() {
return httpDefaultRDDeliveryReceipt;
}
@Override
public void setHttpDefaultRDDeliveryReceipt(int httpDefaultRDDeliveryReceipt) {
this.httpDefaultRDDeliveryReceipt = httpDefaultRDDeliveryReceipt;
this.store();
}
@Override
public int getHttpDefaultRDIntermediateNotification() {
return httpDefaultRDIntermediateNotification;
}
@Override
public void setHttpDefaultRDIntermediateNotification(int httpDefaultRDIntermediateNotification) {
this.httpDefaultRDIntermediateNotification = httpDefaultRDIntermediateNotification;
this.store();
}
@Override
public int getHttpDefaultDataCoding() {
return httpDefaultDataCoding;
}
@Override
public void setHttpDefaultDataCoding(int httpDefaultDataCoding) {
this.httpDefaultDataCoding = httpDefaultDataCoding;
this.store();
}
public void start() throws Exception {
this.persistFile.clear();
if (persistDir != null) {
this.persistFile.append(persistDir).append(File.separator).append(this.name).append("_")
.append(PERSIST_FILE_NAME);
} else {
persistFile
.append(System.getProperty(SmscManagement.SMSC_PERSIST_DIR_KEY,
System.getProperty(SmscManagement.USER_DIR_KEY))).append(File.separator).append(this.name)
.append("_").append(PERSIST_FILE_NAME);
}
logger.info(String.format("Loading SMSC Properties from %s", persistFile.toString()));
try {
this.load();
} catch (FileNotFoundException e) {
logger.warn(String.format("Failed to load the SMSC configuration file. \n%s", e.getMessage()));
}
}
public void stop() throws Exception {
this.store();
}
/**
* Persist
*/
public void store() {
// TODO : Should we keep reference to Objects rather than recreating
// everytime?
try {
XMLObjectWriter writer = XMLObjectWriter.newInstance(new FileOutputStream(persistFile.toString()));
writer.setBinding(binding);
// Enables cross-references.
// writer.setReferenceResolver(new XMLReferenceResolver());
writer.setIndentation(TAB_INDENT);
writer.write(this.serviceCenterGt, SC_GT, String.class);
if (networkIdVsServiceCenterGt.size() > 0) {
ArrayList<ServiceCenterGtNetworkIdElement> al = new ArrayList<ServiceCenterGtNetworkIdElement>();
for (Entry<Integer, String> val : networkIdVsServiceCenterGt.entrySet()) {
ServiceCenterGtNetworkIdElement el = new ServiceCenterGtNetworkIdElement();
el.networkId = val.getKey();
el.serviceCenterGt = val.getValue();
al.add(el);
}
SmscPropertiesManagement_serviceCenterGtNetworkId al2 = new SmscPropertiesManagement_serviceCenterGtNetworkId(al);
writer.write(al2, SC_GT_LIST, SmscPropertiesManagement_serviceCenterGtNetworkId.class);
}
writer.write(this.serviceCenterSsn, SC_SSN, Integer.class);
writer.write(this.hlrSsn, HLR_SSN, Integer.class);
writer.write(this.mscSsn, MSC_SSN, Integer.class);
writer.write(this.maxMapVersion, MAX_MAP_VERSION, Integer.class);
writer.write(this.defaultValidityPeriodHours, DEFAULT_VALIDITY_PERIOD_HOURS, Integer.class);
writer.write(this.maxValidityPeriodHours, MAX_VALIDITY_PERIOD_HOURS, Integer.class);
writer.write(this.defaultTon, DEFAULT_TON, Integer.class);
writer.write(this.defaultNpi, DEFAULT_NPI, Integer.class);
writer.write(this.subscriberBusyDueDelay, SUBSCRIBER_BUSY_DUE_DELAY, Integer.class);
writer.write(this.firstDueDelay, FIRST_DUE_DELAY, Integer.class);
writer.write(this.secondDueDelay, SECOND_DUE_DELAY, Integer.class);
writer.write(this.maxDueDelay, MAX_DUE_DELAY, Integer.class);
writer.write(this.dueDelayMultiplicator, DUE_DELAY_MULTIPLICATOR, Integer.class);
writer.write(this.maxMessageLengthReducer, MAX_MESSAGE_LENGTH_REDUCER, Integer.class);
writer.write(this.dbHosts, DB_HOSTS, String.class);
writer.write(this.dbPort, DB_PORT, Integer.class);
writer.write(this.keyspaceName, KEYSPACE_NAME, String.class);
writer.write(this.clusterName, CLUSTER_NAME, String.class);
writer.write(this.fetchPeriod, FETCH_PERIOD, Long.class);
writer.write(this.fetchMaxRows, FETCH_MAX_ROWS, Integer.class);
writer.write(this.deliveryPause, DELIVERY_PAUSE, Boolean.class);
writer.write(this.removingLiveTablesDays, REMOVING_LIVE_TABLES_DAYS, Integer.class);
writer.write(this.removingArchiveTablesDays, REMOVING_ARCHIVE_TABLES_DAYS, Integer.class);
writer.write(this.hrHlrNumber, HR_HLR_NUMBER, String.class);
if (networkIdVsHrHlrNumber.size() > 0) {
ArrayList<HrHlrNumberNetworkIdElement> al = new ArrayList<HrHlrNumberNetworkIdElement>();
for (Entry<Integer, String> val : networkIdVsHrHlrNumber.entrySet()) {
HrHlrNumberNetworkIdElement el = new HrHlrNumberNetworkIdElement();
el.networkId = val.getKey();
el.hrHlrNumber = val.getValue();
al.add(el);
}
SmscPropertiesManagement_HrHlrNumberNetworkId al2 = new SmscPropertiesManagement_HrHlrNumberNetworkId(al);
writer.write(al2, HR_HLR_NUMBER_LIST, SmscPropertiesManagement_HrHlrNumberNetworkId.class);
}
writer.write(this.hrSriBypass, HR_SRI_BYPASS, Boolean.class);
if (networkIdVsHrSriBypass.size() > 0) {
ArrayList<HrSriBypassNetworkIdElement> al = new ArrayList<HrSriBypassNetworkIdElement>();
for (Entry<Integer, Boolean> val : networkIdVsHrSriBypass.entrySet()) {
HrSriBypassNetworkIdElement el = new HrSriBypassNetworkIdElement();
el.networkId = val.getKey();
el.hrSriBypass = val.getValue();
al.add(el);
}
SmscPropertiesManagement_HrSriBypassNetworkId al2 = new SmscPropertiesManagement_HrSriBypassNetworkId(al);
writer.write(al2, HR_SRI_BYPASS_LIST, SmscPropertiesManagement_HrSriBypassNetworkId.class);
}
writer.write(this.nationalLanguageSingleShift, NATIONAL_LANGUAGE_SINGLE_SHIFT, Integer.class);
writer.write(this.nationalLanguageLockingShift, NATIONAL_LANGUAGE_LOCKING_SHIFT, Integer.class);
writer.write(this.esmeDefaultClusterName, ESME_DEFAULT_CLUSTER_NAME, String.class);
writer.write(this.maxActivityCount, MAX_ACTIVITY_COUNT, Integer.class);
writer.write(this.deliveryTimeout, DELIVERY_TIMEOUT, Integer.class);
writer.write(this.vpProlong, VP_PROLONG, Integer.class);
// writer.write(this.isSMSHomeRouting, SMS_HOME_ROUTING, Boolean.class);
writer.write(this.smppEncodingForGsm7.toString(), SMPP_ENCODING_FOR_GSM7, String.class);
writer.write(this.smppEncodingForUCS2.toString(), SMPP_ENCODING_FOR_UCS2, String.class);
writer.write(this.httpEncodingForGsm7.toString(), HTTP_ENCODING_FOR_GSM7, String.class);
writer.write(this.httpEncodingForUCS2.toString(), HTTP_ENCODING_FOR_UCS2, String.class);
writer.write(this.reviseSecondsOnSmscStart, REVISE_SECONDS_ON_SMSC_START, Integer.class);
writer.write(this.processingSmsSetTimeout, PROCESSING_SMS_SET_TIMEOUT, Integer.class);
writer.write(this.generateReceiptCdr, GENERATE_RECEIPT_CDR, Boolean.class);
writer.write(this.generateTempFailureCdr, GENERATE_TEMP_FAILURE_CDR, Boolean.class);
writer.write(this.calculateMsgPartsLenCdr, CALCULATE_MSG_PARTS_LEN_CDR, Boolean.class);
writer.write(this.delayParametersInCdr, DELAY_PARAMETERS_IN_CDR, Boolean.class);
writer.write(this.receiptsDisabling, RECEIPTS_DISABLING, Boolean.class);
writer.write(this.incomeReceiptsProcessing, INCOME_RECEIPTS_PROCESSING, Boolean.class);
writer.write(this.enableIntermediateReceipts, ENABLE_INTERMEDIATE_RECEIPTS, Boolean.class);
writer.write(this.origNetworkIdForReceipts, ORIG_NETWORK_ID_FOR_RECEIPTS, Boolean.class);
writer.write(this.moDefaultMessagingMode, MO_DEFAULT_MESSAGING_MODE, Integer.class);
writer.write(this.hrDefaultMessagingMode, HR_DEFAULT_MESSAGING_MODE, Integer.class);
writer.write(this.sipDefaultMessagingMode, SIP_DEFAULT_MESSAGING_MODE, Integer.class);
writer.write(this.generateCdr.getValue(), GENERATE_CDR, Integer.class);
writer.write(this.generateArchiveTable.getValue(), GENERATE_ARCHIVE_TABLE, Integer.class);
writer.write(this.storeAndForwordMode.toString(), STORE_AND_FORWORD_MODE, String.class);
writer.write(this.minMessageId, MIN_MESSAGE_ID, Long.class);
writer.write(this.maxMessageId, MAX_MESSAGE_ID, Long.class);
writer.write(this.moCharging.toString(), MO_CHARGING, String.class);
writer.write(this.hrCharging.toString(), HR_CHARGING, String.class);
writer.write(this.txSmppCharging.toString(), TX_SMPP_CHARGING, String.class);
writer.write(this.txSipCharging.toString(), TX_SIP_CHARGING, String.class);
writer.write(this.txHttpCharging.toString(), TX_HTTP_CHARGING, String.class);
writer.write(this.globalTitleIndicator.toString(), GLOBAL_TITLE_INDICATOR, String.class);
writer.write(this.translationType, TRANSLATION_TYPE, Integer.class);
writer.write(this.correlationIdLiveTime, CORRELATION_ID_LIVE_TIME, Integer.class);
writer.write(this.sriResponseLiveTime, SRI_RESPONSE_LIVE_TIME, Integer.class);
writer.write(this.httpDefaultSourceTon, HTTP_DEFAULT_SOURCE_TON, Integer.class);
writer.write(this.httpDefaultSourceNpi, HTTP_DEFAULT_SOURCE_NPI, Integer.class);
writer.write(this.httpDefaultDestTon, HTTP_DEFAULT_DEST_TON, Integer.class);
writer.write(this.httpDefaultDestNpi, HTTP_DEFAULT_DEST_NPI, Integer.class);
writer.write(this.httpDefaultNetworkId, HTTP_DEFAULT_NETWORK_ID, Integer.class);
writer.write(this.httpDefaultMessagingMode, HTTP_DEFAULT_MESSAGING_MODE, Integer.class);
writer.write(this.httpDefaultRDDeliveryReceipt, HTTP_DEFAULT_RD_DELIVERY_RECEIPT, Integer.class);
writer.write(this.httpDefaultRDIntermediateNotification, HTTP_DEFAULT_RD_INTERMEDIATE_NOTIFICATION, Integer.class);
writer.write(this.httpDefaultDataCoding, HTTP_DEFAULT_DATA_CODING, Integer.class);
writer.write(this.cassandraUser, CASSANDRA_USER, String.class);
writer.write(this.cassandraPass, CASSANDRA_PASS, String.class);
writer.write(this.diameterDestRealm, DIAMETER_DEST_REALM, String.class);
writer.write(this.diameterDestHost, DIAMETER_DEST_HOST, String.class);
writer.write(this.diameterDestPort, DIAMETER_DEST_PORT, Integer.class);
writer.write(this.diameterUserName, DIAMETER_USER_NAME, String.class);
writer.close();
} catch (Exception e) {
logger.error("Error while persisting the SMSC state in file", e);
}
}
/**
* Load and create LinkSets and Link from persisted file
*
* @throws Exception
*/
public void load() throws FileNotFoundException {
XMLObjectReader reader = null;
try {
reader = XMLObjectReader.newInstance(new FileInputStream(persistFile.toString()));
reader.setBinding(binding);
this.serviceCenterGt = reader.read(SC_GT, String.class);
SmscPropertiesManagement_serviceCenterGtNetworkId al = reader.read(SC_GT_LIST, SmscPropertiesManagement_serviceCenterGtNetworkId.class);
networkIdVsServiceCenterGt.clear();
if (al != null) {
for (ServiceCenterGtNetworkIdElement elem : al.getData()) {
networkIdVsServiceCenterGt.put(elem.networkId, elem.serviceCenterGt);
}
}
this.serviceCenterSsn = reader.read(SC_SSN, Integer.class);
this.hlrSsn = reader.read(HLR_SSN, Integer.class);
this.mscSsn = reader.read(MSC_SSN, Integer.class);
this.maxMapVersion = reader.read(MAX_MAP_VERSION, Integer.class);
Integer dvp = reader.read(DEFAULT_VALIDITY_PERIOD_HOURS, Integer.class);
if (dvp != null)
this.defaultValidityPeriodHours = dvp;
Integer mvp = reader.read(MAX_VALIDITY_PERIOD_HOURS, Integer.class);
if (mvp != null)
this.maxValidityPeriodHours = mvp;
Integer dTon = reader.read(DEFAULT_TON, Integer.class);
if (dTon != null)
this.defaultTon = dTon;
Integer dNpi = reader.read(DEFAULT_NPI, Integer.class);
if (dNpi != null)
this.defaultNpi = dNpi;
Integer val = reader.read(SUBSCRIBER_BUSY_DUE_DELAY, Integer.class);
if (val != null)
this.subscriberBusyDueDelay = val;
val = reader.read(FIRST_DUE_DELAY, Integer.class);
if (val != null)
this.firstDueDelay = val;
val = reader.read(SECOND_DUE_DELAY, Integer.class);
if (val != null)
this.secondDueDelay = val;
val = reader.read(MAX_DUE_DELAY, Integer.class);
if (val != null)
this.maxDueDelay = val;
val = reader.read(DUE_DELAY_MULTIPLICATOR, Integer.class);
if (val != null)
this.dueDelayMultiplicator = val;
val = reader.read(MAX_MESSAGE_LENGTH_REDUCER, Integer.class);
if (val != null)
this.maxMessageLengthReducer = val;
// for backup compatibility
String vals = reader.read(HOSTS, String.class);
if (vals != null) {
String[] hostsArr = vals.split(":");
if (hostsArr.length == 2) {
this.dbHosts = hostsArr[0];
this.dbPort = Integer.parseInt(hostsArr[1]);
}
}
vals = reader.read(DB_HOSTS, String.class);
if (vals != null)
this.dbHosts = vals;
val = reader.read(DB_PORT, Integer.class);
if (val != null)
this.dbPort = val;
this.keyspaceName = reader.read(KEYSPACE_NAME, String.class);
this.clusterName = reader.read(CLUSTER_NAME, String.class);
Long vall = reader.read(FETCH_PERIOD, Long.class);
if (vall != null)
this.fetchPeriod = vall;
val = reader.read(FETCH_MAX_ROWS, Integer.class);
if (val != null)
this.fetchMaxRows = val;
Boolean valB = reader.read(DELIVERY_PAUSE, Boolean.class);
if (valB != null) {
this.deliveryPause = valB.booleanValue();
}
val = reader.read(REMOVING_LIVE_TABLES_DAYS, Integer.class);
if (val != null)
this.removingLiveTablesDays = val;
val = reader.read(REMOVING_ARCHIVE_TABLES_DAYS, Integer.class);
if (val != null)
this.removingArchiveTablesDays = val;
vals = reader.read(MO_UNKNOWN_TYPE_OF_NUMBER_PREFIX, String.class);
vals = reader.read(HR_HLR_NUMBER, String.class);
if (vals != null)
this.hrHlrNumber = vals;
SmscPropertiesManagement_HrHlrNumberNetworkId al2 = reader.read(HR_HLR_NUMBER_LIST, SmscPropertiesManagement_HrHlrNumberNetworkId.class);
networkIdVsHrHlrNumber.clear();
if (al2 != null) {
for (HrHlrNumberNetworkIdElement elem : al2.getData()) {
networkIdVsHrHlrNumber.put(elem.networkId, elem.hrHlrNumber);
}
}
valB = reader.read(HR_SRI_BYPASS, Boolean.class);
if (valB != null)
this.hrSriBypass = valB;
SmscPropertiesManagement_HrSriBypassNetworkId al3 = reader.read(HR_SRI_BYPASS_LIST,
SmscPropertiesManagement_HrSriBypassNetworkId.class);
networkIdVsHrSriBypass.clear();
if (al3 != null) {
for (HrSriBypassNetworkIdElement elem : al3.getData()) {
networkIdVsHrSriBypass.put(elem.networkId, elem.hrSriBypass);
}
}
val = reader.read(NATIONAL_LANGUAGE_SINGLE_SHIFT, Integer.class);
if (val != null)
this.nationalLanguageSingleShift = val;
val = reader.read(NATIONAL_LANGUAGE_LOCKING_SHIFT, Integer.class);
if (val != null)
this.nationalLanguageLockingShift = val;
this.esmeDefaultClusterName = reader.read(ESME_DEFAULT_CLUSTER_NAME, String.class);
val = reader.read(MAX_ACTIVITY_COUNT, Integer.class);
if (val != null)
this.maxActivityCount = val;
val = reader.read(DELIVERY_TIMEOUT, Integer.class);
if (val != null)
this.deliveryTimeout = val;
val = reader.read(VP_PROLONG, Integer.class);
if (val != null)
this.vpProlong = val;
// this line is for backward compatibility
valB = reader.read(SMS_HOME_ROUTING, Boolean.class);
// if (valB != null) {
// this.isSMSHomeRouting = valB.booleanValue();
// }
vals = reader.read(SMPP_ENCODING_FOR_GSM7, String.class);
if (vals != null)
this.smppEncodingForGsm7 = Enum.valueOf(SmppEncoding.class, vals);
vals = reader.read(SMPP_ENCODING_FOR_UCS2, String.class);
if (vals != null)
this.httpEncodingForUCS2 = Enum.valueOf(HttpEncoding.class, vals);
vals = reader.read(HTTP_ENCODING_FOR_GSM7, String.class);
if (vals != null)
this.httpEncodingForGsm7 = Enum.valueOf(HttpEncoding.class, vals);
vals = reader.read(HTTP_ENCODING_FOR_UCS2, String.class);
if (vals != null)
this.smppEncodingForUCS2 = Enum.valueOf(SmppEncoding.class, vals);
val = reader.read(REVISE_SECONDS_ON_SMSC_START, Integer.class);
if (val != null)
this.reviseSecondsOnSmscStart = val;
val = reader.read(PROCESSING_SMS_SET_TIMEOUT, Integer.class);
if (val != null)
this.processingSmsSetTimeout = val;
valB = reader.read(GENERATE_RECEIPT_CDR, Boolean.class);
if (valB != null) {
this.generateReceiptCdr = valB.booleanValue();
}
valB = reader.read(GENERATE_TEMP_FAILURE_CDR, Boolean.class);
if (valB != null) {
this.generateTempFailureCdr = valB.booleanValue();
}
valB = reader.read(CALCULATE_MSG_PARTS_LEN_CDR, Boolean.class);
if (valB != null) {
this.calculateMsgPartsLenCdr = valB.booleanValue();
}
valB = reader.read(DELAY_PARAMETERS_IN_CDR, Boolean.class);
if (valB != null) {
this.delayParametersInCdr = valB.booleanValue();
}
valB = reader.read(RECEIPTS_DISABLING, Boolean.class);
if (valB != null) {
this.receiptsDisabling = valB.booleanValue();
}
valB = reader.read(INCOME_RECEIPTS_PROCESSING, Boolean.class);
if (valB != null) {
this.incomeReceiptsProcessing = valB.booleanValue();
}
valB = reader.read(ENABLE_INTERMEDIATE_RECEIPTS, Boolean.class);
if (valB != null) {
this.enableIntermediateReceipts = valB.booleanValue();
}
valB = reader.read(ORIG_NETWORK_ID_FOR_RECEIPTS, Boolean.class);
if (valB != null) {
this.origNetworkIdForReceipts = valB.booleanValue();
}
val = reader.read(MO_DEFAULT_MESSAGING_MODE, Integer.class);
if (val != null)
this.moDefaultMessagingMode = val;
val = reader.read(HR_DEFAULT_MESSAGING_MODE, Integer.class);
if (val != null)
this.hrDefaultMessagingMode = val;
val = reader.read(SIP_DEFAULT_MESSAGING_MODE, Integer.class);
if (val != null)
this.sipDefaultMessagingMode = val;
val = reader.read(GENERATE_CDR, Integer.class);
if (val != null)
this.generateCdr = new GenerateType(val);
val = reader.read(GENERATE_ARCHIVE_TABLE, Integer.class);
if (val != null)
this.generateArchiveTable = new GenerateType(val);
vals = reader.read(STORE_AND_FORWORD_MODE, String.class);
if (vals != null)
this.storeAndForwordMode = Enum.valueOf(StoreAndForwordMode.class, vals);
vall = reader.read(MIN_MESSAGE_ID, Long.class);
if (vall != null)
this.minMessageId = vall;
vall = reader.read(MAX_MESSAGE_ID, Long.class);
if (vall != null)
this.maxMessageId = vall;
vals = reader.read(MO_CHARGING, String.class);
if (vals != null) {
if (vals.toLowerCase().equals("false")) {
this.moCharging = MoChargingType.accept;
} else if (vals.toLowerCase().equals("true")) {
this.moCharging = MoChargingType.diameter;
} else {
this.moCharging = Enum.valueOf(MoChargingType.class, vals);
}
}
vals = reader.read(HR_CHARGING, String.class);
if (vals != null) {
if (vals.toLowerCase().equals("false")) {
this.hrCharging = MoChargingType.accept;
} else if (vals.toLowerCase().equals("true")) {
this.hrCharging = MoChargingType.diameter;
} else {
this.hrCharging = Enum.valueOf(MoChargingType.class, vals);
}
}
vals = reader.read(TX_SMPP_CHARGING, String.class);
if (vals != null)
this.txSmppCharging = Enum.valueOf(ChargingType.class, vals);
vals = reader.read(TX_SIP_CHARGING, String.class);
if (vals != null)
this.txSipCharging = Enum.valueOf(ChargingType.class, vals);
vals = reader.read(TX_HTTP_CHARGING, String.class);
if (vals != null) {
if (vals.toLowerCase().equals("false")) {
this.txHttpCharging = MoChargingType.accept;
} else if (vals.toLowerCase().equals("true")) {
this.txHttpCharging = MoChargingType.diameter;
} else {
this.txHttpCharging = Enum.valueOf(MoChargingType.class, vals);
}
}
vals = reader.read(GLOBAL_TITLE_INDICATOR, String.class);
if (vals != null)
this.globalTitleIndicator = Enum.valueOf(GlobalTitleIndicator.class, vals);
val = reader.read(TRANSLATION_TYPE, Integer.class);
if (val != null)
this.translationType = val;
val = reader.read(CORRELATION_ID_LIVE_TIME, Integer.class);
if (val != null)
this.correlationIdLiveTime = val;
val = reader.read(SRI_RESPONSE_LIVE_TIME, Integer.class);
if (val != null)
this.sriResponseLiveTime = val;
val = reader.read(HTTP_DEFAULT_SOURCE_TON, Integer.class);
if (val != null)
this.httpDefaultSourceTon = val;
val = reader.read(HTTP_DEFAULT_SOURCE_NPI, Integer.class);
if (val != null)
this.httpDefaultSourceNpi = val;
val = reader.read(HTTP_DEFAULT_DEST_TON, Integer.class);
if (val != null)
this.httpDefaultDestTon = val;
val = reader.read(HTTP_DEFAULT_DEST_NPI, Integer.class);
if (val != null)
this.httpDefaultDestNpi = val;
val = reader.read(HTTP_DEFAULT_NETWORK_ID, Integer.class);
if (val != null)
this.httpDefaultNetworkId = val;
val = reader.read(HTTP_DEFAULT_MESSAGING_MODE, Integer.class);
if (val != null)
this.httpDefaultMessagingMode = val;
val = reader.read(HTTP_DEFAULT_RD_DELIVERY_RECEIPT, Integer.class);
if (val != null)
this.httpDefaultRDDeliveryReceipt = val;
val = reader.read(HTTP_DEFAULT_RD_INTERMEDIATE_NOTIFICATION, Integer.class);
if (val != null)
this.httpDefaultRDIntermediateNotification = val;
val = reader.read(HTTP_DEFAULT_DATA_CODING, Integer.class);
if (val != null)
this.httpDefaultDataCoding = val;
vals = reader.read(CASSANDRA_USER, String.class);
if (vals != null)
this.cassandraUser = vals;
vals = reader.read(CASSANDRA_PASS, String.class);
if (vals != null)
this.cassandraPass = vals;
this.diameterDestRealm = reader.read(DIAMETER_DEST_REALM, String.class);
this.diameterDestHost = reader.read(DIAMETER_DEST_HOST, String.class);
val = reader.read(DIAMETER_DEST_PORT, Integer.class);
if (val != null)
this.diameterDestPort = val;
this.diameterUserName = reader.read(DIAMETER_USER_NAME, String.class);
reader.close();
} catch (XMLStreamException ex) {
logger.error("Error while loading the SMSC state from file", ex);
}
}
public static class SmscPropertiesManagement_serviceCenterGtNetworkId extends
ArrayListSerializingBase<ServiceCenterGtNetworkIdElement> {
public SmscPropertiesManagement_serviceCenterGtNetworkId() {
super(SC_GT_LIST, ServiceCenterGtNetworkIdElement.class);
}
public SmscPropertiesManagement_serviceCenterGtNetworkId(ArrayList<ServiceCenterGtNetworkIdElement> data) {
super(SC_GT_LIST, ServiceCenterGtNetworkIdElement.class, data);
}
}
public static class SmscPropertiesManagement_HrHlrNumberNetworkId extends
ArrayListSerializingBase<HrHlrNumberNetworkIdElement> {
public SmscPropertiesManagement_HrHlrNumberNetworkId() {
super(HR_HLR_NUMBER_LIST, HrHlrNumberNetworkIdElement.class);
}
public SmscPropertiesManagement_HrHlrNumberNetworkId(ArrayList<HrHlrNumberNetworkIdElement> data) {
super(HR_HLR_NUMBER_LIST, HrHlrNumberNetworkIdElement.class, data);
}
}
public static class SmscPropertiesManagement_HrSriBypassNetworkId extends
ArrayListSerializingBase<HrSriBypassNetworkIdElement> {
public SmscPropertiesManagement_HrSriBypassNetworkId() {
super(HR_SRI_BYPASS_LIST, HrSriBypassNetworkIdElement.class);
}
public SmscPropertiesManagement_HrSriBypassNetworkId(ArrayList<HrSriBypassNetworkIdElement> data) {
super(HR_SRI_BYPASS_LIST, HrSriBypassNetworkIdElement.class, data);
}
}
}