diff --git a/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/entities/SmsMessageFilter.java b/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/entities/SmsMessageFilter.java index c644c7e983..83a74811e8 100644 --- a/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/entities/SmsMessageFilter.java +++ b/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/entities/SmsMessageFilter.java @@ -19,12 +19,12 @@ */ package org.restcomm.connect.dao.entities; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; import org.restcomm.connect.commons.annotations.concurrency.Immutable; -import java.text.DateFormat; import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; import java.util.List; /** @@ -35,7 +35,7 @@ @Immutable public class SmsMessageFilter { - public static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd"); private String accountSid; private List accountSidSet; // if not-null we need the cdrs that belong to several accounts @@ -49,7 +49,8 @@ public class SmsMessageFilter { private String instanceid; private String smppMessageId; - public SmsMessageFilter() { + private SmsMessageFilter() { + } @Deprecated @@ -149,6 +150,8 @@ public static class Builder { private Builder() { this.filter = new SmsMessageFilter(); + this.filter.limit = 50; + this.filter.offset = 0; } public Builder accountSid(String accountSid) { @@ -175,16 +178,16 @@ public Builder sender(String sender) { return this; } - public Builder startTime(Date startTime) { + public Builder startTime(DateTime startTime) { if (startTime != null) { - this.filter.startTime = DATE_FORMAT.format(startTime); + this.filter.startTime = DATE_TIME_FORMATTER.print(startTime); } return this; } - public Builder endTime(Date endTime) { + public Builder endTime(DateTime endTime) { if (endTime != null) { - this.filter.endTime = DATE_FORMAT.format(endTime); + this.filter.endTime = DATE_TIME_FORMATTER.print(endTime); } return this; } diff --git a/restcomm/restcomm.dao/src/test/java/org/restcomm/connect/dao/mybatis/SmsMessagesDaoTest.java b/restcomm/restcomm.dao/src/test/java/org/restcomm/connect/dao/mybatis/SmsMessagesDaoTest.java index dcd64036c4..cab16ca9b2 100644 --- a/restcomm/restcomm.dao/src/test/java/org/restcomm/connect/dao/mybatis/SmsMessagesDaoTest.java +++ b/restcomm/restcomm.dao/src/test/java/org/restcomm/connect/dao/mybatis/SmsMessagesDaoTest.java @@ -26,7 +26,9 @@ import java.math.BigDecimal; import java.net.URI; import java.text.ParseException; +import java.util.Calendar; import java.util.Currency; +import java.util.List; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; @@ -38,6 +40,7 @@ import org.restcomm.connect.commons.dao.Sid; import org.restcomm.connect.dao.SmsMessagesDao; import org.restcomm.connect.dao.entities.SmsMessage; +import org.restcomm.connect.dao.entities.SmsMessageFilter; /** * @author quintana.thomas@gmail.com (Thomas Quintana) @@ -120,24 +123,28 @@ private SmsMessage createSms() { return createSms(Sid.generate(Sid.Type.ACCOUNT), SmsMessage.Direction.OUTBOUND_API, 0, DateTime.now()); } - private SmsMessage createSms(Sid account, SmsMessage.Direction direction, int i, DateTime date) { + 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 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 @@ -234,4 +241,41 @@ public void testUpdateSmsMessageDateSentAndStatusAndGetBySmppMsgId(){ assertEquals(smsMessage.getDateSent(), resultantSmsMessage.getDateSent()); assertEquals(smsMessage.getStatus(), resultantSmsMessage.getStatus()); } + + @Test + public void testGetSmsMessagesWithSmppMessageFromLastThreeDays() throws InterruptedException, ParseException { + // 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 yesterdar = DateTime.now().minusDays(1); + final SmsMessage smsMessage5 = createSms(accountSid, SmsMessage.Direction.OUTBOUND_API, 4, threeDaysAgo, 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); + + final SmsMessageFilter filter = SmsMessageFilter.builer().smppMessageId(smppMessageId).endTime(threeDaysAgo).build(); + + // when + final List messages = smsMessagesDao.getSmsMessages(filter); + + try { + assertEquals(3, messages.size()); + assertEquals(smsMessage6.getSid(), messages.get(0).getSid()); + assertEquals(smsMessage5.getSid(), messages.get(1).getSid()); + assertEquals(smsMessage3.getSid(), messages.get(2).getSid()); + } finally { + smsMessagesDao.removeSmsMessages(accountSid); + } + } } diff --git a/restcomm/restcomm.sms/src/main/java/org/restcomm/connect/sms/smpp/SmppMessageHandler.java b/restcomm/restcomm.sms/src/main/java/org/restcomm/connect/sms/smpp/SmppMessageHandler.java index 7b00862b5a..51fe8d62a2 100644 --- a/restcomm/restcomm.sms/src/main/java/org/restcomm/connect/sms/smpp/SmppMessageHandler.java +++ b/restcomm/restcomm.sms/src/main/java/org/restcomm/connect/sms/smpp/SmppMessageHandler.java @@ -84,7 +84,6 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; -import java.util.Calendar; import java.util.Collection; import java.util.List; @@ -152,9 +151,7 @@ public void onReceive(Object message) throws Exception { } // Find all messages correlated with SMPP Message ID in last three days - final Calendar calendar = Calendar.getInstance(); - calendar.add(Calendar.DAY_OF_MONTH, -3); - final SmsMessageFilter filter = SmsMessageFilter.builer().smppMessageId(deliveryReceipt.getId()).endTime(calendar.getTime()).build(); + final SmsMessageFilter filter = SmsMessageFilter.builer().smppMessageId(deliveryReceipt.getId()).endTime(DateTime.now().minusDays(3)).build(); final List smsMessages = this.storage.getSmsMessagesDao().getSmsMessages(filter); // Update status of messages and remove correlation with SMPP Message ID diff --git a/restcomm/restcomm.sms/src/test/java/org/restcomm/connect/sms/smpp/SmppMessageHandlerTest.java b/restcomm/restcomm.sms/src/test/java/org/restcomm/connect/sms/smpp/SmppMessageHandlerTest.java index ab5424206e..cfc329059f 100644 --- a/restcomm/restcomm.sms/src/test/java/org/restcomm/connect/sms/smpp/SmppMessageHandlerTest.java +++ b/restcomm/restcomm.sms/src/test/java/org/restcomm/connect/sms/smpp/SmppMessageHandlerTest.java @@ -181,8 +181,8 @@ public Actor create() throws Exception { final SmsMessageFilter filter = filterCaptor.getValue(); assertEquals(dlrPayload.getId(), filter.getSmppMessageId()); - final Date endDate = SmsMessageFilter.DATE_FORMAT.parse(filter.getEndTime()); - assertEquals(3, TimeUnit.DAYS.convert(new Date().getTime() - endDate.getTime(), TimeUnit.MILLISECONDS)); + final DateTime endDate = SmsMessageFilter.DATE_TIME_FORMATTER.parseDateTime(filter.getEndTime()); + assertEquals(3, TimeUnit.DAYS.convert(new Date().getTime() - endDate.toDate().getTime(), TimeUnit.MILLISECONDS)); final ArgumentCaptor smsCaptor = ArgumentCaptor.forClass(SmsMessage.class); verify(smsMessagesDao, timeout(50).times(3)).updateSmsMessage(smsCaptor.capture()); @@ -237,8 +237,8 @@ public Actor create() throws Exception { final SmsMessageFilter filter = filterCaptor.getValue(); assertEquals(dlrPayload.getId(), filter.getSmppMessageId()); - final Date endDate = SmsMessageFilter.DATE_FORMAT.parse(filter.getEndTime()); - assertEquals(3, TimeUnit.DAYS.convert(new Date().getTime() - endDate.getTime(), TimeUnit.MILLISECONDS)); + final DateTime endDate = SmsMessageFilter.DATE_TIME_FORMATTER.parseDateTime(filter.getEndTime()); + assertEquals(3, TimeUnit.DAYS.convert(new Date().getTime() - endDate.toDate().getTime(), TimeUnit.MILLISECONDS)); verify(smsMessagesDao, never()).updateSmsMessage(any(SmsMessage.class)); }