killbill-memoizeit

Details

diff --git a/api/src/main/java/com/ning/billing/ErrorCode.java b/api/src/main/java/com/ning/billing/ErrorCode.java
index 5b8e22f..17e40bf 100644
--- a/api/src/main/java/com/ning/billing/ErrorCode.java
+++ b/api/src/main/java/com/ning/billing/ErrorCode.java
@@ -179,7 +179,6 @@ public enum ErrorCode {
     TAG_CANNOT_BE_REMOVED(3951, "The tag %s cannot be removed because %s"),
     TAG_ALREADY_EXISTS(3952, "The tag %s already exists"),
 
-
     /*
     *
     * Range 4000: INVOICE
@@ -201,6 +200,8 @@ public enum ErrorCode {
     EXTERNAL_CHARGE_AMOUNT_INVALID(4015, "External charge amount %s should be strictly positive"),
     INVOICE_WOULD_BE_NEGATIVE(4016, "Cannot execute operation, the invoice balance would become negative"),
     INVOICE_ALREADY_EXISTS(4017, "The invoice already exists %s"),
+    INVOICE_NUMBER_NOT_FOUND(4018, "No invoice could be found for number %s."),
+    INVOICE_INVALID_NUMBER(4019, "Invalid invoice number %s."),
 
     /*
      *
@@ -292,7 +293,6 @@ public enum ErrorCode {
     TENANT_UPDATE_FAILED(10005, "Tenant update failed."),
     TENANT_NO_SUCH_KEY(10006, "Tenant %s does not have a key %s"),
 
-
     CUSTOM_FIELD_ALREADY_EXISTS(11000, "The custom field %s already exists"),
 
     __UNKNOWN_ERROR_CODE(-1, "Unknown ErrorCode");
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 730fbbc..142ac74 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
@@ -38,7 +38,6 @@ import com.ning.billing.invoice.api.InvoiceItemType;
 import com.ning.billing.invoice.api.InvoicePayment.InvoicePaymentType;
 import com.ning.billing.invoice.api.user.DefaultInvoiceAdjustmentEvent;
 import com.ning.billing.invoice.model.InvoiceItemList;
-import com.ning.billing.invoice.model.RecurringInvoiceItem;
 import com.ning.billing.invoice.notification.NextBillingDatePoster;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
@@ -156,7 +155,24 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
 
     @Override
     public InvoiceModelDao getByNumber(final Integer number, final InternalTenantContext context) throws InvoiceApiException {
-        return getByRecordId(number.longValue(), context);
+
+        if (number == null) {
+            throw new InvoiceApiException(ErrorCode.INVOICE_INVALID_NUMBER, "(null)");
+        }
+
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<InvoiceModelDao>() {
+            @Override
+            public InvoiceModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final InvoiceSqlDao invoiceDao = entitySqlDaoWrapperFactory.become(InvoiceSqlDao.class);
+
+                final InvoiceModelDao invoice = invoiceDao.getByRecordId(number.longValue(), context);
+                if (invoice == null) {
+                    throw new InvoiceApiException(ErrorCode.INVOICE_NUMBER_NOT_FOUND, number.longValue());
+                }
+                populateChildren(invoice, entitySqlDaoWrapperFactory, context);
+                return invoice;
+            }
+        });
     }
 
     @Override
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
index c4dd373..2d1bb07 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
@@ -164,4 +164,14 @@ public class InvoiceDaoTestBase extends InvoicingTestBase {
         Assert.assertEquals(InvoiceModelDaoHelper.getBalance(invoice).doubleValue(), balance);
         Assert.assertEquals(InvoiceModelDaoHelper.getCBAAmount(invoice).doubleValue(), cbaAmount);
     }
+
+    protected void checkInvoicesEqual(final InvoiceModelDao retrievedInvoice, final Invoice invoice) {
+        Assert.assertEquals(retrievedInvoice.getId(), invoice.getId());
+        Assert.assertEquals(retrievedInvoice.getAccountId(), invoice.getAccountId());
+        Assert.assertEquals(retrievedInvoice.getCurrency(), invoice.getCurrency());
+        Assert.assertEquals(retrievedInvoice.getInvoiceDate(), invoice.getInvoiceDate());
+        Assert.assertEquals(retrievedInvoice.getTargetDate(), invoice.getTargetDate());
+        Assert.assertEquals(retrievedInvoice.getInvoiceItems().size(), invoice.getInvoiceItems().size());
+        Assert.assertEquals(retrievedInvoice.getInvoicePayments().size(), invoice.getPayments().size());
+    }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
index 2b668f8..43269b5 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
@@ -75,6 +75,17 @@ import static org.testng.Assert.assertTrue;
 public class TestInvoiceDao extends InvoiceDaoTestBase {
 
     @Test(groups = "slow")
+    public void testSimple() throws Exception {
+        final UUID accountId = UUID.randomUUID();
+        final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), clock.getUTCToday(), Currency.USD);
+        createInvoice(invoice, true, internalCallContext);
+
+        final InvoiceModelDao retrievedInvoice = invoiceDao.getById(invoice.getId(), internalCallContext);
+        checkInvoicesEqual(retrievedInvoice, invoice);
+        checkInvoicesEqual(invoiceDao.getByNumber(retrievedInvoice.getInvoiceNumber(), internalCallContext), invoice);
+    }
+
+    @Test(groups = "slow")
     public void testCreationAndRetrievalByAccount() {
         final UUID accountId = UUID.randomUUID();
         final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), clock.getUTCToday(), Currency.USD);
diff --git a/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java b/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java
index a7494e6..6b87f60 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java
@@ -28,20 +28,20 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class DefaultOverdueChangeEvent extends DefaultBusInternalEvent implements OverdueChangeInternalEvent {
+
     private final UUID overdueObjectId;
     private final Blockable.Type overdueObjectType;
     private final String previousOverdueStateName;
     private final String nextOverdueStateName;
 
-
     @JsonCreator
     public DefaultOverdueChangeEvent(@JsonProperty("overdueObjectId") final UUID overdueObjectId,
-                                    @JsonProperty("overdueObjectType") final Blockable.Type overdueObjectType,
-                                    @JsonProperty("previousOverdueStateName") final String previousOverdueStateName,
-                                    @JsonProperty("nextOverdueStateName") final String nextOverdueStateName,
-                                    @JsonProperty("userToken") final UUID userToken,
-                                    @JsonProperty("accountRecordId") final Long accountRecordId,
-                                    @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+                                     @JsonProperty("overdueObjectType") final Blockable.Type overdueObjectType,
+                                     @JsonProperty("previousOverdueStateName") final String previousOverdueStateName,
+                                     @JsonProperty("nextOverdueStateName") final String nextOverdueStateName,
+                                     @JsonProperty("userToken") final UUID userToken,
+                                     @JsonProperty("accountRecordId") final Long accountRecordId,
+                                     @JsonProperty("tenantRecordId") final Long tenantRecordId) {
         super(userToken, accountRecordId, tenantRecordId);
         this.overdueObjectId = overdueObjectId;
         this.overdueObjectType = overdueObjectType;