killbill-aplcache

Details

diff --git a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeEvent.java b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeEvent.java
index 59bcb78..d6b4351 100644
--- a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeEvent.java
+++ b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeEvent.java
@@ -187,17 +187,4 @@ public class DefaultAccountChangeEvent extends DefaultBusInternalEvent implement
             inputList.add(new DefaultChangedField(key, oldData, newData));
         }
     }
-
-    @Override
-    public Long getTenantRecordId() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Long getAccountRecordId() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
 }
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 5c29bbf..b0e1e1d 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
@@ -188,6 +188,6 @@ public class AnalyticsListener {
     }
 
     private InternalCallContext createCallContext(final BusInternalEvent event) {
-        return internalCallContextFactory.createInternalCallContext("AnalyticsService", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
+        return internalCallContextFactory.createInternalCallContext(event.getTenantRecordId(), event.getAccountRecordId(), "AnalyticsService", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
     }
 }
diff --git a/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java b/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
index da3ff18..e10fb5e 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
@@ -194,6 +194,7 @@ public class OverdueStateApplicator<T extends Blockable> {
             final List<Subscription> toBeCancelled = new LinkedList<Subscription>();
             computeSubscriptionsToCancel(blockable, toBeCancelled, context);
             for (final Subscription cur : toBeCancelled) {
+                // STEPH Need conversion toCallContext because we are calling a public API through the Subscription object
                 cur.cancelWithPolicy(clock.getUTCNow(), actionPolicy, context.toCallContext());
             }
         } catch (EntitlementUserApiException e) {
diff --git a/overdue/src/main/java/com/ning/billing/overdue/listener/OverdueListener.java b/overdue/src/main/java/com/ning/billing/overdue/listener/OverdueListener.java
index 3e2b8d5..795e5c7 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/listener/OverdueListener.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/listener/OverdueListener.java
@@ -77,7 +77,7 @@ public class OverdueListener {
     }
 
     private InternalCallContext createCallContext(@Nullable final BusInternalEvent event) {
-        return internalCallContextFactory.createInternalCallContext("OverdueService", CallOrigin.INTERNAL, UserType.SYSTEM,
+        return internalCallContextFactory.createInternalCallContext(event.getTenantRecordId(), event.getAccountRecordId(), "OverdueService", CallOrigin.INTERNAL, UserType.SYSTEM,
                                                                     event == null ? null : event.getUserToken());
     }
 }
diff --git a/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
index 2054f0e..c37b6ed 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.payment.core;
 
+import static com.ning.billing.payment.glue.PaymentModule.PLUGIN_EXECUTOR_NAMED;
+
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -64,8 +66,6 @@ import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableMap;
 import com.google.inject.name.Named;
 
-import static com.ning.billing.payment.glue.PaymentModule.PLUGIN_EXECUTOR_NAMED;
-
 public class RefundProcessor extends ProcessorBase {
 
     private static final Logger log = LoggerFactory.getLogger(RefundProcessor.class);
@@ -234,7 +234,7 @@ public class RefundProcessor extends ProcessorBase {
             throw new PaymentApiException(ErrorCode.PAYMENT_NO_SUCH_REFUND, refundId);
         }
 
-        if (completePluginCompletedRefund(filteredInput)) {
+        if (completePluginCompletedRefund(filteredInput, context)) {
             result = paymentDao.getRefund(refundId, context);
         }
         return new DefaultRefund(result.getId(), result.getCreatedDate(), result.getUpdatedDate(),
@@ -245,7 +245,7 @@ public class RefundProcessor extends ProcessorBase {
     public List<Refund> getAccountRefunds(final Account account, final InternalTenantContext context)
             throws PaymentApiException {
         List<RefundModelDao> result = paymentDao.getRefundsForAccount(account.getId(), context);
-        if (completePluginCompletedRefund(result)) {
+        if (completePluginCompletedRefund(result, context)) {
             result = paymentDao.getRefundsForAccount(account.getId(), context);
         }
         final List<RefundModelDao> filteredInput = filterUncompletedPluginRefund(result);
@@ -255,7 +255,7 @@ public class RefundProcessor extends ProcessorBase {
     public List<Refund> getPaymentRefunds(final UUID paymentId, final InternalTenantContext context)
             throws PaymentApiException {
         List<RefundModelDao> result = paymentDao.getRefundsForPayment(paymentId, context);
-        if (completePluginCompletedRefund(result)) {
+        if (completePluginCompletedRefund(result, context)) {
             result = paymentDao.getRefundsForPayment(paymentId, context);
         }
         final List<RefundModelDao> filteredInput = filterUncompletedPluginRefund(result);
@@ -282,7 +282,7 @@ public class RefundProcessor extends ProcessorBase {
         }));
     }
 
-    private boolean completePluginCompletedRefund(final List<RefundModelDao> refunds) throws PaymentApiException {
+    private boolean completePluginCompletedRefund(final List<RefundModelDao> refunds, final InternalTenantContext tenantContext) throws PaymentApiException {
 
         final Collection<RefundModelDao> refundsToBeFixed = Collections2.filter(refunds, new Predicate<RefundModelDao>() {
             @Override
@@ -295,7 +295,7 @@ public class RefundProcessor extends ProcessorBase {
         }
 
         try {
-            final InternalCallContext context = internalCallContextFactory.createInternalCallContext("RefundProcessor", CallOrigin.INTERNAL, UserType.SYSTEM, null);
+            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(tenantContext.getTenantRecordId(), tenantContext.getAccountRecordId(), "RefundProcessor", CallOrigin.INTERNAL, UserType.SYSTEM, null);
             final Account account = accountInternalApi.getAccountById(refundsToBeFixed.iterator().next().getAccountId(), context);
             new WithAccountLock<Void>().processAccountWithLock(locker, account.getExternalKey(), new WithAccountLockCallback<Void>() {
 
diff --git a/usage/src/main/java/com/ning/billing/usage/timeline/aggregator/TimelineAggregator.java b/usage/src/main/java/com/ning/billing/usage/timeline/aggregator/TimelineAggregator.java
index 6d272aa..ec2af28 100644
--- a/usage/src/main/java/com/ning/billing/usage/timeline/aggregator/TimelineAggregator.java
+++ b/usage/src/main/java/com/ning/billing/usage/timeline/aggregator/TimelineAggregator.java
@@ -71,7 +71,7 @@ public class TimelineAggregator {
 
     private final ScheduledExecutorService aggregatorThread = Executors.newSingleThreadScheduledExecutor();
 
-    private Map<String, AtomicLong> aggregatorCounters = new LinkedHashMap<String, AtomicLong>();
+    private final Map<String, AtomicLong> aggregatorCounters = new LinkedHashMap<String, AtomicLong>();
 
     private final AtomicBoolean isAggregating = new AtomicBoolean(false);
 
@@ -426,6 +426,7 @@ public class TimelineAggregator {
     }
 
     private InternalCallContext createCallContext() {
-        return internalCallContextFactory.createInternalCallContext("TimelineAggregator", CallOrigin.INTERNAL, UserType.SYSTEM, null);
+        // TODO add teantRecordId and accountRecordId
+        return internalCallContextFactory.createInternalCallContext(InternalCallContextFactory.INTERNAL_TENANT_RECORD_ID, null, "TimelineAggregator", CallOrigin.INTERNAL, UserType.SYSTEM, null);
     }
 }
diff --git a/usage/src/main/java/com/ning/billing/usage/timeline/BackgroundDBChunkWriter.java b/usage/src/main/java/com/ning/billing/usage/timeline/BackgroundDBChunkWriter.java
index 3c4a786..7a12fa5 100644
--- a/usage/src/main/java/com/ning/billing/usage/timeline/BackgroundDBChunkWriter.java
+++ b/usage/src/main/java/com/ning/billing/usage/timeline/BackgroundDBChunkWriter.java
@@ -67,7 +67,7 @@ public class BackgroundDBChunkWriter {
     private final AtomicBoolean shuttingDown = new AtomicBoolean();
     private List<PendingChunkMap> pendingChunks = new ArrayList<PendingChunkMap>();
     private DateTime lastWriteTime = new DateTime();
-    private AtomicBoolean doingWritesNow = new AtomicBoolean();
+    private final AtomicBoolean doingWritesNow = new AtomicBoolean();
     private final ScheduledExecutorService backgroundWriteThread = Executors.newSingleThreadScheduledExecutor();
 
     private final AtomicLong maybePerformBackgroundWritesCount = new AtomicLong();
@@ -223,6 +223,7 @@ public class BackgroundDBChunkWriter {
     }
 
     private InternalCallContext createCallContext() {
-        return internalCallContextFactory.createInternalCallContext("ChunkWriter", CallOrigin.INTERNAL, UserType.SYSTEM, null);
+        // TODO information about accountRecordId and tenatRecordId
+        return internalCallContextFactory.createInternalCallContext(InternalCallContextFactory.INTERNAL_TENANT_RECORD_ID, null, "ChunkWriter", CallOrigin.INTERNAL, UserType.SYSTEM, null);
     }
 }
diff --git a/util/src/main/java/com/ning/billing/util/bus/PersistentBus.java b/util/src/main/java/com/ning/billing/util/bus/PersistentBus.java
index 44b0110..eab96ab 100644
--- a/util/src/main/java/com/ning/billing/util/bus/PersistentBus.java
+++ b/util/src/main/java/com/ning/billing/util/bus/PersistentBus.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -108,9 +108,9 @@ public class PersistentBus extends PersistentQueueBase implements Bus {
 
     @Override
     public int doProcessEvents() {
-        // Note: retrieving and clearing bus events is not done per tenant (yet?)
-        final InternalCallContext context = internalCallContextFactory.createInternalCallContext("PersistentBus", CallOrigin.INTERNAL, UserType.SYSTEM, null);
 
+        // TODO Retrieving and clearing bus events is not done per tenant so pass default INTERNAL_TENANT_RECORD_ID; not sure this is something we want to do anyway ?
+        final InternalCallContext context = internalCallContextFactory.createInternalCallContext(InternalCallContextFactory.INTERNAL_TENANT_RECORD_ID, null, "PersistentBus", CallOrigin.INTERNAL, UserType.SYSTEM, null);
         final List<BusEventEntry> events = getNextBusEvent(context);
         if (events.size() == 0) {
             return 0;
@@ -118,11 +118,13 @@ public class PersistentBus extends PersistentQueueBase implements Bus {
 
         int result = 0;
         for (final BusEventEntry cur : events) {
-            final BusInternalEvent evt = deserializeEvent(cur.getBusEventClass(), cur.getBusEventJson());
+            final String jsonWithAccountAndTenantRecorId = tweakJsonToIncludeAccountAndTenantRecordId(cur.getBusEventJson(), cur.getAccountRecordId(), cur.getTenantRecordId());
+            final BusInternalEvent evt = deserializeEvent(cur.getBusEventClass(), jsonWithAccountAndTenantRecorId);
             result++;
             // STEPH exception handling is done by GUAVA-- logged a bug Issue-780
             eventBusDelegate.post(evt);
-            dao.clearBusEvent(cur.getId(), hostname, context);
+            final InternalCallContext rehydratedContext = internalCallContextFactory.createInternalCallContext(cur.getTenantRecordId(), cur.getAccountRecordId(), context);
+            dao.clearBusEvent(cur.getId(), hostname, rehydratedContext);
         }
         return result;
     }
@@ -184,4 +186,17 @@ public class PersistentBus extends PersistentQueueBase implements Bus {
             log.error("Failed to post BusEvent " + event, e);
         }
     }
+
+
+    private String tweakJsonToIncludeAccountAndTenantRecordId(final String input, final Long accountRecordId, final Long tenantRecordId) {
+        int lastIndexPriorFinalBracket = input.lastIndexOf("}");
+        final StringBuilder tmp = new StringBuilder(input.substring(0, lastIndexPriorFinalBracket));
+        tmp.append(",\"accountRecordId\":");
+        tmp.append(accountRecordId);
+        tmp.append(",\"tenantRecordId\":");
+        tmp.append(tenantRecordId);
+        tmp.append("}");
+        return tmp.toString();
+    }
+
 }
diff --git a/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContext.java b/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContext.java
index 1496065..9f6da10 100644
--- a/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContext.java
+++ b/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContext.java
@@ -57,12 +57,13 @@ public class InternalCallContext extends InternalTenantContext {
     }
 
 
-/*
+    // TODO should not be needed if all services are using internal API
+    // Unfortunately not true as some APIs ae hidden in object-- e.g OverdueStateApplicator is doing subscription.cancelWithPolicy(polciy, context);
+    //
     public CallContext toCallContext() {
-        // TODO - can't go back to CallContext (need to extract internal APIs first)
         return new DefaultCallContext(null, userName, callOrigin, userType, reasonCode, comment, userToken, createdDate, updatedDate);
     }
-*/
+
     public UUID getUserToken() {
         return userToken;
     }
diff --git a/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContextFactory.java b/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContextFactory.java
index a9dd53f..950f1e3 100644
--- a/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContextFactory.java
+++ b/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContextFactory.java
@@ -283,10 +283,12 @@ public class InternalCallContextFactory {
         }
         return tenantRecordId;
     }
-/*
-    // TODO - remove
-    public InternalCallContext createInternalCallContext(final String userName, final CallOrigin callOrigin, final UserType userType, final UUID userToken) {
+
+    /*
+    // Needed by PersistentBus to retrieve events
+    public InternalCallContext createInternalCallContextX(final String userName, final CallOrigin callOrigin, final UserType userType, final UUID userToken) {
         return createInternalCallContext(INTERNAL_TENANT_RECORD_ID, null, userName, callOrigin, userType, userToken);
     }
     */
+
 }
diff --git a/util/src/main/java/com/ning/billing/util/events/DefaultBusInternalEvent.java b/util/src/main/java/com/ning/billing/util/events/DefaultBusInternalEvent.java
index 3e6980b..ad450fb 100644
--- a/util/src/main/java/com/ning/billing/util/events/DefaultBusInternalEvent.java
+++ b/util/src/main/java/com/ning/billing/util/events/DefaultBusInternalEvent.java
@@ -17,6 +17,8 @@ package com.ning.billing.util.events;
 
 import java.util.UUID;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
 public abstract class DefaultBusInternalEvent implements BusInternalEvent {
 
     private final UUID userToken;
@@ -34,11 +36,13 @@ public abstract class DefaultBusInternalEvent implements BusInternalEvent {
         return userToken;
     }
 
+    @JsonIgnore
     @Override
     public Long getTenantRecordId() {
         return tenantRecordId;
     }
 
+    @JsonIgnore
     @Override
     public Long getAccountRecordId() {
         return accountRecordId;