killbill-aplcache

Change all interfaces that are i) user vivible and or have a sql

11/2/2012 7:20:51 PM

Changes

api/src/main/java/com/ning/billing/util/entity/UpdatableEntity.java 20(+0 -20)

util/src/main/java/com/ning/billing/util/entity/UpdatableEntityBase.java 29(+0 -29)

Details

diff --git a/account/src/main/java/com/ning/billing/account/api/DefaultAccountEmail.java b/account/src/main/java/com/ning/billing/account/api/DefaultAccountEmail.java
index 2be4a58..4053a32 100644
--- a/account/src/main/java/com/ning/billing/account/api/DefaultAccountEmail.java
+++ b/account/src/main/java/com/ning/billing/account/api/DefaultAccountEmail.java
@@ -18,9 +18,10 @@ package com.ning.billing.account.api;
 
 import java.util.UUID;
 
-import com.ning.billing.util.entity.UpdatableEntityBase;
+import com.ning.billing.util.entity.Entity;
+import com.ning.billing.util.entity.EntityBase;
 
-public class DefaultAccountEmail extends UpdatableEntityBase implements AccountEmail {
+public class DefaultAccountEmail extends EntityBase implements AccountEmail, Entity {
     private final UUID accountId;
     private final String email;
 
diff --git a/account/src/main/java/com/ning/billing/account/api/svcs/DefaultAccountInternalApi.java b/account/src/main/java/com/ning/billing/account/api/svcs/DefaultAccountInternalApi.java
index b29bc91..2a0cb14 100644
--- a/account/src/main/java/com/ning/billing/account/api/svcs/DefaultAccountInternalApi.java
+++ b/account/src/main/java/com/ning/billing/account/api/svcs/DefaultAccountInternalApi.java
@@ -57,25 +57,21 @@ public class DefaultAccountInternalApi implements AccountInternalApi {
 
     @Override
     public Account getAccountByRecordId(final Long recordId,
-            final InternalTenantContext context) throws AccountApiException {
+                                        final InternalTenantContext context) throws AccountApiException {
         return accountDao.getByRecordId(recordId, context);
     }
 
     @Override
     public void updateAccount(final String externalKey, final AccountData accountData,
-            final InternalCallContext context) throws AccountApiException {
+                              final InternalCallContext context) throws AccountApiException {
         final Account account = getAccountByKey(externalKey, context);
-        try {
-            final Account updatedAccount = new DefaultAccount(account.getId(), accountData);
-            accountDao.update(updatedAccount,context);
-        } catch (final EntityPersistenceException e) {
-            throw new AccountApiException(e, ErrorCode.ACCOUNT_UPDATE_FAILED);
-        }
+        final Account updatedAccount = new DefaultAccount(account.getId(), accountData);
+        accountDao.update(updatedAccount, context);
     }
 
     @Override
     public List<AccountEmail> getEmails(final UUID accountId,
-            final InternalTenantContext context)  {
+                                        final InternalTenantContext context) {
         return accountEmailDao.getEmails(accountId, context);
     }
 
@@ -97,7 +93,7 @@ public class DefaultAccountInternalApi implements AccountInternalApi {
 
     @Override
     public void updatePaymentMethod(final UUID accountId, final UUID paymentMethodId,
-            final InternalCallContext context) throws AccountApiException {
+                                    final InternalCallContext context) throws AccountApiException {
         try {
             accountDao.updatePaymentMethod(accountId, paymentMethodId, context);
         } catch (final EntityPersistenceException e) {
diff --git a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountUserApi.java b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountUserApi.java
index bd2c79c..5592748 100644
--- a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountUserApi.java
+++ b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountUserApi.java
@@ -19,8 +19,6 @@ package com.ning.billing.account.api.user;
 import java.util.List;
 import java.util.UUID;
 
-import javax.annotation.Nullable;
-
 import org.joda.time.DateTime;
 
 import com.ning.billing.ErrorCode;
@@ -101,23 +99,16 @@ public class DefaultAccountUserApi implements AccountUserApi {
 
     @Override
     public void updateAccount(final Account account, final CallContext context) throws AccountApiException {
-        try {
-            accountDao.update(account, internalCallContextFactory.createInternalCallContext(account.getId(), context));
-        } catch (EntityPersistenceException e) {
-            throw new AccountApiException(e, ErrorCode.ACCOUNT_UPDATE_FAILED);
-        }
+        accountDao.update(account, internalCallContextFactory.createInternalCallContext(account.getId(), context));
+
     }
 
     @Override
     public void updateAccount(final UUID accountId, final AccountData accountData, final CallContext context)
             throws AccountApiException {
         final Account account = new DefaultAccount(accountId, accountData);
+        accountDao.update(account, internalCallContextFactory.createInternalCallContext(account.getId(), context));
 
-        try {
-            accountDao.update(account, internalCallContextFactory.createInternalCallContext(account.getId(), context));
-        } catch (EntityPersistenceException e) {
-            throw new AccountApiException(e, e.getCode(), e.getMessage());
-        }
     }
 
     @Override
diff --git a/account/src/main/java/com/ning/billing/account/dao/AccountDao.java b/account/src/main/java/com/ning/billing/account/dao/AccountDao.java
index c7dd36f..76275ad 100644
--- a/account/src/main/java/com/ning/billing/account/dao/AccountDao.java
+++ b/account/src/main/java/com/ning/billing/account/dao/AccountDao.java
@@ -23,9 +23,10 @@ import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.entity.EntityPersistenceException;
+import com.ning.billing.util.entity.dao.EntityDao;
 import com.ning.billing.util.entity.dao.UpdatableEntityDao;
 
-public interface AccountDao extends UpdatableEntityDao<Account> {
+public interface AccountDao extends EntityDao<Account> {
 
     public Account getAccountByKey(String key, InternalTenantContext context);
 
@@ -39,4 +40,6 @@ public interface AccountDao extends UpdatableEntityDao<Account> {
      * @param paymentMethodId the is of the current default paymentMethod
      */
     public void updatePaymentMethod(UUID accountId, UUID paymentMethodId, InternalCallContext context) throws EntityPersistenceException;
+
+    public void update(Account account, InternalCallContext context);
 }
diff --git a/account/src/main/java/com/ning/billing/account/dao/AuditedAccountDao.java b/account/src/main/java/com/ning/billing/account/dao/AuditedAccountDao.java
index b51a4a8..5fef0c6 100644
--- a/account/src/main/java/com/ning/billing/account/dao/AuditedAccountDao.java
+++ b/account/src/main/java/com/ning/billing/account/dao/AuditedAccountDao.java
@@ -123,9 +123,9 @@ public class AuditedAccountDao implements AccountDao {
                     accountSqlDao.insertAuditFromTransaction(audit, rehydratedContext);
 
                     final AccountCreationInternalEvent creationEvent = new DefaultAccountCreationEvent(account,
-                            rehydratedContext.getUserToken(),
-                            context.getAccountRecordId(),
-                            context.getTenantRecordId());
+                                                                                                       rehydratedContext.getUserToken(),
+                                                                                                       context.getAccountRecordId(),
+                                                                                                       context.getTenantRecordId());
                     try {
                         eventBus.postFromTransaction(creationEvent, transactionalDao, rehydratedContext);
                     } catch (final EventBusException e) {
@@ -145,54 +145,47 @@ public class AuditedAccountDao implements AccountDao {
         }
     }
 
-    @Override
-    public void update(final Account specifiedAccount, final InternalCallContext context) throws EntityPersistenceException {
-        try {
-            accountSqlDao.inTransaction(new Transaction<Void, AccountSqlDao>() {
-                @Override
-                public Void inTransaction(final AccountSqlDao transactional, final TransactionStatus status) throws EntityPersistenceException, InternalBus.EventBusException {
-                    final UUID accountId = specifiedAccount.getId();
-                    final Account currentAccount = transactional.getById(accountId.toString(), context);
-                    if (currentAccount == null) {
-                        throw new EntityPersistenceException(ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID, accountId);
-                    }
+    public void update(final Account specifiedAccount, final InternalCallContext context) {
 
-                    // Set unspecified (null) fields to their current values
-                    final Account account = specifiedAccount.mergeWithDelegate(currentAccount);
+        accountSqlDao.inTransaction(new Transaction<Void, AccountSqlDao>() {
+            @Override
+            public Void inTransaction(final AccountSqlDao transactional, final TransactionStatus status) throws EntityPersistenceException, InternalBus.EventBusException {
+                final UUID accountId = specifiedAccount.getId();
+                final Account currentAccount = transactional.getById(accountId.toString(), context);
+                if (currentAccount == null) {
+                    throw new EntityPersistenceException(ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID, accountId);
+                }
 
-                    transactional.update(account, context);
+                // Set unspecified (null) fields to their current values
+                final Account account = specifiedAccount.mergeWithDelegate(currentAccount);
 
-                    final Long recordId = accountSqlDao.getRecordId(accountId.toString(), context);
-                    final EntityHistory<Account> history = new EntityHistory<Account>(accountId, recordId, account, ChangeType.UPDATE);
-                    accountSqlDao.insertHistoryFromTransaction(history, context);
+                transactional.update(account, context);
 
-                    final Long historyRecordId = accountSqlDao.getHistoryRecordId(recordId, context);
-                    final EntityAudit audit = new EntityAudit(TableName.ACCOUNT_HISTORY, historyRecordId, ChangeType.UPDATE);
-                    accountSqlDao.insertAuditFromTransaction(audit, context);
+                final Long recordId = accountSqlDao.getRecordId(accountId.toString(), context);
+                final EntityHistory<Account> history = new EntityHistory<Account>(accountId, recordId, account, ChangeType.UPDATE);
+                accountSqlDao.insertHistoryFromTransaction(history, context);
 
-                    final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(accountId,
-                            context.getUserToken(),
-                            currentAccount,
-                            account,
-                            context.getAccountRecordId(),
-                            context.getTenantRecordId());
-                    if (changeEvent.hasChanges()) {
-                        try {
-                            eventBus.postFromTransaction(changeEvent, transactional, context);
-                        } catch (final EventBusException e) {
-                            log.warn("Failed to post account change event for account " + accountId, e);
-                        }
+                final Long historyRecordId = accountSqlDao.getHistoryRecordId(recordId, context);
+                final EntityAudit audit = new EntityAudit(TableName.ACCOUNT_HISTORY, historyRecordId, ChangeType.UPDATE);
+                accountSqlDao.insertAuditFromTransaction(audit, context);
+
+                final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(accountId,
+                                                                                             context.getUserToken(),
+                                                                                             currentAccount,
+                                                                                             account,
+                                                                                             context.getAccountRecordId(),
+                                                                                             context.getTenantRecordId());
+                if (changeEvent.hasChanges()) {
+                    try {
+                        eventBus.postFromTransaction(changeEvent, transactional, context);
+                    } catch (final EventBusException e) {
+                        log.warn("Failed to post account change event for account " + accountId, e);
                     }
-                    return null;
                 }
-            });
-        } catch (final RuntimeException re) {
-            if (re.getCause() instanceof EntityPersistenceException) {
-                throw (EntityPersistenceException) re.getCause();
-            } else {
-                throw re;
+                return null;
             }
-        }
+        });
+
     }
 
     @Override
@@ -225,7 +218,7 @@ public class AuditedAccountDao implements AccountDao {
                     accountSqlDao.insertAuditFromTransaction(audit, context);
 
                     final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(accountId, context.getUserToken(), currentAccount, account,
-                            context.getAccountRecordId(), context.getTenantRecordId());
+                                                                                                 context.getAccountRecordId(), context.getTenantRecordId());
 
                     if (changeEvent.hasChanges()) {
                         try {
diff --git a/api/src/main/java/com/ning/billing/account/api/Account.java b/api/src/main/java/com/ning/billing/account/api/Account.java
index 7a9b8f9..0fdbbd2 100644
--- a/api/src/main/java/com/ning/billing/account/api/Account.java
+++ b/api/src/main/java/com/ning/billing/account/api/Account.java
@@ -17,7 +17,7 @@
 package com.ning.billing.account.api;
 
 import com.ning.billing.junction.api.Blockable;
-import com.ning.billing.util.entity.UpdatableEntity;
+import com.ning.billing.util.entity.Entity;
 
 /**
  * The interface <code>Account</code> represents an account within Killbill.
@@ -29,7 +29,7 @@ import com.ning.billing.util.entity.UpdatableEntity;
  * @see com.ning.billing.account.api.AccountData
  */
 
-public interface Account extends AccountData, UpdatableEntity, Blockable {
+public interface Account extends AccountData, Entity, Blockable {
 
     /**
      *
diff --git a/api/src/main/java/com/ning/billing/account/api/AccountEmail.java b/api/src/main/java/com/ning/billing/account/api/AccountEmail.java
index 5ac42af..10145ef 100644
--- a/api/src/main/java/com/ning/billing/account/api/AccountEmail.java
+++ b/api/src/main/java/com/ning/billing/account/api/AccountEmail.java
@@ -18,9 +18,9 @@ package com.ning.billing.account.api;
 
 import java.util.UUID;
 
-import com.ning.billing.util.entity.UpdatableEntity;
+import com.ning.billing.util.entity.Entity;
 
-public interface AccountEmail extends UpdatableEntity {
+public interface AccountEmail extends Entity {
 
     /**
      *
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/timeline/BundleTimeline.java b/api/src/main/java/com/ning/billing/entitlement/api/timeline/BundleTimeline.java
index cfc3bab..ed85d3f 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/timeline/BundleTimeline.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/timeline/BundleTimeline.java
@@ -19,12 +19,14 @@ package com.ning.billing.entitlement.api.timeline;
 import java.util.List;
 import java.util.UUID;
 
+import com.ning.billing.util.entity.Entity;
+
 /**
  *  The interface {@code BundleTimeline} shows a view of all the entitlement events for a specific
  *  {@code SubscriptionBundle}.
  *
  */
-public interface BundleTimeline {
+public interface BundleTimeline extends Entity {
 
     /**
      *
@@ -36,7 +38,7 @@ public interface BundleTimeline {
      *
      * @return the unique id for the {@SubscriptionBundle}
      */
-    UUID getBundleId();
+    UUID getId();
 
     /**
      *
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/timeline/SubscriptionTimeline.java b/api/src/main/java/com/ning/billing/entitlement/api/timeline/SubscriptionTimeline.java
index a521e89..aaa1b40 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/timeline/SubscriptionTimeline.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/timeline/SubscriptionTimeline.java
@@ -22,6 +22,7 @@ import org.joda.time.DateTime;
 
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
+import com.ning.billing.util.entity.Entity;
 
 /**
  * The interface {@code} shows a view of all the events for a particular {@code Subscription}.
@@ -29,13 +30,7 @@ import com.ning.billing.entitlement.api.SubscriptionTransitionType;
  * It can be used to display information, or it can be used to modify the entitlement stream of events
  * and 'repair' the stream by versioning the events.
  */
-public interface SubscriptionTimeline {
-
-    /**
-     *
-     * @return the unique id for that {@code Subscription}
-     */
-    public UUID getId();
+public interface SubscriptionTimeline extends Entity {
 
     /**
      *
diff --git a/api/src/main/java/com/ning/billing/junction/api/Blockable.java b/api/src/main/java/com/ning/billing/junction/api/Blockable.java
index 20ac9ca..8e3f5cf 100644
--- a/api/src/main/java/com/ning/billing/junction/api/Blockable.java
+++ b/api/src/main/java/com/ning/billing/junction/api/Blockable.java
@@ -22,8 +22,9 @@ import com.ning.billing.ObjectType;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
+import com.ning.billing.util.entity.Entity;
 
-public interface Blockable {
+public interface Blockable extends Entity {
 
     public enum Type {
         ACCOUNT,
@@ -71,6 +72,7 @@ public interface Blockable {
         }
     }
 
+    @Override
     public UUID getId();
 
     public BlockingState getBlockingState();
diff --git a/api/src/main/java/com/ning/billing/tenant/api/TenantKV.java b/api/src/main/java/com/ning/billing/tenant/api/TenantKV.java
index 0103440..cf34a62 100644
--- a/api/src/main/java/com/ning/billing/tenant/api/TenantKV.java
+++ b/api/src/main/java/com/ning/billing/tenant/api/TenantKV.java
@@ -16,7 +16,9 @@
 package com.ning.billing.tenant.api;
 
 
-public interface TenantKV {
+import com.ning.billing.util.entity.Entity;
+
+public interface TenantKV extends Entity {
 
     public String getKey();
 
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestRepairIntegration.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestRepairIntegration.java
index a68afe6..d3fd015 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestRepairIntegration.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestRepairIntegration.java
@@ -181,6 +181,16 @@ public class TestRepairIntegration extends TestIntegrationBase {
             }
 
             @Override
+            public DateTime getCreatedDate() {
+                return null;
+            }
+
+            @Override
+            public DateTime getUpdatedDate() {
+                return null;
+            }
+
+            @Override
             public List<NewEvent> getNewEvents() {
                 return newEvents;
             }
@@ -216,11 +226,21 @@ public class TestRepairIntegration extends TestIntegrationBase {
             }
 
             @Override
-            public UUID getBundleId() {
+            public UUID getId() {
                 return bundleId;
             }
 
             @Override
+            public DateTime getCreatedDate() {
+                return null;
+            }
+
+            @Override
+            public DateTime getUpdatedDate() {
+                return null;
+            }
+
+            @Override
             public String getExternalKey() {
                 return null;
             }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java
index 67d9e3d..4e0d044 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java
@@ -117,20 +117,20 @@ public class DefaultEntitlementTimelineApi implements EntitlementTimelineApi {
     public BundleTimeline repairBundle(final BundleTimeline input, final boolean dryRun, final CallContext context) throws EntitlementRepairException {
         final InternalTenantContext tenantContext = internalCallContextFactory.createInternalTenantContext(context);
         try {
-            final SubscriptionBundle bundle = dao.getSubscriptionBundleFromId(input.getBundleId(), tenantContext);
+            final SubscriptionBundle bundle = dao.getSubscriptionBundleFromId(input.getId(), tenantContext);
             if (bundle == null) {
-                throw new EntitlementRepairException(ErrorCode.ENT_REPAIR_UNKNOWN_BUNDLE, input.getBundleId());
+                throw new EntitlementRepairException(ErrorCode.ENT_REPAIR_UNKNOWN_BUNDLE, input.getId());
             }
 
             // Subscriptions are ordered with BASE subscription first-- if exists
-            final List<Subscription> subscriptions = dao.getSubscriptions(factory, input.getBundleId(), tenantContext);
+            final List<Subscription> subscriptions = dao.getSubscriptions(factory, input.getId(), tenantContext);
             if (subscriptions.size() == 0) {
-                throw new EntitlementRepairException(ErrorCode.ENT_REPAIR_NO_ACTIVE_SUBSCRIPTIONS, input.getBundleId());
+                throw new EntitlementRepairException(ErrorCode.ENT_REPAIR_NO_ACTIVE_SUBSCRIPTIONS, input.getId());
             }
 
             final String viewId = getViewId(((SubscriptionBundleData) bundle).getLastSysUpdateTime(), subscriptions);
             if (!viewId.equals(input.getViewId())) {
-                throw new EntitlementRepairException(ErrorCode.ENT_REPAIR_VIEW_CHANGED, input.getBundleId(), input.getViewId(), viewId);
+                throw new EntitlementRepairException(ErrorCode.ENT_REPAIR_VIEW_CHANGED, input.getId(), input.getViewId(), viewId);
             }
 
             DateTime firstDeletedBPEventTime = null;
@@ -232,10 +232,10 @@ public class DefaultEntitlementTimelineApi implements EntitlementTimelineApi {
                 baseSubscriptionRepair.addFutureAddonCancellation(addOnSubscriptionInRepair, context);
 
                 final List<SubscriptionTimeline> repairs = createGetSubscriptionRepairList(subscriptions, convertDataRepair(inRepair));
-                return createGetBundleRepair(input.getBundleId(), bundle.getKey(), input.getViewId(), repairs);
+                return createGetBundleRepair(input.getId(), bundle.getKey(), input.getViewId(), repairs);
             } else {
-                dao.repair(bundle.getAccountId(), input.getBundleId(), inRepair, internalCallContextFactory.createInternalCallContext(bundle.getAccountId(), context));
-                return getBundleTimeline(input.getBundleId(), context);
+                dao.repair(bundle.getAccountId(), input.getId(), inRepair, internalCallContextFactory.createInternalCallContext(bundle.getAccountId(), context));
+                return getBundleTimeline(input.getId(), context);
             }
         } catch (CatalogApiException e) {
             throw new EntitlementRepairException(e);
@@ -391,11 +391,21 @@ public class DefaultEntitlementTimelineApi implements EntitlementTimelineApi {
             }
 
             @Override
-            public UUID getBundleId() {
+            public UUID getId() {
                 return bundleId;
             }
 
             @Override
+            public DateTime getCreatedDate() {
+                throw new UnsupportedOperationException();
+            }
+
+            @Override
+            public DateTime getUpdatedDate() {
+                throw new UnsupportedOperationException();
+            }
+
+            @Override
             public String getExternalKey() {
                 return externalKey;
             }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultSubscriptionTimeline.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultSubscriptionTimeline.java
index d8331e7..343dfed 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultSubscriptionTimeline.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultSubscriptionTimeline.java
@@ -13,6 +13,7 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
+
 package com.ning.billing.entitlement.api.timeline;
 
 import java.util.ArrayList;
@@ -38,6 +39,7 @@ import com.ning.billing.entitlement.events.phase.PhaseEvent;
 import com.ning.billing.entitlement.events.user.ApiEvent;
 import com.ning.billing.entitlement.events.user.ApiEventType;
 
+
 public class DefaultSubscriptionTimeline implements SubscriptionTimeline {
 
     private final UUID id;
@@ -58,12 +60,12 @@ public class DefaultSubscriptionTimeline implements SubscriptionTimeline {
         this.id = input.getId();
         this.activeVersion = input.getActiveVersion();
         this.existingEvents = (input.getExistingEvents() != null) ? new ArrayList<SubscriptionTimeline.ExistingEvent>(input.getExistingEvents()) :
-                Collections.<SubscriptionTimeline.ExistingEvent>emptyList();
+                              Collections.<SubscriptionTimeline.ExistingEvent>emptyList();
         sortExistingEvent(this.existingEvents);
         this.deletedEvents = (input.getDeletedEvents() != null) ? new ArrayList<SubscriptionTimeline.DeletedEvent>(input.getDeletedEvents()) :
-                Collections.<SubscriptionTimeline.DeletedEvent>emptyList();
+                             Collections.<SubscriptionTimeline.DeletedEvent>emptyList();
         this.newEvents = (input.getNewEvents() != null) ? new ArrayList<SubscriptionTimeline.NewEvent>(input.getNewEvents()) :
-                Collections.<SubscriptionTimeline.NewEvent>emptyList();
+                         Collections.<SubscriptionTimeline.NewEvent>emptyList();
         sortNewEvent(this.newEvents);
     }
 
@@ -264,6 +266,16 @@ public class DefaultSubscriptionTimeline implements SubscriptionTimeline {
     }
 
     @Override
+    public DateTime getCreatedDate() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public DateTime getUpdatedDate() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
     public List<DeletedEvent> getDeletedEvents() {
         return deletedEvents;
     }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundleData.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundleData.java
index 87516f4..8e0630a 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundleData.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundleData.java
@@ -24,14 +24,12 @@ import org.joda.time.DateTime;
 
 import com.ning.billing.junction.api.BlockingState;
 import com.ning.billing.overdue.OverdueState;
+import com.ning.billing.util.entity.EntityBase;
 
-public class SubscriptionBundleData implements SubscriptionBundle {
+public class SubscriptionBundleData extends EntityBase implements SubscriptionBundle {
 
-    private final UUID id;
     private final String key;
     private final UUID accountId;
-    private final DateTime createdDate;
-    private final DateTime updatedDate;
     private final DateTime lastSysTimeUpdate;
     private final OverdueState<SubscriptionBundle> overdueState;
 
@@ -44,15 +42,12 @@ public class SubscriptionBundleData implements SubscriptionBundle {
     }
 
     public SubscriptionBundleData(final UUID id, final String key, final UUID accountId, final DateTime lastSysUpdate, @Nullable final OverdueState<SubscriptionBundle> overdueState) {
-        this.id = id;
+        // TODO add column in bundles table
+        super(id, null, null);
         this.key = key;
         this.accountId = accountId;
         this.lastSysTimeUpdate = lastSysUpdate;
         this.overdueState = overdueState;
-
-        // TODO add column in bundles table
-        createdDate = null;
-        updatedDate = null;
     }
 
     @Override
@@ -61,21 +56,6 @@ public class SubscriptionBundleData implements SubscriptionBundle {
     }
 
     @Override
-    public UUID getId() {
-        return id;
-    }
-
-    @Override
-    public DateTime getCreatedDate() {
-        return createdDate;
-    }
-
-    @Override
-    public DateTime getUpdatedDate() {
-        return updatedDate;
-    }
-
-    @Override
     public UUID getAccountId() {
         return accountId;
     }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
index de8814c..081132e 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
@@ -201,6 +201,8 @@ public class AuditedEntitlementDao implements EntitlementDao {
             public Void inTransaction(final SubscriptionSqlDao transactionalDao, final TransactionStatus status) throws Exception {
                 final String subscriptionId = subscription.getId().toString();
                 transactionalDao.updateChargedThroughDate(subscription.getId().toString(), ctd, context);
+
+
                 final Long subscriptionRecordId = transactionalDao.getRecordId(subscriptionId, context);
                 final EntityAudit subscriptionAudit = new EntityAudit(TableName.SUBSCRIPTIONS, subscriptionRecordId, ChangeType.UPDATE);
                 transactionalDao.insertAuditFromTransaction(subscriptionAudit, context);
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/timeline/TestApiBaseRepair.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/timeline/TestApiBaseRepair.java
index 6fb3525..bec35c0 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/timeline/TestApiBaseRepair.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/timeline/TestApiBaseRepair.java
@@ -41,13 +41,16 @@ import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import static org.testng.Assert.assertEquals;
 
 public abstract class TestApiBaseRepair extends TestApiBase {
+
     protected static final Logger log = LoggerFactory.getLogger(TestApiBaseRepair.class);
 
     public interface TestWithExceptionCallback {
+
         public void doTest() throws EntitlementRepairException, EntitlementUserApiException;
     }
 
     public static class TestWithException {
+
         public void withException(final TestWithExceptionCallback callback, final ErrorCode code) throws Exception {
             try {
                 callback.doTest();
@@ -66,6 +69,16 @@ public abstract class TestApiBaseRepair extends TestApiBase {
             }
 
             @Override
+            public DateTime getCreatedDate() {
+                return null;
+            }
+
+            @Override
+            public DateTime getUpdatedDate() {
+                return null;
+            }
+
+            @Override
             public List<NewEvent> getNewEvents() {
                 return newEvents;
             }
@@ -100,11 +113,21 @@ public abstract class TestApiBaseRepair extends TestApiBase {
             }
 
             @Override
-            public UUID getBundleId() {
+            public UUID getId() {
                 return bundleId;
             }
 
             @Override
+            public DateTime getCreatedDate() {
+                return null;
+            }
+
+            @Override
+            public DateTime getUpdatedDate() {
+                return null;
+            }
+
+            @Override
             public String getExternalKey() {
                 return null;
             }
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 0a177e8..cb191c4 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
@@ -82,7 +82,7 @@ public class AccountTimelineJson {
         final StringBuilder tmp = new StringBuilder();
         for (final UUID cur : b) {
             for (final BundleTimeline bt : bundles) {
-                if (bt.getBundleId().equals(cur)) {
+                if (bt.getId().equals(cur)) {
                     if (!first) {
                         tmp.append(",");
                     }
@@ -120,7 +120,7 @@ public class AccountTimelineJson {
         this.account = new AccountJsonSimple(account.getId().toString(), account.getExternalKey());
         this.bundles = new LinkedList<BundleJsonWithSubscriptions>();
         for (final BundleTimeline bundle : bundles) {
-            final List<AuditLog> bundleAuditLogs = bundlesAuditLogs.get(bundle.getBundleId());
+            final List<AuditLog> bundleAuditLogs = bundlesAuditLogs.get(bundle.getId());
             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 8fd820e..af8900a 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
@@ -50,10 +50,10 @@ public class BundleJsonWithSubscriptions extends BundleJsonSimple {
 
     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);
+        super(bundle.getId(), bundle.getExternalKey(), auditLogs);
         this.subscriptions = new LinkedList<SubscriptionJsonWithEvents>();
         for (final SubscriptionTimeline subscriptionTimeline : bundle.getSubscriptions()) {
-            this.subscriptions.add(new SubscriptionJsonWithEvents(bundle.getBundleId(), subscriptionTimeline,
+            this.subscriptions.add(new SubscriptionJsonWithEvents(bundle.getId(), subscriptionTimeline,
                                                                   subscriptionsAuditLogs.get(subscriptionTimeline.getId()), subscriptionEventsAuditLogs));
         }
     }
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 8f3ac82..a5551cf 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
@@ -93,7 +93,7 @@ public class TestBundleJsonWithSubscriptions extends JaxrsTestSuite {
         final BundleTimeline bundleTimeline = Mockito.mock(BundleTimeline.class);
         final UUID bundleId = UUID.randomUUID();
         final String externalKey = UUID.randomUUID().toString();
-        Mockito.when(bundleTimeline.getBundleId()).thenReturn(bundleId);
+        Mockito.when(bundleTimeline.getId()).thenReturn(bundleId);
         Mockito.when(bundleTimeline.getExternalKey()).thenReturn(externalKey);
         Mockito.when(bundleTimeline.getSubscriptions()).thenReturn(ImmutableList.<SubscriptionTimeline>of(subscriptionTimeline));
 
@@ -118,7 +118,7 @@ public class TestBundleJsonWithSubscriptions extends JaxrsTestSuite {
         final BundleTimeline bundle = Mockito.mock(BundleTimeline.class);
         final UUID bundleId = UUID.randomUUID();
         final String externalKey = UUID.randomUUID().toString();
-        Mockito.when(bundle.getBundleId()).thenReturn(bundleId);
+        Mockito.when(bundle.getId()).thenReturn(bundleId);
         Mockito.when(bundle.getExternalKey()).thenReturn(externalKey);
 
         final BundleJsonWithSubscriptions bundleJsonWithSubscriptions = new BundleJsonWithSubscriptions(bundle, null,
diff --git a/tenant/src/main/java/com/ning/billing/tenant/api/DefaultTenantKV.java b/tenant/src/main/java/com/ning/billing/tenant/api/DefaultTenantKV.java
index ece3445..9b67cdc 100644
--- a/tenant/src/main/java/com/ning/billing/tenant/api/DefaultTenantKV.java
+++ b/tenant/src/main/java/com/ning/billing/tenant/api/DefaultTenantKV.java
@@ -16,12 +16,19 @@
 package com.ning.billing.tenant.api;
 
 
-public class DefaultTenantKV  implements TenantKV {
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.util.entity.EntityBase;
+
+public class DefaultTenantKV  extends EntityBase implements TenantKV {
 
     private final String key;
     private final String value;
 
-    public DefaultTenantKV(final String key, final String value) {
+    public DefaultTenantKV(final UUID id, final String key, final String value, final DateTime createdDate, final DateTime updatedDate) {
+        super(id, createdDate, updatedDate);
         this.key = key;
         this.value = value;
     }
diff --git a/tenant/src/main/java/com/ning/billing/tenant/dao/DefaultTenantDao.java b/tenant/src/main/java/com/ning/billing/tenant/dao/DefaultTenantDao.java
index 16620e3..f17d01b 100644
--- a/tenant/src/main/java/com/ning/billing/tenant/dao/DefaultTenantDao.java
+++ b/tenant/src/main/java/com/ning/billing/tenant/dao/DefaultTenantDao.java
@@ -115,7 +115,7 @@ public class DefaultTenantDao implements TenantDao {
 
     @Override
     public void addTenantKeyValue(final String key, final String value, final InternalCallContext context) {
-        tenantKVSqlDao.insertTenantKeyValue(key, value, context.getTenantRecordId(), context);
+        tenantKVSqlDao.insertTenantKeyValue(UUID.randomUUID().toString(), key, value, context.getTenantRecordId(), context);
     }
 
     @Override
diff --git a/tenant/src/main/java/com/ning/billing/tenant/dao/TenantKVSqlDao.java b/tenant/src/main/java/com/ning/billing/tenant/dao/TenantKVSqlDao.java
index 83b3d79..ae58d87 100644
--- a/tenant/src/main/java/com/ning/billing/tenant/dao/TenantKVSqlDao.java
+++ b/tenant/src/main/java/com/ning/billing/tenant/dao/TenantKVSqlDao.java
@@ -18,7 +18,9 @@ package com.ning.billing.tenant.dao;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.List;
+import java.util.UUID;
 
+import org.joda.time.DateTime;
 import org.skife.jdbi.v2.StatementContext;
 import org.skife.jdbi.v2.sqlobject.Bind;
 import org.skife.jdbi.v2.sqlobject.SqlQuery;
@@ -44,7 +46,7 @@ public interface TenantKVSqlDao extends Transactional<TenantKVSqlDao> {
     public List<TenantKV> getTenantValueForKey(@Bind("key") final String key, @Bind("tenantRecordId") Long tenantRecordId);
 
     @SqlUpdate
-    public void insertTenantKeyValue(@Bind("key") final String key, @Bind("value") final String value, @Bind("tenantRecordId") Long tenantRecordId, @InternalTenantContextBinder final InternalCallContext context);
+    public void insertTenantKeyValue(@Bind("id") String id, @Bind("key") final String key, @Bind("value") final String value, @Bind("tenantRecordId") Long tenantRecordId, @InternalTenantContextBinder final InternalCallContext context);
 
     @SqlUpdate
     public void deleteTenantKey(@Bind("key") final String key, @Bind("tenantRecordId") Long tenantRecordId);
@@ -54,9 +56,12 @@ public interface TenantKVSqlDao extends Transactional<TenantKVSqlDao> {
 
         @Override
         public TenantKV map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
+            final UUID id = getUUID(result, "id");
             final String key = result.getString("t_key");
             final String value = result.getString("t_value");
-            return new DefaultTenantKV(key, value);
+            final DateTime createdDate = getDateTime(result, "created_date");
+            final DateTime updatedDate = getDateTime(result, "updated_date");
+            return new DefaultTenantKV(id, key, value, createdDate, updatedDate);
         }
     }
 }
diff --git a/tenant/src/main/resources/com/ning/billing/tenant/ddl.sql b/tenant/src/main/resources/com/ning/billing/tenant/ddl.sql
index a8a7911..4096d11 100644
--- a/tenant/src/main/resources/com/ning/billing/tenant/ddl.sql
+++ b/tenant/src/main/resources/com/ning/billing/tenant/ddl.sql
@@ -19,6 +19,7 @@ CREATE UNIQUE INDEX tenants_api_key ON tenants(api_key);
 DROP TABLE IF EXISTS tenant_kvs;
 CREATE TABLE tenant_kvs (
    record_id int(11) unsigned NOT NULL AUTO_INCREMENT,
+   id char(36) NOT NULL,
    tenant_record_id int(11) unsigned default null,
    t_key varchar(64) NOT NULL,
    t_value varchar(1024) NOT NULL,
@@ -28,4 +29,4 @@ CREATE TABLE tenant_kvs (
    updated_by varchar(50) DEFAULT NULL,
    PRIMARY KEY(record_id)
 ) ENGINE=innodb;
-CREATE INDEX tenant_kvs_key ON tenant_kvs(tenant_record_id, t_key);
\ No newline at end of file
+CREATE INDEX tenant_kvs_key ON tenant_kvs(tenant_record_id, t_key);
diff --git a/util/src/main/java/com/ning/billing/util/audit/api/DefaultAuditUserApi.java b/util/src/main/java/com/ning/billing/util/audit/api/DefaultAuditUserApi.java
index 8a91fc2..0429e67 100644
--- a/util/src/main/java/com/ning/billing/util/audit/api/DefaultAuditUserApi.java
+++ b/util/src/main/java/com/ning/billing/util/audit/api/DefaultAuditUserApi.java
@@ -69,7 +69,7 @@ public class DefaultAuditUserApi implements AuditUserApi {
         final Map<UUID, List<AuditLog>> subscriptionsAuditLogs = new HashMap<UUID, List<AuditLog>>();
         final Map<UUID, List<AuditLog>> subscriptionEventsAuditLogs = new HashMap<UUID, List<AuditLog>>();
         for (final BundleTimeline bundle : bundles) {
-            bundlesAuditLogs.put(bundle.getBundleId(), getAuditLogs(bundle.getBundleId(), ObjectType.BUNDLE, auditLevel, context));
+            bundlesAuditLogs.put(bundle.getId(), getAuditLogs(bundle.getId(), ObjectType.BUNDLE, auditLevel, context));
             for (final SubscriptionTimeline subscriptionTimeline : bundle.getSubscriptions()) {
                 subscriptionsAuditLogs.put(subscriptionTimeline.getId(), getAuditLogs(subscriptionTimeline.getId(), ObjectType.SUBSCRIPTION, auditLevel, context));
                 for (final ExistingEvent event : subscriptionTimeline.getExistingEvents()) {
diff --git a/util/src/main/java/com/ning/billing/util/customfield/StringCustomField.java b/util/src/main/java/com/ning/billing/util/customfield/StringCustomField.java
index 98257fa..4458801 100644
--- a/util/src/main/java/com/ning/billing/util/customfield/StringCustomField.java
+++ b/util/src/main/java/com/ning/billing/util/customfield/StringCustomField.java
@@ -18,9 +18,10 @@ package com.ning.billing.util.customfield;
 
 import java.util.UUID;
 
-import com.ning.billing.util.entity.UpdatableEntityBase;
+import com.ning.billing.util.entity.Entity;
+import com.ning.billing.util.entity.EntityBase;
 
-public class StringCustomField extends UpdatableEntityBase implements CustomField {
+public class StringCustomField extends EntityBase implements CustomField, Entity {
     private final String name;
     private String value;
 
diff --git a/util/src/main/java/com/ning/billing/util/entity/dao/UpdatableEntityDao.java b/util/src/main/java/com/ning/billing/util/entity/dao/UpdatableEntityDao.java
index e04c33c..4b9e0b2 100644
--- a/util/src/main/java/com/ning/billing/util/entity/dao/UpdatableEntityDao.java
+++ b/util/src/main/java/com/ning/billing/util/entity/dao/UpdatableEntityDao.java
@@ -18,9 +18,8 @@ package com.ning.billing.util.entity.dao;
 
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.entity.EntityPersistenceException;
-import com.ning.billing.util.entity.UpdatableEntity;
 
-public interface UpdatableEntityDao<T extends UpdatableEntity> extends EntityDao<T> {
+public interface UpdatableEntityDao<T> extends EntityDao {
 
     public void update(T entity, InternalCallContext context) throws EntityPersistenceException;
 }
diff --git a/util/src/test/java/com/ning/billing/util/audit/api/TestDefaultAuditUserApi.java b/util/src/test/java/com/ning/billing/util/audit/api/TestDefaultAuditUserApi.java
index 7f45d5a..d1fef2c 100644
--- a/util/src/test/java/com/ning/billing/util/audit/api/TestDefaultAuditUserApi.java
+++ b/util/src/test/java/com/ning/billing/util/audit/api/TestDefaultAuditUserApi.java
@@ -75,7 +75,7 @@ public class TestDefaultAuditUserApi extends AuditLogsTestBase {
         final List<BundleTimeline> bundles = new ArrayList<BundleTimeline>();
         for (final UUID objectId : objectIds) {
             final BundleTimeline entity = Mockito.mock(BundleTimeline.class);
-            Mockito.when(entity.getBundleId()).thenReturn(objectId);
+            Mockito.when(entity.getId()).thenReturn(objectId);
             bundles.add(entity);
         }