killbill-memoizeit

Merge branch 'audit-rework' of github.com:killbill/killbill

11/15/2012 9:57:15 PM

Changes

Details

diff --git a/account/src/main/resources/com/ning/billing/account/dao/AccountEmailSqlDao.sql.stg b/account/src/main/resources/com/ning/billing/account/dao/AccountEmailSqlDao.sql.stg
index 05bdcd2..30972a6 100644
--- a/account/src/main/resources/com/ning/billing/account/dao/AccountEmailSqlDao.sql.stg
+++ b/account/src/main/resources/com/ning/billing/account/dao/AccountEmailSqlDao.sql.stg
@@ -27,18 +27,18 @@ tableValues() ::= <<
 
 getEmailByAccountId() ::= <<
 select
-<allTableFields()>
-from <tableName()>
-where account_id = :accountId
-and is_active
-<AND_CHECK_TENANT()>
+  <allTableFields("t.")>
+from <tableName()> t
+where t.account_id = :accountId
+and t.is_active
+<AND_CHECK_TENANT("t.")>
 ;
 >>
 
 markEmailAsDeleted() ::= <<
-update <tableName()>
-set is_active = 0
-where  id = :id
-<AND_CHECK_TENANT()>
+update <tableName()> t
+set t.is_active = 0
+where <idField("t.")> = :id
+<AND_CHECK_TENANT("t.")>
 ;
 >>
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessTagRecorder.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessTagRecorder.java
index 84e5d3d..7bd0ae1 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessTagRecorder.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessTagRecorder.java
@@ -48,7 +48,7 @@ import com.ning.billing.entitlement.api.user.DefaultSubscriptionFactory;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.engine.addon.AddonUtils;
-import com.ning.billing.entitlement.engine.dao.AuditedEntitlementDao;
+import com.ning.billing.entitlement.engine.dao.DefaultEntitlementDao;
 import com.ning.billing.entitlement.engine.dao.EntitlementDao;
 import com.ning.billing.mock.MockAccountBuilder;
 import com.ning.billing.util.bus.InMemoryInternalBus;
@@ -90,7 +90,7 @@ public class TestBusinessTagRecorder extends AnalyticsTestSuiteWithEmbeddedDB {
         final CatalogService catalogService = new DefaultCatalogService(Mockito.mock(CatalogConfig.class), Mockito.mock(VersionedCatalogLoader.class));
         final AddonUtils addonUtils = new AddonUtils(catalogService);
         final DefaultNotificationQueueService notificationQueueService = new DefaultNotificationQueueService(dbi, clock, internalCallContextFactory);
-        final EntitlementDao entitlementDao = new AuditedEntitlementDao(dbi, clock, addonUtils, notificationQueueService, eventBus, catalogService);
+        final EntitlementDao entitlementDao = new DefaultEntitlementDao(dbi, clock, addonUtils, notificationQueueService, eventBus, catalogService);
         final PlanAligner planAligner = new PlanAligner(catalogService);
         final DefaultSubscriptionApiService apiService = new DefaultSubscriptionApiService(clock, entitlementDao, catalogService, planAligner, internalCallContextFactory);
         final DefaultSubscriptionFactory subscriptionFactory = new DefaultSubscriptionFactory(apiService, clock, catalogService);
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/glue/DefaultEntitlementModule.java b/entitlement/src/main/java/com/ning/billing/entitlement/glue/DefaultEntitlementModule.java
index 96d5e66..459cae7 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/glue/DefaultEntitlementModule.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/glue/DefaultEntitlementModule.java
@@ -18,6 +18,7 @@ package com.ning.billing.entitlement.glue;
 
 import org.skife.config.ConfigurationObjectFactory;
 
+import com.ning.billing.entitlement.engine.dao.DefaultEntitlementDao;
 import com.ning.billing.util.config.EntitlementConfig;
 import com.ning.billing.entitlement.alignment.MigrationPlanAligner;
 import com.ning.billing.entitlement.alignment.PlanAligner;
@@ -40,7 +41,6 @@ import com.ning.billing.entitlement.api.user.DefaultSubscriptionFactory;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.engine.addon.AddonUtils;
 import com.ning.billing.entitlement.engine.core.Engine;
-import com.ning.billing.entitlement.engine.dao.AuditedEntitlementDao;
 import com.ning.billing.entitlement.engine.dao.EntitlementDao;
 import com.ning.billing.entitlement.engine.dao.RepairEntitlementDao;
 import com.ning.billing.glue.EntitlementModule;
@@ -60,7 +60,7 @@ public class DefaultEntitlementModule extends AbstractModule implements Entitlem
     }
 
     protected void installEntitlementDao() {
-        bind(EntitlementDao.class).to(AuditedEntitlementDao.class).asEagerSingleton();
+        bind(EntitlementDao.class).to(DefaultEntitlementDao.class).asEagerSingleton();
         bind(EntitlementDao.class).annotatedWith(Names.named(REPAIR_NAMED)).to(RepairEntitlementDao.class);
         bind(RepairEntitlementLifecycleDao.class).annotatedWith(Names.named(REPAIR_NAMED)).to(RepairEntitlementDao.class);
         bind(RepairEntitlementDao.class).asEagerSingleton();
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoSql.java b/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoSql.java
index 048ab21..228e23f 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoSql.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoSql.java
@@ -26,7 +26,7 @@ import com.ning.billing.util.notificationq.NotificationQueueService;
 
 import com.google.inject.Inject;
 
-public class MockEntitlementDaoSql extends AuditedEntitlementDao {
+public class MockEntitlementDaoSql extends DefaultEntitlementDao {
     @Inject
     public MockEntitlementDaoSql(final IDBI dbi, final Clock clock, final AddonUtils addonUtils, final NotificationQueueService notificationQueueService,
                                  final InternalBus eventBus, final CatalogService catalogService) {
diff --git a/payment/src/main/java/com/ning/billing/payment/glue/PaymentModule.java b/payment/src/main/java/com/ning/billing/payment/glue/PaymentModule.java
index 77ebc62..906a0b6 100644
--- a/payment/src/main/java/com/ning/billing/payment/glue/PaymentModule.java
+++ b/payment/src/main/java/com/ning/billing/payment/glue/PaymentModule.java
@@ -25,6 +25,7 @@ import org.skife.config.ConfigSource;
 import org.skife.config.ConfigurationObjectFactory;
 import org.skife.config.SimplePropertyConfigSource;
 
+import com.ning.billing.payment.dao.DefaultPaymentDao;
 import com.ning.billing.util.config.PaymentConfig;
 import com.ning.billing.payment.api.DefaultPaymentApi;
 import com.ning.billing.payment.api.PaymentApi;
@@ -35,7 +36,6 @@ import com.ning.billing.payment.bus.TagHandler;
 import com.ning.billing.payment.core.PaymentMethodProcessor;
 import com.ning.billing.payment.core.PaymentProcessor;
 import com.ning.billing.payment.core.RefundProcessor;
-import com.ning.billing.payment.dao.AuditedPaymentDao;
 import com.ning.billing.payment.dao.PaymentDao;
 import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
 import com.ning.billing.payment.retry.AutoPayRetryService;
@@ -72,7 +72,7 @@ public class PaymentModule extends AbstractModule {
     }
 
     protected void installPaymentDao() {
-        bind(PaymentDao.class).to(AuditedPaymentDao.class).asEagerSingleton();
+        bind(PaymentDao.class).to(DefaultPaymentDao.class).asEagerSingleton();
     }
 
     protected void installPaymentProviderPlugins(final PaymentConfig config) {
diff --git a/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java b/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
index 8424853..c574c78 100644
--- a/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
+++ b/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
@@ -55,7 +55,7 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
     public void setup() throws IOException {
         clock = new DefaultClock();
         setupDb();
-        paymentDao = new AuditedPaymentDao(dbi);
+        paymentDao = new DefaultPaymentDao(dbi);
     }
 
     private void setupDb() {
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 361b6f5..a7084a5 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
@@ -110,7 +110,7 @@ public class DefaultTenantDao extends EntityDaoBase<TenantModelDao, Tenant, Tena
         return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<String>>() {
             @Override
             public List<String> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                final List<TenantKVModelDao> tenantKV = entitySqlDaoWrapperFactory.become(TenantKVSqlDao.class).getTenantValueForKey(key, context.getTenantRecordId());
+                final List<TenantKVModelDao> tenantKV = entitySqlDaoWrapperFactory.become(TenantKVSqlDao.class).getTenantValueForKey(key, context);
                 return ImmutableList.copyOf(Collections2.transform(tenantKV, new Function<TenantKVModelDao, String>() {
                     @Override
                     public String apply(final TenantKVModelDao in) {
@@ -126,7 +126,8 @@ public class DefaultTenantDao extends EntityDaoBase<TenantModelDao, Tenant, Tena
         transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Void>() {
             @Override
             public Void inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                entitySqlDaoWrapperFactory.become(TenantKVSqlDao.class).insertTenantKeyValue(UUID.randomUUID().toString(), key, value, context.getTenantRecordId(), context);
+                final TenantKVModelDao tenantKVModelDao = new TenantKVModelDao(UUID.randomUUID(), context.getCreatedDate(), context.getUpdatedDate(), key, value);
+                entitySqlDaoWrapperFactory.become(TenantKVSqlDao.class).create(tenantKVModelDao, context);
                 return null;
             }
         });
@@ -137,7 +138,7 @@ public class DefaultTenantDao extends EntityDaoBase<TenantModelDao, Tenant, Tena
         transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Void>() {
             @Override
             public Void inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                entitySqlDaoWrapperFactory.become(TenantKVSqlDao.class).deleteTenantKey(key, context.getTenantRecordId());
+                entitySqlDaoWrapperFactory.become(TenantKVSqlDao.class).markTenantKeyAsDeleted(key, context);
                 return null;
             }
         });
diff --git a/tenant/src/main/java/com/ning/billing/tenant/dao/TenantKVModelDao.java b/tenant/src/main/java/com/ning/billing/tenant/dao/TenantKVModelDao.java
index 3eb3955..516ce59 100644
--- a/tenant/src/main/java/com/ning/billing/tenant/dao/TenantKVModelDao.java
+++ b/tenant/src/main/java/com/ning/billing/tenant/dao/TenantKVModelDao.java
@@ -29,6 +29,7 @@ public class TenantKVModelDao extends EntityBase implements EntityModelDao<Tenan
 
     private String key;
     private String value;
+    private Boolean isActive;
 
     public TenantKVModelDao() { /* For the DAO mapper */ }
 
@@ -36,6 +37,7 @@ public class TenantKVModelDao extends EntityBase implements EntityModelDao<Tenan
         super(id, createdDate, updatedDate);
         this.key = key;
         this.value = value;
+        this.isActive = true;
     }
 
     public String getKey() {
@@ -46,12 +48,17 @@ public class TenantKVModelDao extends EntityBase implements EntityModelDao<Tenan
         return value;
     }
 
+    public Boolean getIsActive() {
+        return isActive;
+    }
+
     @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder();
         sb.append("TenantKVModelDao");
         sb.append("{key='").append(key).append('\'');
         sb.append(", value='").append(value).append('\'');
+        sb.append(", isActive=").append(isActive);
         sb.append('}');
         return sb.toString();
     }
@@ -70,6 +77,9 @@ public class TenantKVModelDao extends EntityBase implements EntityModelDao<Tenan
 
         final TenantKVModelDao that = (TenantKVModelDao) o;
 
+        if (isActive != null ? !isActive.equals(that.isActive) : that.isActive != null) {
+            return false;
+        }
         if (key != null ? !key.equals(that.key) : that.key != null) {
             return false;
         }
@@ -85,6 +95,7 @@ public class TenantKVModelDao extends EntityBase implements EntityModelDao<Tenan
         int result = super.hashCode();
         result = 31 * result + (key != null ? key.hashCode() : 0);
         result = 31 * result + (value != null ? value.hashCode() : 0);
+        result = 31 * result + (isActive != null ? isActive.hashCode() : 0);
         return result;
     }
 
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 ccef4fd..f75be0f 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
@@ -16,60 +16,30 @@
 
 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.BindBean;
 import org.skife.jdbi.v2.sqlobject.SqlQuery;
 import org.skife.jdbi.v2.sqlobject.SqlUpdate;
-import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
-import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
-import com.ning.billing.tenant.api.DefaultTenantKV;
 import com.ning.billing.tenant.api.TenantKV;
-import com.ning.billing.tenant.dao.TenantKVSqlDao.TenantKVMapper;
+import com.ning.billing.util.audit.ChangeType;
 import com.ning.billing.util.callcontext.InternalCallContext;
-import com.ning.billing.util.dao.MapperBase;
-import com.ning.billing.util.dao.UuidMapper;
+import com.ning.billing.util.callcontext.InternalTenantContext;
+import com.ning.billing.util.entity.dao.Audited;
 import com.ning.billing.util.entity.dao.EntitySqlDao;
 import com.ning.billing.util.entity.dao.EntitySqlDaoStringTemplate;
 
 @EntitySqlDaoStringTemplate
-@RegisterMapper({UuidMapper.class, TenantKVMapper.class})
 public interface TenantKVSqlDao extends EntitySqlDao<TenantKVModelDao, TenantKV> {
 
-    // TODO should take a context
-
     @SqlQuery
     public List<TenantKVModelDao> getTenantValueForKey(@Bind("key") final String key,
-                                                       @Bind("tenantRecordId") Long tenantRecordId);
-
-    @SqlUpdate
-    public void insertTenantKeyValue(@Bind("id") String id,
-                                     @Bind("key") final String key,
-                                     @Bind("value") final String value,
-                                     @Bind("tenantRecordId") Long tenantRecordId,
-                                     @BindBean final InternalCallContext context);
+                                                       @BindBean final InternalTenantContext context);
 
     @SqlUpdate
-    public void deleteTenantKey(@Bind("key") final String key,
-                                @Bind("tenantRecordId") Long tenantRecordId);
-
-    public class TenantKVMapper extends MapperBase implements ResultSetMapper<TenantKV> {
-
-        @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");
-            final DateTime createdDate = getDateTime(result, "created_date");
-            final DateTime updatedDate = getDateTime(result, "updated_date");
-            return new DefaultTenantKV(id, key, value, createdDate, updatedDate);
-        }
-    }
+    @Audited(ChangeType.DELETE)
+    public void markTenantKeyAsDeleted(@Bind("key") final String key,
+                                       @BindBean final InternalCallContext context);
 }
diff --git a/tenant/src/main/resources/com/ning/billing/tenant/dao/TenantKVSqlDao.sql.stg b/tenant/src/main/resources/com/ning/billing/tenant/dao/TenantKVSqlDao.sql.stg
index ce66a1a..20edb99 100644
--- a/tenant/src/main/resources/com/ning/billing/tenant/dao/TenantKVSqlDao.sql.stg
+++ b/tenant/src/main/resources/com/ning/billing/tenant/dao/TenantKVSqlDao.sql.stg
@@ -1,58 +1,45 @@
-group TenantKVSqlDao;
-
-
-tenantKVFields(prefix) ::= <<
-    <prefix>record_id,
-    <prefix>id,
-    <prefix>tenant_record_id,
-    <prefix>t_key,
-    <prefix>t_value,
-    <prefix>created_date,
-    <prefix>created_by,
-    <prefix>updated_date,
-    <prefix>updated_by
+group TenantKVSqlDao: EntitySqlDao;
+
+tableName() ::= "tenant_kvs"
+
+tableFields(prefix) ::= <<
+  <prefix>t_key
+, <prefix>t_value
+, <prefix>is_active
+, <prefix>created_date
+, <prefix>created_by
+, <prefix>updated_date
+, <prefix>updated_by
 >>
 
-insertTenantKeyValue() ::= <<
-   INSERT INTO tenant_kvs (
-      id
-      , tenant_record_id
-      , t_key
-      , t_value
-      , created_date
-      , created_by
-      , updated_date
-      , updated_by
-    ) VALUES (
-      :id
-      , :tenantRecordId
-      , :key
-      , :value
-      , :createdDate
-      , :userName
-      , :updatedDate
-      , :userName
-    );
+tableValues() ::= <<
+  :key
+, :value
+, :isActive
+, :createdDate
+, :createdBy
+, :updatedDate
+, :updatedBy
 >>
 
+accountRecordIdFieldWithComma() ::= ""
 
-getTenantValueForKey() ::= <<
-    SELECT <tenantKVFields()>
-    FROM tenant_kvs
-    WHERE
-        tenant_record_id = :tenantRecordId AND t_key = :key
-    ;
->>
+accountRecordIdValueWithComma() ::= ""
 
 
-deleteTenantKey() ::= <<
-    DELETE FROM tenant_kvs
-    WHERE
-        tenant_record_id = :tenantRecordId AND t_key = :key
-    ;
+getTenantValueForKey() ::= <<
+select
+  <allTableFields("t.")>
+from <tableName()> t
+where t.t_key = :key
+<AND_CHECK_TENANT("t.")>
+;
 >>
 
-
-test() ::= <<
-    SELECT 1 FROM tenants;
+markTenantKeyAsDeleted() ::= <<
+update <tableName()> t
+set t.is_active = 0
+where t.t_key = :key
+<AND_CHECK_TENANT("t.")>
+;
 >>
diff --git a/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java b/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java
index 8fa62d5..1ded618 100644
--- a/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java
+++ b/util/src/main/java/com/ning/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java
@@ -187,7 +187,6 @@ public class EntitySqlDaoWrapperInvocationHandler<S extends EntitySqlDao<M, E>, 
     }
 
     private List<String> retrieveEntityIdsFromArguments(final Method method, final Object[] args) {
-
         final Annotation[][] parameterAnnotations = method.getParameterAnnotations();
         int i = -1;
         for (final Object arg : args) {
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDao.java
index 92f4fd0..d40fbf4 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDao.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 Ning, Inc.
+ * Copyright 2010-2012 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -143,7 +143,7 @@ public class DefaultTagDao extends EntityDaoBase<TagModelDao, Tag, TagApiExcepti
                     throw new TagApiException(ErrorCode.TAG_DOES_NOT_EXIST, tagDefinition.getName());
                 }
                 // Delete the tag
-                transactional.deleteById(tag.getId(), context);
+                transactional.markTagAsDeleted(tag.getId().toString(), context);
 
                 postBusEventFromTransaction(tag, tag, ChangeType.DELETE, entitySqlDaoWrapperFactory, context);
                 return null;
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java
index 9d4070a..968c957 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java
@@ -207,7 +207,7 @@ public class DefaultTagDefinitionDao extends EntityDaoBase<TagDefinitionModelDao
                     }
 
                     // Delete it
-                    tagDefinitionSqlDao.deleteTagDefinition(definitionId.toString(), context);
+                    tagDefinitionSqlDao.markTagDefinitionAsDeleted(definitionId.toString(), context);
 
                     postBusEventFromTransaction(tagDefinition, tagDefinition, ChangeType.DELETE, entitySqlDaoWrapperFactory, context);
                     return null;
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionModelDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionModelDao.java
index c83f06d..5c0aaf9 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionModelDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionModelDao.java
@@ -30,6 +30,7 @@ public class TagDefinitionModelDao extends EntityBase implements EntityModelDao<
 
     private String name;
     private String description;
+    private Boolean isActive;
 
     public TagDefinitionModelDao() { /* For the DAO mapper */ }
 
@@ -37,6 +38,7 @@ public class TagDefinitionModelDao extends EntityBase implements EntityModelDao<
         super(id, createdDate, updatedDate);
         this.name = name;
         this.description = description;
+        this.isActive = true;
     }
 
     public TagDefinitionModelDao(final ControlTagType tag) {
@@ -60,12 +62,17 @@ public class TagDefinitionModelDao extends EntityBase implements EntityModelDao<
         return description;
     }
 
+    public Boolean getIsActive() {
+        return isActive;
+    }
+
     @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder();
         sb.append("TagDefinitionModelDao");
         sb.append("{name='").append(name).append('\'');
         sb.append(", description='").append(description).append('\'');
+        sb.append(", isActive=").append(isActive);
         sb.append('}');
         return sb.toString();
     }
@@ -87,6 +94,9 @@ public class TagDefinitionModelDao extends EntityBase implements EntityModelDao<
         if (description != null ? !description.equals(that.description) : that.description != null) {
             return false;
         }
+        if (isActive != null ? !isActive.equals(that.isActive) : that.isActive != null) {
+            return false;
+        }
         if (name != null ? !name.equals(that.name) : that.name != null) {
             return false;
         }
@@ -99,6 +109,7 @@ public class TagDefinitionModelDao extends EntityBase implements EntityModelDao<
         int result = super.hashCode();
         result = 31 * result + (name != null ? name.hashCode() : 0);
         result = 31 * result + (description != null ? description.hashCode() : 0);
+        result = 31 * result + (isActive != null ? isActive.hashCode() : 0);
         return result;
     }
 
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionSqlDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionSqlDao.java
index 7f46ebe..8603f3d 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionSqlDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionSqlDao.java
@@ -20,13 +20,13 @@ import java.util.Collection;
 import java.util.List;
 
 import org.skife.jdbi.v2.sqlobject.Bind;
+import org.skife.jdbi.v2.sqlobject.BindBean;
 import org.skife.jdbi.v2.sqlobject.SqlQuery;
 import org.skife.jdbi.v2.sqlobject.SqlUpdate;
 
 import com.ning.billing.util.audit.ChangeType;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
-import com.ning.billing.util.callcontext.InternalTenantContextBinder;
 import com.ning.billing.util.entity.dao.Audited;
 import com.ning.billing.util.entity.dao.EntitySqlDao;
 import com.ning.billing.util.entity.dao.EntitySqlDaoStringTemplate;
@@ -37,18 +37,18 @@ public interface TagDefinitionSqlDao extends EntitySqlDao<TagDefinitionModelDao,
 
     @SqlQuery
     public TagDefinitionModelDao getByName(@Bind("name") final String definitionName,
-                                           @InternalTenantContextBinder final InternalTenantContext context);
+                                           @BindBean final InternalTenantContext context);
 
     @SqlUpdate
     @Audited(ChangeType.DELETE)
-    public void deleteTagDefinition(@Bind("id") final String definitionId,
-                                    @InternalTenantContextBinder final InternalCallContext context);
+    public void markTagDefinitionAsDeleted(@Bind("id") final String definitionId,
+                                           @BindBean final InternalCallContext context);
 
     @SqlQuery
     public int tagDefinitionUsageCount(@Bind("id") final String definitionId,
-                                       @InternalTenantContextBinder final InternalTenantContext context);
+                                       @BindBean final InternalTenantContext context);
 
     @SqlQuery
     public List<TagDefinitionModelDao> getByIds(@UUIDCollectionBinder final Collection<String> definitionIds,
-                                                @InternalTenantContextBinder final InternalTenantContext context);
+                                                @BindBean final InternalTenantContext context);
 }
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/TagModelDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/TagModelDao.java
index 9f4bc7d..8d381df 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/TagModelDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/TagModelDao.java
@@ -31,6 +31,7 @@ public class TagModelDao extends EntityBase implements EntityModelDao<Tag> {
     private UUID tagDefinitionId;
     private UUID objectId;
     private ObjectType objectType;
+    private Boolean isActive;
 
     public TagModelDao() { /* For the DAO mapper */ }
 
@@ -45,6 +46,7 @@ public class TagModelDao extends EntityBase implements EntityModelDao<Tag> {
         this.tagDefinitionId = tagDefinitionId;
         this.objectId = objectId;
         this.objectType = objectType;
+        this.isActive = true;
     }
 
     public TagModelDao(final Tag tag) {
@@ -63,6 +65,10 @@ public class TagModelDao extends EntityBase implements EntityModelDao<Tag> {
         return objectType;
     }
 
+    public Boolean getIsActive() {
+        return isActive;
+    }
+
     @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder();
@@ -70,6 +76,7 @@ public class TagModelDao extends EntityBase implements EntityModelDao<Tag> {
         sb.append("{tagDefinitionId=").append(tagDefinitionId);
         sb.append(", objectId=").append(objectId);
         sb.append(", objectType=").append(objectType);
+        sb.append(", isActive=").append(isActive);
         sb.append('}');
         return sb.toString();
     }
@@ -88,6 +95,9 @@ public class TagModelDao extends EntityBase implements EntityModelDao<Tag> {
 
         final TagModelDao that = (TagModelDao) o;
 
+        if (isActive != null ? !isActive.equals(that.isActive) : that.isActive != null) {
+            return false;
+        }
         if (objectId != null ? !objectId.equals(that.objectId) : that.objectId != null) {
             return false;
         }
@@ -107,6 +117,7 @@ public class TagModelDao extends EntityBase implements EntityModelDao<Tag> {
         result = 31 * result + (tagDefinitionId != null ? tagDefinitionId.hashCode() : 0);
         result = 31 * result + (objectId != null ? objectId.hashCode() : 0);
         result = 31 * result + (objectType != null ? objectType.hashCode() : 0);
+        result = 31 * result + (isActive != null ? isActive.hashCode() : 0);
         return result;
     }
 
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/TagSqlDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/TagSqlDao.java
index acfe66e..2455417 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/TagSqlDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/TagSqlDao.java
@@ -25,8 +25,10 @@ import org.skife.jdbi.v2.sqlobject.SqlQuery;
 import org.skife.jdbi.v2.sqlobject.SqlUpdate;
 
 import com.ning.billing.ObjectType;
+import com.ning.billing.util.audit.ChangeType;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
+import com.ning.billing.util.entity.dao.Audited;
 import com.ning.billing.util.entity.dao.EntitySqlDao;
 import com.ning.billing.util.entity.dao.EntitySqlDaoStringTemplate;
 import com.ning.billing.util.tag.Tag;
@@ -35,8 +37,9 @@ import com.ning.billing.util.tag.Tag;
 public interface TagSqlDao extends EntitySqlDao<TagModelDao, Tag> {
 
     @SqlUpdate
-    void deleteById(@Bind("id") UUID id,
-                    @BindBean InternalCallContext context);
+    @Audited(ChangeType.DELETE)
+    void markTagAsDeleted(@Bind("id") String tagId,
+                          @BindBean InternalCallContext context);
 
     @SqlQuery
     List<TagModelDao> getTagsForObject(@Bind("objectId") UUID objectId,
diff --git a/util/src/main/resources/com/ning/billing/util/ddl.sql b/util/src/main/resources/com/ning/billing/util/ddl.sql
index 2a1edb7..3036278 100644
--- a/util/src/main/resources/com/ning/billing/util/ddl.sql
+++ b/util/src/main/resources/com/ning/billing/util/ddl.sql
@@ -47,6 +47,7 @@ CREATE TABLE tag_definitions (
     id char(36) NOT NULL,
     name varchar(20) NOT NULL,
     description varchar(200) NOT NULL,
+    is_active bool DEFAULT true,
     created_by varchar(50) NOT NULL,
     created_date datetime NOT NULL,
     updated_by varchar(50) NOT NULL,
@@ -65,6 +66,7 @@ CREATE TABLE tag_definition_history (
     target_record_id int(11) unsigned NOT NULL,
     name varchar(30) NOT NULL,
     description varchar(200),
+    is_active bool DEFAULT true,
     change_type char(6) NOT NULL,
     created_by varchar(50) NOT NULL,
     created_date datetime NOT NULL,
@@ -86,6 +88,7 @@ CREATE TABLE tags (
     tag_definition_id char(36) NOT NULL,
     object_id char(36) NOT NULL,
     object_type varchar(30) NOT NULL,
+    is_active bool DEFAULT true,
     created_by varchar(50) NOT NULL,
     created_date datetime NOT NULL,
     updated_by varchar(50) NOT NULL,
@@ -96,7 +99,6 @@ CREATE TABLE tags (
 ) ENGINE = innodb;
 CREATE UNIQUE INDEX tags_id ON tags(id);
 CREATE INDEX tags_by_object ON tags(object_id);
-CREATE UNIQUE INDEX tags_unique ON tags(tag_definition_id, object_id);
 CREATE INDEX tags_tenant_account_record_id ON tags(tenant_record_id, account_record_id);
 
 DROP TABLE IF EXISTS tag_history;
@@ -107,6 +109,7 @@ CREATE TABLE tag_history (
     object_id char(36) NOT NULL,
     object_type varchar(30) NOT NULL,
     tag_definition_id char(36) NOT NULL,
+    is_active bool DEFAULT true,
     change_type char(6) NOT NULL,
     created_by varchar(50) NOT NULL,
     created_date datetime NOT NULL,
diff --git a/util/src/main/resources/com/ning/billing/util/tag/dao/TagDefinitionSqlDao.sql.stg b/util/src/main/resources/com/ning/billing/util/tag/dao/TagDefinitionSqlDao.sql.stg
index 9492ebd..2d796c1 100644
--- a/util/src/main/resources/com/ning/billing/util/tag/dao/TagDefinitionSqlDao.sql.stg
+++ b/util/src/main/resources/com/ning/billing/util/tag/dao/TagDefinitionSqlDao.sql.stg
@@ -5,6 +5,7 @@ tableName() ::= "tag_definitions"
 tableFields(prefix) ::= <<
   <prefix>name
 , <prefix>description
+, <prefix>is_active
 , <prefix>created_by
 , <prefix>created_date
 , <prefix>updated_by
@@ -14,6 +15,7 @@ tableFields(prefix) ::= <<
 tableValues() ::= <<
   :name
 , :description
+, :isActive
 , :createdBy
 , :createdDate
 , :updatedBy
@@ -24,34 +26,42 @@ accountRecordIdFieldWithComma() ::= ""
 
 accountRecordIdValueWithComma() ::= ""
 
-
 historyTableName() ::= "tag_definition_history"
 
-deleteTagDefinition() ::= <<
-  DELETE FROM tag_definitions
-  WHERE id = :id
-  <AND_CHECK_TENANT()>
-  ;
+markTagDefinitionAsDeleted() ::= <<
+update <tableName()> t
+set t.is_active = 0
+where <idField("t.")> = :id
+<AND_CHECK_TENANT("t.")>
+;
 >>
 
 tagDefinitionUsageCount() ::= <<
-  SELECT COUNT(id)
-  FROM tags
-  WHERE tag_definition_id = :id
-  <AND_CHECK_TENANT()>
+select
+  count(<idField("t.")>)
+from tags t
+where t.is_active
+and t.tag_definition_id = :id
+<AND_CHECK_TENANT("t.")>
+;
 >>
 
 getByName() ::= <<
-  SELECT <allTableFields()>
-   FROM tag_definitions
-  WHERE name = :name
-  <AND_CHECK_TENANT()>
-  ;
+select
+  <allTableFields("t.")>
+from <tableName()> t
+where t.name = :name
+and t.is_active
+<AND_CHECK_TENANT("t.")>
+;
 >>
 
 getByIds(tag_definition_ids) ::= <<
-  SELECT <allTableFields()>
-  FROM tag_definitions
-  WHERE id IN (<tag_definition_ids: {id | :id_<i0>}; separator="," >)
-  <AND_CHECK_TENANT()>
+select
+  <allTableFields("t.")>
+from <tableName()> t
+where t.is_active
+and <idField("t.")> in (<tag_definition_ids: {id | :id_<i0>}; separator="," >)
+<AND_CHECK_TENANT("t.")>
+;
 >>
diff --git a/util/src/main/resources/com/ning/billing/util/tag/dao/TagSqlDao.sql.stg b/util/src/main/resources/com/ning/billing/util/tag/dao/TagSqlDao.sql.stg
index 3dd5e0f..410f56b 100644
--- a/util/src/main/resources/com/ning/billing/util/tag/dao/TagSqlDao.sql.stg
+++ b/util/src/main/resources/com/ning/billing/util/tag/dao/TagSqlDao.sql.stg
@@ -6,6 +6,7 @@ tableFields(prefix) ::= <<
   <prefix>tag_definition_id
 , <prefix>object_id
 , <prefix>object_type
+, <prefix>is_active
 , <prefix>created_by
 , <prefix>created_date
 , <prefix>updated_by
@@ -16,6 +17,7 @@ tableValues() ::= <<
   :tagDefinitionId
 , :objectId
 , :objectType
+, :isActive
 , :createdBy
 , :createdDate
 , :updatedBy
@@ -24,50 +26,21 @@ tableValues() ::= <<
 
 historyTableName() ::= "tag_history"
 
-deleteById() ::= <<
-delete from <tableName()>
-where id = :id
-<AND_CHECK_TENANT()>
+markTagAsDeleted() ::= <<
+update <tableName()> t
+set t.is_active = 0
+where <idField("t.")> = :id
+<AND_CHECK_TENANT("t.")>
 ;
 >>
 
 getTagsForObject() ::= <<
 select
-<allTableFields()>
-from <tableName()>
-where
-object_id = :objectId AND object_type = :objectType
-<AND_CHECK_TENANT()>
+  <allTableFields("t.")>
+from <tableName()> t
+where t.is_active
+and t.object_id = :objectId
+and t.object_type = :objectType
+<AND_CHECK_TENANT("t.")>
 ;
 >>
-
-findTag() ::= <<
-    SELECT <fields()> FROM tags
-    WHERE tag_definition_id = :tagDefinitionId
-    AND object_id = :objectId AND object_type = :objectType
-    <AND_CHECK_TENANT()>
-    ;
->>
-
-getRecordIds() ::= <<
-    SELECT record_id, id
-    FROM tags
-    WHERE object_id = :objectId AND object_type = :objectType
-    <AND_CHECK_TENANT()>
-    ;
->>
-
-getHistoryRecordIds() ::= <<
-    SELECT history_record_id, record_id
-    FROM tag_history
-    WHERE history_record_id > :maxHistoryRecordId
-    <AND_CHECK_TENANT()>
-    ;
->>
-
-load() ::= <<
-  SELECT <fields()>
-    FROM tags
-  WHERE object_id = :objectId AND object_type = :objectType
-  <AND_CHECK_TENANT()>;
->>