killbill-memoizeit

Remove unneeded mappers, fix EnumArgumentFactory Signed-off-by:

11/13/2012 4:21:55 PM

Changes

Details

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 7303711..184124a 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
@@ -448,7 +448,7 @@ public class AuditedEntitlementDao implements EntitlementDao {
                 final List<EntitlementEventModelDao> eventModels = transactional.getFutureActiveEventForSubscription(subscriptionId.toString(), now, context);
 
                 for (final EntitlementEventModelDao cur : eventModels) {
-                    if (cur.getUserTypeX() == ApiEventType.CANCEL) {
+                    if (cur.getUserType() == ApiEventType.CANCEL) {
                         if (cancelledEvent != null) {
                             throw new EntitlementError(String.format("Found multiple cancel active events for subscriptions %s", subscriptionId.toString()));
                         }
@@ -535,8 +535,8 @@ public class AuditedEntitlementDao implements EntitlementDao {
         final Date now = clock.getUTCNow().toDate();
         final List<EntitlementEventModelDao> eventModels = dao.become(EntitlementEventSqlDao.class).getFutureActiveEventForSubscription(subscriptionId.toString(), now, context);
         for (final EntitlementEventModelDao cur : eventModels) {
-            if (cur.getEventTypeX() == type &&
-                (apiType == null || apiType == cur.getUserTypeX())) {
+            if (cur.getEventType() == type &&
+                (apiType == null || apiType == cur.getUserType())) {
                 if (futureEvent != null) {
                     throw new EntitlementError(String.format("Found multiple future events for type %s for subscriptions %s",
                                                              type, subscriptionId.toString()));
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/BundleSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/BundleSqlDao.java
index b903a3e..bf6caa8 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/BundleSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/BundleSqlDao.java
@@ -16,33 +16,24 @@
 
 package com.ning.billing.entitlement.engine.dao;
 
-import java.sql.ResultSet;
-import java.sql.SQLException;
 import java.util.Date;
 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.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.engine.dao.model.SubscriptionBundleModelDao;
 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.dao.MapperBase;
 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(BundleSqlDao.ISubscriptionBundleSqlMapper.class)
 public interface BundleSqlDao extends EntitySqlDao<SubscriptionBundleModelDao, SubscriptionBundle> {
 
     @SqlUpdate
@@ -63,18 +54,4 @@ public interface BundleSqlDao extends EntitySqlDao<SubscriptionBundleModelDao, S
     @SqlQuery
     public List<SubscriptionBundleModelDao> getBundlesForKey(@Bind("externalKey") String externalKey,
                                                              @BindBean final InternalTenantContext context);
-
-    public static class ISubscriptionBundleSqlMapper extends MapperBase implements ResultSetMapper<SubscriptionBundleModelDao> {
-
-        @Override
-        public SubscriptionBundleModelDao map(final int arg, final ResultSet r, final StatementContext ctx) throws SQLException {
-            final UUID id = UUID.fromString(r.getString("id"));
-            final String key = r.getString("external_key");
-            final UUID accountId = UUID.fromString(r.getString("account_id"));
-            final DateTime lastSysUpdateDate = getDateTime(r, "last_sys_update_date");
-            final DateTime createdDate = getDateTime(r, "created_date");
-            final DateTime updatedDate = getDateTime(r, "updated_date");
-            return new SubscriptionBundleModelDao(id, key, accountId, lastSysUpdateDate, createdDate, updatedDate);
-        }
-    }
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java
index a2fb510..3fe18f0 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java
@@ -16,36 +16,24 @@
 
 package com.ning.billing.entitlement.engine.dao;
 
-import java.sql.ResultSet;
-import java.sql.SQLException;
 import java.util.Date;
 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.entitlement.engine.dao.EntitlementEventSqlDao.EventSqlMapper;
 import com.ning.billing.entitlement.engine.dao.model.EntitlementEventModelDao;
 import com.ning.billing.entitlement.events.EntitlementEvent;
-import com.ning.billing.entitlement.events.EntitlementEvent.EventType;
-import com.ning.billing.entitlement.events.user.ApiEventType;
 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.dao.MapperBase;
 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(EventSqlMapper.class)
 public interface EntitlementEventSqlDao extends EntitySqlDao<EntitlementEventModelDao, EntitlementEvent> {
 
     @SqlUpdate
@@ -72,32 +60,4 @@ public interface EntitlementEventSqlDao extends EntitySqlDao<EntitlementEventMod
     @SqlQuery
     public List<EntitlementEventModelDao> getEventsForSubscription(@Bind("subscriptionId") String subscriptionId,
                                                                    @BindBean final InternalTenantContext context);
-
-    public static class EventSqlMapper extends MapperBase implements ResultSetMapper<EntitlementEventModelDao> {
-
-        @Override
-        public EntitlementEventModelDao map(final int index, final ResultSet r, final StatementContext ctx)
-                throws SQLException {
-
-            final long totalOrdering = r.getLong("record_id");
-            final UUID id = UUID.fromString(r.getString("id"));
-            final EventType eventType = EventType.valueOf(r.getString("event_type"));
-            final ApiEventType userType = (eventType == EventType.API_USER) ? ApiEventType.valueOf(r.getString("user_type")) : null;
-            final DateTime createdDate = getDateTime(r, "created_date");
-            final DateTime updatedDate = getDateTime(r, "updated_date");
-            final DateTime requestedDate = getDateTime(r, "requested_date");
-            final DateTime effectiveDate = getDateTime(r, "effective_date");
-            final UUID subscriptionId = UUID.fromString(r.getString("subscription_id"));
-            final String planName = r.getString("plan_name");
-            final String phaseName = r.getString("phase_name");
-            final String priceListName = r.getString("price_list_name");
-            final long currentVersion = r.getLong("current_version");
-            final boolean isActive = r.getBoolean("is_active");
-            final UUID userToken = r.getString("user_token") != null ? UUID.fromString(r.getString("user_token")) : null;
-
-            return new EntitlementEventModelDao(id, totalOrdering, eventType, userType, requestedDate, effectiveDate, subscriptionId,
-                                                planName, phaseName, priceListName, currentVersion, isActive, createdDate, updatedDate);
-
-        }
-    }
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/EntitlementEventModelDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/EntitlementEventModelDao.java
index e1cac4a..203bcf6 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/EntitlementEventModelDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/EntitlementEventModelDao.java
@@ -44,17 +44,19 @@ import com.ning.billing.util.entity.dao.EntityModelDao;
 
 public class EntitlementEventModelDao extends EntityBase implements EntityModelDao<EntitlementEvent> {
 
-    private final long totalOrdering;
-    private final EventType eventType;
-    private final ApiEventType userType;
-    private final DateTime requestedDate;
-    private final DateTime effectiveDate;
-    private final UUID subscriptionId;
-    private final String planName;
-    private final String phaseName;
-    private final String priceListName;
-    private final long currentVersion;
-    private final boolean isActive;
+    private long totalOrdering;
+    private EventType eventType;
+    private ApiEventType userType;
+    private DateTime requestedDate;
+    private DateTime effectiveDate;
+    private UUID subscriptionId;
+    private String planName;
+    private String phaseName;
+    private String priceListName;
+    private long currentVersion;
+    private boolean isActive;
+
+    public EntitlementEventModelDao() { /* For the DAO mapper */ }
 
     public EntitlementEventModelDao(final UUID id, final long totalOrdering, final EventType eventType, final ApiEventType userType,
                                     final DateTime requestedDate, final DateTime effectiveDate, final UUID subscriptionId,
@@ -93,20 +95,11 @@ public class EntitlementEventModelDao extends EntityBase implements EntityModelD
         return totalOrdering;
     }
 
-    public String getEventType() {
-        return eventType != null ? eventType.toString() : null;
-    }
-
-    // TODO required for bindings
-    public String getUserType() {
-        return userType != null ? userType.toString() : null;
-    }
-
-    public EventType getEventTypeX() {
+    public EventType getEventType() {
         return eventType;
     }
 
-    public ApiEventType getUserTypeX() {
+    public ApiEventType getUserType() {
         return userType;
     }
 
@@ -149,7 +142,7 @@ public class EntitlementEventModelDao extends EntityBase implements EntityModelD
 
     public static EntitlementEvent toEntitlementEvent(final EntitlementEventModelDao src) {
 
-        final EventBaseBuilder<?> base = ((src.getEventTypeX() == EventType.PHASE) ?
+        final EventBaseBuilder<?> base = ((src.getEventType() == EventType.PHASE) ?
                                           new PhaseEventBuilder() :
                                           new ApiEventBuilder())
                 .setTotalOrdering(src.getTotalOrdering())
@@ -164,37 +157,37 @@ public class EntitlementEventModelDao extends EntityBase implements EntityModelD
                 .setActive(src.isActive());
 
         EntitlementEvent result = null;
-        if (src.getEventTypeX() == EventType.PHASE) {
+        if (src.getEventType() == EventType.PHASE) {
             result = new PhaseEventData(new PhaseEventBuilder(base).setPhaseName(src.getPhaseName()));
-        } else if (src.getEventTypeX() == EventType.API_USER) {
+        } else if (src.getEventType() == EventType.API_USER) {
             final ApiEventBuilder builder = new ApiEventBuilder(base)
                     .setEventPlan(src.getPlanName())
                     .setEventPlanPhase(src.getPhaseName())
                     .setEventPriceList(src.getPriceListName())
-                    .setEventType(src.getUserTypeX())
+                    .setEventType(src.getUserType())
                     .setFromDisk(true);
 
-            if (src.getUserTypeX() == ApiEventType.CREATE) {
+            if (src.getUserType() == ApiEventType.CREATE) {
                 result = new ApiEventCreate(builder);
-            } else if (src.getUserTypeX() == ApiEventType.RE_CREATE) {
+            } else if (src.getUserType() == ApiEventType.RE_CREATE) {
                 result = new ApiEventReCreate(builder);
-            } else if (src.getUserTypeX() == ApiEventType.MIGRATE_ENTITLEMENT) {
+            } else if (src.getUserType() == ApiEventType.MIGRATE_ENTITLEMENT) {
                 result = new ApiEventMigrateEntitlement(builder);
-            } else if (src.getUserTypeX() == ApiEventType.MIGRATE_BILLING) {
+            } else if (src.getUserType() == ApiEventType.MIGRATE_BILLING) {
                 result = new ApiEventMigrateBilling(builder);
-            } else if (src.getUserTypeX() == ApiEventType.TRANSFER) {
+            } else if (src.getUserType() == ApiEventType.TRANSFER) {
                 result = new ApiEventTransfer(builder);
-            } else if (src.getUserTypeX() == ApiEventType.CHANGE) {
+            } else if (src.getUserType() == ApiEventType.CHANGE) {
                 result = new ApiEventChange(builder);
-            } else if (src.getUserTypeX() == ApiEventType.CANCEL) {
+            } else if (src.getUserType() == ApiEventType.CANCEL) {
                 result = new ApiEventCancel(builder);
-            } else if (src.getUserTypeX() == ApiEventType.RE_CREATE) {
+            } else if (src.getUserType() == ApiEventType.RE_CREATE) {
                 result = new ApiEventReCreate(builder);
-            } else if (src.getUserTypeX() == ApiEventType.UNCANCEL) {
+            } else if (src.getUserType() == ApiEventType.UNCANCEL) {
                 result = new ApiEventUncancel(builder);
             }
         } else {
-            throw new EntitlementError(String.format("Can't figure out event %s", src.getEventTypeX()));
+            throw new EntitlementError(String.format("Can't figure out event %s", src.getEventType()));
         }
         return result;
     }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/SubscriptionBundleModelDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/SubscriptionBundleModelDao.java
index ae3193c..10612c9 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/SubscriptionBundleModelDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/SubscriptionBundleModelDao.java
@@ -28,9 +28,11 @@ import com.ning.billing.util.entity.dao.EntityModelDao;
 
 public class SubscriptionBundleModelDao extends EntityBase implements EntityModelDao<SubscriptionBundle> {
 
-    private final String externalKey;
-    private final UUID accountId;
-    private final DateTime lastSysUpdateDate;
+    private String externalKey;
+    private UUID accountId;
+    private DateTime lastSysUpdateDate;
+
+    public SubscriptionBundleModelDao() { /* For the DAO mapper */ }
 
     public SubscriptionBundleModelDao(final UUID id, final String key, final UUID accountId, final DateTime lastSysUpdateDate,
                                       final DateTime createdDate, final DateTime updateDate) {
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/SubscriptionModelDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/SubscriptionModelDao.java
index 129da56..0f0e18d 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/SubscriptionModelDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/SubscriptionModelDao.java
@@ -30,13 +30,15 @@ import com.ning.billing.util.entity.dao.EntityModelDao;
 
 public class SubscriptionModelDao extends EntityBase implements EntityModelDao<Subscription> {
 
-    private final UUID bundleId;
-    private final ProductCategory category;
-    private final DateTime startDate;
-    private final DateTime bundleStartDate;
-    private final long activeVersion;
-    private final DateTime chargedThroughDate;
-    private final DateTime paidThroughDate;
+    private UUID bundleId;
+    private ProductCategory category;
+    private DateTime startDate;
+    private DateTime bundleStartDate;
+    private long activeVersion;
+    private DateTime chargedThroughDate;
+    private DateTime paidThroughDate;
+
+    public SubscriptionModelDao() { /* For the DAO mapper */ }
 
     public SubscriptionModelDao(final UUID id, final UUID bundleId, final ProductCategory category, final DateTime startDate, final DateTime bundleStartDate,
                                 final long activeVersion, final DateTime chargedThroughDate, final DateTime paidThroughDate, final DateTime createdDate, final DateTime updateDate) {
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
index c068244..c613d93 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
@@ -16,35 +16,24 @@
 
 package com.ning.billing.entitlement.engine.dao;
 
-import java.sql.ResultSet;
-import java.sql.SQLException;
 import java.util.Date;
 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.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.user.Subscription;
-import com.ning.billing.entitlement.engine.dao.SubscriptionSqlDao.SubscriptionMapper;
 import com.ning.billing.entitlement.engine.dao.model.SubscriptionModelDao;
 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.dao.MapperBase;
 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(SubscriptionMapper.class)
 public interface SubscriptionSqlDao extends EntitySqlDao<SubscriptionModelDao, Subscription> {
 
     @SqlQuery
@@ -67,24 +56,4 @@ public interface SubscriptionSqlDao extends EntitySqlDao<SubscriptionModelDao, S
                                 @Bind("startDate") Date startDate,
                                 @Bind("bundleStartDate") Date bundleStartDate,
                                 @BindBean final InternalCallContext context);
-
-    public static class SubscriptionMapper extends MapperBase implements ResultSetMapper<SubscriptionModelDao> {
-
-        @Override
-        public SubscriptionModelDao map(final int arg0, final ResultSet r, final StatementContext ctx)
-                throws SQLException {
-            final UUID id = UUID.fromString(r.getString("id"));
-            final UUID bundleId = UUID.fromString(r.getString("bundle_id"));
-            final ProductCategory category = ProductCategory.valueOf(r.getString("category"));
-            final DateTime bundleStartDate = getDateTime(r, "bundle_start_date");
-            final DateTime startDate = getDateTime(r, "start_date");
-            final DateTime ctd = getDateTime(r, "charged_through_date");
-            final DateTime ptd = getDateTime(r, "paid_through_date");
-            final long activeVersion = r.getLong("active_version");
-            final DateTime createdDate = getDateTime(r, "created_date");
-            final DateTime updatedDate = getDateTime(r, "updated_date");
-            return new SubscriptionModelDao(id, bundleId, category, startDate, bundleStartDate, activeVersion, ctd, ptd, createdDate, updatedDate);
-
-        }
-    }
 }
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptModelDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptModelDao.java
index 8f18809..5defd47 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptModelDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptModelDao.java
@@ -31,14 +31,16 @@ import com.ning.billing.util.entity.dao.EntityModelDao;
 
 public class PaymentAttemptModelDao extends EntityBase implements EntityModelDao<PaymentAttempt> {
 
-    private final UUID accountId;
-    private final UUID invoiceId;
-    private final UUID paymentId;
-    private final PaymentStatus processingStatus;
-    private final DateTime effectiveDate;
-    private final String gatewayErrorCode;
-    private final String gatewayErrorMsg;
-    private final BigDecimal requestedAmount;
+    private UUID accountId;
+    private UUID invoiceId;
+    private UUID paymentId;
+    private PaymentStatus processingStatus;
+    private DateTime effectiveDate;
+    private String gatewayErrorCode;
+    private String gatewayErrorMsg;
+    private BigDecimal requestedAmount;
+
+    public PaymentAttemptModelDao() { /* For the DAO mapper */ }
 
     public PaymentAttemptModelDao(final UUID id, @Nullable final DateTime createdDate, @Nullable final DateTime updatedDate,
                                   final UUID accountId, final UUID invoiceId,
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptSqlDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptSqlDao.java
index 3b9f306..f9791c8 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptSqlDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentAttemptSqlDao.java
@@ -16,33 +16,22 @@
 
 package com.ning.billing.payment.dao;
 
-import java.math.BigDecimal;
-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.payment.api.Payment.PaymentAttempt;
-import com.ning.billing.payment.api.PaymentStatus;
 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.dao.MapperBase;
 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(PaymentAttemptSqlDao.PaymentAttemptModelDaoMapper.class)
 public interface PaymentAttemptSqlDao extends EntitySqlDao<PaymentAttemptModelDao, PaymentAttempt> {
 
     @SqlUpdate
@@ -56,26 +45,4 @@ public interface PaymentAttemptSqlDao extends EntitySqlDao<PaymentAttemptModelDa
     @SqlQuery
     List<PaymentAttemptModelDao> getByPaymentId(@Bind("paymentId") final String paymentId,
                                                 @BindBean final InternalTenantContext context);
-
-    public static class PaymentAttemptModelDaoMapper extends MapperBase implements ResultSetMapper<PaymentAttemptModelDao> {
-
-        @Override
-        public PaymentAttemptModelDao map(final int index, final ResultSet rs, final StatementContext ctx)
-                throws SQLException {
-            final UUID id = getUUID(rs, "id");
-            final UUID accountId = getUUID(rs, "account_id");
-            final UUID invoiceId = getUUID(rs, "invoice_id");
-            final UUID paymentId = getUUID(rs, "payment_id");
-            final DateTime effectiveDate = getDateTime(rs, "effective_date");
-            final PaymentStatus processingStatus = PaymentStatus.valueOf(rs.getString("processing_status"));
-            final String gatewayErrorCode = rs.getString("gateway_error_code");
-            final String gatewayErrorMsg = rs.getString("gateway_error_msg");
-            final BigDecimal requestedAmount = rs.getBigDecimal("requested_amount");
-            final DateTime createdDate = getDateTime(rs, "created_date");
-            final DateTime updatedDate = getDateTime(rs, "updated_date");
-
-            return new PaymentAttemptModelDao(id, createdDate, updatedDate, accountId, invoiceId, paymentId, processingStatus,
-                                              effectiveDate, requestedAmount, gatewayErrorCode, gatewayErrorMsg);
-        }
-    }
 }
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodModelDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodModelDao.java
index 272562c..9f3fc4f 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodModelDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodModelDao.java
@@ -29,10 +29,12 @@ import com.ning.billing.util.entity.dao.EntityModelDao;
 
 public class PaymentMethodModelDao extends EntityBase implements EntityModelDao<PaymentMethod> {
 
-    private final UUID accountId;
-    private final String pluginName;
-    private final Boolean isActive;
-    private final String externalId;
+    private UUID accountId;
+    private String pluginName;
+    private Boolean isActive;
+    private String externalId;
+
+    public PaymentMethodModelDao() { /* For the DAO mapper */ }
 
     public PaymentMethodModelDao(final UUID id, @Nullable final DateTime createdDate, @Nullable final DateTime updatedDate,
                                  final UUID accountId, final String pluginName,
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodSqlDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodSqlDao.java
index f0998c0..25e32f2 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodSqlDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentMethodSqlDao.java
@@ -16,31 +16,22 @@
 
 package com.ning.billing.payment.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.payment.api.PaymentMethod;
 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.dao.MapperBase;
 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(PaymentMethodSqlDao.PaymentMethodDaoMapper.class)
 public interface PaymentMethodSqlDao extends EntitySqlDao<PaymentMethodModelDao, PaymentMethod> {
 
     @SqlUpdate
@@ -59,20 +50,4 @@ public interface PaymentMethodSqlDao extends EntitySqlDao<PaymentMethodModelDao,
 
     @SqlQuery
     List<PaymentMethodModelDao> getByAccountId(@Bind("accountId") final String accountId, @BindBean final InternalCallContext context);
-
-    public static class PaymentMethodDaoMapper extends MapperBase implements ResultSetMapper<PaymentMethodModelDao> {
-
-        @Override
-        public PaymentMethodModelDao map(final int index, final ResultSet rs, final StatementContext ctx)
-                throws SQLException {
-            final UUID id = getUUID(rs, "id");
-            final UUID accountId = getUUID(rs, "account_id");
-            final String pluginName = rs.getString("plugin_name");
-            final Boolean isActive = rs.getBoolean("is_active");
-            final String externalId = rs.getString("external_id");
-            final DateTime createdDate = getDateTime(rs, "created_date");
-            final DateTime updatedDate = getDateTime(rs, "updated_date");
-            return new PaymentMethodModelDao(id, createdDate, updatedDate, accountId, pluginName, isActive, externalId);
-        }
-    }
 }
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentModelDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentModelDao.java
index eda78ae..ab6d409 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentModelDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentModelDao.java
@@ -34,16 +34,18 @@ public class PaymentModelDao extends EntityBase implements EntityModelDao<Paymen
 
     public static final Integer INVALID_PAYMENT_NUMBER = new Integer(-13);
 
-    private final UUID accountId;
-    private final UUID invoiceId;
-    private final UUID paymentMethodId;
-    private final BigDecimal amount;
-    private final Currency currency;
-    private final DateTime effectiveDate;
-    private final Integer paymentNumber;
-    private final PaymentStatus paymentStatus;
-    private final String extFirstPaymentRefId;
-    private final String extSecondPaymentRefId;
+    private UUID accountId;
+    private UUID invoiceId;
+    private UUID paymentMethodId;
+    private BigDecimal amount;
+    private Currency currency;
+    private DateTime effectiveDate;
+    private Integer paymentNumber;
+    private PaymentStatus paymentStatus;
+    private String extFirstPaymentRefId;
+    private String extSecondPaymentRefId;
+
+    public PaymentModelDao() { /* For the DAO mapper */ }
 
     public PaymentModelDao(final UUID id, @Nullable final DateTime createdDate, @Nullable final DateTime updatedDate, final UUID accountId,
                            final UUID invoiceId, final UUID paymentMethodId,
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
index 71a1571..f347534 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
@@ -17,33 +17,22 @@
 package com.ning.billing.payment.dao;
 
 import java.math.BigDecimal;
-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.catalog.api.Currency;
 import com.ning.billing.payment.api.Payment;
-import com.ning.billing.payment.api.PaymentStatus;
 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.dao.MapperBase;
 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(PaymentSqlDao.PaymentModelDaoMapper.class)
 public interface PaymentSqlDao extends EntitySqlDao<PaymentModelDao, Payment> {
 
     @SqlUpdate
@@ -72,28 +61,5 @@ public interface PaymentSqlDao extends EntitySqlDao<PaymentModelDao, Payment> {
     @SqlQuery
     List<PaymentModelDao> getPaymentsForAccount(@Bind("accountId") final String accountId,
                                                 @BindBean final InternalTenantContext context);
-
-    public static class PaymentModelDaoMapper extends MapperBase implements ResultSetMapper<PaymentModelDao> {
-
-        @Override
-        public PaymentModelDao map(final int index, final ResultSet rs, final StatementContext ctx)
-                throws SQLException {
-            final UUID id = getUUID(rs, "id");
-            final UUID accountId = getUUID(rs, "account_id");
-            final UUID invoiceId = getUUID(rs, "invoice_id");
-            final UUID paymentMethodId = getUUID(rs, "payment_method_id");
-            final Integer paymentNumber = rs.getInt("record_id");
-            final BigDecimal amount = rs.getBigDecimal("amount");
-            final DateTime effectiveDate = getDateTime(rs, "effective_date");
-            final Currency currency = Currency.valueOf(rs.getString("currency"));
-            final PaymentStatus paymentStatus = PaymentStatus.valueOf(rs.getString("payment_status"));
-            final String extFirstPaymentRefId = rs.getString("ext_first_payment_ref_id");
-            final String extSecondPaymentRefId = rs.getString("ext_second_payment_ref_id");
-            final DateTime createdDate = getDateTime(rs, "created_date");
-            final DateTime updatedDate = getDateTime(rs, "updated_date");
-            return new PaymentModelDao(id, createdDate, updatedDate, accountId, invoiceId, paymentMethodId, paymentNumber,
-                                       amount, currency, paymentStatus, effectiveDate, extFirstPaymentRefId, extSecondPaymentRefId);
-        }
-    }
 }
 
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/RefundModelDao.java b/payment/src/main/java/com/ning/billing/payment/dao/RefundModelDao.java
index c16a523..22c90eb 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/RefundModelDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/RefundModelDao.java
@@ -31,12 +31,14 @@ import com.ning.billing.util.entity.dao.EntityModelDao;
 
 public class RefundModelDao extends EntityBase implements EntityModelDao<Refund> {
 
-    private final UUID accountId;
-    private final UUID paymentId;
-    private final BigDecimal amount;
-    private final Currency currency;
-    private final boolean isAdjusted;
-    private final RefundStatus refundStatus;
+    private UUID accountId;
+    private UUID paymentId;
+    private BigDecimal amount;
+    private Currency currency;
+    private boolean isAdjusted;
+    private RefundStatus refundStatus;
+
+    public RefundModelDao() { /* For the DAO mapper */ }
 
     public RefundModelDao(final UUID accountId, final UUID paymentId, final BigDecimal amount,
                           final Currency currency, final boolean isAdjusted) {
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/RefundSqlDao.java b/payment/src/main/java/com/ning/billing/payment/dao/RefundSqlDao.java
index f3f611c..2936a80 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/RefundSqlDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/RefundSqlDao.java
@@ -16,34 +16,22 @@
 
 package com.ning.billing.payment.dao;
 
-import java.math.BigDecimal;
-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.catalog.api.Currency;
 import com.ning.billing.payment.api.Refund;
-import com.ning.billing.payment.dao.RefundModelDao.RefundStatus;
 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.dao.MapperBase;
 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(RefundSqlDao.RefundModelDaoMapper.class)
 public interface RefundSqlDao extends EntitySqlDao<RefundModelDao, Refund> {
 
     @SqlUpdate
@@ -59,22 +47,4 @@ public interface RefundSqlDao extends EntitySqlDao<RefundModelDao, Refund> {
     @SqlQuery
     List<RefundModelDao> getRefundsForAccount(@Bind("accountId") final String accountId,
                                               @BindBean final InternalTenantContext context);
-
-    public static class RefundModelDaoMapper extends MapperBase implements ResultSetMapper<RefundModelDao> {
-
-        @Override
-        public RefundModelDao map(final int index, final ResultSet rs, final StatementContext ctx)
-                throws SQLException {
-            final UUID id = getUUID(rs, "id");
-            final UUID accountId = getUUID(rs, "account_id");
-            final UUID paymentId = getUUID(rs, "payment_id");
-            final BigDecimal amount = rs.getBigDecimal("amount");
-            final boolean isAdjusted = rs.getBoolean("is_adjusted");
-            final Currency currency = Currency.valueOf(rs.getString("currency"));
-            final RefundStatus refundStatus = RefundStatus.valueOf(rs.getString("refund_status"));
-            final DateTime createdDate = getDateTime(rs, "created_date");
-            final DateTime updatedDate = getDateTime(rs, "updated_date");
-            return new RefundModelDao(id, accountId, paymentId, amount, currency, isAdjusted, refundStatus, createdDate, updatedDate);
-        }
-    }
 }
diff --git a/util/src/main/java/com/ning/billing/util/bus/dao/PersistentBusSqlDao.java b/util/src/main/java/com/ning/billing/util/bus/dao/PersistentBusSqlDao.java
index e9e70de..0f2ad73 100644
--- a/util/src/main/java/com/ning/billing/util/bus/dao/PersistentBusSqlDao.java
+++ b/util/src/main/java/com/ning/billing/util/bus/dao/PersistentBusSqlDao.java
@@ -24,6 +24,7 @@ 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;
@@ -35,7 +36,6 @@ import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
 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.dao.BinderBase;
 import com.ning.billing.util.dao.MapperBase;
 import com.ning.billing.util.queue.PersistentQueueEntryLifecycle.PersistentQueueEntryLifecycleState;
@@ -48,33 +48,33 @@ public interface PersistentBusSqlDao extends Transactional<PersistentBusSqlDao>,
     public BusEventEntry getNextBusEventEntry(@Bind("max") int max,
                                               @Bind("owner") String owner,
                                               @Bind("now") Date now,
-                                              @InternalTenantContextBinder final InternalTenantContext context);
+                                              @BindBean final InternalTenantContext context);
 
     @SqlUpdate
     public int claimBusEvent(@Bind("owner") String owner,
                              @Bind("nextAvailable") Date nextAvailable,
                              @Bind("recordId") Long id,
                              @Bind("now") Date now,
-                             @InternalTenantContextBinder final InternalCallContext context);
+                             @BindBean final InternalCallContext context);
 
     @SqlUpdate
     public void clearBusEvent(@Bind("recordId") Long id,
                               @Bind("owner") String owner,
-                              @InternalTenantContextBinder final InternalCallContext context);
+                              @BindBean final InternalCallContext context);
 
     @SqlUpdate
     public void removeBusEventsById(@Bind("recordId") Long id,
-                                    @InternalTenantContextBinder final InternalCallContext context);
+                                    @BindBean final InternalCallContext context);
 
     @SqlUpdate
     public void insertBusEvent(@Bind(binder = PersistentBusSqlBinder.class) BusEventEntry evt,
-                               @InternalTenantContextBinder final InternalCallContext context);
+                               @BindBean final InternalCallContext context);
 
     @SqlUpdate
     public void insertClaimedHistory(@Bind("ownerId") String owner,
                                      @Bind("claimedDate") Date claimedDate,
                                      @Bind("busEventId") long id,
-                                     @InternalTenantContextBinder final InternalCallContext context);
+                                     @BindBean final InternalCallContext context);
 
     public static class PersistentBusSqlBinder extends BinderBase implements Binder<Bind, BusEventEntry> {
 
diff --git a/util/src/main/java/com/ning/billing/util/dao/EnumArgumentFactory.java b/util/src/main/java/com/ning/billing/util/dao/EnumArgumentFactory.java
index aa8dbb2..d47cb64 100644
--- a/util/src/main/java/com/ning/billing/util/dao/EnumArgumentFactory.java
+++ b/util/src/main/java/com/ning/billing/util/dao/EnumArgumentFactory.java
@@ -19,7 +19,6 @@ package com.ning.billing.util.dao;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.sql.Types;
-import java.util.UUID;
 
 import org.skife.jdbi.v2.StatementContext;
 import org.skife.jdbi.v2.tweak.Argument;
@@ -56,6 +55,6 @@ public class EnumArgumentFactory implements ArgumentFactory<Enum> {
 
     @Override
     public boolean accepts(final Class expectedType, final Object value, final StatementContext ctx) {
-        return value != null && value.getClass().isEnum();
+        return value != null && (value instanceof Enum /* Works for Enum inside classes */ || value.getClass().isEnum());
     }
 }
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 f91d83d..071e530 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
@@ -26,6 +26,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import org.skife.jdbi.v2.Binding;
 import org.skife.jdbi.v2.StatementContext;
 import org.skife.jdbi.v2.exceptions.DBIException;
 import org.skife.jdbi.v2.exceptions.StatementException;
@@ -69,20 +70,27 @@ public class EntitySqlDaoWrapperInvocationHandler<S extends EntitySqlDao<M, E>, 
             return invokeSafely(proxy, method, args);
         } catch (Throwable t) {
             if (t.getCause() != null && t.getCause().getCause() != null && DBIException.class.isAssignableFrom(t.getCause().getClass())) {
-                // Likely the JDBC exception or a Billing exception we have thrown in the transaction
-                // If it's a JDBC error, try to extract the SQL statement
+                // Likely a JDBC error, try to extract the SQL statement and JDBI bindings
                 if (t.getCause() instanceof StatementException) {
                     final StatementContext statementContext = ((StatementException) t.getCause()).getStatementContext();
+
                     if (statementContext != null) {
+                        // Grumble, we need to rely on the suxxor toString() method as nothing is exposed
+                        final Binding binding = statementContext.getBinding();
+
                         final PreparedStatement statement = statementContext.getStatement();
                         if (statement != null) {
                             // Note: we rely on the JDBC driver to have a sane toString() method...
-                            errorDuringTransaction(t.getCause().getCause(), method, statement.toString());
-                            // Never reached
-                            return null;
+                            errorDuringTransaction(t.getCause().getCause(), method, statement.toString() + "\n" + binding.toString());
+                        } else {
+                            errorDuringTransaction(t.getCause().getCause(), method, binding.toString());
                         }
+
+                        // Never reached
+                        return null;
                     }
                 }
+
                 errorDuringTransaction(t.getCause().getCause(), method);
             } else if (t.getCause() != null) {
                 // t is likely not interesting (java.lang.reflect.InvocationTargetException)