Skip to content

Commit

Permalink
Merge pull request #2965 from RestComm/bs-232
Browse files Browse the repository at this point in the history
Cleanup SMPP Message ID correlation for messages waiting for DLR.

Closes BS-232
  • Loading branch information
hrosa committed Jun 12, 2018
2 parents 8d57bbd + 1e35cdc commit a970aa5
Show file tree
Hide file tree
Showing 9 changed files with 252 additions and 149 deletions.
Expand Up @@ -117,9 +117,17 @@
AND date_created >= #{startTime}
</if>
<if test="endTime != null">
AND date_created &lt;= DATE_ADD(#{endTime},INTERVAL 1 DAY)
AND date_created &lt;= DATE_ADD(#{endTime},INTERVAL 1 DAY)
</if>
<if test="smppMessageId != null">
AND "smpp_message_id"=#{smppMessageId}
</if>
order by date_created
LIMIT #{limit} OFFSET #{offset}
</select>

<select id="findBySmppMessageId" parameterType="map" resultType="hashmap">
SELECT * FROM "restcomm_sms_messages" AS "restcomm_sms_messages"
WHERE "smpp_message_id" = #{smppMessageId}
</select>
</mapper>
Expand Up @@ -117,10 +117,18 @@
AND "date_created" &gt;= #{startTime}
</if>
<if test="endTime != null">
AND "date_created" &lt;= DATE_ADD(#{endTime},INTERVAL 1 DAY)
AND "date_created" &lt;= DATE_ADD(#{endTime},INTERVAL 1 DAY)
</if>
<if test="smppMessageId != null">
AND "smpp_message_id"=#{smppMessageId}
</if>
order by "date_created"
LIMIT #{limit} OFFSET #{offset}
</select>

<select id="findBySmppMessageId" parameterType="map" resultType="hashmap">
SELECT * FROM "restcomm_sms_messages" AS "restcomm_sms_messages"
WHERE "smpp_message_id" = #{smppMessageId}
</select>

</mapper>
Expand Up @@ -19,13 +19,13 @@
*/
package org.restcomm.connect.dao;

import java.text.ParseException;
import java.util.List;

import org.restcomm.connect.commons.dao.Sid;
import org.restcomm.connect.dao.entities.SmsMessage;
import org.restcomm.connect.dao.entities.SmsMessageFilter;

import java.text.ParseException;
import java.util.List;

/**
* @author quintana.thomas@gmail.com (Thomas Quintana)
*/
Expand Down Expand Up @@ -53,4 +53,6 @@ public interface SmsMessagesDao {
// Support for filtering of message list result, Issue 1395
Integer getTotalSmsMessage(SmsMessageFilter filter);
List<SmsMessage> getSmsMessages(SmsMessageFilter filter);

List<SmsMessage> findBySmppMessageId(String smppMessageId);
}
Expand Up @@ -45,12 +45,12 @@ public class SmsMessageFilter {
private final String instanceid;

public SmsMessageFilter(String accountSid, List<String> accountSidSet, String recipient, String sender, String startTime, String endTime,
String body, Integer limit, Integer offset) throws ParseException {
String body, Integer limit, Integer offset) throws ParseException {
this(accountSid, accountSidSet, recipient,sender,startTime,endTime, body, limit,offset,null);
}

public SmsMessageFilter(String accountSid, List<String> accountSidSet, String recipient, String sender, String startTime, String endTime,
String body, Integer limit, Integer offset, String instanceId) throws ParseException {
String body, Integer limit, Integer offset, String instanceId) throws ParseException {
this.accountSid = accountSid;
this.accountSidSet = accountSidSet;

Expand Down Expand Up @@ -124,4 +124,4 @@ public int getOffset() {
}

public String getInstanceid() { return instanceid; }
}
}
Expand Up @@ -38,17 +38,7 @@
import java.util.List;
import java.util.Map;

import static org.restcomm.connect.dao.DaoUtils.readBigDecimal;
import static org.restcomm.connect.dao.DaoUtils.readCurrency;
import static org.restcomm.connect.dao.DaoUtils.readDateTime;
import static org.restcomm.connect.dao.DaoUtils.readSid;
import static org.restcomm.connect.dao.DaoUtils.readString;
import static org.restcomm.connect.dao.DaoUtils.readUri;
import static org.restcomm.connect.dao.DaoUtils.writeBigDecimal;
import static org.restcomm.connect.dao.DaoUtils.writeCurrency;
import static org.restcomm.connect.dao.DaoUtils.writeDateTime;
import static org.restcomm.connect.dao.DaoUtils.writeSid;
import static org.restcomm.connect.dao.DaoUtils.writeUri;
import static org.restcomm.connect.dao.DaoUtils.*;

/**
* @author quintana.thomas@gmail.com (Thomas Quintana)
Expand Down Expand Up @@ -205,6 +195,25 @@ public int getSmsMessagesPerAccountLastPerMinute(String accountSid) throws Parse
}
}

@Override
public List<SmsMessage> findBySmppMessageId(String smppMessageId) {
final Map<String, Object> parameters = new HashMap<>(2);
parameters.put("smppMessageId", smppMessageId);
final SqlSession session = this.sessions.openSession();

try {
final List<Map<String, Object>> results = session.selectList(namespace + "findBySmppMessageId", parameters);
final List<SmsMessage> messages = new ArrayList<>(results.size());

for (Map<String, Object> result : results) {
messages.add(toSmsMessage(result));
}
return messages;
} finally {
session.close();
}
}

private Map<String, Object> toMap(final SmsMessage smsMessage) {
final Map<String, Object> map = new HashMap<String, Object>();
map.put("sid", writeSid(smsMessage.getSid()));
Expand Down
Expand Up @@ -6,8 +6,8 @@
<mapper namespace="org.mobicents.servlet.sip.restcomm.dao.SmsMessagesDao">
<insert id="addSmsMessage" parameterType="map">
INSERT INTO "restcomm_sms_messages" ("sid", "date_created", "date_updated", "date_sent", "account_sid", "sender", "recipient", "body", "status", "direction", "price",
"api_version", "uri") VALUES (#{sid}, #{date_created}, #{date_updated}, #{date_sent}, #{account_sid}, #{sender}, #{recipient}, #{body},
#{status}, #{direction}, #{price}, #{api_version}, #{uri});
"api_version", "uri", "smpp_message_id") VALUES (#{sid}, #{date_created}, #{date_updated}, #{date_sent}, #{account_sid}, #{sender}, #{recipient}, #{body},
#{status}, #{direction}, #{price}, #{api_version}, #{uri}, #{smpp_message_id});
</insert>

<select id="getSmsMessage" parameterType="string" resultType="hashmap">
Expand Down Expand Up @@ -117,10 +117,19 @@
AND "date_created" &gt;= #{startTime}
</if>
<if test="endTime != null">
AND "date_created" &lt;= DATE_ADD(#{endTime},INTERVAL 1 DAY)
AND "date_created" &lt;= DATE_ADD(#{endTime},INTERVAL 1 DAY)
</if>
<if test="smppMessageId != null">
AND "smpp_message_id"=#{smppMessageId}
</if>

order by "date_created"
LIMIT #{limit} OFFSET #{offset}
</select>

<select id="findBySmppMessageId" parameterType="map" resultType="hashmap">
SELECT * FROM "restcomm_sms_messages" AS "restcomm_sms_messages"
WHERE "smpp_message_id" = #{smppMessageId}
</select>

</mapper>
Expand Up @@ -19,15 +19,6 @@
*/
package org.restcomm.connect.dao.mybatis;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.io.InputStream;
import java.math.BigDecimal;
import java.net.URI;
import java.text.ParseException;
import java.util.Currency;

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
Expand All @@ -39,6 +30,16 @@
import org.restcomm.connect.dao.SmsMessagesDao;
import org.restcomm.connect.dao.entities.SmsMessage;

import java.io.InputStream;
import java.math.BigDecimal;
import java.net.URI;
import java.text.ParseException;
import java.util.Currency;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

/**
* @author quintana.thomas@gmail.com (Thomas Quintana)
*/
Expand Down Expand Up @@ -115,29 +116,33 @@ public void createReadUpdateDelete() {
// Validate that the CDR was removed.
assertTrue(messages.getSmsMessage(sid) == null);
}

private SmsMessage createSms() {
return createSms(Sid.generate(Sid.Type.ACCOUNT), SmsMessage.Direction.OUTBOUND_API, 0, DateTime.now());
return createSms(Sid.generate(Sid.Type.ACCOUNT), SmsMessage.Direction.OUTBOUND_API, 0, DateTime.now());
}

private SmsMessage createSms(Sid account, SmsMessage.Direction direction, int index, DateTime date) {
return createSms(account, direction, index, date, null);
}

private SmsMessage createSms(Sid account, SmsMessage.Direction direction, int i, DateTime date) {
private SmsMessage createSms(Sid account, SmsMessage.Direction direction, int index, DateTime date, String smppMessageId) {
final Sid sid = Sid.generate(Sid.Type.SMS_MESSAGE);
final URI url = URI.create("2012-04-24/Accounts/Acoount/SMS/Messages/unique-id.json");
final SmsMessage.Builder builder = SmsMessage.builder();
builder.setSid(sid);
builder.setAccountSid(account);
builder.setApiVersion("2012-04-24");
builder.setRecipient("+12223334444");
builder.setSender("+17778889999");
builder.setBody("Hello World - "+i);
builder.setStatus(SmsMessage.Status.SENDING);
builder.setDirection(direction);
builder.setPrice(new BigDecimal("0.00"));
builder.setPriceUnit(Currency.getInstance("USD"));
builder.setUri(url);
builder.setDateCreated(date);
SmsMessage message = builder.build();
return message;
return SmsMessage.builder()
.setSid(sid)
.setAccountSid(account)
.setApiVersion("2012-04-24")
.setRecipient("+12223334444")
.setSender("+17778889999")
.setBody("Hello World - " + index)
.setStatus(SmsMessage.Status.SENDING)
.setDirection(direction)
.setPrice(new BigDecimal("0.00"))
.setPriceUnit(Currency.getInstance("USD"))
.setUri(url)
.setDateCreated(date)
.setSmppMessageId(smppMessageId)
.build();
}

@Test
Expand All @@ -149,33 +154,33 @@ public void testGetSmsMessagesLastMinute() throws InterruptedException, ParseExc
SmsMessage message = createSms(account, SmsMessage.Direction.OUTBOUND_API, i, oneMinuteAgo);
// Create a new sms message in the data store.
messages.addSmsMessage(message);
logger.info("Created message: "+message);
logger.info("Created message: " + message);
}
for (int i = 0; i < 2; i++) {
SmsMessage message = createSms(account, SmsMessage.Direction.OUTBOUND_CALL, i, oneMinuteAgo);
// Create a new sms message in the data store.
messages.addSmsMessage(message);
logger.info("Created message: "+message);
logger.info("Created message: " + message);
}
for (int i = 0; i < 2; i++) {
SmsMessage message = createSms(account, SmsMessage.Direction.OUTBOUND_REPLY, i, oneMinuteAgo);
// Create a new sms message in the data store.
messages.addSmsMessage(message);
logger.info("Created message: "+message);
logger.info("Created message: " + message);
}
int lastMessages = messages.getSmsMessagesPerAccountLastPerMinute(account.toString());
logger.info("SMS Messages last minutes: "+lastMessages);
logger.info("SMS Messages last minutes: " + lastMessages);
assertEquals(6, lastMessages);
Thread.sleep(5000);
DateTime oneMinuteLater = DateTime.now();
for (int i = 0; i < 3; i++) {
SmsMessage message = createSms(account, SmsMessage.Direction.OUTBOUND_CALL, i, oneMinuteLater);
// Create a new sms message in the data store.
messages.addSmsMessage(message);
logger.info("Created message: "+message);
logger.info("Created message: " + message);
}
lastMessages = messages.getSmsMessagesPerAccountLastPerMinute(account.toString());
logger.info("SMS Messages last minutes: "+lastMessages);
logger.info("SMS Messages last minutes: " + lastMessages);
assertEquals(3, lastMessages);
messages.removeSmsMessages(account);
}
Expand Down Expand Up @@ -212,20 +217,20 @@ public void testReadDeleteByAccount() {
}

@Test
public void testUpdateSmsMessageDateSentAndStatusAndGetBySmppMsgId(){
final DateTime dateSent = DateTime.now();
final SmsMessage.Status status = SmsMessage.Status.SENT;
final String smppMessageId = "0000058049";

// add a new msg
SmsMessage smsMessage = createSms();
final SmsMessagesDao messages = manager.getSmsMessagesDao();
public void testUpdateSmsMessageDateSentAndStatusAndGetBySmppMsgId() {
final DateTime dateSent = DateTime.now();
final SmsMessage.Status status = SmsMessage.Status.SENT;
final String smppMessageId = "0000058049";

// add a new msg
SmsMessage smsMessage = createSms();
final SmsMessagesDao messages = manager.getSmsMessagesDao();
messages.addSmsMessage(smsMessage);

//set status and dateSent
smsMessage = smsMessage.setStatus(status).setDateSent(dateSent).setSmppMessageId(smppMessageId);
messages.updateSmsMessage(smsMessage);
smsMessage = smsMessage.setStatus(status).setDateSent(dateSent).setSmppMessageId(smppMessageId);
messages.updateSmsMessage(smsMessage);

//get SmsMessage By SmppMessageId
SmsMessage resultantSmsMessage = messages.getSmsMessageBySmppMessageId(smppMessageId);

Expand All @@ -234,4 +239,48 @@ public void testUpdateSmsMessageDateSentAndStatusAndGetBySmppMsgId(){
assertEquals(smsMessage.getDateSent(), resultantSmsMessage.getDateSent());
assertEquals(smsMessage.getStatus(), resultantSmsMessage.getStatus());
}

@Test
public void testFindBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc() {
// given
final SmsMessagesDao smsMessagesDao = manager.getSmsMessagesDao();
final Sid accountSid = Sid.generate(Sid.Type.ACCOUNT);
final String smppMessageId = "12345";

final DateTime fourDaysAgo = DateTime.now().minusDays(4);
final SmsMessage smsMessage1 = createSms(accountSid, SmsMessage.Direction.OUTBOUND_API, 0, fourDaysAgo, smppMessageId);
final SmsMessage smsMessage2 = createSms(accountSid, SmsMessage.Direction.OUTBOUND_API, 1, fourDaysAgo, smppMessageId);

final DateTime threeDaysAgo = DateTime.now().minusDays(3);
final SmsMessage smsMessage3 = createSms(accountSid, SmsMessage.Direction.OUTBOUND_API, 2, threeDaysAgo, smppMessageId);
final SmsMessage smsMessage4 = createSms(accountSid, SmsMessage.Direction.OUTBOUND_API, 3, threeDaysAgo, null);

final DateTime yesterday = DateTime.now().minusDays(1);
final SmsMessage smsMessage5 = createSms(accountSid, SmsMessage.Direction.OUTBOUND_API, 4, yesterday, smppMessageId);

final DateTime today = DateTime.now();
final SmsMessage smsMessage6 = createSms(accountSid, SmsMessage.Direction.OUTBOUND_API, 5, today, smppMessageId);
final SmsMessage smsMessage7 = createSms(accountSid, SmsMessage.Direction.OUTBOUND_API, 6, today, null);

// when
smsMessagesDao.addSmsMessage(smsMessage1);
smsMessagesDao.addSmsMessage(smsMessage2);
smsMessagesDao.addSmsMessage(smsMessage3);
smsMessagesDao.addSmsMessage(smsMessage4);
smsMessagesDao.addSmsMessage(smsMessage5);
smsMessagesDao.addSmsMessage(smsMessage6);
smsMessagesDao.addSmsMessage(smsMessage7);

final List<SmsMessage> messages = smsMessagesDao.findBySmppMessageId(smppMessageId);

// then
try {
assertEquals(5, messages.size());
for (SmsMessage message: messages) {
assertEquals(smppMessageId, message.getSmppMessageId());
}
} finally {
smsMessagesDao.removeSmsMessages(accountSid);
}
}
}

0 comments on commit a970aa5

Please sign in to comment.