killbill-memoizeit

Details

diff --git a/api/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java b/api/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
index 5f64dc7..673dec5 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
@@ -41,7 +41,7 @@ public class DefaultBillingEvent implements BillingEvent {
     final private String description;
     final private BillingModeType billingModeType;
     final private BillingPeriod billingPeriod;
-    
+
     public DefaultBillingEvent(SubscriptionTransition transition, Subscription subscription, int billCycleDay) {
         this.billCycleDay = billCycleDay;
         this.subscription = subscription;
@@ -53,7 +53,7 @@ public class DefaultBillingEvent implements BillingEvent {
         description = transition.getTransitionType().toString();
         billingModeType=BillingModeType.IN_ADVANCE;
         billingPeriod = transition.getNextPhase().getBillingPeriod();
-        
+
     }
 
     // Intended for test only
@@ -135,12 +135,12 @@ public class DefaultBillingEvent implements BillingEvent {
     }
     @Override
     public BigDecimal getFixedPrice(Currency currency) throws CatalogApiException {
-        return fixedPrice.getPrice(currency);
+        return  fixedPrice != null ? fixedPrice.getPrice(currency) : new BigDecimal(0);
     }
 
     @Override
     public BigDecimal getRecurringPrice(Currency currency) throws CatalogApiException {
-        return recurringPrice.getPrice(currency);
+        return  recurringPrice != null ? recurringPrice.getPrice(currency) : new BigDecimal(0);
     }
-    
+
 }
\ No newline at end of file
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java
index b79d2a9..63ea85e 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/inv_ent/TestBasic.java
@@ -40,7 +40,10 @@ import org.testng.annotations.Test;
 
 
 import com.google.inject.Inject;
+import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountData;
+import com.ning.billing.account.api.AccountService;
+import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.beatrix.integration.inv_ent.TestBusHandler.NextEvent;
 import com.ning.billing.beatrix.lifecycle.Lifecycle;
 import com.ning.billing.catalog.api.BillingPeriod;
@@ -81,11 +84,16 @@ public class TestBasic {
     @Inject
     private InvoiceService invoiceService;
 
+    @Inject
+    private AccountService accountService;
+
 
     private EntitlementUserApi entitlementUserApi;
 
     private InvoiceUserApi invoiceUserApi;
 
+    private AccountUserApi accountUserApi;
+
     private TestBusHandler busHandler;
 
 
@@ -106,6 +114,7 @@ public class TestBasic {
          */
         entitlementUserApi = entitlementService.getUserApi();
         invoiceUserApi = invoiceService.getUserApi();
+        accountUserApi = accountService.getAccountUserApi();
     }
 
     @AfterSuite(alwaysRun = true)
@@ -163,8 +172,10 @@ public class TestBasic {
     @Test(groups = "fast", enabled = false)
     public void testSimple() throws Exception {
 
-        UUID accountId = UUID.randomUUID();
-        SubscriptionBundle bundle = entitlementUserApi.createBundleForAccount(accountId, "whatever");
+        Account account = accountUserApi.createAccount(getAccountData(), null, null);
+        assertNotNull(account);
+
+        SubscriptionBundle bundle = entitlementUserApi.createBundleForAccount(account.getId(), "whatever");
 
         String productName = "Shotgun";
         BillingPeriod term = BillingPeriod.MONTHLY;
@@ -178,7 +189,7 @@ public class TestBasic {
         SubscriptionData subscription = (SubscriptionData) entitlementUserApi.createSubscription(bundle.getId(),
                 new PlanPhaseSpecifier(productName, ProductCategory.BASE, term, planSetName, null), null);
         assertNotNull(subscription);
-        assertTrue(busHandler.isCompleted(5000));
+        assertTrue(busHandler.isCompleted(5000 * 1000));
 
         //
         // VERIFY CTD HAS BEEN SET
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java b/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
index b7bc657..df43d71 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
@@ -17,19 +17,31 @@
 package com.ning.billing.invoice.api;
 
 import com.google.inject.Inject;
+import com.ning.billing.invoice.InvoiceListener;
+import com.ning.billing.invoice.notification.NextBillingDateNotifier;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
+import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
+import com.ning.billing.util.eventbus.Bus;
 
 public class DefaultInvoiceService implements InvoiceService {
-    private static final String INVOICE_SERVICE_NAME = "invoice-service";
+
+    public static final String INVOICE_SERVICE_NAME = "invoice-service";
     private final InvoiceUserApi userApi;
     private final InvoicePaymentApi paymentApi;
+    private final NextBillingDateNotifier dateNotifier;
+    private final InvoiceListener invoiceListener;
+    private final Bus eventBus;
 
     @Inject
-    public DefaultInvoiceService(InvoiceUserApi userApi, InvoicePaymentApi paymentApi) {
+    public DefaultInvoiceService(InvoiceListener invoiceListener, Bus eventBus, InvoiceUserApi userApi, InvoicePaymentApi paymentApi, NextBillingDateNotifier dateNotifier) {
+        this.invoiceListener = invoiceListener;
+        this.eventBus = eventBus;
         this.userApi = userApi;
         this.paymentApi = paymentApi;
+        this.dateNotifier = dateNotifier;
     }
 
+
     @Override
     public String getName() {
         return INVOICE_SERVICE_NAME;
@@ -47,5 +59,34 @@ public class DefaultInvoiceService implements InvoiceService {
 
     @LifecycleHandlerType(LifecycleHandlerType.LifecycleLevel.INIT_SERVICE)
     public void initialize() {
+        dateNotifier.initialize();
+    }
+
+    @LifecycleHandlerType(LifecycleLevel.START_SERVICE)
+    public void start() {
+        dateNotifier.start();
+    }
+
+    @LifecycleHandlerType(LifecycleHandlerType.LifecycleLevel.REGISTER_EVENTS)
+    public void registerForNotifications() {
+        try {
+            eventBus.register(invoiceListener);
+        } catch (Bus.EventBusException e) {
+            throw new RuntimeException("Unable to register to the EventBus!", e);
+        }
+    }
+
+    @LifecycleHandlerType(LifecycleHandlerType.LifecycleLevel.UNREGISTER_EVENTS)
+    public void unregisterForNotifications() {
+        try {
+            eventBus.unregister(invoiceListener);
+        } catch (Bus.EventBusException e) {
+            throw new RuntimeException("Unable to unregister to the EventBus!", e);
+        }
+    }
+
+    @LifecycleHandlerType(LifecycleLevel.STOP_SERVICE)
+    public void stop() {
+        dateNotifier.stop();
     }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java b/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java
index 35c6ac6..174a21c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java
@@ -16,7 +16,11 @@
 
 package com.ning.billing.invoice.glue;
 
+import org.skife.config.ConfigurationObjectFactory;
+
 import com.google.inject.AbstractModule;
+import com.ning.billing.config.InvoiceConfig;
+import com.ning.billing.invoice.InvoiceListener;
 import com.ning.billing.invoice.api.DefaultInvoiceService;
 import com.ning.billing.invoice.api.InvoicePaymentApi;
 import com.ning.billing.invoice.api.InvoiceService;
@@ -25,6 +29,10 @@ import com.ning.billing.invoice.api.user.DefaultInvoiceUserApi;
 import com.ning.billing.invoice.api.InvoiceUserApi;
 import com.ning.billing.invoice.dao.DefaultInvoiceDao;
 import com.ning.billing.invoice.dao.InvoiceDao;
+import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
+import com.ning.billing.invoice.model.InvoiceGenerator;
+import com.ning.billing.invoice.notification.DefaultNextBillingDateNotifier;
+import com.ning.billing.invoice.notification.NextBillingDateNotifier;
 
 public class InvoiceModule extends AbstractModule {
 
@@ -40,9 +48,18 @@ public class InvoiceModule extends AbstractModule {
         bind(InvoicePaymentApi.class).to(DefaultInvoicePaymentApi.class).asEagerSingleton();
     }
 
+    protected void installConfig() {
+        final InvoiceConfig config = new ConfigurationObjectFactory(System.getProperties()).build(InvoiceConfig.class);
+        bind(InvoiceConfig.class).toInstance(config);
+    }
+
     @Override
     protected void configure() {
         bind(InvoiceService.class).to(DefaultInvoiceService.class).asEagerSingleton();
+        bind(NextBillingDateNotifier.class).to(DefaultNextBillingDateNotifier.class).asEagerSingleton();
+        bind(InvoiceListener.class).asEagerSingleton();
+        bind(InvoiceGenerator.class).to(DefaultInvoiceGenerator.class).asEagerSingleton();
+        installConfig();
         installInvoiceDao();
         installInvoiceUserApi();
         installInvoicePaymentApi();
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
index 1a1cd13..f305441 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
@@ -16,6 +16,7 @@
 
 package com.ning.billing.invoice;
 
+import java.util.List;
 import java.util.SortedSet;
 import java.util.UUID;
 import org.joda.time.DateTime;
@@ -34,6 +35,7 @@ import com.ning.billing.entitlement.api.user.SubscriptionTransition;
 import com.ning.billing.invoice.api.BillingEventSet;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
+import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceUserApi;
 import com.ning.billing.invoice.dao.InvoiceDao;
 import com.ning.billing.invoice.model.InvoiceGenerator;
@@ -96,7 +98,7 @@ public class InvoiceListener {
         DateTime targetDate = new DateTime();
         Currency targetCurrency = account.getCurrency();
 
-        InvoiceItemList invoiceItemList = (InvoiceItemList) invoiceUserApi.getInvoiceItemsByAccount(accountId);
+        InvoiceItemList invoiceItemList = new InvoiceItemList(invoiceUserApi.getInvoiceItemsByAccount(accountId));
         Invoice invoice = generator.generateInvoice(accountId, billingEvents, invoiceItemList, targetDate, targetCurrency);
 
         if (invoice != null) {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemList.java b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemList.java
index 2e462df..6ee713c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemList.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemList.java
@@ -24,6 +24,14 @@ import com.ning.billing.invoice.api.InvoiceItem;
 public class InvoiceItemList extends ArrayList<InvoiceItem> {
     private static final int NUMBER_OF_DECIMALS = InvoicingConfiguration.getNumberOfDecimals();
 
+
+    public InvoiceItemList() {
+    }
+
+    public InvoiceItemList(List<InvoiceItem> items) {
+        addAll(items);
+    }
+
     public BigDecimal getTotalAmount() {
         // TODO: Jeff -- naive implementation, assumes all invoice items share the same currency
         BigDecimal total = new BigDecimal("0");
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
index ebf0b5b..794426e 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
@@ -25,6 +25,7 @@ import org.slf4j.LoggerFactory;
 
 import com.google.inject.Inject;
 import com.ning.billing.config.InvoiceConfig;
+import com.ning.billing.invoice.api.DefaultInvoiceService;
 import com.ning.billing.lifecycle.KillbillService;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
 import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
@@ -37,29 +38,30 @@ import com.ning.billing.util.notificationq.NotificationQueueService;
 import com.ning.billing.util.notificationq.NotificationQueueService.NotficationQueueAlreadyExists;
 import com.ning.billing.util.notificationq.NotificationQueueService.NotificationQueueHandler;
 
-public class DefaultNextBillingDateNotifier implements KillbillService, NextBillingDateNotifier {
+public class DefaultNextBillingDateNotifier implements  NextBillingDateNotifier {
+
     private final static Logger log = LoggerFactory.getLogger(DefaultNextBillingDateNotifier.class);
 
-    private static final String NEXT_BILLING_DATE_NOTIFIER_SERVICE_NAME = "next-billing-date-notifier";
     private static final String NEXT_BILLING_DATE_NOTIFIER_QUEUE = "next-billing-date-queue";
-    
+
     private final Bus eventBus;
     private final NotificationQueueService notificationQueueService;
+	private final InvoiceConfig config;
+
     private NotificationQueue nextBillingQueue;
-	private InvoiceConfig config;
 
-	@Inject
+    @Inject
 	public DefaultNextBillingDateNotifier(NotificationQueueService notificationQueueService, Bus eventBus, InvoiceConfig config){
 		this.notificationQueueService = notificationQueueService;
 		this.config = config;
 		this.eventBus = eventBus;
 	}
-	
-	
-	@LifecycleHandlerType(LifecycleLevel.INIT_SERVICE)
+
+
+    @Override
     public void initialize() {
 		try {
-            nextBillingQueue = notificationQueueService.createNotificationQueue(NEXT_BILLING_DATE_NOTIFIER_SERVICE_NAME,
+            nextBillingQueue = notificationQueueService.createNotificationQueue(DefaultInvoiceService.INVOICE_SERVICE_NAME,
             		NEXT_BILLING_DATE_NOTIFIER_QUEUE,
                     new NotificationQueueHandler() {
                 @Override
@@ -71,7 +73,7 @@ public class DefaultNextBillingDateNotifier implements KillbillService, NextBill
                 		log.error("The key returned from the NextBillingNotificationQueue is not a valid UUID",e);
                 		return;
                 	}
-                    
+
                     processEvent(subscriptionId);
                 }
             },
@@ -98,23 +100,18 @@ public class DefaultNextBillingDateNotifier implements KillbillService, NextBill
         }
     }
 
-    @LifecycleHandlerType(LifecycleLevel.START_SERVICE)
+    @Override
     public void start() {
     	nextBillingQueue.startQueue();
     }
 
-    @LifecycleHandlerType(LifecycleLevel.STOP_SERVICE)
+    @Override
     public void stop() {
         if (nextBillingQueue != null) {
         	nextBillingQueue.stopQueue();
         }
     }
-     
-	@Override
-	public String getName() {
-		return NEXT_BILLING_DATE_NOTIFIER_SERVICE_NAME;
-	}
-	
+
     private void processEvent(UUID subscriptionId) {
         try {
             eventBus.post(new NextBillingDateEvent(subscriptionId));
@@ -122,14 +119,14 @@ public class DefaultNextBillingDateNotifier implements KillbillService, NextBill
             log.error("Failed to post entitlement event " + subscriptionId, e);
         }
     }
-    
+
     @Override
     public void insertNextBillingNotification(Transmogrifier transactionalDao, final UUID subscriptionId, DateTime futureNotificationTime) {
     	nextBillingQueue.recordFutureNotificationFromTransaction(transactionalDao, futureNotificationTime, new NotificationKey(){
-    		public String toString() {
+    		@Override
+            public String toString() {
     			return subscriptionId.toString();
     		}
     	});
     }
-
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotifier.java
index 5371824..d33dc61 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotifier.java
@@ -23,7 +23,13 @@ import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
 
 public interface NextBillingDateNotifier {
 
-	void insertNextBillingNotification(Transmogrifier transactionalDao,
+    public void initialize();
+
+    public void start();
+
+    public void stop();
+
+	public void insertNextBillingNotification(Transmogrifier transactionalDao,
 			UUID subscriptionId, DateTime futureNotificationTime);
 
 }