killbill-uncached

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

11/13/2012 4:22:24 PM

Changes

Details

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 24f2cbe..e5acd59 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
@@ -62,8 +62,13 @@ public class DefaultAccountInternalApi implements AccountInternalApi {
 
     @Override
     public Account getAccountByRecordId(final Long recordId, final InternalTenantContext context) throws AccountApiException {
+        try {
         final AccountModelDao account = accountDao.getByRecordId(recordId, context);
         return new DefaultAccount(account);
+        } catch (NullPointerException e) {
+            e.printStackTrace();;
+            return null;
+        }
     }
 
     @Override
diff --git a/account/src/main/java/com/ning/billing/account/dao/DefaultAccountDao.java b/account/src/main/java/com/ning/billing/account/dao/DefaultAccountDao.java
index fc199b8..dc3fe91 100644
--- a/account/src/main/java/com/ning/billing/account/dao/DefaultAccountDao.java
+++ b/account/src/main/java/com/ning/billing/account/dao/DefaultAccountDao.java
@@ -75,7 +75,7 @@ public class DefaultAccountDao extends EntityDaoBase<AccountModelDao, Account, A
                 return;
         }
 
-        final Long recordId = getRecordId(savedAccount.getId(), context);
+        final Long recordId = entitySqlDaoWrapperFactory.become(AccountSqlDao.class).getRecordId(savedAccount.getId().toString(), context);
         // We need to re-hydrate the context with the account record id
         final InternalCallContext rehydratedContext = internalCallContextFactory.createInternalCallContext(recordId, context);
         final AccountCreationInternalEvent creationEvent = new DefaultAccountCreationEvent(savedAccount,
diff --git a/api/src/main/java/com/ning/billing/junction/api/BlockingState.java b/api/src/main/java/com/ning/billing/junction/api/BlockingState.java
index a324506..d46e799 100644
--- a/api/src/main/java/com/ning/billing/junction/api/BlockingState.java
+++ b/api/src/main/java/com/ning/billing/junction/api/BlockingState.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.junction.api;
 
+import java.util.UUID;
+
 import org.joda.time.DateTime;
 
 import com.ning.billing.util.entity.Entity;
@@ -23,23 +25,27 @@ import com.ning.billing.util.entity.Entity;
 
 public interface BlockingState extends Entity, Comparable<BlockingState> {
 
-    public abstract String getStateName();
+    public UUID getBlockedId();
+
+    public String getStateName();
+
+    public Blockable.Type getType();
 
-    public abstract Blockable.Type getType();
+    public DateTime getTimestamp();
 
-    public abstract DateTime getTimestamp();
+    public boolean isBlockChange();
 
-    public abstract boolean isBlockChange();
+    public boolean isBlockEntitlement();
 
-    public abstract boolean isBlockEntitlement();
+    public boolean isBlockBilling();
 
-    public abstract boolean isBlockBilling();
+    public int compareTo(BlockingState arg0);
 
-    public abstract int compareTo(BlockingState arg0);
+    public int hashCode();
 
-    public abstract int hashCode();
+    public String getDescription();
 
-    public abstract String getDescription();
+    public String toString();
 
-    public abstract String toString();
+    public String getService();
 }
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegration.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegration.java
index 8f21dfa..dfd9176 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegration.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegration.java
@@ -266,6 +266,8 @@ public class TestIntegration extends TestIntegrationBase {
         // CREATE SUBSCRIPTION AND EXPECT BOTH EVENTS: NextEvent.CREATE NextEvent.INVOICE
         //
         SubscriptionData subscription = subscriptionDataFromSubscription(createSubscriptionAndCheckForCompletion(bundle.getId(), "Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, NextEvent.CREATE, NextEvent.INVOICE));
+
+
         invoiceChecker.checkInvoice(account.getId(), invoiceItemCount++, callContext, new ExpectedItemCheck(initialCreationDate.toLocalDate(), null, InvoiceItemType.FIXED, new BigDecimal("0")));
         // No end date for the trial item (fixed price of zero), and CTD should be today (i.e. when the trial started)
         invoiceChecker.checkChargedThroughDate(subscription.getId(), clock.getUTCToday(), callContext);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index 0570fc2..730fbbc 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.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
@@ -185,7 +185,7 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
                     final List<InvoiceItemModelDao> recurringInvoiceItems = ImmutableList.<InvoiceItemModelDao>copyOf(Collections2.filter(invoiceItems, new Predicate<InvoiceItemModelDao>() {
                         @Override
                         public boolean apply(@Nullable final InvoiceItemModelDao item) {
-                            return RecurringInvoiceItem.class.isInstance(item);
+                            return item.getType() == InvoiceItemType.RECURRING;
                         }
                     }));
                     notifyOfFutureBillingEvents(entitySqlDaoWrapperFactory, invoice.getAccountId(), recurringInvoiceItems);
diff --git a/junction/src/main/java/com/ning/billing/junction/api/svcs/DefaultInternalBlockingApi.java b/junction/src/main/java/com/ning/billing/junction/api/svcs/DefaultInternalBlockingApi.java
index 554a5eb..48a4988 100644
--- a/junction/src/main/java/com/ning/billing/junction/api/svcs/DefaultInternalBlockingApi.java
+++ b/junction/src/main/java/com/ning/billing/junction/api/svcs/DefaultInternalBlockingApi.java
@@ -43,7 +43,7 @@ public class DefaultInternalBlockingApi implements BlockingInternalApi {
 
     @Override
     public BlockingState getBlockingStateFor(final Blockable overdueable, final InternalTenantContext context) {
-        BlockingState state = dao.getBlockingStateFor(overdueable, context);
+        BlockingState state = dao.getBlockingStateFor(overdueable.getId(), context);
         if (state == null) {
             state = DefaultBlockingState.getClearState();
         }
@@ -57,7 +57,7 @@ public class DefaultInternalBlockingApi implements BlockingInternalApi {
 
     @Override
     public List<BlockingState> getBlockingHistory(final Blockable overdueable, final InternalTenantContext context) {
-        return dao.getBlockingHistoryFor(overdueable, context);
+        return dao.getBlockingHistoryFor(overdueable.getId(), context);
     }
 
     @Override
diff --git a/junction/src/main/java/com/ning/billing/junction/dao/BlockingStateDao.java b/junction/src/main/java/com/ning/billing/junction/dao/BlockingStateDao.java
index f33d3d4..8266091 100644
--- a/junction/src/main/java/com/ning/billing/junction/dao/BlockingStateDao.java
+++ b/junction/src/main/java/com/ning/billing/junction/dao/BlockingStateDao.java
@@ -27,16 +27,9 @@ import com.ning.billing.util.clock.Clock;
 
 public interface BlockingStateDao {
 
-    // Read
-    public BlockingState getBlockingStateFor(Blockable blockable, InternalTenantContext context);
-
     public BlockingState getBlockingStateFor(UUID blockableId, InternalTenantContext context);
 
-    public List<BlockingState> getBlockingHistoryFor(Blockable blockable, InternalTenantContext context);
-
     public List<BlockingState> getBlockingHistoryFor(UUID blockableId, InternalTenantContext context);
 
-    // Write
     <T extends Blockable> void setBlockingState(BlockingState state, Clock clock, InternalCallContext context);
-
-} 
+}
diff --git a/junction/src/main/java/com/ning/billing/junction/dao/BlockingStateModelDao.java b/junction/src/main/java/com/ning/billing/junction/dao/BlockingStateModelDao.java
new file mode 100644
index 0000000..5dbdd25
--- /dev/null
+++ b/junction/src/main/java/com/ning/billing/junction/dao/BlockingStateModelDao.java
@@ -0,0 +1,114 @@
+/*
+ * 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
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.junction.dao;
+
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.junction.api.Blockable;
+import com.ning.billing.junction.api.Blockable.Type;
+import com.ning.billing.junction.api.BlockingState;
+import com.ning.billing.util.callcontext.InternalCallContext;
+import com.ning.billing.util.dao.TableName;
+import com.ning.billing.util.entity.EntityBase;
+import com.ning.billing.util.entity.dao.EntityModelDao;
+import com.ning.billing.util.svcapi.junction.DefaultBlockingState;
+
+public class BlockingStateModelDao extends EntityBase implements EntityModelDao<BlockingState>{
+
+    private final UUID blockableId;
+    private final Type type;
+    private final String state;
+    private final String service;
+    private final Boolean blockChange;
+    private final Boolean blockEntitlement;
+    private final Boolean blockBilling;
+
+    public BlockingStateModelDao(final UUID id, final UUID blockableId, final Type type, final String state, final String service, final Boolean blockChange, final Boolean blockEntitlement,
+                                 final Boolean blockBilling, final DateTime createDate, final DateTime updateDate) {
+        super(id, createDate, updateDate);
+        this.blockableId = blockableId;
+        this.type = type;
+        this.state = state;
+        this.service = service;
+        this.blockChange = blockChange;
+        this.blockEntitlement = blockEntitlement;
+        this.blockBilling = blockBilling;
+    }
+
+    public BlockingStateModelDao(final BlockingState src, InternalCallContext context) {
+        this(src.getId(), src.getBlockedId(), src.getType(), src.getStateName(), src.getService(), src.isBlockChange(),
+             src.isBlockEntitlement(), src.isBlockBilling(), context.getCreatedDate(), context.getUpdatedDate());
+    }
+
+    public UUID getBlockableId() {
+        return blockableId;
+    }
+
+    public Type getType() {
+        return type;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public String getService() {
+        return service;
+    }
+
+    public Boolean getBlockChange() {
+        return blockChange;
+    }
+
+    public Boolean getBlockEntitlement() {
+        return blockEntitlement;
+    }
+
+    public Boolean getBlockBilling() {
+        return blockBilling;
+    }
+
+    public static BlockingState toBlockingState(BlockingStateModelDao src) {
+        if (src == null) {
+            return null;
+        }
+        return new DefaultBlockingState(src.getId(), src.getBlockableId(),src.getState(), src.getType(), src.getService(), src.getBlockChange(), src.getBlockEntitlement(), src.getBlockBilling(),
+                                 src.getCreatedDate(), src.getUpdatedDate());
+    }
+
+    @Override
+    public TableName getTableName() {
+        return TableName.BLOCKING_STATES;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("BlockingStateModelDao");
+        sb.append("{blockableId=").append(blockableId);
+        sb.append(", type=").append(type);
+        sb.append(", state='").append(state).append('\'');
+        sb.append(", service='").append(service).append('\'');
+        sb.append(", blockChange=").append(blockChange);
+        sb.append(", blockEntitlement=").append(blockEntitlement);
+        sb.append(", blockBilling=").append(blockBilling);
+        sb.append('}');
+        return sb.toString();
+    }
+}
diff --git a/junction/src/main/java/com/ning/billing/junction/dao/BlockingStateSqlDao.java b/junction/src/main/java/com/ning/billing/junction/dao/BlockingStateSqlDao.java
index 9e33d3d..c1edb7e 100644
--- a/junction/src/main/java/com/ning/billing/junction/dao/BlockingStateSqlDao.java
+++ b/junction/src/main/java/com/ning/billing/junction/dao/BlockingStateSqlDao.java
@@ -25,10 +25,12 @@ import org.joda.time.DateTime;
 import org.skife.jdbi.v2.SQLStatement;
 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.Binder;
 import org.skife.jdbi.v2.sqlobject.SqlQuery;
 import org.skife.jdbi.v2.sqlobject.SqlUpdate;
 import org.skife.jdbi.v2.sqlobject.customizers.Mapper;
+import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
 import org.skife.jdbi.v2.sqlobject.mixins.CloseMe;
 import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
 import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
@@ -45,45 +47,25 @@ import com.ning.billing.util.callcontext.InternalTenantContextBinder;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.dao.BinderBase;
 import com.ning.billing.util.dao.MapperBase;
+import com.ning.billing.util.entity.dao.EntitySqlDao;
+import com.ning.billing.util.entity.dao.EntitySqlDaoStringTemplate;
 import com.ning.billing.util.svcapi.junction.DefaultBlockingState;
 
-@ExternalizedSqlViaStringTemplate3()
-public interface BlockingStateSqlDao extends BlockingStateDao, CloseMe, Transmogrifier {
+@EntitySqlDaoStringTemplate
+@RegisterMapper(BlockingStateSqlDao.BlockingHistorySqlMapper.class)
+public interface BlockingStateSqlDao extends EntitySqlDao<BlockingStateModelDao, BlockingState> {
 
-    @Override
-    @SqlUpdate
-    public abstract <T extends Blockable> void setBlockingState(@Bind(binder = BlockingStateBinder.class) BlockingState state,
-                                                                @Bind(binder = CurrentTimeBinder.class) Clock clock,
-                                                                @InternalTenantContextBinder final InternalCallContext context);
-
-    @Override
-    @SqlQuery
-    @Mapper(BlockingHistorySqlMapper.class)
-    public abstract BlockingState getBlockingStateFor(@Bind(binder = BlockableBinder.class) Blockable overdueable,
-                                                      @InternalTenantContextBinder final InternalTenantContext context);
-
-    @Override
     @SqlQuery
-    @Mapper(BlockingHistorySqlMapper.class)
-    public abstract BlockingState getBlockingStateFor(@Bind(binder = UUIDBinder.class) UUID overdueableId,
-                                                      @InternalTenantContextBinder final InternalTenantContext context);
+    public BlockingStateModelDao getBlockingStateFor(@Bind("blockableId") UUID blockableId, @BindBean final InternalTenantContext context);
 
-    @Override
     @SqlQuery
-    @Mapper(BlockingHistorySqlMapper.class)
-    public abstract List<BlockingState> getBlockingHistoryFor(@Bind(binder = BlockableBinder.class) Blockable blockable,
-                                                              @InternalTenantContextBinder final InternalTenantContext context);
+    public abstract List<BlockingStateModelDao> getBlockingHistoryFor(@Bind("blockableId") UUID blockableId,
+                                                              @BindBean final InternalTenantContext context);
 
-    @Override
-    @SqlQuery
-    @Mapper(BlockingHistorySqlMapper.class)
-    public abstract List<BlockingState> getBlockingHistoryFor(@Bind(binder = UUIDBinder.class) UUID blockableId,
-                                                              @InternalTenantContextBinder final InternalTenantContext context);
-
-    public class BlockingHistorySqlMapper extends MapperBase implements ResultSetMapper<BlockingState> {
+    public class BlockingHistorySqlMapper extends MapperBase implements ResultSetMapper<BlockingStateModelDao> {
 
         @Override
-        public BlockingState map(final int index, final ResultSet r, final StatementContext ctx)
+        public BlockingStateModelDao map(final int index, final ResultSet r, final StatementContext ctx)
                 throws SQLException {
 
             final UUID id;
@@ -112,74 +94,7 @@ public interface BlockingStateSqlDao extends BlockingStateDao, CloseMe, Transmog
             } catch (BlockingApiException e) {
                 throw new SQLException(e);
             }
-            return new DefaultBlockingState(id, blockableId, stateName, type, service, blockChange, blockEntitlement, blockBilling, timestamp, createdDate);
-        }
-    }
-
-    public static class BlockingStateSqlMapper extends MapperBase implements ResultSetMapper<String> {
-
-        @Override
-        public String map(final int index, final ResultSet r, final StatementContext ctx)
-                throws SQLException {
-            return r.getString("state") == null ? DefaultBlockingState.CLEAR_STATE_NAME : r.getString("state");
-        }
-    }
-
-    public static class BlockingStateBinder extends BinderBase implements Binder<Bind, DefaultBlockingState> {
-
-        @Override
-        public void bind(@SuppressWarnings("rawtypes") final SQLStatement stmt, final Bind bind, final DefaultBlockingState state) {
-            stmt.bind("id", state.getId().toString());
-            stmt.bind("blockableId", state.getBlockedId().toString());
-            stmt.bind("state", state.getStateName().toString());
-            stmt.bind("type", state.getType().toString());
-            stmt.bind("service", state.getService().toString());
-            stmt.bind("blockChange", state.isBlockChange());
-            stmt.bind("blockEntitlement", state.isBlockEntitlement());
-            stmt.bind("blockBilling", state.isBlockBilling());
-        }
-    }
-
-    public static class UUIDBinder extends BinderBase implements Binder<Bind, UUID> {
-
-        @Override
-        public void bind(@SuppressWarnings("rawtypes") final SQLStatement stmt, final Bind bind, final UUID id) {
-            stmt.bind("blockable_id", id.toString());
-        }
-    }
-
-    public static class BlockableBinder extends BinderBase implements Binder<Bind, Blockable> {
-
-        @Override
-        public void bind(@SuppressWarnings("rawtypes") final SQLStatement stmt, final Bind bind, final Blockable overdueable) {
-            stmt.bind("blockable_id", overdueable.getId().toString());
-        }
-    }
-
-    public static class OverdueStateBinder<T extends Blockable> extends BinderBase implements Binder<Bind, OverdueState<T>> {
-
-        @Override
-        public void bind(final SQLStatement<?> stmt, final Bind bind, final OverdueState<T> overdueState) {
-            stmt.bind("state", overdueState.getName());
-        }
-    }
-
-    public class BlockableTypeBinder extends BinderBase implements Binder<Bind, Blockable.Type> {
-
-        @Override
-        public void bind(@SuppressWarnings("rawtypes") final SQLStatement stmt, final Bind bind, final Type type) {
-            stmt.bind("type", type.name());
+            return new BlockingStateModelDao(id, blockableId, type, stateName, service, blockChange,blockEntitlement, blockBilling, createdDate, createdDate);
         }
-
     }
-
-    public static class CurrentTimeBinder extends BinderBase implements Binder<Bind, Clock> {
-
-        @Override
-        public void bind(@SuppressWarnings("rawtypes") final SQLStatement stmt, final Bind bind, final Clock clock) {
-            stmt.bind("created_date", clock.getUTCNow().toDate());
-        }
-
-    }
-
 }
diff --git a/junction/src/main/java/com/ning/billing/junction/dao/DefaultBlockingStateDao.java b/junction/src/main/java/com/ning/billing/junction/dao/DefaultBlockingStateDao.java
new file mode 100644
index 0000000..ec1945e
--- /dev/null
+++ b/junction/src/main/java/com/ning/billing/junction/dao/DefaultBlockingStateDao.java
@@ -0,0 +1,99 @@
+/*
+ * 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
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.junction.dao;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import javax.annotation.Nullable;
+import javax.inject.Inject;
+
+import org.skife.jdbi.v2.IDBI;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.ning.billing.junction.api.Blockable;
+import com.ning.billing.junction.api.BlockingState;
+import com.ning.billing.util.callcontext.InternalCallContext;
+import com.ning.billing.util.callcontext.InternalTenantContext;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.entity.dao.EntitySqlDao;
+import com.ning.billing.util.entity.dao.EntitySqlDaoTransactionWrapper;
+import com.ning.billing.util.entity.dao.EntitySqlDaoTransactionalJdbiWrapper;
+import com.ning.billing.util.entity.dao.EntitySqlDaoWrapperFactory;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+
+public class DefaultBlockingStateDao implements BlockingStateDao {
+
+
+    private static final Logger log = LoggerFactory.getLogger(DefaultBlockingStateDao.class);
+
+    private final Clock clock;
+    private final EntitySqlDaoTransactionalJdbiWrapper transactionalSqlDao;
+
+    @Inject
+    public DefaultBlockingStateDao(final IDBI dbi, final Clock clock) {
+        this.clock = clock;
+        this.transactionalSqlDao = new EntitySqlDaoTransactionalJdbiWrapper(dbi);
+    }
+
+
+    @Override
+    public BlockingState getBlockingStateFor(final UUID blockableId, final InternalTenantContext context) {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<BlockingState>() {
+            @Override
+            public BlockingState inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final BlockingStateModelDao model =  entitySqlDaoWrapperFactory.become(BlockingStateSqlDao.class).getBlockingStateFor(blockableId, context);
+                return BlockingStateModelDao.toBlockingState(model);
+
+            }
+        });
+    }
+
+
+
+    @Override
+    public List<BlockingState> getBlockingHistoryFor(final UUID blockableId, final InternalTenantContext context) {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<BlockingState>>() {
+            @Override
+            public List<BlockingState> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                List<BlockingStateModelDao> models = entitySqlDaoWrapperFactory.become(BlockingStateSqlDao.class).getBlockingHistoryFor(blockableId, context);
+                return new ArrayList<BlockingState>(Collections2.transform(models, new Function<BlockingStateModelDao, BlockingState>() {
+                    @Override
+                    public BlockingState apply(@Nullable final BlockingStateModelDao src) {
+                        return BlockingStateModelDao.toBlockingState(src);
+                    }
+                }));
+            }
+        });
+    }
+
+    @Override
+    public <T extends Blockable> void setBlockingState(final BlockingState state, final Clock clock, final InternalCallContext context) {
+        transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Void>() {
+            @Override
+            public Void inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final BlockingStateSqlDao sqlDao = entitySqlDaoWrapperFactory.become(BlockingStateSqlDao.class);
+                sqlDao.create(new BlockingStateModelDao(state, context), context);
+                return null;
+            }
+        });
+    }
+}
diff --git a/junction/src/main/java/com/ning/billing/junction/glue/DefaultJunctionModule.java b/junction/src/main/java/com/ning/billing/junction/glue/DefaultJunctionModule.java
index e7b37bd..756b50c 100644
--- a/junction/src/main/java/com/ning/billing/junction/glue/DefaultJunctionModule.java
+++ b/junction/src/main/java/com/ning/billing/junction/glue/DefaultJunctionModule.java
@@ -26,12 +26,14 @@ import com.ning.billing.junction.block.BlockingChecker;
 import com.ning.billing.junction.block.DefaultBlockingChecker;
 import com.ning.billing.junction.dao.BlockingStateDao;
 import com.ning.billing.junction.dao.BlockingStateSqlDao;
+import com.ning.billing.junction.dao.DefaultBlockingStateDao;
 import com.ning.billing.junction.plumbing.api.BlockingAccountUserApi;
 import com.ning.billing.junction.plumbing.api.BlockingEntitlementUserApi;
 import com.ning.billing.junction.plumbing.billing.BlockingCalculator;
 import com.ning.billing.junction.plumbing.billing.DefaultInternalBillingApi;
 import com.ning.billing.util.svcapi.junction.BillingInternalApi;
 import com.ning.billing.util.svcapi.junction.BlockingInternalApi;
+import com.ning.billing.util.svcapi.junction.DefaultBlockingState;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
@@ -63,7 +65,7 @@ public class DefaultJunctionModule extends AbstractModule implements JunctionMod
     }
 
     public void installBlockingStateDao() {
-        bind(BlockingStateDao.class).toProvider(BlockingDaoProvider.class);
+        bind(BlockingStateDao.class).to(DefaultBlockingStateDao.class).asEagerSingleton();
     }
 
     public void installAccountUserApi() {
@@ -81,19 +83,4 @@ public class DefaultJunctionModule extends AbstractModule implements JunctionMod
     public void installBlockingCalculator() {
         bind(BlockingCalculator.class).asEagerSingleton();
     }
-
-    public static class BlockingDaoProvider implements Provider<BlockingStateDao> {
-        private final IDBI dbi;
-
-
-        @Inject
-        public BlockingDaoProvider(final IDBI dbi) {
-            this.dbi = dbi;
-        }
-
-        @Override
-        public BlockingStateDao get() {
-            return dbi.onDemand(BlockingStateSqlDao.class);
-        }
-    }
 }
diff --git a/junction/src/main/resources/com/ning/billing/junction/dao/BlockingStateSqlDao.sql.stg b/junction/src/main/resources/com/ning/billing/junction/dao/BlockingStateSqlDao.sql.stg
index 0cfcd63..d477691 100644
--- a/junction/src/main/resources/com/ning/billing/junction/dao/BlockingStateSqlDao.sql.stg
+++ b/junction/src/main/resources/com/ning/billing/junction/dao/BlockingStateSqlDao.sql.stg
@@ -1,11 +1,12 @@
 group BlockingStateSqlDao: EntitySqlDao;
 
 
+tableName() ::= "blocking_states"
+
 tableFields(prefix) ::= <<
- <prefix>id
-, <prefix>blockable_id
-, <prefix>state
+  <prefix>blockable_id
 , <prefix>type
+, <prefix>state
 , <prefix>service
 , <prefix>block_change
 , <prefix>block_entitlement
@@ -15,10 +16,9 @@ tableFields(prefix) ::= <<
 
 
 tableValues() ::= <<
- :id
-, :blockableId
-, :state
+  :blockableId
 , :type
+, :state
 , :service
 , :blockChange
 , :blockEntitlement
@@ -27,42 +27,26 @@ tableValues() ::= <<
 >>
 
 getBlockingStateFor() ::= <<
-    select
-        id
-      , blockable_id
-      , state
-      , type
-      , service
-      , block_change
-      , block_entitlement
-      , block_billing
-      , created_date
-      , tenant_record_id
-    from blocking_states
-    where blockable_id = :blockable_id
-    <AND_CHECK_TENANT()>
-    -- We want the current state, hence the order desc and limit 1
-    order by created_date desc, record_id desc
-    limit 1
-    ;
+select
+<allTableFields()>
+from
+<tableName()>
+where blockable_id = :blockableId
+<AND_CHECK_TENANT()>
+-- We want the current state, hence the order desc and limit 1
+order by created_date desc, record_id desc
+limit 1
+;
 >>
 
 getBlockingHistoryFor() ::= <<
-    select
-       id
-      , blockable_id
-      , state
-      , type
-      , service
-      , block_change
-      , block_entitlement
-      , block_billing
-      , created_date
-      , tenant_record_id
-    from blocking_states
-    where blockable_id = :blockable_id
-    <AND_CHECK_TENANT()>
-    -- We want the history in order
-    order by created_date asc, record_id asc
-    ;
+select
+<allTableFields()>
+from
+<tableName()>
+where blockable_id = :blockableId
+<AND_CHECK_TENANT()>
+-- We want the current state, hence the order desc and limit 1
+order by created_date asc, record_id asc
+;
 >>
diff --git a/junction/src/test/java/com/ning/billing/junction/api/blocking/TestDefaultBlockingApi.java b/junction/src/test/java/com/ning/billing/junction/api/blocking/TestDefaultBlockingApi.java
index 5d1c7a2..13f84ba 100644
--- a/junction/src/test/java/com/ning/billing/junction/api/blocking/TestDefaultBlockingApi.java
+++ b/junction/src/test/java/com/ning/billing/junction/api/blocking/TestDefaultBlockingApi.java
@@ -32,6 +32,7 @@ import com.ning.billing.junction.api.svcs.DefaultInternalBlockingApi;
 import com.ning.billing.junction.api.BlockingState;
 import com.ning.billing.junction.dao.BlockingStateDao;
 import com.ning.billing.junction.dao.BlockingStateSqlDao;
+import com.ning.billing.junction.dao.DefaultBlockingStateDao;
 import com.ning.billing.util.clock.ClockMock;
 import com.ning.billing.util.svcapi.junction.DefaultBlockingState;
 
@@ -43,11 +44,10 @@ public class TestDefaultBlockingApi extends JunctionTestSuiteWithEmbeddedDB {
 
     @BeforeMethod(groups = "slow")
     public void setUp() throws Exception {
-        final BlockingStateDao blockingStateDao = getMysqlTestingHelper().getDBI().onDemand(BlockingStateSqlDao.class);
+        final BlockingStateDao blockingStateDao = new DefaultBlockingStateDao(getMysqlTestingHelper().getDBI(), clock);
         blockingApi = new DefaultInternalBlockingApi(blockingStateDao, clock);
     }
 
-    // API_FIX
     @Test(groups = "slow", enabled=false)
     public void testSetBlockingStateOnBundle() throws Exception {
         final UUID bundleId = UUID.randomUUID();
diff --git a/junction/src/test/java/com/ning/billing/junction/blocking/TestBlockingChecker.java b/junction/src/test/java/com/ning/billing/junction/blocking/TestBlockingChecker.java
index 7607964..1b3d1ba 100644
--- a/junction/src/test/java/com/ning/billing/junction/blocking/TestBlockingChecker.java
+++ b/junction/src/test/java/com/ning/billing/junction/blocking/TestBlockingChecker.java
@@ -53,16 +53,7 @@ public class TestBlockingChecker extends JunctionTestSuite {
     private BlockingState accountState;
 
     private final BlockingStateDao dao = new BlockingStateDao() {
-        @Override
-        public BlockingState getBlockingStateFor(final Blockable blockable, final InternalTenantContext context) {
-            if (blockable.getId() == account.getId()) {
-                return accountState;
-            } else if (blockable.getId() == subscription.getId()) {
-                return subscriptionState;
-            } else {
-                return bundleState;
-            }
-        }
+
 
         @Override
         public BlockingState getBlockingStateFor(final UUID blockableId, final InternalTenantContext context) {
@@ -75,10 +66,6 @@ public class TestBlockingChecker extends JunctionTestSuite {
             }
         }
 
-        @Override
-        public List<BlockingState> getBlockingHistoryFor(final Blockable overdueable, final InternalTenantContext context) {
-            throw new UnsupportedOperationException();
-        }
 
         @Override
         public List<BlockingState> getBlockingHistoryFor(final UUID overdueableId, final InternalTenantContext context) {
diff --git a/junction/src/test/java/com/ning/billing/junction/dao/TestBlockingDao.java b/junction/src/test/java/com/ning/billing/junction/dao/TestBlockingDao.java
index 2c1c4a2..5730a39 100644
--- a/junction/src/test/java/com/ning/billing/junction/dao/TestBlockingDao.java
+++ b/junction/src/test/java/com/ning/billing/junction/dao/TestBlockingDao.java
@@ -43,8 +43,6 @@ public class TestBlockingDao extends JunctionTestSuiteWithEmbeddedDB {
     @Inject
     private BlockingStateDao dao;
 
-    private final InternalTenantContext tenantContext = Mockito.mock(InternalTenantContext.class);
-    private final InternalCallContext context = Mockito.mock(InternalCallContext.class);
 
     @Test(groups = "slow")
     public void testDao() {
@@ -58,18 +56,17 @@ public class TestBlockingDao extends JunctionTestSuiteWithEmbeddedDB {
         final boolean blockBilling = false;
 
         final BlockingState state1 = new DefaultBlockingState(uuid, overdueStateName, Blockable.Type.SUBSCRIPTION_BUNDLE, service, blockChange, blockEntitlement, blockBilling);
-        dao.setBlockingState(state1, clock, context);
+        dao.setBlockingState(state1, clock, internalCallContext);
         clock.setDeltaFromReality(1000 * 3600 * 24);
 
         final String overdueStateName2 = "NoReallyThisCantGoOn";
         final BlockingState state2 = new DefaultBlockingState(uuid, overdueStateName2, Blockable.Type.SUBSCRIPTION_BUNDLE, service, blockChange, blockEntitlement, blockBilling);
-        dao.setBlockingState(state2, clock, context);
+        dao.setBlockingState(state2, clock, internalCallContext);
 
         final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
         Mockito.when(bundle.getId()).thenReturn(uuid);
 
-        Assert.assertEquals(dao.getBlockingStateFor(bundle, tenantContext).getStateName(), state2.getStateName());
-        Assert.assertEquals(dao.getBlockingStateFor(bundle.getId(), tenantContext).getStateName(), overdueStateName2);
+        Assert.assertEquals(dao.getBlockingStateFor(uuid, internalCallContext).getStateName(), state2.getStateName());
     }
 
     @Test(groups = "slow")
@@ -84,23 +81,18 @@ public class TestBlockingDao extends JunctionTestSuiteWithEmbeddedDB {
         final boolean blockBilling = false;
 
         final BlockingState state1 = new DefaultBlockingState(uuid, overdueStateName, Blockable.Type.SUBSCRIPTION_BUNDLE, service, blockChange, blockEntitlement, blockBilling);
-        dao.setBlockingState(state1, clock, context);
+        dao.setBlockingState(state1, clock, internalCallContext);
         clock.setDeltaFromReality(1000 * 3600 * 24);
 
         final String overdueStateName2 = "NoReallyThisCantGoOn";
         final BlockingState state2 = new DefaultBlockingState(uuid, overdueStateName2, Blockable.Type.SUBSCRIPTION_BUNDLE, service, blockChange, blockEntitlement, blockBilling);
-        dao.setBlockingState(state2, clock, context);
+        dao.setBlockingState(state2, clock, internalCallContext);
 
         final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
         Mockito.when(bundle.getId()).thenReturn(uuid);
 
-        final List<BlockingState> history1 = dao.getBlockingHistoryFor(bundle, tenantContext);
-        final List<BlockingState> history2 = dao.getBlockingHistoryFor(bundle.getId(), tenantContext);
-
-        Assert.assertEquals(history1.size(), 2);
-        Assert.assertEquals(history1.get(0).getStateName(), overdueStateName);
-        Assert.assertEquals(history1.get(1).getStateName(), overdueStateName2);
 
+        final List<BlockingState> history2 = dao.getBlockingHistoryFor(bundle.getId(), internalCallContext);
         Assert.assertEquals(history2.size(), 2);
         Assert.assertEquals(history2.get(0).getStateName(), overdueStateName);
         Assert.assertEquals(history2.get(1).getStateName(), overdueStateName2);
diff --git a/overdue/src/test/java/com/ning/billing/overdue/applicator/ApplicatorMockJunctionModule.java b/overdue/src/test/java/com/ning/billing/overdue/applicator/ApplicatorMockJunctionModule.java
index 35edf31..0c1ac40 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/applicator/ApplicatorMockJunctionModule.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/applicator/ApplicatorMockJunctionModule.java
@@ -45,6 +45,11 @@ public class ApplicatorMockJunctionModule extends MockJunctionModule {
             return new BlockingState() {
 
                 @Override
+                public UUID getBlockedId() {
+                    return overdueable.getId();
+                }
+
+                @Override
                 public String getStateName() {
                     return DefaultBlockingState.CLEAR_STATE_NAME;
                 }
@@ -86,6 +91,11 @@ public class ApplicatorMockJunctionModule extends MockJunctionModule {
                 }
 
                 @Override
+                public String getService() {
+                    return "whatever";
+                }
+
+                @Override
                 public UUID getId() {
                     return UUID.randomUUID();
                 }
diff --git a/payment/src/main/resources/com/ning/billing/payment/dao/PaymentMethodSqlDao.sql.stg b/payment/src/main/resources/com/ning/billing/payment/dao/PaymentMethodSqlDao.sql.stg
index c0b0b76..e6d5794 100644
--- a/payment/src/main/resources/com/ning/billing/payment/dao/PaymentMethodSqlDao.sql.stg
+++ b/payment/src/main/resources/com/ning/billing/payment/dao/PaymentMethodSqlDao.sql.stg
@@ -57,7 +57,7 @@ where  id = :id
 getPaymentMethodIncludedDelete(accountId) ::= <<
 select <allTableFields()>
 from <tableName()>
-where account_id = :accountId
+where id = :id
 ;
 >>
 
diff --git a/util/src/main/java/com/ning/billing/util/dao/TableName.java b/util/src/main/java/com/ning/billing/util/dao/TableName.java
index 14b0693..0e4da16 100644
--- a/util/src/main/java/com/ning/billing/util/dao/TableName.java
+++ b/util/src/main/java/com/ning/billing/util/dao/TableName.java
@@ -29,6 +29,7 @@ public enum TableName {
     ACCOUNT_EMAIL_HISTORY("account_email_history"),
     ACCOUNT_EMAIL("account_emails", ObjectType.ACCOUNT_EMAIL, ACCOUNT_EMAIL_HISTORY),
     BUNDLES("bundles", ObjectType.BUNDLE),
+    BLOCKING_STATES("blocking_states"),
     CUSTOM_FIELD_HISTORY("custom_field_history"),
     CUSTOM_FIELD("custom_fields", ObjectType.CUSTOM_FIELD, CUSTOM_FIELD_HISTORY),
     INVOICE_ITEMS("invoice_items", ObjectType.INVOICE_ITEM),
diff --git a/util/src/main/java/com/ning/billing/util/entity/dao/EntityDaoBase.java b/util/src/main/java/com/ning/billing/util/entity/dao/EntityDaoBase.java
index b8e1788..cfa095e 100644
--- a/util/src/main/java/com/ning/billing/util/entity/dao/EntityDaoBase.java
+++ b/util/src/main/java/com/ning/billing/util/entity/dao/EntityDaoBase.java
@@ -48,7 +48,10 @@ public abstract class EntityDaoBase<M extends EntityModelDao<E>, E extends Entit
                 final EntitySqlDao<M, E> transactional = entitySqlDaoWrapperFactory.become(realSqlDao);
                 transactional.create(entity, context);
 
-                postBusEventFromTransaction(entity, entity, ChangeType.INSERT, entitySqlDaoWrapperFactory, context);
+
+                final M refreshedEntity = transactional.getById(entity.getId().toString(), context);
+
+                postBusEventFromTransaction(entity, refreshedEntity, ChangeType.INSERT, entitySqlDaoWrapperFactory, context);
                 return null;
             }
         });
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 071e530..8fa62d5 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,8 +187,8 @@ public class EntitySqlDaoWrapperInvocationHandler<S extends EntitySqlDao<M, E>, 
     }
 
     private List<String> retrieveEntityIdsFromArguments(final Method method, final Object[] args) {
-        final Annotation[][] parameterAnnotations = method.getParameterAnnotations();
 
+        final Annotation[][] parameterAnnotations = method.getParameterAnnotations();
         int i = -1;
         for (final Object arg : args) {
             i++;
@@ -239,6 +239,7 @@ public class EntitySqlDaoWrapperInvocationHandler<S extends EntitySqlDao<M, E>, 
         return entityIds;
     }
 
+
     private InternalCallContext retrieveContextFromArguments(final Object[] args) {
         for (final Object arg : args) {
             if (!(arg instanceof InternalCallContext)) {
@@ -246,7 +247,6 @@ public class EntitySqlDaoWrapperInvocationHandler<S extends EntitySqlDao<M, E>, 
             }
             return (InternalCallContext) arg;
         }
-
         return null;
     }
 
diff --git a/util/src/main/java/com/ning/billing/util/svcapi/junction/DefaultBlockingState.java b/util/src/main/java/com/ning/billing/util/svcapi/junction/DefaultBlockingState.java
index d1c9853..21e3150 100644
--- a/util/src/main/java/com/ning/billing/util/svcapi/junction/DefaultBlockingState.java
+++ b/util/src/main/java/com/ning/billing/util/svcapi/junction/DefaultBlockingState.java
@@ -89,7 +89,7 @@ public class DefaultBlockingState extends EntityBase implements BlockingState {
              null);
     }
 
-
+    @Override
     public UUID getBlockedId() {
         return blockingId;
     }
@@ -115,6 +115,7 @@ public class DefaultBlockingState extends EntityBase implements BlockingState {
         return timestamp;
     }
 
+    @Override
     public String getService() {
         return service;
     }