killbill-uncached

dao refactoring for Account (separate AccountDao and AccountSqlDao

12/15/2011 4:40:04 PM

Details

diff --git a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountUserApi.java b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountUserApi.java
index a3b26fc..497d139 100644
--- a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountUserApi.java
+++ b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountUserApi.java
@@ -16,15 +16,14 @@
 
 package com.ning.billing.account.api.user;
 
+import java.util.List;
+import java.util.UUID;
 import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountData;
 import com.ning.billing.account.api.DefaultAccount;
 import com.ning.billing.account.dao.AccountDao;
 
-import java.util.List;
-import java.util.UUID;
-
 public class DefaultAccountUserApi implements com.ning.billing.account.api.AccountUserApi {
     private final AccountDao dao;
 
diff --git a/account/src/main/java/com/ning/billing/account/dao/AccountDao.java b/account/src/main/java/com/ning/billing/account/dao/AccountDao.java
index 02b4549..52d43ab 100644
--- a/account/src/main/java/com/ning/billing/account/dao/AccountDao.java
+++ b/account/src/main/java/com/ning/billing/account/dao/AccountDao.java
@@ -17,82 +17,8 @@
 package com.ning.billing.account.dao;
 
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountData;
-import com.ning.billing.account.api.user.AccountBuilder;
-import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.util.entity.EntityDao;
-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.Binder;
-import org.skife.jdbi.v2.sqlobject.BinderFactory;
-import org.skife.jdbi.v2.sqlobject.BindingAnnotation;
-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.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
-import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
-import java.lang.annotation.Annotation;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.UUID;
-
-@ExternalizedSqlViaStringTemplate3
-@RegisterMapper(AccountDaoWrapper.AccountMapper.class)
 public interface AccountDao extends EntityDao<Account> {
-    @SqlQuery
-    public Account getAccountByKey(@Bind("externalKey") final String key);
-
-    @Override
-    @SqlUpdate
-    public void save(@AccountBinder Account account);
-
-    public static class AccountMapper implements ResultSetMapper<Account> {
-        @Override
-        public Account map(int index, ResultSet result, StatementContext context) throws SQLException {
-            UUID id = UUID.fromString(result.getString("id"));
-            String externalKey = result.getString("external_key");
-            String email = result.getString("email");
-            String name = result.getString("name");
-            int firstNameLength = result.getInt("first_name_length");
-            String phone = result.getString("phone");
-            int billingCycleDay = result.getInt("billing_cycle_day");
-            Currency currency = Currency.valueOf(result.getString("currency"));
-            String paymentProviderName = result.getString("payment_provider_name");
-
-            return new AccountBuilder(id).externalKey(externalKey).email(email)
-                                         .name(name).firstNameLength(firstNameLength)
-                                         .phone(phone).currency(currency)
-                                         .billingCycleDay(billingCycleDay)
-                                         .paymentProviderName(paymentProviderName).build();
-        }
-    }
-
-    @BindingAnnotation(AccountBinder.AccountBinderFactory.class)
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target({ElementType.PARAMETER})
-    public @interface AccountBinder {
-        public static class AccountBinderFactory implements BinderFactory {
-            public Binder build(Annotation annotation) {
-                return new Binder<AccountBinder, AccountData>() {
-                    public void bind(SQLStatement q, AccountBinder bind, AccountData account) {
-                        q.bind("id", account.getId().toString());
-                        q.bind("externalKey", account.getExternalKey());
-                        q.bind("email", account.getEmail());
-                        q.bind("name", account.getName());
-                        q.bind("firstNameLength", account.getFirstNameLength());
-                        q.bind("phone", account.getPhone());
-                        q.bind("currency", account.getCurrency().toString());
-                        q.bind("billingCycleDay", account.getBillCycleDay());
-                        q.bind("paymentProviderName", account.getPaymentProviderName());
-                    }
-                };
-            }
-        }
-    }
+    public Account getAccountByKey(String key);
 }
diff --git a/account/src/main/java/com/ning/billing/account/dao/AccountSqlDao.java b/account/src/main/java/com/ning/billing/account/dao/AccountSqlDao.java
new file mode 100644
index 0000000..4c2a550
--- /dev/null
+++ b/account/src/main/java/com/ning/billing/account/dao/AccountSqlDao.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2010-2011 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.account.dao;
+
+import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.AccountData;
+import com.ning.billing.account.api.user.AccountBuilder;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.util.entity.EntityDao;
+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.Binder;
+import org.skife.jdbi.v2.sqlobject.BinderFactory;
+import org.skife.jdbi.v2.sqlobject.BindingAnnotation;
+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.sqlobject.mixins.Transactional;
+import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
+import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
+import org.skife.jdbi.v2.tweak.ResultSetMapper;
+
+import java.lang.annotation.Annotation;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.UUID;
+
+@ExternalizedSqlViaStringTemplate3
+@RegisterMapper(AccountSqlDao.AccountMapper.class)
+public interface AccountSqlDao extends EntityDao<Account>, Transactional<AccountSqlDao>, Transmogrifier {
+    @SqlQuery
+    public Account getAccountByKey(@Bind("externalKey") final String key);
+
+    @Override
+    @SqlUpdate
+    public void save(@AccountBinder Account account);
+
+    public static class AccountMapper implements ResultSetMapper<Account> {
+        @Override
+        public Account map(int index, ResultSet result, StatementContext context) throws SQLException {
+            UUID id = UUID.fromString(result.getString("id"));
+            String externalKey = result.getString("external_key");
+            String email = result.getString("email");
+            String name = result.getString("name");
+            int firstNameLength = result.getInt("first_name_length");
+            String phone = result.getString("phone");
+            int billingCycleDay = result.getInt("billing_cycle_day");
+            Currency currency = Currency.valueOf(result.getString("currency"));
+            String paymentProviderName = result.getString("payment_provider_name");
+
+            return new AccountBuilder(id).externalKey(externalKey).email(email)
+                                         .name(name).firstNameLength(firstNameLength)
+                                         .phone(phone).currency(currency)
+                                         .billingCycleDay(billingCycleDay)
+                                         .paymentProviderName(paymentProviderName).build();
+        }
+    }
+
+    @BindingAnnotation(AccountBinder.AccountBinderFactory.class)
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target({ElementType.PARAMETER})
+    public @interface AccountBinder {
+        public static class AccountBinderFactory implements BinderFactory {
+            public Binder build(Annotation annotation) {
+                return new Binder<AccountBinder, AccountData>() {
+                    public void bind(SQLStatement q, AccountBinder bind, AccountData account) {
+                        q.bind("id", account.getId().toString());
+                        q.bind("externalKey", account.getExternalKey());
+                        q.bind("email", account.getEmail());
+                        q.bind("name", account.getName());
+                        q.bind("firstNameLength", account.getFirstNameLength());
+                        q.bind("phone", account.getPhone());
+                        q.bind("currency", account.getCurrency().toString());
+                        q.bind("billingCycleDay", account.getBillCycleDay());
+                        q.bind("paymentProviderName", account.getPaymentProviderName());
+                    }
+                };
+            }
+        }
+    }
+}
diff --git a/account/src/main/java/com/ning/billing/account/glue/AccountModule.java b/account/src/main/java/com/ning/billing/account/glue/AccountModule.java
index 1ffa28a..d70548d 100644
--- a/account/src/main/java/com/ning/billing/account/glue/AccountModule.java
+++ b/account/src/main/java/com/ning/billing/account/glue/AccountModule.java
@@ -20,7 +20,8 @@ import com.google.inject.AbstractModule;
 import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.account.api.user.DefaultAccountUserApi;
 import com.ning.billing.account.dao.AccountDao;
-import com.ning.billing.account.dao.AccountDaoWrapper;
+import com.ning.billing.account.dao.AccountSqlDao;
+import com.ning.billing.account.dao.DefaultAccountDao;
 import org.skife.config.ConfigurationObjectFactory;
 
 public class AccountModule extends AbstractModule {
@@ -36,28 +37,18 @@ public class AccountModule extends AbstractModule {
     }
 
     private void installAccountDao() {
-        bind(AccountDao.class).to(AccountDaoWrapper.class).asEagerSingleton();
+        bind(AccountDao.class).to(DefaultAccountDao.class).asEagerSingleton();
     }
 
     private void installAccountUserApi() {
         bind(AccountUserApi.class).to(DefaultAccountUserApi.class).asEagerSingleton();
     }
 
-//    private void installFieldStore() {
-//        bind(FieldStoreDao.class).to(FieldStoreDaoWrapper.class).asEagerSingleton();
-//    }
-//
-//    private void installTagStore() {
-//        bind(TagStoreDao.class).to(TagStoreDaoWrapper.class).asEagerSingleton();
-//    }
-
     @Override
     protected void configure() {
         installConfig();
         installAccountCore();
         installAccountDao();
         installAccountUserApi();
-//        installFieldStore();
-//        installTagStore();
     }
 }
diff --git a/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java b/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java
index d191a0e..ce9570f 100644
--- a/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java
+++ b/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java
@@ -40,7 +40,7 @@ public abstract class AccountDaoTestBase {
         // Healthcheck test to make sure MySQL is setup properly
         try {
             AccountModuleMock module = new AccountModuleMock();
-            final String ddl = IOUtils.toString(AccountDao.class.getResourceAsStream("/com/ning/billing/account/ddl.sql"));
+            final String ddl = IOUtils.toString(AccountSqlDao.class.getResourceAsStream("/com/ning/billing/account/ddl.sql"));
             module.createDb(ddl);
 
             final Injector injector = Guice.createInjector(Stage.DEVELOPMENT, module);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoWrapper.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoWrapper.java
index 18aac2e..826d4ba 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoWrapper.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoWrapper.java
@@ -69,31 +69,22 @@ public class InvoiceDaoWrapper implements InvoiceDao {
          dbi.inTransaction(new TransactionCallback<Void>() {
             @Override
             public Void inTransaction(Handle conn, TransactionStatus status) throws Exception {
-                try {
-                    conn.begin();
-
-                    InvoiceDao invoiceDao = conn.attach(InvoiceDao.class);
-                    Invoice currentInvoice = invoiceDao.getById(invoice.getId().toString());
-                    invoiceDao.save(invoice);
+                InvoiceDao invoiceDao = conn.attach(InvoiceDao.class);
+                Invoice currentInvoice = invoiceDao.getById(invoice.getId().toString());
+                invoiceDao.save(invoice);
 
 //                    List<InvoiceItem> invoiceItems = invoice.getItems();
 //                    InvoiceItemDao invoiceItemDao = conn.attach(InvoiceItemDao.class);
 //                    invoiceItemDao.save(invoiceItems);
 
-                    if (currentInvoice == null) {
-                        InvoiceCreationNotification event;
-                        event = new DefaultInvoiceCreationNotification(invoice.getId(), invoice.getAccountId(),
-                                                                      invoice.getAmountOutstanding(), invoice.getCurrency(),
-                                                                      invoice.getInvoiceDate());
-                        eventBus.post(event);
-                    } else {
-
-                    }
+                if (currentInvoice == null) {
+                    InvoiceCreationNotification event;
+                    event = new DefaultInvoiceCreationNotification(invoice.getId(), invoice.getAccountId(),
+                                                                  invoice.getAmountOutstanding(), invoice.getCurrency(),
+                                                                  invoice.getInvoiceDate());
+                    eventBus.post(event);
+                } else {
 
-                    conn.commit();
-                } catch (Exception e) {
-                    conn.rollback();
-                    throw e;
                 }
 
                 return null;
diff --git a/util/src/main/java/com/ning/billing/util/customfield/dao/FieldStoreDao.java b/util/src/main/java/com/ning/billing/util/customfield/dao/FieldStoreDao.java
index 96a3976..680a826 100644
--- a/util/src/main/java/com/ning/billing/util/customfield/dao/FieldStoreDao.java
+++ b/util/src/main/java/com/ning/billing/util/customfield/dao/FieldStoreDao.java
@@ -33,6 +33,7 @@ import org.skife.jdbi.v2.sqlobject.BinderFactory;
 import org.skife.jdbi.v2.sqlobject.BindingAnnotation;
 import org.skife.jdbi.v2.sqlobject.SqlBatch;
 import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
+import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
 import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
 import org.skife.jdbi.v2.tweak.ResultSetMapper;
 import com.ning.billing.util.customfield.CustomField;
@@ -41,7 +42,7 @@ import com.ning.billing.util.entity.EntityCollectionDao;
 
 @ExternalizedSqlViaStringTemplate3
 @RegisterMapper(FieldStoreDao.CustomFieldMapper.class)
-public interface FieldStoreDao extends EntityCollectionDao<CustomField> {
+public interface FieldStoreDao extends EntityCollectionDao<CustomField>, Transmogrifier {
     @Override
     @SqlBatch
     public void save(@Bind("objectId") final String objectId,