killbill-memoizeit

payment: fix issues with id when refreshing payment methods Signed-off-by:

7/26/2012 6:50:52 PM

Details

diff --git a/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java
index 9105f58..16faab9 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java
@@ -24,6 +24,11 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ExecutorService;
 
+import javax.annotation.Nullable;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableList;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
 import com.ning.billing.ErrorCode;
@@ -118,7 +123,6 @@ public class PaymentMethodProcessor extends ProcessorBase {
         });
     }
 
-
     public List<PaymentMethod> refreshPaymentMethods(final String pluginName, final Account account, final CallContext context)
             throws PaymentApiException {
 
@@ -126,31 +130,33 @@ public class PaymentMethodProcessor extends ProcessorBase {
 
             @Override
             public List<PaymentMethod> doOperation() throws PaymentApiException {
-                final List<PaymentMethod> result = new LinkedList<PaymentMethod>();
                 final PaymentPluginApi pluginApi;
                 try {
                     pluginApi = pluginRegistry.getPlugin(pluginName);
                     final List<PaymentMethodPlugin> pluginPms = pluginApi.getPaymentMethodDetails(account.getExternalKey());
                     // The method should never return null by convention, but let's not trust the plugin...
                     if (pluginPms == null) {
-                        return result;
+                        return ImmutableList.<PaymentMethod>of();
                     }
 
                     final List<PaymentMethodModelDao> finalPaymentMethods = new ArrayList<PaymentMethodModelDao>();
                     for (final PaymentMethodPlugin cur : pluginPms) {
                         final PaymentMethod input = new DefaultPaymentMethod(account.getId(), pluginName, cur);
-                        result.add(input);
-
                         final PaymentMethodModelDao pmModel = new PaymentMethodModelDao(input.getId(), input.getAccountId(), input.getPluginName(), input.isActive(), input.getPluginDetail().getExternalPaymentMethodId());
                         finalPaymentMethods.add(pmModel);
                     }
 
-                    paymentDao.refreshPaymentMethods(account.getId(), finalPaymentMethods, context);
+                    final List<PaymentMethodModelDao> refreshedPaymentMethods = paymentDao.refreshPaymentMethods(account.getId(), finalPaymentMethods, context);
+                    return ImmutableList.<PaymentMethod>copyOf(Collections2.transform(refreshedPaymentMethods, new Function<PaymentMethodModelDao, PaymentMethod>() {
+                        @Override
+                        public PaymentMethod apply(final PaymentMethodModelDao input) {
+                            return new DefaultPaymentMethod(input);
+                        }
+                    }));
                 } catch (PaymentPluginApiException e) {
                     // STEPH all errors should also take a pluginName
                     throw new PaymentApiException(ErrorCode.PAYMENT_REFRESH_PAYMENT_METHOD, account.getId(), e.getErrorMessage());
                 }
-                return result;
             }
         });
     }
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/AuditedPaymentDao.java b/payment/src/main/java/com/ning/billing/payment/dao/AuditedPaymentDao.java
index 943a858..b7ed65f 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/AuditedPaymentDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/AuditedPaymentDao.java
@@ -25,6 +25,8 @@ import org.skife.jdbi.v2.Transaction;
 import org.skife.jdbi.v2.TransactionStatus;
 
 import com.google.inject.Inject;
+
+import com.ning.billing.payment.api.PaymentMethod;
 import com.ning.billing.payment.api.PaymentStatus;
 import com.ning.billing.payment.dao.RefundModelDao.RefundStatus;
 import com.ning.billing.payment.retry.PluginFailureRetryService.PluginFailureRetryServiceScheduler;
@@ -199,11 +201,11 @@ public class AuditedPaymentDao implements PaymentDao {
     }
 
     @Override
-    public void refreshPaymentMethods(final UUID accountId, final List<PaymentMethodModelDao> paymentMethods, final CallContext context) {
-        paymentMethodSqlDao.inTransaction(new Transaction<Void, PaymentMethodSqlDao>() {
+    public List<PaymentMethodModelDao> refreshPaymentMethods(final UUID accountId, final List<PaymentMethodModelDao> paymentMethods, final CallContext context) {
+        return paymentMethodSqlDao.inTransaction(new Transaction<List<PaymentMethodModelDao>, PaymentMethodSqlDao>() {
 
             @Override
-            public Void inTransaction(final PaymentMethodSqlDao transactional, final TransactionStatus status) throws Exception {
+            public List<PaymentMethodModelDao> inTransaction(final PaymentMethodSqlDao transactional, final TransactionStatus status) throws Exception {
                 final List<PaymentMethodModelDao> existingPaymentMethods = getPaymentMethodsInTransaction(transactional, accountId);
 
                 for (final PaymentMethodModelDao finalPaymentMethod : paymentMethods) {
@@ -232,7 +234,7 @@ public class AuditedPaymentDao implements PaymentDao {
                     }
                 }
 
-                return null;
+                return getPaymentMethodsInTransaction(transactional, accountId);
             }
         });
     }
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentDao.java
index 9a1d7bb..b4e7797 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentDao.java
@@ -18,6 +18,7 @@ package com.ning.billing.payment.dao;
 import java.util.List;
 import java.util.UUID;
 
+import com.ning.billing.payment.api.PaymentMethod;
 import com.ning.billing.payment.api.PaymentStatus;
 import com.ning.billing.payment.dao.RefundModelDao.RefundStatus;
 import com.ning.billing.util.callcontext.CallContext;
@@ -53,7 +54,7 @@ public interface PaymentDao {
 
     public PaymentMethodModelDao insertPaymentMethod(final PaymentMethodModelDao paymentMethod, final CallContext context);
 
-    public void refreshPaymentMethods(final UUID accountId, final List<PaymentMethodModelDao> paymentMethods, final CallContext context);
+    public List<PaymentMethodModelDao> refreshPaymentMethods(final UUID accountId, final List<PaymentMethodModelDao> paymentMethods, final CallContext context);
 
     public PaymentMethodModelDao getPaymentMethod(final UUID paymentMethodId);
 
diff --git a/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java b/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java
index 9713bfa..3811f8c 100644
--- a/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java
+++ b/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
+import com.ning.billing.payment.api.PaymentMethod;
 import com.ning.billing.payment.api.PaymentStatus;
 import com.ning.billing.payment.dao.RefundModelDao.RefundStatus;
 import com.ning.billing.util.callcontext.CallContext;
@@ -128,20 +129,8 @@ public class MockPaymentDao implements PaymentDao {
     }
 
     @Override
-    public void refreshPaymentMethods(final UUID accountId, final List<PaymentMethodModelDao> newPaymentMethods, final CallContext context) {
-        synchronized (this) {
-            final Iterator<PaymentMethodModelDao> it = paymentMethods.iterator();
-            while (it.hasNext()) {
-                final PaymentMethodModelDao cur = it.next();
-                if (cur.getAccountId().equals(accountId)) {
-                    it.remove();
-                }
-            }
-
-            for (final PaymentMethodModelDao paymentMethodModelDao : paymentMethods) {
-                insertPaymentMethod(paymentMethodModelDao, context);
-            }
-        }
+    public List<PaymentMethodModelDao> refreshPaymentMethods(final UUID accountId, final List<PaymentMethodModelDao> newPaymentMethods, final CallContext context) {
+        throw new UnsupportedOperationException();
     }
 
     @Override