killbill-uncached

analytics: prepare AnalyticsListener to accept account events Signed-off-by:

11/18/2011 10:03:05 PM

Details

diff --git a/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java b/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
index 2372a51..415a002 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
@@ -18,129 +18,51 @@ package com.ning.billing.analytics;
 
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
-import com.ning.billing.account.api.IAccount;
-import com.ning.billing.account.api.IAccountUserApi;
-import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionDao;
-import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
-import com.ning.billing.entitlement.api.user.ISubscriptionBundle;
 import com.ning.billing.entitlement.api.user.ISubscriptionTransition;
-import org.joda.time.DateTime;
-
-import java.util.List;
 
 public class AnalyticsListener
 {
-    private final BusinessSubscriptionTransitionDao dao;
-    private final IEntitlementUserApi entitlementApi;
-    private final IAccountUserApi accountApi;
     private final BusinessSubscriptionTransitionRecorder bstRecorder;
+    private final BusinessAccountRecorder bacRecorder;
 
     @Inject
-    public AnalyticsListener(final BusinessSubscriptionTransitionDao dao, final IEntitlementUserApi entitlementApi, final IAccountUserApi accountApi)
+    public AnalyticsListener(final BusinessSubscriptionTransitionRecorder bstRecorder, final BusinessAccountRecorder bacRecorder)
     {
-        this.dao = dao;
-        this.entitlementApi = entitlementApi;
-        this.accountApi = accountApi;
-        this.bstRecorder = new BusinessSubscriptionTransitionRecorder(dao);
+        this.bstRecorder = bstRecorder;
+        this.bacRecorder = bacRecorder;
     }
 
     @Subscribe
-    public void handleNotificationChange(final ISubscriptionTransition event)
+    public void handleSubscriptionTransitionChange(final ISubscriptionTransition event)
     {
         switch (event.getTransitionType()) {
             case CREATE:
-                subscriptionCreated(event);
+                bstRecorder.subscriptionCreated(event);
                 break;
             case CANCEL:
-                subscriptionCancelled(event);
+                bstRecorder.subscriptionCancelled(event);
                 break;
             case CHANGE:
-                subscriptionChanged(event);
+                bstRecorder.subscriptionChanged(event);
                 break;
             case PAUSE:
-                subscriptionPaused(event);
+                bstRecorder.subscriptionPaused(event);
                 break;
             case RESUME:
-                subscriptionResumed(event);
+                bstRecorder.subscriptionResumed(event);
                 break;
             case UNCANCEL:
                 break;
             case PHASE:
-                subscriptionPhaseChanged(event);
+                bstRecorder.subscriptionPhaseChanged(event);
                 break;
             default:
-                throw new RuntimeException("Unexpected event type " + event.getRequestedTransitionTime());
+                throw new RuntimeException("Unexpected event type " + event.getTransitionType());
         }
     }
 
-    private void subscriptionCreated(final ISubscriptionTransition created)
-    {
-        final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCreated(created.getNextPlan());
-        recordTransition(event, created);
-    }
-
-    private void subscriptionCancelled(final ISubscriptionTransition cancelled)
-    {
-        final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCancelled(cancelled.getNextPlan());
-        recordTransition(event, cancelled);
-    }
-
-    private void subscriptionChanged(final ISubscriptionTransition changed)
-    {
-        final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionChanged(changed.getNextPlan());
-        recordTransition(event, changed);
-    }
-
-    private void subscriptionPaused(final ISubscriptionTransition paused)
-    {
-        final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionPaused(paused.getNextPlan());
-        recordTransition(event, paused);
-    }
-
-    private void subscriptionResumed(final ISubscriptionTransition resumed)
-    {
-        final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionResumed(resumed.getNextPlan());
-        recordTransition(event, resumed);
-    }
-
-    private void subscriptionPhaseChanged(final ISubscriptionTransition phaseChanged)
-    {
-        final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionPhaseChanged(phaseChanged.getNextPlan(), phaseChanged.getNextState());
-        recordTransition(event, phaseChanged);
-    }
-
-    private void recordTransition(final BusinessSubscriptionEvent event, final ISubscriptionTransition transition)
+    @Subscribe
+    public void handleAccountChange(final Object event)
     {
-        Currency currency = null;
-        String transitionKey = null;
-
-        // Retrieve key and currency via the bundle
-        final ISubscriptionBundle bundle = entitlementApi.getBundleFromId(transition.getBundleId());
-        if (bundle != null) {
-            transitionKey = bundle.getKey();
-
-            final IAccount account = accountApi.getAccountFromId(bundle.getAccountId());
-            if (account != null) {
-                currency = account.getCurrency();
-            }
-        }
-
-        // The ISubscriptionTransition interface gives us all the prev/next information we need but the start date
-        // of the previous plan. We need to retrieve it from our own transitions table
-        DateTime previousEffectiveTransitionTime = null;
-        final List<BusinessSubscriptionTransition> transitions = dao.getTransitions(transitionKey);
-        if (transitions != null && transitions.size() > 0) {
-            final BusinessSubscriptionTransition lastTransition = transitions.get(transitions.size() - 1);
-            if (lastTransition != null && lastTransition.getNextSubscription() != null) {
-                previousEffectiveTransitionTime = lastTransition.getNextSubscription().getStartDate();
-            }
-        }
-
-        // TODO Support currency changes
-        final BusinessSubscription prevSubscription = new BusinessSubscription(transition.getPreviousPlan(), transition.getPreviousPhase(), currency, previousEffectiveTransitionTime, transition.getPreviousState(), transition.getSubscriptionId(), transition.getBundleId());
-        final BusinessSubscription nextSubscription = new BusinessSubscription(transition.getNextPlan(), transition.getNextPhase(), currency, transition.getEffectiveTransitionTime(), transition.getNextState(), transition.getSubscriptionId(), transition.getBundleId());
-
-        bstRecorder.record(transitionKey, transition.getRequestedTransitionTime(), event, prevSubscription, nextSubscription);
     }
 }
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
new file mode 100644
index 0000000..7c5a6da
--- /dev/null
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.analytics;
+
+import com.google.inject.Inject;
+import com.ning.billing.account.api.IAccount;
+import com.ning.billing.account.api.IAccountUserApi;
+import com.ning.billing.analytics.dao.BusinessAccountDao;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BusinessAccountRecorder
+{
+    private static final Logger log = LoggerFactory.getLogger(BusinessAccountRecorder.class);
+
+    private final BusinessAccountDao dao;
+    private final IAccountUserApi accountApi;
+
+    @Inject
+    public BusinessAccountRecorder(final BusinessAccountDao dao, final IAccountUserApi accountApi)
+    {
+        this.dao = dao;
+        this.accountApi = accountApi;
+    }
+
+    public void subscriptionCreated(final IAccount created)
+    {
+    }
+
+    public void subscriptionUpdated(final IAccount updated)
+    {
+    }
+}
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
index 781926b..c3ecc70 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
@@ -16,22 +16,107 @@
 
 package com.ning.billing.analytics;
 
+import com.google.inject.Inject;
+import com.ning.billing.account.api.IAccount;
+import com.ning.billing.account.api.IAccountUserApi;
 import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionDao;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
+import com.ning.billing.entitlement.api.user.ISubscriptionBundle;
+import com.ning.billing.entitlement.api.user.ISubscriptionTransition;
 import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.List;
+
 public class BusinessSubscriptionTransitionRecorder
 {
     private static final Logger log = LoggerFactory.getLogger(BusinessSubscriptionTransitionRecorder.class);
 
     private final BusinessSubscriptionTransitionDao dao;
+    private final IEntitlementUserApi entitlementApi;
+    private final IAccountUserApi accountApi;
 
-    public BusinessSubscriptionTransitionRecorder(final BusinessSubscriptionTransitionDao dao)
+    @Inject
+    public BusinessSubscriptionTransitionRecorder(final BusinessSubscriptionTransitionDao dao, final IEntitlementUserApi entitlementApi, final IAccountUserApi accountApi)
     {
         this.dao = dao;
+        this.entitlementApi = entitlementApi;
+        this.accountApi = accountApi;
+    }
+
+    public void subscriptionCreated(final ISubscriptionTransition created)
+    {
+        final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCreated(created.getNextPlan());
+        recordTransition(event, created);
+    }
+
+    public void subscriptionCancelled(final ISubscriptionTransition cancelled)
+    {
+        final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCancelled(cancelled.getNextPlan());
+        recordTransition(event, cancelled);
+    }
+
+    public void subscriptionChanged(final ISubscriptionTransition changed)
+    {
+        final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionChanged(changed.getNextPlan());
+        recordTransition(event, changed);
+    }
+
+    public void subscriptionPaused(final ISubscriptionTransition paused)
+    {
+        final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionPaused(paused.getNextPlan());
+        recordTransition(event, paused);
+    }
+
+    public void subscriptionResumed(final ISubscriptionTransition resumed)
+    {
+        final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionResumed(resumed.getNextPlan());
+        recordTransition(event, resumed);
+    }
+
+    public void subscriptionPhaseChanged(final ISubscriptionTransition phaseChanged)
+    {
+        final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionPhaseChanged(phaseChanged.getNextPlan(), phaseChanged.getNextState());
+        recordTransition(event, phaseChanged);
+    }
+
+    public void recordTransition(final BusinessSubscriptionEvent event, final ISubscriptionTransition transition)
+    {
+        Currency currency = null;
+        String transitionKey = null;
+
+        // Retrieve key and currency via the bundle
+        final ISubscriptionBundle bundle = entitlementApi.getBundleFromId(transition.getBundleId());
+        if (bundle != null) {
+            transitionKey = bundle.getKey();
+
+            final IAccount account = accountApi.getAccountFromId(bundle.getAccountId());
+            if (account != null) {
+                currency = account.getCurrency();
+            }
+        }
+
+        // The ISubscriptionTransition interface gives us all the prev/next information we need but the start date
+        // of the previous plan. We need to retrieve it from our own transitions table
+        DateTime previousEffectiveTransitionTime = null;
+        final List<BusinessSubscriptionTransition> transitions = dao.getTransitions(transitionKey);
+        if (transitions != null && transitions.size() > 0) {
+            final BusinessSubscriptionTransition lastTransition = transitions.get(transitions.size() - 1);
+            if (lastTransition != null && lastTransition.getNextSubscription() != null) {
+                previousEffectiveTransitionTime = lastTransition.getNextSubscription().getStartDate();
+            }
+        }
+
+        // TODO Support currency changes
+        final BusinessSubscription prevSubscription = new BusinessSubscription(transition.getPreviousPlan(), transition.getPreviousPhase(), currency, previousEffectiveTransitionTime, transition.getPreviousState(), transition.getSubscriptionId(), transition.getBundleId());
+        final BusinessSubscription nextSubscription = new BusinessSubscription(transition.getNextPlan(), transition.getNextPhase(), currency, transition.getEffectiveTransitionTime(), transition.getNextState(), transition.getSubscriptionId(), transition.getBundleId());
+
+        record(transitionKey, transition.getRequestedTransitionTime(), event, prevSubscription, nextSubscription);
     }
 
+    // Public for internal reasons
     public void record(final String key, final DateTime requestedDateTime, final BusinessSubscriptionEvent event, final BusinessSubscription prevSubscription, final BusinessSubscription nextSubscription)
     {
         final BusinessSubscriptionTransition transition = new BusinessSubscriptionTransition(
diff --git a/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java b/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java
index 11bc356..59fc392 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java
@@ -19,6 +19,8 @@ package com.ning.billing.analytics.setup;
 
 import com.google.inject.AbstractModule;
 import com.ning.billing.analytics.AnalyticsListener;
+import com.ning.billing.analytics.BusinessAccountRecorder;
+import com.ning.billing.analytics.BusinessSubscriptionTransitionRecorder;
 import com.ning.billing.analytics.api.AnalyticsService;
 import com.ning.billing.analytics.api.IAnalyticsService;
 import com.ning.billing.analytics.dao.BusinessAccountDao;
@@ -33,7 +35,11 @@ public class AnalyticsModule extends AbstractModule
     {
         bind(BusinessSubscriptionTransitionDao.class).toProvider(BusinessSubscriptionTransitionDaoProvider.class).asEagerSingleton();
         bind(BusinessAccountDao.class).toProvider(BusinessAccountDaoProvider.class).asEagerSingleton();
+
+        bind(BusinessSubscriptionTransitionRecorder.class).asEagerSingleton();
+        bind(BusinessAccountRecorder.class).asEagerSingleton();
         bind(AnalyticsListener.class).asEagerSingleton();
+
         bind(IAnalyticsService.class).to(AnalyticsService.class).asEagerSingleton();
     }
 }
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index 7560c40..aae04e7 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -148,7 +148,7 @@ public class TestAnalyticsService
             service.registerForNotifications();
         }
         catch (Throwable t) {
-            Assert.fail("Unable to start the bus or service!");
+            Assert.fail("Unable to start the bus or service! " + t);
         }
 
         // Send an event to the bus and make sure our Dao got it
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java b/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
index 35c7a65..9f13e2e 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
@@ -50,7 +50,8 @@ public class TestAnalyticsListener
     @BeforeMethod(alwaysRun = true)
     public void setUp() throws Exception
     {
-        listener = new AnalyticsListener(dao, new MockIEntitlementUserApi(bundleUUID, KEY), new MockIAccountUserApi());
+        final BusinessSubscriptionTransitionRecorder recorder = new BusinessSubscriptionTransitionRecorder(dao, new MockIEntitlementUserApi(bundleUUID, KEY), new MockIAccountUserApi());
+        listener = new AnalyticsListener(recorder, null);
     }
 
     @Test(groups = "fast")
@@ -61,7 +62,7 @@ public class TestAnalyticsListener
         final DateTime requestedTransitionTime = new DateTime(DateTimeZone.UTC);
         final SubscriptionTransition firstTransition = createFirstSubscriptionTransition(requestedTransitionTime, effectiveTransitionTime);
         final BusinessSubscriptionTransition firstBST = createExpectedFirstBST(requestedTransitionTime, effectiveTransitionTime);
-        listener.handleNotificationChange(firstTransition);
+        listener.handleSubscriptionTransitionChange(firstTransition);
         Assert.assertEquals(dao.getTransitions(KEY).size(), 1);
         Assert.assertEquals(dao.getTransitions(KEY).get(0), firstBST);
 
@@ -70,7 +71,7 @@ public class TestAnalyticsListener
         final DateTime requestedPauseTransitionTime = new DateTime(DateTimeZone.UTC);
         final SubscriptionTransition pausedSubscriptionTransition = createPauseSubscriptionTransition(effectivePauseTransitionTime, requestedPauseTransitionTime, firstTransition.getNextState());
         final BusinessSubscriptionTransition pausedBST = createExpectedPausedBST(requestedPauseTransitionTime, effectivePauseTransitionTime, firstBST.getNextSubscription());
-        listener.handleNotificationChange(pausedSubscriptionTransition);
+        listener.handleSubscriptionTransitionChange(pausedSubscriptionTransition);
         Assert.assertEquals(dao.getTransitions(KEY).size(), 2);
         Assert.assertEquals(dao.getTransitions(KEY).get(1), pausedBST);
 
@@ -79,14 +80,14 @@ public class TestAnalyticsListener
         final DateTime requestedResumeTransitionTime = new DateTime(DateTimeZone.UTC);
         final SubscriptionTransition resumedSubscriptionTransition = createResumeSubscriptionTransition(requestedResumeTransitionTime, effectiveResumeTransitionTime, pausedSubscriptionTransition.getNextState());
         final BusinessSubscriptionTransition resumedBST = createExpectedResumedBST(requestedResumeTransitionTime, effectiveResumeTransitionTime, pausedBST.getNextSubscription());
-        listener.handleNotificationChange(resumedSubscriptionTransition);
+        listener.handleSubscriptionTransitionChange(resumedSubscriptionTransition);
         Assert.assertEquals(dao.getTransitions(KEY).size(), 3);
         Assert.assertEquals(dao.getTransitions(KEY).get(2), resumedBST);
 
         // Cancel it
         final DateTime effectiveCancelTransitionTime = new DateTime(DateTimeZone.UTC);
         final DateTime requestedCancelTransitionTime = new DateTime(DateTimeZone.UTC);
-        listener.handleNotificationChange(createCancelSubscriptionTransition(requestedCancelTransitionTime, effectiveCancelTransitionTime, resumedSubscriptionTransition.getNextState()));
+        listener.handleSubscriptionTransitionChange(createCancelSubscriptionTransition(requestedCancelTransitionTime, effectiveCancelTransitionTime, resumedSubscriptionTransition.getNextState()));
         final BusinessSubscriptionTransition cancelledBST = createExpectedCancelledBST(requestedCancelTransitionTime, effectiveCancelTransitionTime, resumedBST.getNextSubscription());
         Assert.assertEquals(dao.getTransitions(KEY).size(), 4);
         Assert.assertEquals(dao.getTransitions(KEY).get(3), cancelledBST);