killbill-memoizeit

payment: update to killbill-api 0.9.3 Signed-off-by: Pierre-Alexandre

4/24/2014 5:13:42 PM

Details

diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
index 33faf6c..e9c88b8 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
@@ -51,6 +51,7 @@ import org.killbill.billing.account.api.AccountData;
 import org.killbill.billing.account.api.AccountEmail;
 import org.killbill.billing.account.api.AccountUserApi;
 import org.killbill.billing.account.api.MutableAccountData;
+import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.entitlement.api.SubscriptionApi;
 import org.killbill.billing.entitlement.api.SubscriptionApiException;
 import org.killbill.billing.entitlement.api.SubscriptionBundle;
@@ -644,15 +645,17 @@ public class AccountResource extends JaxRsResourceBase {
         final CallContext callContext = context.createContext(createdBy, reason, comment, request);
         final UUID accountId = UUID.fromString(accountIdStr);
         final Account account = accountUserApi.getAccountById(accountId, callContext);
+        final Currency currency = json.getCurrency() == null ? account.getCurrency() : Currency.valueOf(json.getCurrency());
+        final UUID directPaymentId = json.getDirectPaymentId() == null ? null : UUID.fromString(json.getDirectPaymentId());
 
         final TransactionType transactionType = TransactionType.valueOf(json.getTransactionType());
         DirectPayment result;
         switch (transactionType) {
             case AUTHORIZE:
-                result = directPaymentApi.createAuthorization(account, json.getAmount(), json.getExternalKey(), pluginProperties, callContext);
+                result = directPaymentApi.createAuthorization(account, directPaymentId, json.getAmount(), currency, json.getExternalKey(), pluginProperties, callContext);
                 break;
             case PURCHASE:
-                result = directPaymentApi.createPurchase(account, json.getAmount(), json.getExternalKey(), pluginProperties, callContext);
+                result = directPaymentApi.createPurchase(account, directPaymentId, json.getAmount(), currency, json.getExternalKey(), pluginProperties, callContext);
                 break;
             default:
                 return Response.status(Status.PRECONDITION_FAILED).entity("TransactionType " + transactionType + " is not allowed for an account").build();
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/DirectPaymentResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/DirectPaymentResource.java
index 03270f0..20ccbf9 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/DirectPaymentResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/DirectPaymentResource.java
@@ -38,6 +38,7 @@ import javax.ws.rs.core.UriInfo;
 import org.killbill.billing.account.api.Account;
 import org.killbill.billing.account.api.AccountApiException;
 import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.jaxrs.json.DirectPaymentJson;
 import org.killbill.billing.jaxrs.json.PaymentJson;
 import org.killbill.billing.jaxrs.util.Context;
@@ -105,8 +106,9 @@ public class DirectPaymentResource extends JaxRsResourceBase {
         final DirectPayment initialPayment = directPaymentApi.getPayment(directPaymentId, false, pluginProperties, callContext);
 
         final Account account = accountUserApi.getAccountById(initialPayment.getAccountId(), callContext);
+        final Currency currency = json.getCurrency() == null ? account.getCurrency() : Currency.valueOf(json.getCurrency());
 
-        final DirectPayment payment = directPaymentApi.createCapture(account, directPaymentId, json.getAmount(), pluginProperties, callContext);
+        final DirectPayment payment = directPaymentApi.createCapture(account, directPaymentId, json.getAmount(), currency, pluginProperties, callContext);
         return uriBuilder.buildResponse(uriInfo, DirectPaymentResource.class, "getDirectPayment", payment.getId());
     }
 
diff --git a/payment/src/main/java/org/killbill/billing/payment/api/svcs/DefaultDirectPaymentApi.java b/payment/src/main/java/org/killbill/billing/payment/api/svcs/DefaultDirectPaymentApi.java
index a090091..2d60830 100644
--- a/payment/src/main/java/org/killbill/billing/payment/api/svcs/DefaultDirectPaymentApi.java
+++ b/payment/src/main/java/org/killbill/billing/payment/api/svcs/DefaultDirectPaymentApi.java
@@ -25,6 +25,7 @@ import javax.inject.Inject;
 
 import org.killbill.billing.ErrorCode;
 import org.killbill.billing.account.api.Account;
+import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.payment.api.DirectPayment;
 import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.killbill.billing.payment.api.PaymentApiException;
@@ -47,18 +48,18 @@ public class DefaultDirectPaymentApi implements DirectPaymentApi {
     }
 
     @Override
-    public DirectPayment createAuthorization(final Account account, final BigDecimal amount, final String externalKey, final Iterable<PluginProperty> properties, final CallContext callContext) throws PaymentApiException {
-        return directPaymentProcessor.createAuthorization(account, amount, externalKey, properties, internalCallContextFactory.createInternalCallContext(account.getId(), callContext));
+    public DirectPayment createAuthorization(final Account account, final UUID directPaymentId, final BigDecimal amount, final Currency currency, final String externalKey, final Iterable<PluginProperty> properties, final CallContext callContext) throws PaymentApiException {
+        return directPaymentProcessor.createAuthorization(account, directPaymentId, amount, currency, externalKey, properties, internalCallContextFactory.createInternalCallContext(account.getId(), callContext));
     }
 
     @Override
-    public DirectPayment createCapture(final Account account, final UUID directPaymentId, final BigDecimal amount, final Iterable<PluginProperty> properties, final CallContext callContext) throws PaymentApiException {
-        return directPaymentProcessor.createCapture(account, directPaymentId, amount, properties, internalCallContextFactory.createInternalCallContext(account.getId(), callContext));
+    public DirectPayment createCapture(final Account account, final UUID directPaymentId, final BigDecimal amount, final Currency currency, final Iterable<PluginProperty> properties, final CallContext callContext) throws PaymentApiException {
+        return directPaymentProcessor.createCapture(account, directPaymentId, amount, currency, properties, internalCallContextFactory.createInternalCallContext(account.getId(), callContext));
     }
 
     @Override
-    public DirectPayment createPurchase(final Account account, final BigDecimal amount, final String externalKey, final Iterable<PluginProperty> properties, final CallContext callContext) throws PaymentApiException {
-        return directPaymentProcessor.createPurchase(account, amount, externalKey, properties, internalCallContextFactory.createInternalCallContext(account.getId(), callContext));
+    public DirectPayment createPurchase(final Account account, final UUID directPaymentId, final BigDecimal amount, final Currency currency, final String externalKey, final Iterable<PluginProperty> properties, final CallContext callContext) throws PaymentApiException {
+        return directPaymentProcessor.createPurchase(account, directPaymentId, amount, currency, externalKey, properties, internalCallContextFactory.createInternalCallContext(account.getId(), callContext));
     }
 
     @Override
@@ -67,8 +68,8 @@ public class DefaultDirectPaymentApi implements DirectPaymentApi {
     }
 
     @Override
-    public DirectPayment createCredit(final Account account, final UUID directPaymentId, final BigDecimal amount, final Iterable<PluginProperty> properties, final CallContext callContext) throws PaymentApiException {
-        return directPaymentProcessor.createCredit(account, directPaymentId, amount, properties, internalCallContextFactory.createInternalCallContext(account.getId(), callContext));
+    public DirectPayment createCredit(final Account account, final UUID directPaymentId, final BigDecimal amount, final Currency currency, final Iterable<PluginProperty> properties, final CallContext callContext) throws PaymentApiException {
+        return directPaymentProcessor.createCredit(account, directPaymentId, amount, currency, properties, internalCallContextFactory.createInternalCallContext(account.getId(), callContext));
     }
 
     @Override
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/DirectPaymentProcessor.java b/payment/src/main/java/org/killbill/billing/payment/core/DirectPaymentProcessor.java
index 69da111..8eb7f5c 100644
--- a/payment/src/main/java/org/killbill/billing/payment/core/DirectPaymentProcessor.java
+++ b/payment/src/main/java/org/killbill/billing/payment/core/DirectPaymentProcessor.java
@@ -36,6 +36,7 @@ import org.killbill.billing.account.api.Account;
 import org.killbill.billing.account.api.AccountInternalApi;
 import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.invoice.api.InvoiceInternalApi;
 import org.killbill.billing.osgi.api.OSGIServiceRegistration;
 import org.killbill.billing.payment.api.DefaultDirectPayment;
@@ -69,6 +70,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Function;
+import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
@@ -108,49 +110,54 @@ public class DirectPaymentProcessor extends ProcessorBase {
         this.paymentPluginDispatcher = new PluginDispatcher<DirectPayment>(paymentPluginTimeoutSec, executor);
     }
 
-    public DirectPayment createAuthorization(final Account account, final BigDecimal amount, final String externalKey, final Iterable<PluginProperty> properties, final InternalCallContext callContext) throws PaymentApiException {
+    public DirectPayment createAuthorization(final Account account, @Nullable final UUID directPaymentId, final BigDecimal amount, final Currency currency, final String externalKey, final Iterable<PluginProperty> properties, final InternalCallContext callContext) throws PaymentApiException {
         return initiateDirectPayment(TransactionType.AUTHORIZE,
                                      new PluginWrapper() {
                                          @Override
                                          public PaymentInfoPlugin doPluginOperation(final PaymentPluginApi plugin, final Account account, final BigDecimal amount, final UUID directPaymentId, final Iterable<PluginProperty> properties, final CallContext callContext) throws PaymentPluginApiException {
-                                             return plugin.authorizePayment(account.getId(), directPaymentId, account.getPaymentMethodId(), amount, account.getCurrency(), properties, callContext);
+                                             return plugin.authorizePayment(account.getId(), directPaymentId, account.getPaymentMethodId(), amount, currency, properties, callContext);
                                          }
                                      },
+                                     directPaymentId,
                                      externalKey,
                                      account,
                                      amount,
+                                     currency,
                                      properties,
                                      callContext
                                     );
     }
 
-    public DirectPayment createCapture(final Account account, final UUID directPaymentId, final BigDecimal amount, final Iterable<PluginProperty> properties, final InternalCallContext callContext) throws PaymentApiException {
+    public DirectPayment createCapture(final Account account, final UUID directPaymentId, final BigDecimal amount, final Currency currency, final Iterable<PluginProperty> properties, final InternalCallContext callContext) throws PaymentApiException {
         return createDirectPayment(TransactionType.CAPTURE,
                                    new PluginWrapper() {
                                        @Override
                                        public PaymentInfoPlugin doPluginOperation(final PaymentPluginApi plugin, final Account account, final BigDecimal amount, final UUID directPaymentId, final Iterable<PluginProperty> properties, final CallContext callContext) throws PaymentPluginApiException {
-                                           return plugin.capturePayment(account.getId(), directPaymentId, account.getPaymentMethodId(), amount, account.getCurrency(), properties, callContext);
+                                           return plugin.capturePayment(account.getId(), directPaymentId, account.getPaymentMethodId(), amount, currency, properties, callContext);
                                        }
                                    },
                                    directPaymentId,
                                    account,
                                    amount,
+                                   currency,
                                    properties,
                                    callContext
                                   );
     }
 
-    public DirectPayment createPurchase(final Account account, final BigDecimal amount, final String externalKey, final Iterable<PluginProperty> properties, final InternalCallContext callContext) throws PaymentApiException {
+    public DirectPayment createPurchase(final Account account, @Nullable final UUID directPaymentId, final BigDecimal amount, final Currency currency, final String externalKey, final Iterable<PluginProperty> properties, final InternalCallContext callContext) throws PaymentApiException {
         return initiateDirectPayment(TransactionType.PURCHASE,
                                      new PluginWrapper() {
                                          @Override
                                          public PaymentInfoPlugin doPluginOperation(final PaymentPluginApi plugin, final Account account, final BigDecimal amount, final UUID directPaymentId, final Iterable<PluginProperty> properties, final CallContext callContext) throws PaymentPluginApiException {
-                                             return plugin.authorizePayment(account.getId(), directPaymentId, account.getPaymentMethodId(), amount, account.getCurrency(), properties, callContext);
+                                             return plugin.authorizePayment(account.getId(), directPaymentId, account.getPaymentMethodId(), amount, currency, properties, callContext);
                                          }
                                      },
+                                     directPaymentId,
                                      externalKey,
                                      account,
                                      amount,
+                                     currency,
                                      properties,
                                      callContext
                                     );
@@ -167,12 +174,13 @@ public class DirectPaymentProcessor extends ProcessorBase {
                                    directPaymentId,
                                    account,
                                    null,
+                                   null,
                                    properties,
                                    callContext
                                   );
     }
 
-    public DirectPayment createCredit(final Account account, final UUID directPaymentId, final BigDecimal amount, final Iterable<PluginProperty> properties, final InternalCallContext callContext) throws PaymentApiException {
+    public DirectPayment createCredit(final Account account, final UUID directPaymentId, final BigDecimal amount, final Currency currency, final Iterable<PluginProperty> properties, final InternalCallContext callContext) throws PaymentApiException {
         return createDirectPayment(TransactionType.CREDIT,
                                    new PluginWrapper() {
                                        @Override
@@ -183,6 +191,7 @@ public class DirectPaymentProcessor extends ProcessorBase {
                                    directPaymentId,
                                    account,
                                    amount,
+                                   currency,
                                    properties,
                                    callContext
                                   );
@@ -353,8 +362,10 @@ public class DirectPaymentProcessor extends ProcessorBase {
         PaymentInfoPlugin doPluginOperation(final PaymentPluginApi plugin, final Account account, final BigDecimal amount, final UUID directPaymentId, final Iterable<PluginProperty> properties, final CallContext callContext) throws PaymentPluginApiException;
     }
 
-    private DirectPayment initiateDirectPayment(final TransactionType transactionType, final PluginWrapper pluginWrapper, final String externalKey, final Account account, final BigDecimal amount,
-                                                final Iterable<PluginProperty> properties, final InternalCallContext callContext) throws PaymentApiException {
+    private DirectPayment initiateDirectPayment(final TransactionType transactionType, final PluginWrapper pluginWrapper, @Nullable final UUID directPaymentId, final String externalKey, final Account account,
+                                                final BigDecimal amount, final Currency currency, final Iterable<PluginProperty> properties, final InternalCallContext callContext) throws PaymentApiException {
+        Preconditions.checkArgument(account.getCurrency().equals(currency), String.format("Currency %s doesn't match the one on the account (%s)", currency, currency));
+
         try {
             return paymentPluginDispatcher.dispatchWithAccountLock(new CallableWithAccountLock<DirectPayment>(locker,
                                                                                                               account.getExternalKey(),
@@ -363,15 +374,29 @@ public class DirectPaymentProcessor extends ProcessorBase {
                                                                                                                   @Override
                                                                                                                   public DirectPayment doOperation() throws PaymentApiException {
                                                                                                                       final DateTime utcNow = clock.getUTCNow();
-                                                                                                                      final DirectPaymentModelDao pmd = new DirectPaymentModelDao(utcNow, utcNow, account.getId(), account.getPaymentMethodId(), externalKey);
-                                                                                                                      final DirectPaymentTransactionModelDao ptmd = new DirectPaymentTransactionModelDao(utcNow, utcNow, pmd.getId(),
-                                                                                                                                                                                                         transactionType, utcNow, PaymentStatus.UNKNOWN,
-                                                                                                                                                                                                         amount, account.getCurrency(), null, null);
-
-                                                                                                                      final DirectPaymentModelDao inserted = paymentDao.insertDirectPaymentWithFirstTransaction(pmd, ptmd, callContext);
-                                                                                                                      final DirectPaymentTransactionModelDao insertedTransaction = paymentDao.getDirectTransactionsForAccount(account.getId(), callContext).get(0);
-
-                                                                                                                      return getDirectPayment(pluginWrapper, account, amount, inserted.getId(), insertedTransaction.getId(), properties, callContext);
+                                                                                                                      final DirectPaymentModelDao paymentModelDao;
+                                                                                                                      final DirectPaymentTransactionModelDao paymentTransactionModelDao;
+                                                                                                                      if (directPaymentId == null) {
+                                                                                                                          final DirectPaymentModelDao pmd = new DirectPaymentModelDao(utcNow, utcNow, account.getId(), account.getPaymentMethodId(), externalKey);
+                                                                                                                          final DirectPaymentTransactionModelDao ptmd = new DirectPaymentTransactionModelDao(utcNow, utcNow, pmd.getId(),
+                                                                                                                                                                                                             transactionType, utcNow, PaymentStatus.UNKNOWN,
+                                                                                                                                                                                                             amount, currency, null, null);
+
+                                                                                                                          paymentModelDao = paymentDao.insertDirectPaymentWithFirstTransaction(pmd, ptmd, callContext);
+                                                                                                                          paymentTransactionModelDao = paymentDao.getDirectTransactionsForAccount(account.getId(), callContext).get(0);
+                                                                                                                      } else {
+                                                                                                                          paymentModelDao = paymentDao.getDirectPayment(directPaymentId, callContext);
+                                                                                                                          if (paymentModelDao == null) {
+                                                                                                                              throw new PaymentApiException(ErrorCode.PAYMENT_NO_SUCH_PAYMENT, directPaymentId);
+                                                                                                                          }
+
+                                                                                                                          final DirectPaymentTransactionModelDao ptmd = new DirectPaymentTransactionModelDao(utcNow, utcNow, directPaymentId,
+                                                                                                                                                                                                             transactionType, utcNow, PaymentStatus.UNKNOWN,
+                                                                                                                                                                                                             amount, currency, null, null);
+                                                                                                                          paymentTransactionModelDao = paymentDao.updateDirectPaymentWithNewTransaction(directPaymentId, ptmd, callContext);
+                                                                                                                      }
+
+                                                                                                                      return getDirectPayment(pluginWrapper, account, amount, currency, paymentModelDao.getId(), paymentTransactionModelDao.getId(), properties, callContext);
                                                                                                                   }
                                                                                                               }
             ));
@@ -384,8 +409,10 @@ public class DirectPaymentProcessor extends ProcessorBase {
     }
 
     private DirectPayment createDirectPayment(final TransactionType transactionType, final PluginWrapper pluginWrapper, final UUID directPaymentId,
-                                              final Account account, @Nullable final BigDecimal amount,
+                                              final Account account, @Nullable final BigDecimal amount, @Nullable final Currency currency,
                                               final Iterable<PluginProperty> properties, final InternalCallContext callContext) throws PaymentApiException {
+        Preconditions.checkArgument((amount == null && currency == null) || account.getCurrency().equals(currency), String.format("Currency %s doesn't match the one on the account (%s)", currency, currency));
+
         try {
             return paymentPluginDispatcher.dispatchWithAccountLock(new CallableWithAccountLock<DirectPayment>(locker,
                                                                                                               account.getExternalKey(),
@@ -396,10 +423,10 @@ public class DirectPaymentProcessor extends ProcessorBase {
                                                                                                                       final DateTime utcNow = clock.getUTCNow();
                                                                                                                       final DirectPaymentTransactionModelDao ptmd = new DirectPaymentTransactionModelDao(utcNow, utcNow, directPaymentId,
                                                                                                                                                                                                          transactionType, utcNow, PaymentStatus.UNKNOWN,
-                                                                                                                                                                                                         amount, account.getCurrency(), null, null);
+                                                                                                                                                                                                         amount, currency, null, null);
                                                                                                                       final DirectPaymentTransactionModelDao inserted = paymentDao.updateDirectPaymentWithNewTransaction(directPaymentId, ptmd, callContext);
 
-                                                                                                                      return getDirectPayment(pluginWrapper, account, amount, directPaymentId, inserted.getId(), properties, callContext);
+                                                                                                                      return getDirectPayment(pluginWrapper, account, amount, currency, directPaymentId, inserted.getId(), properties, callContext);
                                                                                                                   }
                                                                                                               }
             ));
@@ -411,7 +438,7 @@ public class DirectPaymentProcessor extends ProcessorBase {
         }
     }
 
-    private DirectPayment getDirectPayment(final PluginWrapper pluginWrapper, final Account account, @Nullable final BigDecimal amount,
+    private DirectPayment getDirectPayment(final PluginWrapper pluginWrapper, final Account account, @Nullable final BigDecimal amount, @Nullable final Currency currency,
                                            final UUID directPaymentId, final UUID directPaymentTransactionId, final Iterable<PluginProperty> properties,
                                            final InternalCallContext callContext) throws PaymentApiException {
         final UUID tenantId = nonEntityDao.retrieveIdFromObject(callContext.getTenantRecordId(), ObjectType.TENANT);
@@ -427,15 +454,15 @@ public class DirectPaymentProcessor extends ProcessorBase {
                 throw new PaymentPluginApiException(formatError, e);
             }
 
-            processPaymentInfoPlugin(infoPlugin, account, amount, directPaymentId, directPaymentTransactionId, callContext);
+            processPaymentInfoPlugin(infoPlugin, account, amount, currency, directPaymentId, directPaymentTransactionId, callContext);
         } catch (final PaymentPluginApiException e) {
-            paymentDao.updateDirectPaymentAndTransactionOnCompletion(directPaymentId, PaymentStatus.PAYMENT_FAILURE_ABORTED, amount, account.getCurrency(), directPaymentTransactionId, null, e.getMessage(), callContext);
+            paymentDao.updateDirectPaymentAndTransactionOnCompletion(directPaymentId, PaymentStatus.PAYMENT_FAILURE_ABORTED, amount, currency, directPaymentTransactionId, null, e.getMessage(), callContext);
         }
 
         return getPayment(directPaymentId, false, properties, callContext);
     }
 
-    private PaymentStatus processPaymentInfoPlugin(final PaymentInfoPlugin infoPlugin, final Account account, @Nullable final BigDecimal amount,
+    private PaymentStatus processPaymentInfoPlugin(final PaymentInfoPlugin infoPlugin, final Account account, @Nullable final BigDecimal amount, @Nullable final Currency currency,
                                                    final UUID directPaymentId, final UUID directPaymentTransactionId, final InternalCallContext callContext) throws PaymentPluginApiException {
         final PaymentStatus paymentStatus;
         switch (infoPlugin.getStatus()) {
@@ -456,7 +483,7 @@ public class DirectPaymentProcessor extends ProcessorBase {
         }
 
         // Update Payment/PaymentAttempt status
-        paymentDao.updateDirectPaymentAndTransactionOnCompletion(directPaymentId, paymentStatus, amount, account.getCurrency(),
+        paymentDao.updateDirectPaymentAndTransactionOnCompletion(directPaymentId, paymentStatus, amount, currency,
                                                                  directPaymentTransactionId, infoPlugin.getGatewayErrorCode(), infoPlugin.getGatewayError(), callContext);
 
         return paymentStatus;

pom.xml 2(+1 -1)

diff --git a/pom.xml b/pom.xml
index b67ae73..8f296ff 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill-oss-parent</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.7.3</version>
+        <version>0.7.4</version>
     </parent>
     <artifactId>killbill</artifactId>
     <version>0.11.2-SNAPSHOT</version>