/*
* 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.library;
import org.restcomm.smpp.parameter.TlvSet;
import java.io.Serializable;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Date;
import java.util.UUID;
import javolution.xml.XMLObjectReader;
import javolution.xml.XMLObjectWriter;
import javolution.xml.stream.XMLStreamException;
/**
*
* @author amit bhayani
* @author sergey vetyutnev
*
*/
public class Sms implements Serializable {
private static final long serialVersionUID = 6893251312588274520L;
public static final byte ESME_DELIVERY_ACK = 0x04;
private SmsSet smsSet;
private UUID dbId;
private long dueSlot;
private boolean stored;
private boolean storingAfterFailure;
private boolean invokedByAlert;
// targetId of a delivery start (for case when we do rerouting)
private String targetIdOnDeliveryStart;
private int sourceAddrTon;
private int sourceAddrNpi;
private String sourceAddr;
private int origNetworkId;
private String originatorSccpAddress;
private String mtServiceCenterAddress;
private long messageId;
private String dlvMessageId;
private int moMessageRef;
private String receiptOrigMessageId;
private String origSystemId;
private String origEsmeName;
private Date submitDate;
private Date deliveryDate;
private String serviceType;
private int esmClass;
private int protocolId; // not present in data_sm
private int priority; // not present in data_sm
private int registeredDelivery;
private int replaceIfPresent; // not present in data_sm
private int dataCoding;
private int nationalLanguageSingleShift;
private int nationalLanguageLockingShift;
private int defaultMsgId; // not present in data_sm, not used in deliver_sm
private byte[] shortMessage;
private String shortMessageText;
private byte[] shortMessageBin;
private Date scheduleDeliveryTime; // not present in data_sm
private Date validityPeriod; // not present in data_sm
private String origMoServiceCentreAddressDA;
private int deliveryCount;
private int reroutingCount;
private TlvSet tlvSet = new TlvSet();
private boolean statusReportRequest;
private int deliveryAttempt;
private String userData;
private SmsExtraData extraData = new SmsExtraData();
private String extraData_2;
private String extraData_3;
private String extraData_4;
private MessageDeliveryResultResponseInterface messageDeliveryResultResponse;
public Sms() {
}
/**
* ID field for storing into a database
*/
public UUID getDbId() {
return dbId;
}
public void setDbId(UUID dbId) {
this.dbId = dbId;
}
/**
* In which dueSlot belongs to this record
*/
public long getDueSlot() {
return dueSlot;
}
public void setDueSlot(long dueSlot) {
this.dueSlot = dueSlot;
}
/**
* If this message is in the database stored
*/
public boolean getStored() {
return stored;
}
public void setStored(boolean stored) {
this.stored = stored;
}
/**
* If this message will be stored in the database if the delivery has failed
*/
public boolean getStoringAfterFailure() {
return storingAfterFailure;
}
public void setStoringAfterFailure(boolean storingAfterFailure) {
this.storingAfterFailure = storingAfterFailure;
}
/**
* If this message was invoked for delivering after Alert message
*/
public boolean getInvokedByAlert() {
return invokedByAlert;
}
public void setInvokedByAlert(boolean invokedByAlert) {
this.invokedByAlert = invokedByAlert;
}
/**
* targetId of a delivery start (for case when we do rerouting)
*/
public String getTargetIdOnDeliveryStart() {
return targetIdOnDeliveryStart;
}
public void setTargetIdOnDeliveryStart(String targetIdOnDeliveryStart) {
this.targetIdOnDeliveryStart = targetIdOnDeliveryStart;
}
/**
* DeliveringActivity link
*/
public SmsSet getSmsSet() {
return smsSet;
}
public void setSmsSet(SmsSet smsSet) {
this.smsSet = smsSet;
}
/**
* smpp style type of number
*/
public int getSourceAddrTon() {
return sourceAddrTon;
}
public void setSourceAddrTon(int sourceAddrTon) {
this.sourceAddrTon = sourceAddrTon;
}
/**
* smpp style type of numbering plan indicator
*/
public int getSourceAddrNpi() {
return sourceAddrNpi;
}
public void setSourceAddrNpi(int sourceAddrNpi) {
this.sourceAddrNpi = sourceAddrNpi;
}
/**
* origination address
*/
public String getSourceAddr() {
return sourceAddr;
}
public void setSourceAddr(String sourceAddr) {
this.sourceAddr = sourceAddr;
}
/**
* original networkId
*/
public int getOrigNetworkId() {
return origNetworkId;
}
public void setOrigNetworkId(int origNetworkId) {
this.origNetworkId = origNetworkId;
}
/**
* Originator Sccp Address
*/
public String getOriginatorSccpAddress() {
return originatorSccpAddress;
}
public void setOriginatorSccpAddress(String originatorSccpAddress) {
this.originatorSccpAddress = originatorSccpAddress;
}
/**
* Unique message ID assigned by SMSC (since SMSC started)
*/
public long getMessageId() {
return messageId;
}
public String getMessageIdText() {
return MessageUtil.createMessageIdString(messageId);
// return String.format("%010d", messageId);
// return String.format("%d", messageId);
}
public void setMessageId(long messageId) {
this.messageId = messageId;
}
/**
* MO SMS-SUBMIT TP-Message-Reference field value
*/
public int getMoMessageRef() {
return moMessageRef;
}
public void setMoMessageRef(int moMessageRef) {
this.moMessageRef = moMessageRef;
}
/**
* SMPP name of origination esme systemId (SMPP originated) / HttpUser name (HTTP originated)
*/
public String getOrigSystemId() {
return origSystemId;
}
public void setOrigSystemId(String systemId) {
this.origSystemId = systemId;
}
/**
* SMSC internal name of origination esme (�� for MO messages)
*/
public String getOrigEsmeName() {
return origEsmeName;
}
public void setOrigEsmeName(String origEsmeName) {
this.origEsmeName = origEsmeName;
}
/**
* time when a message was received by SMSC
*/
public Date getSubmitDate() {
return submitDate;
}
public void setSubmitDate(Date submitDate) {
this.submitDate = submitDate;
}
/**
* time when a message was sent from SMSC (null (?) if message failed to deliver)
*/
public Date getDeliverDate() {
return deliveryDate;
}
public void setDeliveryDate(Date deliveryDate) {
this.deliveryDate = deliveryDate;
}
/**
* service_type smpp param for esme originated messages
*/
public String getServiceType() {
return serviceType;
}
public void setServiceType(String serviceType) {
this.serviceType = serviceType;
}
/**
* Indicates Message Mode and Message Type
*/
public int getEsmClass() {
return esmClass;
}
public void setEsmClass(int esmClass) {
this.esmClass = esmClass;
}
/**
* Protocol Identifier SMPP parameter (TP-Protocol-Identifier files for GSM)
*/
public int getProtocolId() {
return protocolId;
}
public void setProtocolId(int protocolId) {
this.protocolId = protocolId;
}
/**
* priority_flag smpp parameter
*/
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
/**
* registered_delivery smpp parameter
*/
public int getRegisteredDelivery() {
return registeredDelivery;
}
public void setRegisteredDelivery(int registeredDelivery) {
this.registeredDelivery = registeredDelivery;
}
/**
* replace_if_present_flag smpp parameter
*/
public int getReplaceIfPresent() {
return replaceIfPresent;
}
public void setReplaceIfPresent(int replaceIfPresent) {
this.replaceIfPresent = replaceIfPresent;
}
/**
* data_coding scheme
*/
public int getDataCoding() {
return dataCoding;
}
public void setDataCoding(int dataCoding) {
this.dataCoding = dataCoding;
}
public int getDataCodingForDatabase() {
return dataCoding | (nationalLanguageLockingShift << 8) | (nationalLanguageSingleShift << 16);
}
public void setDataCodingForDatabase(int dataCoding) {
this.dataCoding = (dataCoding & 0xFF);
this.nationalLanguageLockingShift = (dataCoding & 0xFF00) >> 8;
this.nationalLanguageSingleShift = (dataCoding & 0xFF0000) >> 16;
}
public int getNationalLanguageSingleShift() {
return nationalLanguageSingleShift;
}
public void setNationalLanguageSingleShift(int nationalLanguageSingleShift) {
this.nationalLanguageSingleShift = nationalLanguageSingleShift;
}
public int getNationalLanguageLockingShift() {
return nationalLanguageLockingShift;
}
public void setNationalLanguageLockingShift(int nationalLanguageLockingShift) {
this.nationalLanguageLockingShift = nationalLanguageLockingShift;
}
/**
* sm_default_msg_id smpp parameter
*/
public int getDefaultMsgId() {
return defaultMsgId;
}
public void setDefaultMsgId(int defaultMsgId) {
this.defaultMsgId = defaultMsgId;
}
@Deprecated
public byte[] getShortMessage() {
return shortMessage;
}
@Deprecated
public void setShortMessage(byte[] shortMessage) {
this.shortMessage = shortMessage;
}
/**
* Message: text part
*/
public String getShortMessageText() {
return shortMessageText;
}
public void setShortMessageText(String shortMessageText) {
this.shortMessageText = shortMessageText;
}
/**
* Message: binary part (UDH for text message or all message for binary messages)
*/
public byte[] getShortMessageBin() {
return shortMessageBin;
}
public void setShortMessageBin(byte[] shortMessageBin) {
this.shortMessageBin = shortMessageBin;
}
/**
* schedule_delivery_time smpp parameter time when SMSC should start a delivery (may be null � immediate message delivery)
*/
public Date getScheduleDeliveryTime() {
return scheduleDeliveryTime;
}
public void setScheduleDeliveryTime(Date scheduleDeliveryTime) {
this.scheduleDeliveryTime = scheduleDeliveryTime;
}
/**
* The validity period of this message (if ESME have not defined or for MO messages this field is filled by default SMSC settings)
*/
public Date getValidityPeriod() {
return validityPeriod;
}
public void setValidityPeriod(Date validityPeriod) {
this.validityPeriod = validityPeriod;
}
/**
* original ServiceCentreAddressDA that has come in incoming MO SS7 mesage
*/
public String getOrigMoServiceCentreAddressDA() {
return origMoServiceCentreAddressDA;
}
public void setOrigMoServiceCentreAddressDA(String origMoServiceCentreAddressDA) {
this.origMoServiceCentreAddressDA = origMoServiceCentreAddressDA;
}
/**
* delivery tries count
*/
public int getDeliveryCount() {
return deliveryCount;
}
public void setDeliveryCount(int deliveryCount) {
this.deliveryCount = deliveryCount;
}
public int getReroutingCount() {
return reroutingCount;
}
public void setReroutingCount(int reroutingCount) {
this.reroutingCount = reroutingCount;
}
// Optional parameters
/**
* List of tlv parameters
*/
public TlvSet getTlvSet() {
return tlvSet;
}
public void setTlvSet(TlvSet tlvSet) {
this.tlvSet = tlvSet;
}
public MessageDeliveryResultResponseInterface getMessageDeliveryResultResponse() {
return messageDeliveryResultResponse;
}
public void setMessageDeliveryResultResponse(MessageDeliveryResultResponseInterface messageDeliveryResultResponse) {
this.messageDeliveryResultResponse = messageDeliveryResultResponse;
}
public boolean isMcDeliveryReceipt() {
if ((this.esmClass & ESME_DELIVERY_ACK) != 0)
return true;
else
return false;
}
public boolean isStatusReportRequest() {
return statusReportRequest;
}
public void setStatusReportRequest(boolean statusReportRequest) {
this.statusReportRequest = statusReportRequest;
}
public int getDeliveryAttempt() {
return deliveryAttempt;
}
public void setDeliveryAttempt(int deliveryAttempt) {
this.deliveryAttempt = deliveryAttempt;
}
public String getUserData() {
return userData;
}
public void setUserData(String userData) {
this.userData = userData;
}
public String getExtraData_2() {
return extraData_2;
}
public void setExtraData_2(String extraData_2) {
this.extraData_2 = extraData_2;
}
public String getExtraData_3() {
return extraData_3;
}
public void setExtraData_3(String extraData_3) {
this.extraData_3 = extraData_3;
}
public String getExtraData_4() {
return extraData_4;
}
public void setExtraData_4(String extraData_4) {
this.extraData_4 = extraData_4;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("SmsEvent [SmsSet=");
sb.append(smsSet);
sb.append(", dbId=");
sb.append(dbId);
sb.append(", dueSlot=");
sb.append(dueSlot);
sb.append(", stored=");
sb.append(stored);
sb.append(", storingAfterFailure=");
sb.append(storingAfterFailure);
sb.append(", invokedByAlert=");
sb.append(invokedByAlert);
sb.append(", sourceAddrTon=");
sb.append(sourceAddrTon);
sb.append(", sourceAddrNpi=");
sb.append(sourceAddrNpi);
sb.append(", sourceAddr=");
sb.append(sourceAddr);
sb.append(", origNetworkId=");
sb.append(origNetworkId);
sb.append(", messageId=");
sb.append(messageId);
if (dlvMessageId != null) {
sb.append(", dlvMessageId=");
sb.append(dlvMessageId);
}
if (receiptOrigMessageId != null) {
sb.append(", receiptOrigMessageId=");
sb.append(receiptOrigMessageId);
}
if (this.extraData.getReceiptLocalMessageId() != null) {
sb.append(", receiptLocalMessageId=");
sb.append(this.extraData.getReceiptLocalMessageId());
}
if (this.extraData.getMprocNotes() != null) {
sb.append(", mprocNotes=");
sb.append(this.extraData.getMprocNotes());
}
sb.append(", moMessageRef=");
sb.append(moMessageRef);
sb.append(", origSystemId=");
sb.append(origSystemId);
sb.append(", origEsmeName=");
sb.append(origEsmeName);
sb.append(", submitDate=");
sb.append(submitDate);
sb.append(", deliverDate=");
sb.append(deliveryDate);
sb.append(", serviceType=");
sb.append(serviceType);
sb.append(", esmClass=");
sb.append(esmClass);
sb.append(", protocolId=");
sb.append(protocolId);
sb.append(", priority=");
sb.append(priority);
sb.append(", registeredDelivery=");
sb.append(registeredDelivery);
sb.append(", replaceIfPresent=");
sb.append(replaceIfPresent);
sb.append(", dataCoding=");
sb.append(dataCoding);
sb.append(", nationalLanguageSingleShift=");
sb.append(nationalLanguageSingleShift);
sb.append(", nationalLanguageLockingShift=");
sb.append(nationalLanguageLockingShift);
sb.append(", defaultMsgId=");
sb.append(defaultMsgId);
sb.append(", scheduleDeliveryTime=");
sb.append(scheduleDeliveryTime);
sb.append(", validityPeriod=");
sb.append(validityPeriod);
sb.append(", origMoServiceCentreAddressDA=");
sb.append(origMoServiceCentreAddressDA);
sb.append(", deliveryCount=");
sb.append(deliveryCount);
sb.append(", reroutingCount=");
sb.append(reroutingCount);
sb.append(", originationType=");
sb.append(this.extraData.getOriginationType());
sb.append(", originatorSccpAddress=");
sb.append(originatorSccpAddress);
sb.append(", shortMessageText=");
sb.append(shortMessageText);
if (shortMessageBin != null) {
sb.append(", shortMessageBin=\"");
sb.append(printArray(shortMessageBin));
sb.append("\"");
}
if (this.tlvSet != null) {
sb.append(", tlvSet=");
sb.append(this.tlvSet.toString());
}
sb.append("]");
return sb.toString();
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
if (dbId != null)
return dbId.hashCode();
else
return 0;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Sms other = (Sms) obj;
if (this.dbId == null || other.dbId == null)
return false;
if (this.dbId.equals(other.dbId))
return true;
else
return false;
}
private String printArray(byte[] bb) {
StringBuilder sb = new StringBuilder();
int i1 = 0;
for (byte b : bb) {
if (i1 == 0)
i1 = 1;
else
sb.append(", ");
sb.append((b & 0xFF));
}
return sb.toString();
}
public String getReceiptOrigMessageId() {
return receiptOrigMessageId;
}
public void setReceiptOrigMessageId(String receiptOrigMessageId) {
this.receiptOrigMessageId = receiptOrigMessageId;
}
public String getMtServiceCenterAddress() {
return mtServiceCenterAddress;
}
public void setMtServiceCenterAddress( String mtServiceCenterAddress ) {
this.mtServiceCenterAddress = mtServiceCenterAddress;
}
public String getDlvMessageId() {
return dlvMessageId;
}
public void setDlvMessageId(String dlvMessageId) {
this.dlvMessageId = dlvMessageId;
}
// extraData
public String getMprocNotes() {
return this.extraData.getMprocNotes();
}
public void setMprocNotes(String mprocNotes) {
this.extraData.setMprocNotes(mprocNotes);
}
/**
* Type of message originated source
*/
public OriginationType getOriginationType() {
return this.extraData.getOriginationType();
}
/**
* @param originationType the originationType to set
*/
public void setOriginationType(OriginationType originationType) {
this.extraData.setOriginationType(originationType);
}
public Long getReceiptLocalMessageId() {
return this.extraData.getReceiptLocalMessageId();
}
public void setReceiptLocalMessageId(Long receiptLocalMessageId) {
this.extraData.setReceiptLocalMessageId(receiptLocalMessageId);
}
public String getExtraData() {
if (this.extraData.isEmpty()) {
return null;
} else {
// serializing of extraData
try {
StringWriter sw = new StringWriter();
XMLObjectWriter writer = XMLObjectWriter.newInstance(sw);
writer.setIndentation("\t");
writer.write(this.extraData, "extraData", SmsExtraData.class);
writer.close();
return sw.toString();
} catch (XMLStreamException e) {
return null;
}
}
}
public void setExtraData(String extraData) {
if (extraData == null || extraData.length() == 0) {
this.extraData.clear();
} else {
// deserializing of extraData
try {
StringReader sr = new StringReader(extraData);
XMLObjectReader reader = XMLObjectReader.newInstance(sr);
SmsExtraData copy = reader.read("extraData", SmsExtraData.class);
if (copy != null) {
this.extraData = copy;
}
} catch (XMLStreamException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}