killbill-memoizeit

Details

diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/AnalyticsListener.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/AnalyticsListener.java
index 82b371f..2b451c3 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/AnalyticsListener.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/AnalyticsListener.java
@@ -77,39 +77,41 @@ public class AnalyticsListener implements OSGIKillbillEventHandler {
     public void handleKillbillEvent(final ExtBusEvent killbillEvent) {
         final CallContext callContext = new AnalyticsCallContext(killbillEvent);
 
-        try {
-            switch (killbillEvent.getEventType()) {
-                case ACCOUNT_CREATION:
-                case ACCOUNT_CHANGE:
-                    handleAccountEvent(killbillEvent, callContext);
-                    break;
-                case SUBSCRIPTION_CREATION:
-                case SUBSCRIPTION_CHANGE:
-                case SUBSCRIPTION_CANCEL:
-                    handleSubscriptionEvent(killbillEvent, callContext);
-                    break;
-                case OVERDUE_CHANGE:
-                    handleOverdueEvent(killbillEvent, callContext);
-                    break;
-                case INVOICE_CREATION:
-                    handleInvoiceEvent(killbillEvent, callContext);
-                    break;
-                case PAYMENT_SUCCESS:
-                case PAYMENT_FAILED:
-                    handlePaymentEvent(killbillEvent, callContext);
-                    break;
-                default:
-                    // TODO invoice adjustments
-                    // TODO refunds
-                    // TODO tags and custom fields
-                    break;
-            }
-        } catch (AnalyticsRefreshException e) {
-            logService.log(LogService.LOG_WARNING, "Refresh triggered by event " + killbillEvent + " failed", e);
+        switch (killbillEvent.getEventType()) {
+            case ACCOUNT_CREATION:
+            case ACCOUNT_CHANGE:
+                handleAccountEvent(killbillEvent, callContext);
+                break;
+            case SUBSCRIPTION_CREATION:
+            case SUBSCRIPTION_CHANGE:
+            case SUBSCRIPTION_CANCEL:
+                handleSubscriptionEvent(killbillEvent, callContext);
+                break;
+            case OVERDUE_CHANGE:
+                handleOverdueEvent(killbillEvent, callContext);
+                break;
+            case INVOICE_CREATION:
+            case INVOICE_ADJUSTMENT:
+                handleInvoiceEvent(killbillEvent, callContext);
+                break;
+            case PAYMENT_SUCCESS:
+            case PAYMENT_FAILED:
+                handlePaymentEvent(killbillEvent, callContext);
+                break;
+            case TAG_CREATION:
+            case TAG_DELETION:
+                handleTagEvent(killbillEvent, callContext);
+                break;
+            case CUSTOM_FIELD_CREATION:
+            case CUSTOM_FIELD_DELETION:
+                handleFieldEvent(killbillEvent, callContext);
+                break;
+            default:
+                break;
         }
     }
 
-    private void handleAccountEvent(final ExtBusEvent killbillEvent, final CallContext callContext) throws AnalyticsRefreshException {
+    private void handleAccountEvent(final ExtBusEvent killbillEvent, final CallContext callContext) {
         updateWithAccountLock(killbillEvent, new Callable<Void>() {
             @Override
             public Void call() throws Exception {
@@ -119,7 +121,7 @@ public class AnalyticsListener implements OSGIKillbillEventHandler {
         });
     }
 
-    private void handleSubscriptionEvent(final ExtBusEvent killbillEvent, final CallContext callContext) throws AnalyticsRefreshException {
+    private void handleSubscriptionEvent(final ExtBusEvent killbillEvent, final CallContext callContext) {
         updateWithAccountLock(killbillEvent, new Callable<Void>() {
             @Override
             public Void call() throws Exception {
@@ -129,7 +131,7 @@ public class AnalyticsListener implements OSGIKillbillEventHandler {
         });
     }
 
-    private void handleInvoiceEvent(final ExtBusEvent killbillEvent, final CallContext callContext) throws AnalyticsRefreshException {
+    private void handleInvoiceEvent(final ExtBusEvent killbillEvent, final CallContext callContext) {
         updateWithAccountLock(killbillEvent, new Callable<Void>() {
             @Override
             public Void call() throws Exception {
@@ -139,7 +141,7 @@ public class AnalyticsListener implements OSGIKillbillEventHandler {
         });
     }
 
-    private void handlePaymentEvent(final ExtBusEvent killbillEvent, final CallContext callContext) throws AnalyticsRefreshException {
+    private void handlePaymentEvent(final ExtBusEvent killbillEvent, final CallContext callContext) {
         updateWithAccountLock(killbillEvent, new Callable<Void>() {
             @Override
             public Void call() throws Exception {
@@ -149,7 +151,7 @@ public class AnalyticsListener implements OSGIKillbillEventHandler {
         });
     }
 
-    private void handleOverdueEvent(final ExtBusEvent killbillEvent, final CallContext callContext) throws AnalyticsRefreshException {
+    private void handleOverdueEvent(final ExtBusEvent killbillEvent, final CallContext callContext) {
         updateWithAccountLock(killbillEvent, new Callable<Void>() {
             @Override
             public Void call() throws Exception {
@@ -159,6 +161,26 @@ public class AnalyticsListener implements OSGIKillbillEventHandler {
         });
     }
 
+    private void handleTagEvent(final ExtBusEvent killbillEvent, final CallContext callContext) {
+        updateWithAccountLock(killbillEvent, new Callable<Void>() {
+            @Override
+            public Void call() throws Exception {
+                bTagDao.update(killbillEvent.getAccountId(), callContext);
+                return null;
+            }
+        });
+    }
+
+    private void handleFieldEvent(final ExtBusEvent killbillEvent, final CallContext callContext) {
+        updateWithAccountLock(killbillEvent, new Callable<Void>() {
+            @Override
+            public Void call() throws Exception {
+                bFieldDao.update(killbillEvent.getAccountId(), callContext);
+                return null;
+            }
+        });
+    }
+
     private static final class AnalyticsCallContext implements CallContext {
 
         private static final String USER_NAME = AnalyticsListener.class.getName();
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/api/user/AnalyticsUserApi.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/api/user/AnalyticsUserApi.java
index 84e928f..c4dfdb5 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/api/user/AnalyticsUserApi.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/api/user/AnalyticsUserApi.java
@@ -61,7 +61,7 @@ public class AnalyticsUserApi extends BusinessAnalyticsBase {
                             final OSGIKillbillAPI osgiKillbillAPI,
                             final OSGIKillbillDataSource osgiKillbillDataSource) {
         super(logService, osgiKillbillAPI);
-        this.analyticsDao = new AnalyticsDao(osgiKillbillDataSource);
+        this.analyticsDao = new AnalyticsDao(osgiKillbillAPI, osgiKillbillDataSource);
         this.bacDao = new BusinessAccountDao(logService, osgiKillbillAPI, osgiKillbillDataSource);
         this.bstDao = new BusinessSubscriptionTransitionDao(logService, osgiKillbillAPI, osgiKillbillDataSource);
         this.binDao = new BusinessInvoiceDao(logService, osgiKillbillAPI, osgiKillbillDataSource, bacDao);
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/BusinessAnalyticsBase.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/BusinessAnalyticsBase.java
index f2db9b6..4964dd4 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/BusinessAnalyticsBase.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/BusinessAnalyticsBase.java
@@ -183,8 +183,7 @@ public abstract class BusinessAnalyticsBase {
     //
 
     protected AuditLog getBlockingStateCreationAuditLog(final UUID blockingStateId, final TenantContext context) throws AnalyticsRefreshException {
-        // TODO
-        final List<AuditLog> auditLogsForBlockingState = getAuditUserApi().getAuditLogs(blockingStateId, null, AuditLevel.MINIMAL, context);
+        final List<AuditLog> auditLogsForBlockingState = getAuditUserApi().getAuditLogs(blockingStateId, ObjectType.BLOCKING_STATES, AuditLevel.MINIMAL, context);
         for (final AuditLog auditLog : auditLogsForBlockingState) {
             if (auditLog.getChangeType().equals(ChangeType.INSERT)) {
                 return auditLog;
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/AnalyticsDao.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/AnalyticsDao.java
index b715a40..b211639 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/AnalyticsDao.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/AnalyticsDao.java
@@ -25,6 +25,7 @@ import java.util.UUID;
 
 import org.skife.jdbi.v2.DBI;
 
+import com.ning.billing.ObjectType;
 import com.ning.billing.osgi.bundles.analytics.api.BusinessAccount;
 import com.ning.billing.osgi.bundles.analytics.api.BusinessField;
 import com.ning.billing.osgi.bundles.analytics.api.BusinessInvoice;
@@ -40,7 +41,9 @@ import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessInvoicePaymentB
 import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessOverdueStatusModelDao;
 import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessSubscriptionTransitionModelDao;
 import com.ning.billing.osgi.bundles.analytics.dao.model.BusinessTagModelDao;
+import com.ning.billing.util.api.RecordIdApi;
 import com.ning.billing.util.callcontext.TenantContext;
+import com.ning.killbill.osgi.libs.killbill.OSGIKillbillAPI;
 import com.ning.killbill.osgi.libs.killbill.OSGIKillbillDataSource;
 
 import com.google.common.base.Function;
@@ -50,15 +53,18 @@ import com.google.common.collect.Lists;
 
 public class AnalyticsDao {
 
-    protected final BusinessAnalyticsSqlDao sqlDao;
+    private final OSGIKillbillAPI osgiKillbillAPI;
+    private final BusinessAnalyticsSqlDao sqlDao;
 
-    public AnalyticsDao(final OSGIKillbillDataSource osgiKillbillDataSource) {
+    public AnalyticsDao(final OSGIKillbillAPI osgiKillbillAPI,
+                        final OSGIKillbillDataSource osgiKillbillDataSource) {
+        this.osgiKillbillAPI = osgiKillbillAPI;
         final DBI dbi = BusinessDBIProvider.get(osgiKillbillDataSource.getDataSource());
         sqlDao = dbi.onDemand(BusinessAnalyticsSqlDao.class);
     }
 
     public BusinessAccount getAccountById(final UUID accountId, final TenantContext context) {
-        final Long accountRecordId = getAccountRecordId(accountId);
+        final Long accountRecordId = getAccountRecordId(accountId, context);
         final Long tenantRecordId = getTenantRecordId(context);
 
         final BusinessAccountModelDao businessAccountModelDao = sqlDao.getAccountByAccountRecordId(accountRecordId, tenantRecordId, context);
@@ -70,7 +76,7 @@ public class AnalyticsDao {
     }
 
     public Collection<BusinessSubscriptionTransition> getSubscriptionTransitionsForAccount(final UUID accountId, final TenantContext context) {
-        final Long accountRecordId = getAccountRecordId(accountId);
+        final Long accountRecordId = getAccountRecordId(accountId, context);
         final Long tenantRecordId = getTenantRecordId(context);
 
         final List<BusinessSubscriptionTransitionModelDao> businessSubscriptionTransitionModelDaos = sqlDao.getSubscriptionTransitionsByAccountRecordId(accountRecordId, tenantRecordId, context);
@@ -83,7 +89,7 @@ public class AnalyticsDao {
     }
 
     public Collection<BusinessOverdueStatus> getOverdueStatusesForAccount(final UUID accountId, final TenantContext context) {
-        final Long accountRecordId = getAccountRecordId(accountId);
+        final Long accountRecordId = getAccountRecordId(accountId, context);
         final Long tenantRecordId = getTenantRecordId(context);
 
         final List<BusinessOverdueStatusModelDao> businessOverdueStatusModelDaos = sqlDao.getOverdueStatusesByAccountRecordId(accountRecordId, tenantRecordId, context);
@@ -96,7 +102,7 @@ public class AnalyticsDao {
     }
 
     public Collection<BusinessInvoice> getInvoicesForAccount(final UUID accountId, final TenantContext context) {
-        final Long accountRecordId = getAccountRecordId(accountId);
+        final Long accountRecordId = getAccountRecordId(accountId, context);
         final Long tenantRecordId = getTenantRecordId(context);
 
         final List<BusinessInvoiceItemBaseModelDao> businessInvoiceItemModelDaos = sqlDao.getInvoiceItemsByAccountRecordId(accountRecordId, tenantRecordId, context);
@@ -118,7 +124,7 @@ public class AnalyticsDao {
     }
 
     public Collection<BusinessInvoicePayment> getInvoicePaymentsForAccount(final UUID accountId, final TenantContext context) {
-        final Long accountRecordId = getAccountRecordId(accountId);
+        final Long accountRecordId = getAccountRecordId(accountId, context);
         final Long tenantRecordId = getTenantRecordId(context);
 
         final List<BusinessInvoicePaymentBaseModelDao> businessInvoicePaymentBaseModelDaos = sqlDao.getInvoicePaymentsByAccountRecordId(accountRecordId, tenantRecordId, context);
@@ -131,7 +137,7 @@ public class AnalyticsDao {
     }
 
     public Collection<BusinessField> getFieldsForAccount(final UUID accountId, final TenantContext context) {
-        final Long accountRecordId = getAccountRecordId(accountId);
+        final Long accountRecordId = getAccountRecordId(accountId, context);
         final Long tenantRecordId = getTenantRecordId(context);
 
         final List<BusinessFieldModelDao> businessFieldModelDaos = sqlDao.getFieldsByAccountRecordId(accountRecordId, tenantRecordId, context);
@@ -144,7 +150,7 @@ public class AnalyticsDao {
     }
 
     public Collection<BusinessTag> getTagsForAccount(final UUID accountId, final TenantContext context) {
-        final Long accountRecordId = getAccountRecordId(accountId);
+        final Long accountRecordId = getAccountRecordId(accountId, context);
         final Long tenantRecordId = getTenantRecordId(context);
 
         final List<BusinessTagModelDao> businessTagModelDaos = sqlDao.getTagsByAccountRecordId(accountRecordId, tenantRecordId, context);
@@ -156,13 +162,13 @@ public class AnalyticsDao {
         });
     }
 
-    private Long getAccountRecordId(final UUID accountId) {
-        // TODO
-        return 0L;
+    private Long getAccountRecordId(final UUID accountId, final TenantContext context) {
+        final RecordIdApi recordIdApi = osgiKillbillAPI.getRecordIdApi();
+        return recordIdApi == null ? -1L : recordIdApi.getRecordId(accountId, ObjectType.ACCOUNT, context);
     }
 
     private Long getTenantRecordId(final TenantContext context) {
-        // TODO
-        return 0L;
+        final RecordIdApi recordIdApi = osgiKillbillAPI.getRecordIdApi();
+        return recordIdApi == null ? -1L : recordIdApi.getRecordId(context.getTenantId(), ObjectType.TENANT, context);
     }
 }
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/BusinessSubscriptionTransitionDao.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/BusinessSubscriptionTransitionDao.java
index 498c92f..509f95b 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/BusinessSubscriptionTransitionDao.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/BusinessSubscriptionTransitionDao.java
@@ -118,9 +118,8 @@ public class BusinessSubscriptionTransitionDao extends BusinessAnalyticsDaoBase 
                                                                                subscriptionTransition.getEffectiveTransitionTime(),
                                                                                subscriptionTransition.getNextState());
 
-        // TODO
-        final Long subscriptionEventRecordId = getSubscriptionEventRecordId(null, context);
-        final AuditLog creationAuditLog = getSubscriptionEventCreationAuditLog(null, context);
+        final Long subscriptionEventRecordId = getSubscriptionEventRecordId(subscriptionTransition.getNextEventId(), context);
+        final AuditLog creationAuditLog = getSubscriptionEventCreationAuditLog(subscriptionTransition.getNextEventId(), context);
 
         final Long accountRecordId = getAccountRecordId(account.getId(), context);
         final Long tenantRecordId = getTenantRecordId(context);
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessSubscription.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessSubscription.java
index 5abbbdb..6433e5e 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessSubscription.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessSubscription.java
@@ -73,7 +73,6 @@ public class BusinessSubscription {
             final Product product = currentPlan.getProduct();
             productName = product.getName();
             productCategory = product.getCategory().toString();
-            // TODO - we should keep the product type
             productType = product.getCatalogName();
         } else {
             productName = null;
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessSubscriptionEvent.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessSubscriptionEvent.java
index d5bd0ee..3414995 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessSubscriptionEvent.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessSubscriptionEvent.java
@@ -34,6 +34,7 @@ public class BusinessSubscriptionEvent {
         MIGRATE,
         ADD,
         CANCEL,
+        UN_CANCEL,
         RE_ADD,
         TRANSFER,
         CHANGE,
@@ -88,13 +89,15 @@ public class BusinessSubscriptionEvent {
                 return subscriptionTransfered(transition.getNextPlan());
             case CANCEL:
                 return subscriptionCancelled(transition.getNextPlan());
+            case UNCANCEL:
+                return subscriptionUnCancelled(transition.getNextPlan());
             case CHANGE:
                 return subscriptionChanged(transition.getNextPlan());
             case PHASE:
                 return subscriptionPhaseChanged(transition.getNextPlan());
-            // TODO - should we really ignore these?
-            case MIGRATE_BILLING:
-            case UNCANCEL:
+            case MIGRATE_BILLING: // Has no impact on the subscription
+            case START_BILLING_DISABLED: // See BOS
+            case END_BILLING_DISABLED: // See BOS
             default:
                 return null;
         }
@@ -112,6 +115,10 @@ public class BusinessSubscriptionEvent {
         return eventFromType(EventType.CANCEL, plan);
     }
 
+    private static BusinessSubscriptionEvent subscriptionUnCancelled(final Plan plan) {
+        return eventFromType(EventType.UN_CANCEL, plan);
+    }
+
     private static BusinessSubscriptionEvent subscriptionChanged(final Plan plan) {
         return eventFromType(EventType.CHANGE, plan);
     }
diff --git a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessSubscriptionTransitionModelDao.java b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessSubscriptionTransitionModelDao.java
index e0dea82..a79bc65 100644
--- a/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessSubscriptionTransitionModelDao.java
+++ b/osgi-bundles/bundles/analytics/src/main/java/com/ning/billing/osgi/bundles/analytics/dao/model/BusinessSubscriptionTransitionModelDao.java
@@ -98,7 +98,7 @@ public class BusinessSubscriptionTransitionModelDao extends BusinessModelDaoBase
              event,
              previousSubscription,
              nextSubscription,
-             null /* TODO */,
+             transition.getNextEventCreatedDate(),
              creationAuditLog.getUserName(),
              creationAuditLog.getReasonCode(),
              creationAuditLog.getComment(),