killbill-aplcache

Details

diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java b/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
index 403d176..fa1a0d1 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
@@ -38,6 +38,8 @@ public interface InvoiceUserApi {
 
     public Invoice getInvoice(UUID invoiceId);
 
+    public Invoice getInvoiceByNumber(Integer number);
+
     public void notifyOfPayment(InvoicePayment invoicePayment, CallContext context);
 
     public Collection<Invoice> getUnpaidInvoicesByAccountId(UUID accountId, DateTime upToDate);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
index 0a6a8f1..19b5523 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -81,6 +81,11 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
     }
 
     @Override
+    public Invoice getInvoiceByNumber(final Integer number) {
+        return dao.getByNumber(number);
+    }
+
+    @Override
     public List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final DateTime upToDate) {
         return dao.getUnpaidInvoicesByAccountId(accountId, upToDate);
     }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index 3ed5c04..4652130 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
@@ -144,6 +144,12 @@ public class DefaultInvoiceDao implements InvoiceDao {
     }
 
     @Override
+    public Invoice getByNumber(final Integer number) {
+        // The invoice number is just the record id
+        return invoiceSqlDao.getByRecordId(number.longValue());
+    }
+
+    @Override
     public void create(final Invoice invoice, final int billCycleDay, final CallContext context) {
         invoiceSqlDao.inTransaction(new Transaction<Void, InvoiceSqlDao>() {
             @Override
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
index 1812ed1..bef6721 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
@@ -35,6 +35,8 @@ public interface InvoiceDao {
 
     Invoice getById(final UUID id);
 
+    Invoice getByNumber(final Integer number);
+
     List<Invoice> get();
 
     List<Invoice> getInvoicesByAccount(final UUID accountId);
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
index 6ed45be..ac5ca6e 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
+++ b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
@@ -51,6 +51,12 @@ getById() ::= <<
   WHERE id = :id;
 >>
 
+getByRecordId() ::= <<
+  SELECT record_id as invoice_number, <invoiceFields()>
+  FROM invoices
+  WHERE record_id = :recordId;
+>>
+
 create() ::= <<
   INSERT INTO invoices(<invoiceFields()>)
   VALUES (:id, :accountId, :invoiceDate, :targetDate, :currency, :migrated, :userName, :createdDate);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
index a81485f..5d7f2c6 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
@@ -67,6 +67,19 @@ public class MockInvoiceDao implements InvoiceDao {
     }
 
     @Override
+    public Invoice getByNumber(final Integer number) {
+        synchronized (monitor) {
+            for (final Invoice invoice : invoices.values()) {
+                if (invoice.getInvoiceNumber().equals(number)) {
+                    return invoice;
+                }
+            }
+        }
+
+        return null;
+    }
+
+    @Override
     public List<Invoice> get() {
         synchronized (monitor) {
             return new ArrayList<Invoice>(invoices.values());
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java
index df2dd59..8c8a947 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java
@@ -26,6 +26,7 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.invoice.InvoiceTestSuite;
+import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.notification.NextBillingDatePoster;
 import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.callcontext.CallContext;
@@ -40,12 +41,16 @@ import com.ning.billing.util.tag.dao.TagDao;
 import com.ning.billing.util.tag.dao.TagDefinitionDao;
 
 public class TestDefaultInvoiceDao extends InvoiceTestSuite {
+    private InvoiceSqlDao invoiceSqlDao;
     private TagUserApi tagUserApi;
     private DefaultInvoiceDao dao;
 
     @BeforeMethod(groups = "fast")
     public void setUp() throws Exception {
         final IDBI idbi = Mockito.mock(IDBI.class);
+        invoiceSqlDao = Mockito.mock(InvoiceSqlDao.class);
+        Mockito.when(idbi.onDemand(InvoiceSqlDao.class)).thenReturn(invoiceSqlDao);
+
         final NextBillingDatePoster poster = Mockito.mock(NextBillingDatePoster.class);
         final TagDefinitionDao tagDefinitionDao = new MockTagDefinitionDao();
         final TagDao tagDao = new MockTagDao();
@@ -54,6 +59,16 @@ public class TestDefaultInvoiceDao extends InvoiceTestSuite {
     }
 
     @Test(groups = "fast")
+    public void testFindByNumber() throws Exception {
+        final Integer number = Integer.MAX_VALUE;
+        final Invoice invoice = Mockito.mock(Invoice.class);
+        Mockito.when(invoiceSqlDao.getByRecordId(number.longValue())).thenReturn(invoice);
+
+        Assert.assertEquals(dao.getByNumber(number), invoice);
+        Assert.assertNull(dao.getByNumber(Integer.MIN_VALUE));
+    }
+
+    @Test(groups = "fast")
     public void testSetWrittenOff() throws Exception {
         final UUID invoiceId = UUID.randomUUID();
 
diff --git a/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDao.java b/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDao.java
index a6a5f92..3db47da 100644
--- a/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDao.java
+++ b/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDao.java
@@ -36,6 +36,9 @@ public interface EntitySqlDao<T extends Entity> {
     public T getById(@Bind("id") final String id);
 
     @SqlQuery
+    public T getByRecordId(@Bind("recordId") final Long recordId);
+
+    @SqlQuery
     public Long getRecordId(@Bind("id") final String id);
 
     @SqlQuery