killbill-memoizeit

Details

api/pom.xml 4(+4 -0)

diff --git a/api/pom.xml b/api/pom.xml
index 013feb9..f691349 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -50,6 +50,10 @@
             <groupId>org.skife.config</groupId>
             <artifactId>config-magic</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.codehaus.jackson</groupId>
+            <artifactId>jackson-core-asl</artifactId>
+        </dependency>
 
     </dependencies>
     <build>
diff --git a/api/src/main/java/com/ning/billing/payment/api/Either.java b/api/src/main/java/com/ning/billing/payment/api/Either.java
index 0ad6405..25ce8f8 100644
--- a/api/src/main/java/com/ning/billing/payment/api/Either.java
+++ b/api/src/main/java/com/ning/billing/payment/api/Either.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.payment.api;
 
+import org.codehaus.jackson.annotate.JsonValue;
+
 public abstract class Either<T, V> {
     public static <T, V> Either<T, V> left(T value) {
         return new Left<T, V>(value);
@@ -51,6 +53,7 @@ public abstract class Either<T, V> {
             return true;
         }
         @Override
+        @JsonValue
         public T getLeft() {
             return value;
         }
@@ -68,6 +71,7 @@ public abstract class Either<T, V> {
         }
 
         @Override
+        @JsonValue
         public V getRight() {
             return value;
         }
diff --git a/api/src/main/java/com/ning/billing/payment/api/PaymentApi.java b/api/src/main/java/com/ning/billing/payment/api/PaymentApi.java
index e54ee98..fb07745 100644
--- a/api/src/main/java/com/ning/billing/payment/api/PaymentApi.java
+++ b/api/src/main/java/com/ning/billing/payment/api/PaymentApi.java
@@ -25,9 +25,21 @@ public interface PaymentApi {
 
     Either<PaymentError, List<PaymentMethodInfo>> getPaymentMethods(String accountKey);
 
+    Either<PaymentError, Void> deletePaymentMethod(String accountKey, String paymentMethodId);
+
     Either<PaymentError, Void> updatePaymentGateway(String accountKey);
 
+    Either<PaymentError, String> addPaypalPaymentMethod(@Nullable String accountKey, PaypalPaymentMethodInfo paypalPaymentMethod);
+
+    Either<PaymentError, PaymentMethodInfo> updatePaymentMethod(String accountKey, PaymentMethodInfo paymentMethodInfo);
+
+    List<Either<PaymentError, PaymentInfo>> createPayment(String accountKey, List<String> invoiceIds);
+
     Either<PaymentError, PaymentProviderAccount> getPaymentProviderAccount(String accountKey);
 
-    Either<PaymentError, String> addPaypalPaymentMethod(@Nullable String accountId, PaypalPaymentMethodInfo paypalPaymentMethod);
+    Either<PaymentError, PaymentProviderAccount> createPaymentProviderAccount(PaymentProviderAccount account);
+
+    Either<PaymentError, PaymentProviderAccount> updatePaymentProviderAccount(PaymentProviderAccount account);
+
+
 }
diff --git a/api/src/main/java/com/ning/billing/payment/api/PaymentError.java b/api/src/main/java/com/ning/billing/payment/api/PaymentError.java
index 85b5ecd..45e8555 100644
--- a/api/src/main/java/com/ning/billing/payment/api/PaymentError.java
+++ b/api/src/main/java/com/ning/billing/payment/api/PaymentError.java
@@ -15,8 +15,12 @@
  */
 
 package com.ning.billing.payment.api;
+import org.codehaus.jackson.annotate.JsonTypeInfo;
+import org.codehaus.jackson.annotate.JsonTypeInfo.Id;
+
 import com.ning.billing.util.eventbus.EventBusNotification;
 
+@JsonTypeInfo(use = Id.NAME, property = "error")
 public class PaymentError implements EventBusNotification {
     private final String type;
     private final String message;
diff --git a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java
index d7faf43..5849c11 100644
--- a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java
+++ b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java
@@ -16,6 +16,7 @@
 
 package com.ning.billing.payment.api;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
@@ -24,6 +25,8 @@ import javax.annotation.Nullable;
 import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountUserApi;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoicePaymentApi;
 import com.ning.billing.payment.RequestProcessor;
 import com.ning.billing.payment.provider.PaymentProviderPlugin;
 import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
@@ -31,11 +34,15 @@ import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
 public class DefaultPaymentApi implements PaymentApi {
     private final PaymentProviderPluginRegistry pluginRegistry;
     private final AccountUserApi accountUserApi;
+    private final InvoicePaymentApi invoicePaymentApi;
 
     @Inject
-    public DefaultPaymentApi(PaymentProviderPluginRegistry pluginRegistry, AccountUserApi accountUserApi) {
+    public DefaultPaymentApi(PaymentProviderPluginRegistry pluginRegistry,
+                             AccountUserApi accountUserApi,
+                             InvoicePaymentApi invoicePaymentApi) {
         this.pluginRegistry = pluginRegistry;
         this.accountUserApi = accountUserApi;
+        this.invoicePaymentApi = invoicePaymentApi;
     }
 
     @Override
@@ -78,8 +85,47 @@ public class DefaultPaymentApi implements PaymentApi {
     }
 
     @Override
-    public Either<PaymentError, String> addPaypalPaymentMethod(@Nullable String accountId, PaypalPaymentMethodInfo paypalPaymentMethod) {
-        final PaymentProviderPlugin plugin = getPaymentProviderPlugin(accountId);
-        return plugin.addPaypalPaymentMethod(accountId, paypalPaymentMethod);
+    public Either<PaymentError, String> addPaypalPaymentMethod(@Nullable String accountKey, PaypalPaymentMethodInfo paypalPaymentMethod) {
+        final PaymentProviderPlugin plugin = getPaymentProviderPlugin(accountKey);
+        return plugin.addPaypalPaymentMethod(accountKey, paypalPaymentMethod);
+    }
+
+    @Override
+    public Either<PaymentError, Void> deletePaymentMethod(String accountKey, String paymentMethodId) {
+        final PaymentProviderPlugin plugin = getPaymentProviderPlugin(accountKey);
+        return plugin.deletePaypalPaymentMethod(accountKey, paymentMethodId);
+    }
+
+    @Override
+    public Either<PaymentError, PaymentMethodInfo> updatePaymentMethod(String accountKey, PaymentMethodInfo paymentMethodInfo) {
+        final PaymentProviderPlugin plugin = getPaymentProviderPlugin(accountKey);
+        return plugin.updatePaypalPaymentMethod(accountKey, paymentMethodInfo);
+    }
+
+    @Override
+    public List<Either<PaymentError, PaymentInfo>> createPayment(String accountKey, List<String> invoiceIds) {
+        final PaymentProviderPlugin plugin = getPaymentProviderPlugin(accountKey);
+        final Account account = accountUserApi.getAccountByKey(accountKey);
+        List<Either<PaymentError, PaymentInfo>> processedPaymentsOrErrors = new ArrayList<Either<PaymentError, PaymentInfo>>(invoiceIds.size());
+
+        for (String invoiceId : invoiceIds) {
+            Invoice invoice = invoicePaymentApi.getInvoice(UUID.fromString(invoiceId));
+            Either<PaymentError, PaymentInfo> paymentOrError = plugin.processInvoice(account, invoice);
+            processedPaymentsOrErrors.add(paymentOrError);
+        }
+
+        return processedPaymentsOrErrors;
+    }
+
+    @Override
+    public Either<PaymentError, PaymentProviderAccount> createPaymentProviderAccount(PaymentProviderAccount account) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Either<PaymentError, PaymentProviderAccount> updatePaymentProviderAccount(PaymentProviderAccount account) {
+        // TODO Auto-generated method stub
+        return null;
     }
 }
diff --git a/payment/src/main/java/com/ning/billing/payment/provider/PaymentProviderPlugin.java b/payment/src/main/java/com/ning/billing/payment/provider/PaymentProviderPlugin.java
index a6ef30f..62557f1 100644
--- a/payment/src/main/java/com/ning/billing/payment/provider/PaymentProviderPlugin.java
+++ b/payment/src/main/java/com/ning/billing/payment/provider/PaymentProviderPlugin.java
@@ -20,9 +20,9 @@ import java.util.List;
 
 import com.ning.billing.account.api.Account;
 import com.ning.billing.invoice.api.Invoice;
-import com.ning.billing.payment.PaymentInfo;
 import com.ning.billing.payment.api.Either;
 import com.ning.billing.payment.api.PaymentError;
+import com.ning.billing.payment.api.PaymentInfo;
 import com.ning.billing.payment.api.PaymentMethodInfo;
 import com.ning.billing.payment.api.PaymentProviderAccount;
 import com.ning.billing.payment.api.PaypalPaymentMethodInfo;
@@ -35,8 +35,10 @@ public interface PaymentProviderPlugin {
     Either<PaymentError, PaymentInfo> getPaymentInfo(String paymentId);
     Either<PaymentError, PaymentMethodInfo> getPaymentMethodInfo(String paymentMethodId);
     Either<PaymentError, PaymentProviderAccount> getPaymentProviderAccount(String accountKey);
-    Either<PaymentError, List<PaymentMethodInfo>> getPaymentMethods(String screenName);
+    Either<PaymentError, List<PaymentMethodInfo>> getPaymentMethods(String accountKey);
 
     Either<PaymentError, Void> updatePaymentGateway(String accountKey);
+    Either<PaymentError, Void> deletePaypalPaymentMethod(String accountKey, String paymentMethodId);
+    Either<PaymentError, PaymentMethodInfo> updatePaypalPaymentMethod(String accountKey, PaymentMethodInfo paymentMethodInfo);
 
 }
diff --git a/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java b/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
index 6353a1b..2033d59 100644
--- a/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.payment;
 
+import java.math.BigDecimal;
+
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
@@ -25,6 +27,7 @@ import com.ning.billing.invoice.api.InvoiceCreationNotification;
 import com.ning.billing.invoice.api.InvoicePaymentApi;
 import com.ning.billing.payment.api.Either;
 import com.ning.billing.payment.api.PaymentError;
+import com.ning.billing.payment.api.PaymentInfo;
 import com.ning.billing.payment.provider.PaymentProviderPlugin;
 import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
 import com.ning.billing.util.eventbus.EventBus;
@@ -49,25 +52,33 @@ public class RequestProcessor {
     }
 
     @Subscribe
-    public void receiveInvoice(InvoiceCreationNotification event) throws EventBusException {
-        final Invoice invoice = invoiceApi.getInvoice(event.getInvoiceId());
-        if (invoice == null) {
-            // TODO: log a warning ?
-        }
-        else {
-            final Account account = accountUserApi.getAccountById(event.getAccountId());
-            if (account == null) {
-                // TODO: log a warning ?
+    public void receiveInvoice(InvoiceCreationNotification event) {
+        try {
+            final Invoice invoice = invoiceApi.getInvoice(event.getInvoiceId());
+            if (invoice == null) {
+                // TODO: log a warning
+            }
+            else if (invoice.getAmountOutstanding().compareTo(BigDecimal.ZERO) == 0 ) {
+                // TODO: send a notification that invoice was ignored ?
             }
             else {
-                final String paymentProviderName = account.getFieldValue(PAYMENT_PROVIDER_KEY);
-                final PaymentProviderPlugin plugin = pluginRegistry.getPlugin(paymentProviderName);
+                final Account account = accountUserApi.getAccountById(event.getAccountId());
+                if (account == null) {
+                    // TODO: log a warning
+                }
+                else {
+                    final String paymentProviderName = account.getPaymentProviderName();
+                    final PaymentProviderPlugin plugin = pluginRegistry.getPlugin(paymentProviderName);
 
-                Either<PaymentError, PaymentInfo> result = plugin.processInvoice(account, invoice);
+                    Either<PaymentError, PaymentInfo> result = plugin.processInvoice(account, invoice);
 
-                eventBus.post(result.isLeft() ? result.getLeft() : result.getRight());
+                    eventBus.post(result.isLeft() ? result.getLeft() : result.getRight());
+                }
             }
         }
+        catch (EventBusException ex) {
+            //  TODO: log
+        }
     }
 
     @Subscribe
diff --git a/payment/src/test/java/com/ning/billing/payment/MockPaymentInfoReceiver.java b/payment/src/test/java/com/ning/billing/payment/MockPaymentInfoReceiver.java
index 789f616..cf2494d 100644
--- a/payment/src/test/java/com/ning/billing/payment/MockPaymentInfoReceiver.java
+++ b/payment/src/test/java/com/ning/billing/payment/MockPaymentInfoReceiver.java
@@ -22,6 +22,7 @@ import java.util.List;
 
 import com.google.common.eventbus.Subscribe;
 import com.ning.billing.payment.api.PaymentError;
+import com.ning.billing.payment.api.PaymentInfo;
 
 public class MockPaymentInfoReceiver {
     private final List<PaymentInfo> processedPayments = Collections.synchronizedList(new ArrayList<PaymentInfo>());
diff --git a/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java b/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java
index 7046f2e..578fd15 100644
--- a/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java
+++ b/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java
@@ -23,9 +23,9 @@ import java.util.concurrent.ConcurrentHashMap;
 
 import com.ning.billing.account.api.Account;
 import com.ning.billing.invoice.api.Invoice;
-import com.ning.billing.payment.PaymentInfo;
 import com.ning.billing.payment.api.Either;
 import com.ning.billing.payment.api.PaymentError;
+import com.ning.billing.payment.api.PaymentInfo;
 import com.ning.billing.payment.api.PaymentMethodInfo;
 import com.ning.billing.payment.api.PaymentProviderAccount;
 import com.ning.billing.payment.api.PaypalPaymentMethodInfo;
@@ -72,19 +72,31 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
     }
 
     @Override
-    public Either<PaymentError, PaypalPaymentMethodInfo> addPaypalPaymentMethod(Account account, PaypalPaymentMethodInfo paypalPaymentMethod) {
+    public Either<PaymentError, Void> updatePaymentGateway(String accountKey) {
         // TODO
         return Either.left(new PaymentError("unknown", "Not implemented"));
     }
 
     @Override
-    public Either<PaymentError, Void> updatePaymentGateway(String accountKey) {
+    public Either<PaymentError, PaymentProviderAccount> getPaymentProviderAccount(String accountKey) {
         // TODO
         return Either.left(new PaymentError("unknown", "Not implemented"));
     }
 
     @Override
-    public Either<PaymentError, PaymentProviderAccount> getPaymentProviderAccount(String accountKey) {
+    public Either<PaymentError, String> addPaypalPaymentMethod(String accountId, PaypalPaymentMethodInfo paypalPaymentMethod) {
+        // TODO
+        return Either.left(new PaymentError("unknown", "Not implemented"));
+    }
+
+    @Override
+    public Either<PaymentError, Void> deletePaypalPaymentMethod(String accountKey, String paymentMethodId) {
+        // TODO
+        return Either.left(new PaymentError("unknown", "Not implemented"));
+    }
+
+    @Override
+    public Either<PaymentError, PaymentMethodInfo> updatePaypalPaymentMethod(String accountKey, PaymentMethodInfo paymentMethodInfo) {
         // TODO
         return Either.left(new PaymentError("unknown", "Not implemented"));
     }
diff --git a/payment/src/test/java/com/ning/billing/payment/TestPaymentProvider.java b/payment/src/test/java/com/ning/billing/payment/TestPaymentProvider.java
index a35a5ac..9afc1ae 100644
--- a/payment/src/test/java/com/ning/billing/payment/TestPaymentProvider.java
+++ b/payment/src/test/java/com/ning/billing/payment/TestPaymentProvider.java
@@ -44,6 +44,7 @@ import com.ning.billing.invoice.api.MockInvoicePaymentApi;
 import com.ning.billing.invoice.model.DefaultInvoice;
 import com.ning.billing.invoice.model.DefaultInvoiceItem;
 import com.ning.billing.payment.api.PaymentError;
+import com.ning.billing.payment.api.PaymentInfo;
 import com.ning.billing.payment.setup.PaymentTestModule;
 import com.ning.billing.util.eventbus.EventBus;
 import com.ning.billing.util.eventbus.EventBus.EventBusException;
@@ -55,9 +56,9 @@ public class TestPaymentProvider {
     @Inject
     private RequestProcessor invoiceProcessor;
     @Inject
-    private MockAccountUserApi accountUserApi;
+    protected MockAccountUserApi accountUserApi;
     @Inject
-    private MockInvoicePaymentApi invoiceApi;
+    protected MockInvoicePaymentApi invoiceApi;
 
     private MockPaymentInfoReceiver paymentInfoReceiver;