killbill-uncached
analytics: prepare AnalyticsListener to accept account events Signed-off-by: …
11/18/2011 10:03:05 PM
Changes
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);