killbill-memoizeit

server: populate audit logs for subscription and subscription

8/13/2012 6:23:30 PM

Details

diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
index 633b6a3..0a177e8 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
@@ -106,19 +106,23 @@ public class AccountTimelineJson {
              paymentsAuditLogs == null ? ImmutableMap.<UUID, List<AuditLog>>of() : paymentsAuditLogs.getPaymentsAuditLogs(),
              refundsAuditLogs == null ? ImmutableMap.<UUID, List<AuditLog>>of() : refundsAuditLogs.getRefundsAuditLogs(),
              chargebacksAuditLogs == null ? ImmutableMap.<UUID, List<AuditLog>>of() : chargebacksAuditLogs.getInvoicePaymentsAuditLogs(),
-             bundlesAuditLogs == null ? ImmutableMap.<UUID, List<AuditLog>>of() : bundlesAuditLogs.getBundlesAuditLogs());
+             bundlesAuditLogs == null ? ImmutableMap.<UUID, List<AuditLog>>of() : bundlesAuditLogs.getBundlesAuditLogs(),
+             bundlesAuditLogs == null ? ImmutableMap.<UUID, List<AuditLog>>of() : bundlesAuditLogs.getSubscriptionsAuditLogs(),
+             bundlesAuditLogs == null ? ImmutableMap.<UUID, List<AuditLog>>of() : bundlesAuditLogs.getSubscriptionEventsAuditLogs());
     }
 
     public AccountTimelineJson(final Account account, final List<Invoice> invoices, final List<Payment> payments, final List<BundleTimeline> bundles,
                                final Multimap<UUID, Refund> refundsByPayment, final Multimap<UUID, InvoicePayment> chargebacksByPayment,
                                final Map<UUID, List<AuditLog>> invoiceAuditLogs, final Map<UUID, List<AuditLog>> invoiceItemsAuditLogs,
                                final Map<UUID, List<AuditLog>> paymentsAuditLogs, final Map<UUID, List<AuditLog>> refundsAuditLogs,
-                               final Map<UUID, List<AuditLog>> chargebacksAuditLogs, final Map<UUID, List<AuditLog>> bundlesAuditLogs) {
+                               final Map<UUID, List<AuditLog>> chargebacksAuditLogs, final Map<UUID, List<AuditLog>> bundlesAuditLogs,
+                               final Map<UUID, List<AuditLog>> subscriptionsAuditLogs, final Map<UUID, List<AuditLog>> subscriptionEventsAuditLogs) {
         this.account = new AccountJsonSimple(account.getId().toString(), account.getExternalKey());
         this.bundles = new LinkedList<BundleJsonWithSubscriptions>();
         for (final BundleTimeline bundle : bundles) {
-            final List<AuditLog> auditLogs = bundlesAuditLogs.get(bundle.getBundleId());
-            final BundleJsonWithSubscriptions jsonWithSubscriptions = new BundleJsonWithSubscriptions(account.getId(), bundle, auditLogs);
+            final List<AuditLog> bundleAuditLogs = bundlesAuditLogs.get(bundle.getBundleId());
+            final BundleJsonWithSubscriptions jsonWithSubscriptions = new BundleJsonWithSubscriptions(bundle, bundleAuditLogs,
+                                                                                                      subscriptionsAuditLogs, subscriptionEventsAuditLogs);
             this.bundles.add(jsonWithSubscriptions);
         }
 
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BundleJsonWithSubscriptions.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BundleJsonWithSubscriptions.java
index be03ceb..8fd820e 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BundleJsonWithSubscriptions.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BundleJsonWithSubscriptions.java
@@ -18,6 +18,7 @@ package com.ning.billing.jaxrs.json;
 
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
 import javax.annotation.Nullable;
@@ -47,11 +48,13 @@ public class BundleJsonWithSubscriptions extends BundleJsonSimple {
         return subscriptions;
     }
 
-    public BundleJsonWithSubscriptions(@Nullable final UUID accountId, final BundleTimeline bundle, final List<AuditLog> auditLogs) {
+    public BundleJsonWithSubscriptions(final BundleTimeline bundle, final List<AuditLog> auditLogs,
+                                       final Map<UUID, List<AuditLog>> subscriptionsAuditLogs, final Map<UUID, List<AuditLog>> subscriptionEventsAuditLogs) {
         super(bundle.getBundleId(), bundle.getExternalKey(), auditLogs);
         this.subscriptions = new LinkedList<SubscriptionJsonWithEvents>();
-        for (final SubscriptionTimeline cur : bundle.getSubscriptions()) {
-            this.subscriptions.add(new SubscriptionJsonWithEvents(bundle.getBundleId(), cur));
+        for (final SubscriptionTimeline subscriptionTimeline : bundle.getSubscriptions()) {
+            this.subscriptions.add(new SubscriptionJsonWithEvents(bundle.getBundleId(), subscriptionTimeline,
+                                                                  subscriptionsAuditLogs.get(subscriptionTimeline.getId()), subscriptionEventsAuditLogs));
         }
     }
 
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonNoEvents.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonNoEvents.java
index a03076f..4d5ecb6 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonNoEvents.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonNoEvents.java
@@ -16,29 +16,27 @@
 
 package com.ning.billing.jaxrs.json;
 
+import java.util.List;
+
 import javax.annotation.Nullable;
 
 import org.joda.time.DateTime;
 
+import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.util.audit.AuditLog;
+
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.ning.billing.entitlement.api.user.Subscription;
 
 public class SubscriptionJsonNoEvents extends SubscriptionJsonSimple {
-    private final DateTime startDate;
 
+    private final DateTime startDate;
     private final String bundleId;
-
     private final String productName;
-
     private final String productCategory;
-
     private final String billingPeriod;
-
     private final String priceList;
-
     private final DateTime chargedThroughDate;
-
     private final DateTime cancelledDate;
 
     @JsonCreator
@@ -50,8 +48,9 @@ public class SubscriptionJsonNoEvents extends SubscriptionJsonSimple {
                                     @JsonProperty("billingPeriod") @Nullable final String billingPeriod,
                                     @JsonProperty("priceList") @Nullable final String priceList,
                                     @JsonProperty("chargedThroughDate") @Nullable final DateTime chargedThroughDate,
-                                    @JsonProperty("cancelledDate") @Nullable final DateTime cancelledDate) {
-        super(subscriptionId);
+                                    @JsonProperty("cancelledDate") @Nullable final DateTime cancelledDate,
+                                    @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
+        super(subscriptionId, auditLogs);
         this.bundleId = bundleId;
         this.startDate = startDate;
         this.productName = productName;
@@ -62,20 +61,17 @@ public class SubscriptionJsonNoEvents extends SubscriptionJsonSimple {
         this.cancelledDate = cancelledDate;
     }
 
-    public SubscriptionJsonNoEvents() {
-        this(null, null, null, null, null, null, null, null, null);
-    }
-
-    public SubscriptionJsonNoEvents(final Subscription data) {
+    public SubscriptionJsonNoEvents(final Subscription data, @Nullable final List<AuditLog> auditLogs) {
         this(data.getId().toString(),
              data.getBundleId().toString(),
              data.getStartDate(),
              data.getCurrentPlan() != null ? data.getCurrentPlan().getProduct().getName() : null,
-             data.getCurrentPlan() != null ?data.getCurrentPlan().getProduct().getCategory().toString() : null,
-             data.getCurrentPlan() != null ?data.getCurrentPlan().getBillingPeriod().toString() : null,
+             data.getCurrentPlan() != null ? data.getCurrentPlan().getProduct().getCategory().toString() : null,
+             data.getCurrentPlan() != null ? data.getCurrentPlan().getBillingPeriod().toString() : null,
              data.getCurrentPriceList() != null ? data.getCurrentPriceList().getName() : null,
              data.getChargedThroughDate(),
-             data.getEndDate() != null ? data.getEndDate() : data.getFutureEndDate());
+             data.getEndDate() != null ? data.getEndDate() : data.getFutureEndDate(),
+             toAuditLogJson(auditLogs));
     }
 
     @Override
@@ -118,9 +114,9 @@ public class SubscriptionJsonNoEvents extends SubscriptionJsonSimple {
     @Override
     public String toString() {
         return "SubscriptionJson [subscriptionId=" + subscriptionId
-                + ", bundleId=" + bundleId + ", productName=" + productName
-                + ", productCategory=" + productCategory + ", billingPeriod="
-                + billingPeriod + ", priceList=" + priceList + "]";
+               + ", bundleId=" + bundleId + ", productName=" + productName
+               + ", productCategory=" + productCategory + ", billingPeriod="
+               + billingPeriod + ", priceList=" + priceList + "]";
     }
 
     @Override
@@ -128,8 +124,8 @@ public class SubscriptionJsonNoEvents extends SubscriptionJsonSimple {
         if (equalsNoSubscriptionIdNoStartDateNoCTD(o) && super.equals(o)) {
             final SubscriptionJsonNoEvents that = (SubscriptionJsonNoEvents) o;
             return ((startDate == null && that.startDate == null) || (startDate != null && that.startDate != null && startDate.compareTo(that.startDate) == 0)) &&
-                    ((chargedThroughDate == null && that.chargedThroughDate == null) || (chargedThroughDate != null && that.chargedThroughDate != null &&
-                            chargedThroughDate.compareTo(that.chargedThroughDate) == 0));
+                   ((chargedThroughDate == null && that.chargedThroughDate == null) || (chargedThroughDate != null && that.chargedThroughDate != null &&
+                                                                                        chargedThroughDate.compareTo(that.chargedThroughDate) == 0));
         } else {
             return false;
         }
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonSimple.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonSimple.java
index 28d5365..acdd875 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonSimple.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonSimple.java
@@ -13,23 +13,24 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
+
 package com.ning.billing.jaxrs.json;
 
+import java.util.List;
+
 import javax.annotation.Nullable;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class SubscriptionJsonSimple {
+public class SubscriptionJsonSimple extends JsonBase {
 
     protected final String subscriptionId;
 
-    public SubscriptionJsonSimple() {
-        this(null);
-    }
-
     @JsonCreator
-    public SubscriptionJsonSimple(@JsonProperty("subscriptionId") @Nullable final String subscriptionId) {
+    public SubscriptionJsonSimple(@JsonProperty("subscriptionId") @Nullable final String subscriptionId,
+                                  @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
+        super(auditLogs);
         this.subscriptionId = subscriptionId;
     }
 
@@ -38,6 +39,15 @@ public class SubscriptionJsonSimple {
     }
 
     @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("SubscriptionJsonSimple");
+        sb.append("{subscriptionId='").append(subscriptionId).append('\'');
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
     public boolean equals(final Object o) {
         if (this == o) {
             return true;
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonWithEvents.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonWithEvents.java
index 73508ad..674a9d2 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonWithEvents.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonWithEvents.java
@@ -13,23 +13,28 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
+
 package com.ning.billing.jaxrs.json;
 
-import javax.annotation.Nullable;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
+import javax.annotation.Nullable;
+
 import org.joda.time.DateTime;
 
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.entitlement.api.timeline.SubscriptionTimeline;
 import com.ning.billing.entitlement.api.timeline.SubscriptionTimeline.ExistingEvent;
 import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.util.audit.AuditLog;
 import com.ning.billing.util.clock.DefaultClock;
 
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 public class SubscriptionJsonWithEvents extends SubscriptionJsonSimple {
 
     private final List<SubscriptionReadEventJson> events;
@@ -41,15 +46,8 @@ public class SubscriptionJsonWithEvents extends SubscriptionJsonSimple {
     public static class SubscriptionReadEventJson extends SubscriptionBaseEventJson {
 
         private final String eventId;
-
         private final DateTime effectiveDate;
 
-        public SubscriptionReadEventJson() {
-            super();
-            this.eventId = null;
-            this.effectiveDate = null;
-        }
-
         @JsonCreator
         public SubscriptionReadEventJson(@JsonProperty("eventId") final String eventId,
                                          @JsonProperty("billingPeriod") final String billingPeriod,
@@ -58,8 +56,9 @@ public class SubscriptionJsonWithEvents extends SubscriptionJsonSimple {
                                          @JsonProperty("product") final String product,
                                          @JsonProperty("priceList") final String priceList,
                                          @JsonProperty("eventType") final String eventType,
-                                         @JsonProperty("phase") final String phase) {
-            super(billingPeriod, requestedDate, product, priceList, eventType, phase);
+                                         @JsonProperty("phase") final String phase,
+                                         @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
+            super(billingPeriod, requestedDate, product, priceList, eventType, phase, auditLogs);
             this.eventId = eventId;
             this.effectiveDate = effectiveDate;
         }
@@ -75,14 +74,14 @@ public class SubscriptionJsonWithEvents extends SubscriptionJsonSimple {
         @Override
         public String toString() {
             return "SubscriptionReadEventJson [eventId=" + eventId
-                    + ", effectiveDate=" + effectiveDate
-                    + ", getBillingPeriod()=" + getBillingPeriod()
-                    + ", getRequestedDate()=" + getRequestedDate()
-                    + ", getProduct()=" + getProduct() + ", getPriceList()="
-                    + getPriceList() + ", getEventType()=" + getEventType()
-                    + ", getPhase()=" + getPhase() + ", getClass()="
-                    + getClass() + ", hashCode()=" + hashCode()
-                    + ", toString()=" + super.toString() + "]";
+                   + ", effectiveDate=" + effectiveDate
+                   + ", getBillingPeriod()=" + getBillingPeriod()
+                   + ", getRequestedDate()=" + getRequestedDate()
+                   + ", getProduct()=" + getProduct() + ", getPriceList()="
+                   + getPriceList() + ", getEventType()=" + getEventType()
+                   + ", getPhase()=" + getPhase() + ", getClass()="
+                   + getClass() + ", hashCode()=" + hashCode()
+                   + ", toString()=" + super.toString() + "]";
         }
 
         @Override
@@ -115,6 +114,7 @@ public class SubscriptionJsonWithEvents extends SubscriptionJsonSimple {
     }
 
     public static class SubscriptionDeletedEventJson extends SubscriptionReadEventJson {
+
         @JsonCreator
         public SubscriptionDeletedEventJson(@JsonProperty("event_id") final String eventId,
                                             @JsonProperty("billing_period") final String billingPeriod,
@@ -123,66 +123,56 @@ public class SubscriptionJsonWithEvents extends SubscriptionJsonSimple {
                                             @JsonProperty("product") final String product,
                                             @JsonProperty("price_list") final String priceList,
                                             @JsonProperty("event_type") final String eventType,
-                                            @JsonProperty("phase") final String phase) {
-            super(eventId, billingPeriod, requestedDate, effectiveDate, product, priceList, eventType, phase);
+                                            @JsonProperty("phase") final String phase,
+                                            @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
+            super(eventId, billingPeriod, requestedDate, effectiveDate, product, priceList, eventType, phase, auditLogs);
         }
     }
 
     public static class SubscriptionNewEventJson extends SubscriptionBaseEventJson {
+
         @JsonCreator
         public SubscriptionNewEventJson(@JsonProperty("billing_period") final String billingPeriod,
                                         @JsonProperty("requested_date") final DateTime requestedDate,
                                         @JsonProperty("product") final String product,
                                         @JsonProperty("price_list") final String priceList,
                                         @JsonProperty("event_type") final String eventType,
-                                        @JsonProperty("phase") final String phase) {
-            super(billingPeriod, requestedDate, product, priceList, eventType, phase);
+                                        @JsonProperty("phase") final String phase,
+                                        @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
+            super(billingPeriod, requestedDate, product, priceList, eventType, phase, auditLogs);
         }
 
         @Override
         public String toString() {
             return "SubscriptionNewEventJson [getBillingPeriod()="
-                    + getBillingPeriod() + ", getRequestedDate()="
-                    + getRequestedDate() + ", getProduct()=" + getProduct()
-                    + ", getPriceList()=" + getPriceList()
-                    + ", getEventType()=" + getEventType() + ", getPhase()="
-                    + getPhase() + ", getClass()=" + getClass()
-                    + ", hashCode()=" + hashCode() + ", toString()="
-                    + super.toString() + "]";
+                   + getBillingPeriod() + ", getRequestedDate()="
+                   + getRequestedDate() + ", getProduct()=" + getProduct()
+                   + ", getPriceList()=" + getPriceList()
+                   + ", getEventType()=" + getEventType() + ", getPhase()="
+                   + getPhase() + ", getClass()=" + getClass()
+                   + ", hashCode()=" + hashCode() + ", toString()="
+                   + super.toString() + "]";
         }
     }
 
-    public static class SubscriptionBaseEventJson {
+    public abstract static class SubscriptionBaseEventJson extends JsonBase {
 
         private final String billingPeriod;
-
         private final DateTime requestedDate;
-
         private final String product;
-
         private final String priceList;
-
         private final String eventType;
-
         private final String phase;
 
-        public SubscriptionBaseEventJson() {
-            this.billingPeriod = null;
-            this.requestedDate = null;
-            this.product = null;
-            this.priceList = null;
-            this.eventType = null;
-            this.phase = null;
-        }
-
         @JsonCreator
         public SubscriptionBaseEventJson(@JsonProperty("billing_period") final String billingPeriod,
                                          @JsonProperty("requested_date") final DateTime requestedDate,
                                          @JsonProperty("product") final String product,
                                          @JsonProperty("price_list") final String priceList,
                                          @JsonProperty("event_type") final String eventType,
-                                         @JsonProperty("phase") final String phase) {
-            super();
+                                         @JsonProperty("phase") final String phase,
+                                         @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
+            super(auditLogs);
             this.billingPeriod = billingPeriod;
             this.requestedDate = DefaultClock.toUTCDateTime(requestedDate);
             this.product = product;
@@ -216,6 +206,20 @@ public class SubscriptionJsonWithEvents extends SubscriptionJsonSimple {
         }
 
         @Override
+        public String toString() {
+            final StringBuilder sb = new StringBuilder();
+            sb.append("SubscriptionBaseEventJson");
+            sb.append("{billingPeriod='").append(billingPeriod).append('\'');
+            sb.append(", requestedDate=").append(requestedDate);
+            sb.append(", product='").append(product).append('\'');
+            sb.append(", priceList='").append(priceList).append('\'');
+            sb.append(", eventType='").append(eventType).append('\'');
+            sb.append(", phase='").append(phase).append('\'');
+            sb.append('}');
+            return sb.toString();
+        }
+
+        @Override
         public boolean equals(final Object o) {
             if (this == o) {
                 return true;
@@ -264,31 +268,32 @@ public class SubscriptionJsonWithEvents extends SubscriptionJsonSimple {
     public SubscriptionJsonWithEvents(@JsonProperty("subscription_id") @Nullable final String subscriptionId,
                                       @JsonProperty("events") @Nullable final List<SubscriptionReadEventJson> events,
                                       @JsonProperty("new_events") @Nullable final List<SubscriptionNewEventJson> newEvents,
-                                      @JsonProperty("deleted_events") @Nullable final List<SubscriptionDeletedEventJson> deletedEvents) {
-        super(subscriptionId);
+                                      @JsonProperty("deleted_events") @Nullable final List<SubscriptionDeletedEventJson> deletedEvents,
+                                      @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
+        super(subscriptionId, auditLogs);
         this.events = events;
         this.deletedEvents = deletedEvents;
         this.newEvents = newEvents;
     }
 
-    public SubscriptionJsonWithEvents() {
-        this((String) null, null, null, null);
-    }
-
     public SubscriptionJsonWithEvents(final Subscription data,
                                       @Nullable final List<SubscriptionReadEventJson> events,
                                       @Nullable final List<SubscriptionNewEventJson> newEvents,
-                                      @Nullable final List<SubscriptionDeletedEventJson> deletedEvents) {
-        this(data.getId().toString(), events, newEvents, deletedEvents);
+                                      @Nullable final List<SubscriptionDeletedEventJson> deletedEvents,
+                                      @Nullable final List<AuditLog> auditLogs) {
+        this(data.getId().toString(), events, newEvents, deletedEvents, toAuditLogJson(auditLogs));
     }
 
-    public SubscriptionJsonWithEvents(@Nullable final UUID bundleId, final SubscriptionTimeline input) {
-        super(input.getId().toString());
+    public SubscriptionJsonWithEvents(@Nullable final UUID bundleId, final SubscriptionTimeline input,
+                                      final List<AuditLog> bundleAuditLogs, final Map<UUID, List<AuditLog>> subscriptionEventsAuditLogs) {
+        super(input.getId().toString(), toAuditLogJson(bundleAuditLogs));
+
         this.events = new LinkedList<SubscriptionReadEventJson>();
-        for (final ExistingEvent cur : input.getExistingEvents()) {
-            final PlanPhaseSpecifier spec = cur.getPlanPhaseSpecifier();
-            this.events.add(new SubscriptionReadEventJson(cur.getEventId().toString(), spec.getBillingPeriod().toString(), cur.getRequestedDate(), cur.getEffectiveDate(),
-                                                          spec.getProductName(), spec.getPriceListName(), cur.getSubscriptionTransitionType().toString(), spec.getPhaseType().toString()));
+        for (final ExistingEvent event : input.getExistingEvents()) {
+            final PlanPhaseSpecifier spec = event.getPlanPhaseSpecifier();
+            this.events.add(new SubscriptionReadEventJson(event.getEventId().toString(), spec.getBillingPeriod().toString(), event.getRequestedDate(), event.getEffectiveDate(),
+                                                          spec.getProductName(), spec.getPriceListName(), event.getSubscriptionTransitionType().toString(), spec.getPhaseType().toString(),
+                                                          toAuditLogJson(subscriptionEventsAuditLogs.get(event.getEventId()))));
         }
         this.newEvents = null;
         this.deletedEvents = null;
@@ -311,6 +316,17 @@ public class SubscriptionJsonWithEvents extends SubscriptionJsonSimple {
     }
 
     @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("SubscriptionJsonWithEvents");
+        sb.append("{events=").append(events);
+        sb.append(", deletedEvents=").append(deletedEvents);
+        sb.append(", newEvents=").append(newEvents);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
     public boolean equals(final Object o) {
         if (this == o) {
             return true;
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
index 4ecee4e..3c97ee0 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
@@ -226,18 +226,15 @@ public class AccountResource extends JaxRsResourceBase {
 
         // Get the invoices
         final List<Invoice> invoices = invoiceApi.getInvoicesByAccount(account.getId());
-        AuditLogsForInvoices invoicesAuditLogs = null;
-        invoicesAuditLogs = auditUserApi.getAuditLogsForInvoices(invoices, auditMode.getLevel());
+        final AuditLogsForInvoices invoicesAuditLogs = auditUserApi.getAuditLogsForInvoices(invoices, auditMode.getLevel());
 
         // Get the payments
         final List<Payment> payments = paymentApi.getAccountPayments(accountId);
-        AuditLogsForPayments paymentsAuditLogs = null;
-        paymentsAuditLogs = auditUserApi.getAuditLogsForPayments(payments, auditMode.getLevel());
+        final AuditLogsForPayments paymentsAuditLogs = auditUserApi.getAuditLogsForPayments(payments, auditMode.getLevel());
 
         // Get the refunds
         final List<Refund> refunds = paymentApi.getAccountRefunds(account);
-        AuditLogsForRefunds refundsAuditLogs = null;
-        refundsAuditLogs = auditUserApi.getAuditLogsForRefunds(refunds, auditMode.getLevel());
+        final AuditLogsForRefunds refundsAuditLogs = auditUserApi.getAuditLogsForRefunds(refunds, auditMode.getLevel());
         final Multimap<UUID, Refund> refundsByPayment = ArrayListMultimap.<UUID, Refund>create();
         for (final Refund refund : refunds) {
             refundsByPayment.put(refund.getPaymentId(), refund);
@@ -245,8 +242,7 @@ public class AccountResource extends JaxRsResourceBase {
 
         // Get the chargebacks
         final List<InvoicePayment> chargebacks = invoicePaymentApi.getChargebacksByAccountId(accountId);
-        AuditLogsForInvoicePayments chargebacksAuditLogs = null;
-        chargebacksAuditLogs = auditUserApi.getAuditLogsForInvoicePayments(chargebacks, auditMode.getLevel());
+        final AuditLogsForInvoicePayments chargebacksAuditLogs = auditUserApi.getAuditLogsForInvoicePayments(chargebacks, auditMode.getLevel());
         final Multimap<UUID, InvoicePayment> chargebacksByPayment = ArrayListMultimap.<UUID, InvoicePayment>create();
         for (final InvoicePayment chargeback : chargebacks) {
             chargebacksByPayment.put(chargeback.getPaymentId(), chargeback);
@@ -254,12 +250,11 @@ public class AccountResource extends JaxRsResourceBase {
 
         // Get the bundles
         final List<SubscriptionBundle> bundles = entitlementApi.getBundlesForAccount(account.getId());
-        AuditLogsForBundles bundlesAuditLogs = null;
-        bundlesAuditLogs = auditUserApi.getAuditLogsForBundles(bundles, auditMode.getLevel());
         final List<BundleTimeline> bundlesTimeline = new LinkedList<BundleTimeline>();
         for (final SubscriptionBundle bundle : bundles) {
             bundlesTimeline.add(timelineApi.getBundleTimeline(bundle.getId()));
         }
+        final AuditLogsForBundles bundlesAuditLogs = auditUserApi.getAuditLogsForBundles(bundlesTimeline, auditMode.getLevel());
 
         final AccountTimelineJson json = new AccountTimelineJson(account, invoices, payments, bundlesTimeline,
                                                                  refundsByPayment, chargebacksByPayment,
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java
index 889795d..81429b4 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java
@@ -95,7 +95,6 @@ public class BundleResource extends JaxRsResourceBase {
         return Response.status(Status.OK).entity(json).build();
     }
 
-
     @POST
     @Consumes(APPLICATION_JSON)
     @Produces(APPLICATION_JSON)
@@ -122,7 +121,7 @@ public class BundleResource extends JaxRsResourceBase {
         final Collection<SubscriptionJsonNoEvents> result = Collections2.transform(bundles, new Function<Subscription, SubscriptionJsonNoEvents>() {
             @Override
             public SubscriptionJsonNoEvents apply(final Subscription input) {
-                return new SubscriptionJsonNoEvents(input);
+                return new SubscriptionJsonNoEvents(input, null);
             }
         });
         return Response.status(Status.OK).entity(result).build();
@@ -173,19 +172,19 @@ public class BundleResource extends JaxRsResourceBase {
     @Consumes(APPLICATION_JSON)
     @Produces(APPLICATION_JSON)
     public Response transferBundle(@PathParam(ID_PARAM_NAME) final String id,
-            @QueryParam(QUERY_REQUESTED_DT) final String requestedDate,
-            @QueryParam(QUERY_BUNDLE_TRANSFER_ADDON) @DefaultValue("true") final Boolean transferAddOn,
-            @QueryParam(QUERY_BUNDLE_TRANSFER_CANCEL_IMM) @DefaultValue("false") final Boolean cancelImmediatley,
-            final BundleJsonNoSubscriptions json,
-            @HeaderParam(HDR_CREATED_BY) final String createdBy,
-            @HeaderParam(HDR_REASON) final String reason,
-            @HeaderParam(HDR_COMMENT) final String comment,
-            @javax.ws.rs.core.Context final UriInfo uriInfo) throws EntitlementUserApiException, EntitlementTransferApiException {
+                                   @QueryParam(QUERY_REQUESTED_DT) final String requestedDate,
+                                   @QueryParam(QUERY_BUNDLE_TRANSFER_ADDON) @DefaultValue("true") final Boolean transferAddOn,
+                                   @QueryParam(QUERY_BUNDLE_TRANSFER_CANCEL_IMM) @DefaultValue("false") final Boolean cancelImmediatley,
+                                   final BundleJsonNoSubscriptions json,
+                                   @HeaderParam(HDR_CREATED_BY) final String createdBy,
+                                   @HeaderParam(HDR_REASON) final String reason,
+                                   @HeaderParam(HDR_COMMENT) final String comment,
+                                   @javax.ws.rs.core.Context final UriInfo uriInfo) throws EntitlementUserApiException, EntitlementTransferApiException {
 
         final SubscriptionBundle bundle = entitlementApi.getBundleFromId(UUID.fromString(id));
         final DateTime inputDate = (requestedDate != null) ? DATE_TIME_FORMATTER.parseDateTime(requestedDate) : null;
         final SubscriptionBundle newBundle = transferApi.transferBundle(bundle.getAccountId(), UUID.fromString(json.getAccountId()), bundle.getKey(), inputDate, transferAddOn,
-                cancelImmediatley, context.createContext(createdBy, reason, comment));
+                                                                        cancelImmediatley, context.createContext(createdBy, reason, comment));
 
         return uriBuilder.buildResponse(BundleResource.class, "getBundle", newBundle.getId(), uriInfo.getBaseUri().toString());
     }
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java
index 69ebb23..68dacad 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java
@@ -102,7 +102,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
     public Response getSubscription(@PathParam("subscriptionId") final String subscriptionId) throws EntitlementUserApiException {
         final UUID uuid = UUID.fromString(subscriptionId);
         final Subscription subscription = entitlementApi.getSubscriptionFromId(uuid);
-        final SubscriptionJsonNoEvents json = new SubscriptionJsonNoEvents(subscription);
+        final SubscriptionJsonNoEvents json = new SubscriptionJsonNoEvents(subscription, null);
         return Response.status(Status.OK).entity(json).build();
     }
 
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleJsonWithSubscriptions.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleJsonWithSubscriptions.java
index 36e328b..8f3ac82 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleJsonWithSubscriptions.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleJsonWithSubscriptions.java
@@ -33,9 +33,11 @@ import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.timeline.BundleTimeline;
 import com.ning.billing.entitlement.api.timeline.SubscriptionTimeline;
 import com.ning.billing.jaxrs.JaxrsTestSuite;
+import com.ning.billing.util.audit.AuditLog;
 import com.ning.billing.util.clock.DefaultClock;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 
 public class TestBundleJsonWithSubscriptions extends JaxrsTestSuite {
 
@@ -58,7 +60,7 @@ public class TestBundleJsonWithSubscriptions extends JaxrsTestSuite {
 
         final UUID bundleId = UUID.randomUUID();
         final String externalKey = UUID.randomUUID().toString();
-        final SubscriptionJsonWithEvents subscription = new SubscriptionJsonWithEvents(bundleId, subscriptionTimeline);
+        final SubscriptionJsonWithEvents subscription = new SubscriptionJsonWithEvents(bundleId, subscriptionTimeline, null, ImmutableMap.<UUID, List<AuditLog>>of());
         final List<AuditLogJson> auditLogs = createAuditLogsJson();
         final BundleJsonWithSubscriptions bundleJsonWithSubscriptions = new BundleJsonWithSubscriptions(bundleId.toString(), externalKey, ImmutableList.<SubscriptionJsonWithEvents>of(subscription), auditLogs);
         Assert.assertEquals(bundleJsonWithSubscriptions.getBundleId(), bundleId.toString());
@@ -95,7 +97,9 @@ public class TestBundleJsonWithSubscriptions extends JaxrsTestSuite {
         Mockito.when(bundleTimeline.getExternalKey()).thenReturn(externalKey);
         Mockito.when(bundleTimeline.getSubscriptions()).thenReturn(ImmutableList.<SubscriptionTimeline>of(subscriptionTimeline));
 
-        final BundleJsonWithSubscriptions bundleJsonWithSubscriptions = new BundleJsonWithSubscriptions(null, bundleTimeline, null);
+        final BundleJsonWithSubscriptions bundleJsonWithSubscriptions = new BundleJsonWithSubscriptions(bundleTimeline, null,
+                                                                                                        ImmutableMap.<UUID, List<AuditLog>>of(),
+                                                                                                        ImmutableMap.<UUID, List<AuditLog>>of());
         Assert.assertEquals(bundleJsonWithSubscriptions.getBundleId(), bundleId.toString());
         Assert.assertEquals(bundleJsonWithSubscriptions.getExternalKey(), externalKey);
         Assert.assertEquals(bundleJsonWithSubscriptions.getSubscriptions().size(), 1);
@@ -117,7 +121,9 @@ public class TestBundleJsonWithSubscriptions extends JaxrsTestSuite {
         Mockito.when(bundle.getBundleId()).thenReturn(bundleId);
         Mockito.when(bundle.getExternalKey()).thenReturn(externalKey);
 
-        final BundleJsonWithSubscriptions bundleJsonWithSubscriptions = new BundleJsonWithSubscriptions(null, bundle, null);
+        final BundleJsonWithSubscriptions bundleJsonWithSubscriptions = new BundleJsonWithSubscriptions(bundle, null,
+                                                                                                        ImmutableMap.<UUID, List<AuditLog>>of(),
+                                                                                                        ImmutableMap.<UUID, List<AuditLog>>of());
         Assert.assertEquals(bundleJsonWithSubscriptions.getBundleId(), bundleId.toString());
         Assert.assertEquals(bundleJsonWithSubscriptions.getExternalKey(), externalKey);
         Assert.assertEquals(bundleJsonWithSubscriptions.getSubscriptions().size(), 0);
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java
index 17df65d..572b678 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleTimelineJson.java
@@ -17,6 +17,7 @@
 package com.ning.billing.jaxrs.json;
 
 import java.math.BigDecimal;
+import java.util.List;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
@@ -32,10 +33,12 @@ import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.timeline.SubscriptionTimeline;
 import com.ning.billing.jaxrs.JaxrsTestSuite;
+import com.ning.billing.util.audit.AuditLog;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.DefaultClock;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 
 public class TestBundleTimelineJson extends JaxrsTestSuite {
 
@@ -80,7 +83,7 @@ public class TestBundleTimelineJson extends JaxrsTestSuite {
 
         final UUID bundleId = UUID.randomUUID();
         final String externalKey = UUID.randomUUID().toString();
-        final SubscriptionJsonWithEvents subscription = new SubscriptionJsonWithEvents(bundleId, subscriptionTimeline);
+        final SubscriptionJsonWithEvents subscription = new SubscriptionJsonWithEvents(bundleId, subscriptionTimeline, null, ImmutableMap.<UUID, List<AuditLog>>of());
 
         return new BundleJsonWithSubscriptions(bundleId.toString(), externalKey, ImmutableList.<SubscriptionJsonWithEvents>of(subscription), null);
     }
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonNoEvents.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonNoEvents.java
index d4e62f0..34ada37 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonNoEvents.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonNoEvents.java
@@ -16,6 +16,7 @@
 
 package com.ning.billing.jaxrs.json;
 
+import java.util.List;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
@@ -24,9 +25,6 @@ import org.mockito.Mockito;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.datatype.joda.JodaModule;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.InternationalPrice;
 import com.ning.billing.catalog.api.Plan;
@@ -37,7 +35,12 @@ import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.jaxrs.JaxrsTestSuite;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.joda.JodaModule;
+
 public class TestSubscriptionJsonNoEvents extends JaxrsTestSuite {
+
     private static final ObjectMapper mapper = new ObjectMapper();
 
     static {
@@ -56,10 +59,11 @@ public class TestSubscriptionJsonNoEvents extends JaxrsTestSuite {
         final String priceList = UUID.randomUUID().toString();
         final DateTime chargedThroughDate = new DateTime(DateTimeZone.UTC);
         final DateTime endDate = new DateTime(DateTimeZone.UTC);
-
+        final List<AuditLogJson> auditLogs = createAuditLogsJson();
         final SubscriptionJsonNoEvents subscriptionJsonNoEvents = new SubscriptionJsonNoEvents(subscriptionId, bundleId, startDate,
                                                                                                productName, productCategory, billingPeriod,
-                                                                                               priceList, chargedThroughDate, endDate);
+                                                                                               priceList, chargedThroughDate, endDate,
+                                                                                               auditLogs);
         Assert.assertEquals(subscriptionJsonNoEvents.getSubscriptionId(), subscriptionId);
         Assert.assertEquals(subscriptionJsonNoEvents.getBundleId(), bundleId);
         Assert.assertEquals(subscriptionJsonNoEvents.getStartDate(), startDate);
@@ -68,17 +72,9 @@ public class TestSubscriptionJsonNoEvents extends JaxrsTestSuite {
         Assert.assertEquals(subscriptionJsonNoEvents.getBillingPeriod(), billingPeriod);
         Assert.assertEquals(subscriptionJsonNoEvents.getPriceList(), priceList);
         Assert.assertEquals(subscriptionJsonNoEvents.getChargedThroughDate(), chargedThroughDate);
+        Assert.assertEquals(subscriptionJsonNoEvents.getAuditLogs(), auditLogs);
 
         final String asJson = mapper.writeValueAsString(subscriptionJsonNoEvents);
-        Assert.assertEquals(asJson, "{\"subscriptionId\":\"" + subscriptionJsonNoEvents.getSubscriptionId() + "\"," +
-                "\"bundleId\":\"" + subscriptionJsonNoEvents.getBundleId() + "\"," +
-                "\"startDate\":\"" + subscriptionJsonNoEvents.getStartDate().toDateTimeISO().toString() + "\"," +
-                "\"productName\":\"" + subscriptionJsonNoEvents.getProductName() + "\"," +
-                "\"productCategory\":\"" + subscriptionJsonNoEvents.getProductCategory() + "\"," +
-                "\"billingPeriod\":\"" + subscriptionJsonNoEvents.getBillingPeriod() + "\"," +
-                "\"priceList\":\"" + subscriptionJsonNoEvents.getPriceList() + "\"," +
-                "\"chargedThroughDate\":\"" + subscriptionJsonNoEvents.getChargedThroughDate().toDateTimeISO().toString() + "\"," +
-                "\"cancelledDate\":\"" + subscriptionJsonNoEvents.getCancelledDate().toDateTimeISO().toString() + "\"}");
 
         final SubscriptionJsonNoEvents fromJson = mapper.readValue(asJson, SubscriptionJsonNoEvents.class);
         Assert.assertEquals(fromJson, subscriptionJsonNoEvents);
@@ -110,7 +106,7 @@ public class TestSubscriptionJsonNoEvents extends JaxrsTestSuite {
         Mockito.when(subscription.getCurrentPriceList()).thenReturn(priceList);
         Mockito.when(subscription.getChargedThroughDate()).thenReturn(new DateTime(DateTimeZone.UTC));
 
-        final SubscriptionJsonNoEvents subscriptionJsonNoEvents = new SubscriptionJsonNoEvents(subscription);
+        final SubscriptionJsonNoEvents subscriptionJsonNoEvents = new SubscriptionJsonNoEvents(subscription, null);
         Assert.assertEquals(subscriptionJsonNoEvents.getSubscriptionId(), subscription.getId().toString());
         Assert.assertEquals(subscriptionJsonNoEvents.getStartDate(), subscription.getStartDate());
         Assert.assertEquals(subscriptionJsonNoEvents.getBundleId(), subscription.getBundleId().toString());
@@ -118,5 +114,6 @@ public class TestSubscriptionJsonNoEvents extends JaxrsTestSuite {
         Assert.assertEquals(subscriptionJsonNoEvents.getProductCategory(), subscription.getCurrentPlan().getProduct().getCategory().toString());
         Assert.assertEquals(subscriptionJsonNoEvents.getBillingPeriod(), subscription.getCurrentPlan().getBillingPeriod().toString());
         Assert.assertEquals(subscriptionJsonNoEvents.getChargedThroughDate(), subscription.getChargedThroughDate());
+        Assert.assertNull(subscriptionJsonNoEvents.getAuditLogs());
     }
 }
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonSimple.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonSimple.java
index e4631f9..a4ab2fc 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonSimple.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonSimple.java
@@ -16,25 +16,25 @@
 
 package com.ning.billing.jaxrs.json;
 
+import java.util.List;
 import java.util.UUID;
 
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ning.billing.jaxrs.JaxrsTestSuite;
 
 public class TestSubscriptionJsonSimple extends JaxrsTestSuite {
-    private static final ObjectMapper mapper = new ObjectMapper();
 
     @Test(groups = "fast")
     public void testJson() throws Exception {
         final String subscriptionId = UUID.randomUUID().toString();
-        final SubscriptionJsonSimple subscriptionJsonSimple = new SubscriptionJsonSimple(subscriptionId);
+        final List<AuditLogJson> auditLogs = createAuditLogsJson();
+        final SubscriptionJsonSimple subscriptionJsonSimple = new SubscriptionJsonSimple(subscriptionId, auditLogs);
         Assert.assertEquals(subscriptionJsonSimple.getSubscriptionId(), subscriptionId);
+        Assert.assertEquals(subscriptionJsonSimple.getAuditLogs(), auditLogs);
 
         final String asJson = mapper.writeValueAsString(subscriptionJsonSimple);
-        Assert.assertEquals(asJson, "{\"subscriptionId\":\"" + subscriptionJsonSimple.getSubscriptionId() + "\"}");
 
         final SubscriptionJsonSimple fromJson = mapper.readValue(asJson, SubscriptionJsonSimple.class);
         Assert.assertEquals(fromJson, subscriptionJsonSimple);
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonWithEvents.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonWithEvents.java
index a0dac08..010de17 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonWithEvents.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonWithEvents.java
@@ -16,6 +16,7 @@
 
 package com.ning.billing.jaxrs.json;
 
+import java.util.List;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
@@ -24,10 +25,6 @@ import org.mockito.Mockito;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.datatype.joda.JodaModule;
-import com.google.common.collect.ImmutableList;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
@@ -36,15 +33,13 @@ import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.timeline.SubscriptionTimeline;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.jaxrs.JaxrsTestSuite;
+import com.ning.billing.util.audit.AuditLog;
 import com.ning.billing.util.clock.DefaultClock;
 
-public class TestSubscriptionJsonWithEvents extends JaxrsTestSuite {
-    private static final ObjectMapper mapper = new ObjectMapper();
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 
-    static {
-        mapper.registerModule(new JodaModule());
-        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
-    }
+public class TestSubscriptionJsonWithEvents extends JaxrsTestSuite {
 
     @Test(groups = "fast")
     public void testJson() throws Exception {
@@ -52,6 +47,7 @@ public class TestSubscriptionJsonWithEvents extends JaxrsTestSuite {
         final DateTime requestedDate = DefaultClock.toUTCDateTime(new DateTime(DateTimeZone.UTC));
         final DateTime effectiveDate = DefaultClock.toUTCDateTime(new DateTime(DateTimeZone.UTC));
         final UUID eventId = UUID.randomUUID();
+        final List<AuditLogJson> auditLogs = createAuditLogsJson();
         final SubscriptionJsonWithEvents.SubscriptionReadEventJson newEvent = new SubscriptionJsonWithEvents.SubscriptionReadEventJson(eventId.toString(),
                                                                                                                                        BillingPeriod.NO_BILLING_PERIOD.toString(),
                                                                                                                                        requestedDate,
@@ -59,25 +55,15 @@ public class TestSubscriptionJsonWithEvents extends JaxrsTestSuite {
                                                                                                                                        UUID.randomUUID().toString(),
                                                                                                                                        UUID.randomUUID().toString(),
                                                                                                                                        SubscriptionTransitionType.CREATE.toString(),
-                                                                                                                                       PhaseType.DISCOUNT.toString());
+                                                                                                                                       PhaseType.DISCOUNT.toString(),
+                                                                                                                                       auditLogs);
         final SubscriptionJsonWithEvents subscriptionJsonWithEvents = new SubscriptionJsonWithEvents(subscriptionId,
                                                                                                      ImmutableList.<SubscriptionJsonWithEvents.SubscriptionReadEventJson>of(newEvent),
                                                                                                      null,
+                                                                                                     null,
                                                                                                      null);
 
         final String asJson = mapper.writeValueAsString(subscriptionJsonWithEvents);
-        final SubscriptionJsonWithEvents.SubscriptionReadEventJson event = subscriptionJsonWithEvents.getEvents().get(0);
-        Assert.assertEquals(asJson, "{\"events\":[{\"eventId\":\"" + event.getEventId() + "\"," +
-                "\"billingPeriod\":\"" + event.getBillingPeriod() + "\"," +
-                "\"product\":\"" + event.getProduct() + "\"," +
-                "\"priceList\":\"" + event.getPriceList() + "\"," +
-                "\"eventType\":\"" + event.getEventType() + "\"," +
-                "\"phase\":\"" + event.getPhase() + "\"," +
-                "\"requestedDate\":\"" + event.getRequestedDate() + "\"," +
-                "\"effectiveDate\":\"" + event.getEffectiveDate() + "\"}]," +
-                "\"subscriptionId\":\"" + subscriptionJsonWithEvents.getSubscriptionId() + "\"," +
-                "\"deletedEvents\":null," +
-                "\"newEvents\":null}");
 
         final SubscriptionJsonWithEvents fromJson = mapper.readValue(asJson, SubscriptionJsonWithEvents.class);
         Assert.assertEquals(fromJson, subscriptionJsonWithEvents);
@@ -88,6 +74,7 @@ public class TestSubscriptionJsonWithEvents extends JaxrsTestSuite {
         final DateTime requestedDate = DefaultClock.toUTCDateTime(new DateTime(DateTimeZone.UTC));
         final DateTime effectiveDate = DefaultClock.toUTCDateTime(new DateTime(DateTimeZone.UTC));
         final UUID eventId = UUID.randomUUID();
+        final List<AuditLogJson> auditLogs = createAuditLogsJson();
         final SubscriptionJsonWithEvents.SubscriptionReadEventJson newEvent = new SubscriptionJsonWithEvents.SubscriptionReadEventJson(eventId.toString(),
                                                                                                                                        BillingPeriod.NO_BILLING_PERIOD.toString(),
                                                                                                                                        requestedDate,
@@ -95,7 +82,8 @@ public class TestSubscriptionJsonWithEvents extends JaxrsTestSuite {
                                                                                                                                        UUID.randomUUID().toString(),
                                                                                                                                        UUID.randomUUID().toString(),
                                                                                                                                        SubscriptionTransitionType.CREATE.toString(),
-                                                                                                                                       PhaseType.DISCOUNT.toString());
+                                                                                                                                       PhaseType.DISCOUNT.toString(),
+                                                                                                                                       auditLogs);
 
         final Subscription subscription = Mockito.mock(Subscription.class);
         Mockito.when(subscription.getId()).thenReturn(UUID.randomUUID());
@@ -103,6 +91,7 @@ public class TestSubscriptionJsonWithEvents extends JaxrsTestSuite {
         final SubscriptionJsonWithEvents subscriptionJsonWithEvents = new SubscriptionJsonWithEvents(subscription,
                                                                                                      ImmutableList.<SubscriptionJsonWithEvents.SubscriptionReadEventJson>of(newEvent),
                                                                                                      null,
+                                                                                                     null,
                                                                                                      null);
         Assert.assertEquals(subscriptionJsonWithEvents.getSubscriptionId(), subscription.getId().toString());
         Assert.assertNull(subscriptionJsonWithEvents.getNewEvents());
@@ -110,6 +99,7 @@ public class TestSubscriptionJsonWithEvents extends JaxrsTestSuite {
         Assert.assertEquals(subscriptionJsonWithEvents.getEvents().size(), 1);
         Assert.assertEquals(subscriptionJsonWithEvents.getEvents().get(0).getEffectiveDate(), newEvent.getEffectiveDate());
         Assert.assertEquals(subscriptionJsonWithEvents.getEvents().get(0).getEventId(), newEvent.getEventId());
+        Assert.assertEquals(subscriptionJsonWithEvents.getEvents().get(0).getAuditLogs(), auditLogs);
     }
 
     @Test(groups = "fast")
@@ -131,7 +121,8 @@ public class TestSubscriptionJsonWithEvents extends JaxrsTestSuite {
 
         final UUID bundleId = UUID.randomUUID();
 
-        final SubscriptionJsonWithEvents subscriptionJsonWithEvents = new SubscriptionJsonWithEvents(bundleId, subscriptionTimeline);
+        final SubscriptionJsonWithEvents subscriptionJsonWithEvents = new SubscriptionJsonWithEvents(bundleId, subscriptionTimeline,
+                                                                                                     null, ImmutableMap.<UUID, List<AuditLog>>of());
         Assert.assertEquals(subscriptionJsonWithEvents.getSubscriptionId(), subscriptionTimeline.getId().toString());
         Assert.assertNull(subscriptionJsonWithEvents.getNewEvents());
         Assert.assertNull(subscriptionJsonWithEvents.getDeletedEvents());
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestAccountTimeline.java b/server/src/test/java/com/ning/billing/jaxrs/TestAccountTimeline.java
index 91496c9..189add2 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestAccountTimeline.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestAccountTimeline.java
@@ -195,19 +195,52 @@ public class TestAccountTimeline extends TestJaxrsBase {
 
             // Verify audits
             final List<AuditLogJson> bundleAuditLogs = timeline.getBundles().get(0).getAuditLogs();
+            final List<AuditLogJson> subscriptionAuditLogs = timeline.getBundles().get(0).getSubscriptions().get(0).getAuditLogs();
+            final List<AuditLogJson> subscriptionEvent1AuditLogs = timeline.getBundles().get(0).getSubscriptions().get(0).getEvents().get(0).getAuditLogs();
+            final List<AuditLogJson> subscriptionEvent2AuditLogs = timeline.getBundles().get(0).getSubscriptions().get(0).getEvents().get(1).getAuditLogs();
             if (AuditLevel.NONE.equals(auditLevel)) {
+                // Audits for bundles
                 Assert.assertEquals(bundleAuditLogs.size(), 0);
+
+                // Audits for subscriptions
+                Assert.assertEquals(subscriptionAuditLogs.size(), 0);
+
+                // Audit for subscription events
+                Assert.assertEquals(subscriptionEvent1AuditLogs.size(), 0);
+                Assert.assertEquals(subscriptionEvent2AuditLogs.size(), 0);
             } else if (AuditLevel.MINIMAL.equals(auditLevel)) {
+                // Audits for bundles
                 Assert.assertEquals(bundleAuditLogs.size(), 1);
                 verifyAuditLog(bundleAuditLogs.get(0), ChangeType.INSERT, reason, comment, createdBy, startTime, endTime);
+
+                // Audits for subscriptions
+                Assert.assertEquals(subscriptionAuditLogs.size(), 1);
+                verifyAuditLog(subscriptionAuditLogs.get(0), ChangeType.INSERT, reason, comment, createdBy, startTime, endTime);
+
+                // Audit for subscription events
+                Assert.assertEquals(subscriptionEvent1AuditLogs.size(), 1);
+                verifyAuditLog(subscriptionEvent1AuditLogs.get(0), ChangeType.INSERT, reason, comment, createdBy, startTime, endTime);
+                Assert.assertEquals(subscriptionEvent2AuditLogs.size(), 1);
+                verifyAuditLog(subscriptionEvent2AuditLogs.get(0), ChangeType.INSERT, reason, comment, createdBy, startTime, endTime);
             } else {
+                // Audits for bundles
                 Assert.assertEquals(bundleAuditLogs.size(), 3);
                 verifyAuditLog(bundleAuditLogs.get(0), ChangeType.INSERT, reason, comment, createdBy, startTime, endTime);
                 verifyAuditLog(bundleAuditLogs.get(1), ChangeType.UPDATE, null, null, TRANSITION, startTime, endTime);
                 verifyAuditLog(bundleAuditLogs.get(2), ChangeType.UPDATE, null, null, TRANSITION, startTime, endTime);
-            }
 
-            // TODO subscription events audit logs
+                // Audits for subscriptions
+                Assert.assertEquals(subscriptionAuditLogs.size(), 3);
+                verifyAuditLog(subscriptionAuditLogs.get(0), ChangeType.INSERT, reason, comment, createdBy, startTime, endTime);
+                verifyAuditLog(subscriptionAuditLogs.get(1), ChangeType.UPDATE, null, null, TRANSITION, startTime, endTime);
+                verifyAuditLog(subscriptionAuditLogs.get(2), ChangeType.UPDATE, null, null, TRANSITION, startTime, endTime);
+
+                // Audit for subscription events
+                Assert.assertEquals(subscriptionEvent1AuditLogs.size(), 1);
+                verifyAuditLog(subscriptionEvent1AuditLogs.get(0), ChangeType.INSERT, reason, comment, createdBy, startTime, endTime);
+                Assert.assertEquals(subscriptionEvent2AuditLogs.size(), 1);
+                verifyAuditLog(subscriptionEvent2AuditLogs.get(0), ChangeType.INSERT, reason, comment, createdBy, startTime, endTime);
+            }
         }
     }
 
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java b/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
index 71069c8..01d4f46 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
@@ -474,7 +474,9 @@ public class TestJaxrsBase extends ServerTestSuiteWithEmbeddedDB {
 
     protected SubscriptionJsonNoEvents createSubscription(final String bundleId, final String productName, final String productCategory, final String billingPeriod, final boolean waitCompletion) throws Exception {
 
-        final SubscriptionJsonNoEvents input = new SubscriptionJsonNoEvents(null, bundleId, null, productName, productCategory, billingPeriod, PriceListSet.DEFAULT_PRICELIST_NAME, null, null);
+        final SubscriptionJsonNoEvents input = new SubscriptionJsonNoEvents(null, bundleId, null, productName, productCategory,
+                                                                            billingPeriod, PriceListSet.DEFAULT_PRICELIST_NAME,
+                                                                            null, null, null);
         String baseJson = mapper.writeValueAsString(input);
 
         final Map<String, String> queryParams = waitCompletion ? getQueryParamsForCallCompletion("5") : DEFAULT_EMPTY_QUERY;
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestSubscription.java b/server/src/test/java/com/ning/billing/jaxrs/TestSubscription.java
index 9465e90..298370c 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestSubscription.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestSubscription.java
@@ -78,7 +78,7 @@ public class TestSubscription extends TestJaxrsBase {
                                                                                newProductName,
                                                                                subscriptionJson.getProductCategory(),
                                                                                subscriptionJson.getBillingPeriod(),
-                                                                               subscriptionJson.getPriceList(), null, null);
+                                                                               subscriptionJson.getPriceList(), null, null, null);
         baseJson = mapper.writeValueAsString(newInput);
 
         final Map<String, String> queryParams = getQueryParamsForCallCompletion(CALL_COMPLETION_TIMEOUT_SEC);
@@ -119,7 +119,7 @@ public class TestSubscription extends TestJaxrsBase {
     public void testWithNonExistentSubscription() throws Exception {
         final String uri = JaxrsResource.SUBSCRIPTIONS_PATH + "/" + UUID.randomUUID().toString();
         final SubscriptionJsonNoEvents subscriptionJson = new SubscriptionJsonNoEvents(null, UUID.randomUUID().toString(), null, "Pistol", ProductCategory.BASE.toString(), BillingPeriod.MONTHLY.toString(),
-                                                                                       PriceListSet.DEFAULT_PRICELIST_NAME, null, null);
+                                                                                       PriceListSet.DEFAULT_PRICELIST_NAME, null, null, null);
         final String baseJson = mapper.writeValueAsString(subscriptionJson);
 
         Response response = doPut(uri, baseJson, DEFAULT_EMPTY_QUERY, DEFAULT_HTTP_TIMEOUT_SEC);
@@ -166,7 +166,8 @@ public class TestSubscription extends TestJaxrsBase {
                                                                                BillingPeriod.MONTHLY.toString(),
                                                                                subscriptionJson.getPriceList(),
                                                                                subscriptionJson.getChargedThroughDate(),
-                                                                               subscriptionJson.getCancelledDate());
+                                                                               subscriptionJson.getCancelledDate(),
+                                                                               null);
         baseJson = mapper.writeValueAsString(newInput);
         final Map<String, String> queryParams = getQueryParamsForCallCompletion(CALL_COMPLETION_TIMEOUT_SEC);
         queryParams.put(JaxrsResource.QUERY_POLICY, "immediate");