killbill-memoizeit

payment: introduce InvoicePaymentInternalApi Signed-off-by:

6/17/2018 2:31:06 AM

Details

diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/db/TestDBRouter.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/db/TestDBRouter.java
index 94cb0ac..6cd9b9b 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/db/TestDBRouter.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/db/TestDBRouter.java
@@ -76,6 +76,10 @@ public class TestDBRouter extends TestIntegrationBase {
 
     @AfterMethod(groups = "slow")
     public void afterMethod() throws Exception {
+        if (hasFailed()) {
+            return;
+        }
+
         externalBus.unregister(publicListener);
         super.afterMethod();
     }
diff --git a/payment/src/main/java/org/killbill/billing/payment/api/DefaultInvoicePaymentApi.java b/payment/src/main/java/org/killbill/billing/payment/api/DefaultInvoicePaymentApi.java
index 6d87e45..c0ffe20 100644
--- a/payment/src/main/java/org/killbill/billing/payment/api/DefaultInvoicePaymentApi.java
+++ b/payment/src/main/java/org/killbill/billing/payment/api/DefaultInvoicePaymentApi.java
@@ -29,9 +29,10 @@ import org.killbill.billing.account.api.Account;
 import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.invoice.api.InvoiceInternalApi;
 import org.killbill.billing.invoice.api.InvoicePayment;
-import org.killbill.billing.payment.invoice.InvoicePaymentControlPluginApi;
+import org.killbill.billing.payment.api.svcs.InvoicePaymentPaymentOptions;
 import org.killbill.billing.util.UUIDs;
 import org.killbill.billing.util.callcontext.CallContext;
+import org.killbill.billing.util.callcontext.InternalCallContextFactory;
 import org.killbill.billing.util.callcontext.TenantContext;
 
 import com.google.common.base.MoreObjects;
@@ -41,11 +42,18 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
 
     private final PaymentApi paymentApi;
     private final InvoiceInternalApi invoiceInternalApi;
+    private final InvoicePaymentInternalApi invoicePaymentInternalApi;
+    private final InternalCallContextFactory internalCallContextFactory;
 
     @Inject
-    public DefaultInvoicePaymentApi(final PaymentApi paymentApi, final InvoiceInternalApi invoiceInternalApi) {
+    public DefaultInvoicePaymentApi(final PaymentApi paymentApi,
+                                    final InvoiceInternalApi invoiceInternalApi,
+                                    final InvoicePaymentInternalApi invoicePaymentInternalApi,
+                                    final InternalCallContextFactory internalCallContextFactory) {
         this.paymentApi = paymentApi;
         this.invoiceInternalApi = invoiceInternalApi;
+        this.invoicePaymentInternalApi = invoicePaymentInternalApi;
+        this.internalCallContextFactory = internalCallContextFactory;
     }
 
     @Override
@@ -57,32 +65,23 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
                                                    final Currency currency,
                                                    final DateTime effectiveDate,
                                                    final String paymentExternalKey,
-                                                   final String originalPaymentTransactionExternalKey,
-                                                   final Iterable<PluginProperty> originalProperties,
+                                                   final String paymentTransactionExternalKey,
+                                                   final Iterable<PluginProperty> properties,
                                                    final PaymentOptions paymentOptions,
                                                    final CallContext context) throws PaymentApiException {
-        final Collection<PluginProperty> pluginProperties = new LinkedList<PluginProperty>();
-        if (originalProperties != null) {
-            for (final PluginProperty pluginProperty : originalProperties) {
-                pluginProperties.add(pluginProperty);
-            }
-        }
-        pluginProperties.add(new PluginProperty("IPCD_INVOICE_ID", invoiceId.toString(), false));
-
-        final String paymentTransactionExternalKey = MoreObjects.firstNonNull(originalPaymentTransactionExternalKey, UUIDs.randomUUID().toString());
-        final Payment payment = paymentApi.createPurchaseWithPaymentControl(account,
-                                                                            paymentMethodId,
-                                                                            null,
-                                                                            amount,
-                                                                            currency,
-                                                                            null,
-                                                                            paymentExternalKey,
-                                                                            paymentTransactionExternalKey,
-                                                                            pluginProperties,
-                                                                            buildPaymentOptions(paymentOptions),
-                                                                            context);
-
-        return getInvoicePayment(payment.getId(), paymentTransactionExternalKey, context);
+        return invoicePaymentInternalApi.createPurchaseForInvoice(true,
+                                                                  account,
+                                                                  invoiceId,
+                                                                  paymentMethodId,
+                                                                  paymentId,
+                                                                  amount,
+                                                                  currency,
+                                                                  effectiveDate,
+                                                                  paymentExternalKey,
+                                                                  paymentTransactionExternalKey,
+                                                                  properties,
+                                                                  paymentOptions,
+                                                                  internalCallContextFactory.createInternalCallContext(account.getId(), context));
     }
 
     @Override
@@ -107,7 +106,7 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
                                                                           effectiveDate,
                                                                           paymentTransactionExternalKey,
                                                                           pluginProperties,
-                                                                          buildPaymentOptions(paymentOptions),
+                                                                          InvoicePaymentPaymentOptions.create(paymentOptions),
                                                                           context);
 
         return getInvoicePayment(payment.getId(), paymentTransactionExternalKey, context);
@@ -142,7 +141,7 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
                                                                           paymentExternalKey,
                                                                           paymentTransactionExternalKey,
                                                                           pluginProperties,
-                                                                          buildPaymentOptions(paymentOptions),
+                                                                          InvoicePaymentPaymentOptions.create(paymentOptions),
                                                                           context);
 
         return getInvoicePayment(payment.getId(), paymentTransactionExternalKey, context);
@@ -180,44 +179,4 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
         }
         return null;
     }
-
-    private PaymentOptions buildPaymentOptions(final PaymentOptions paymentOptions) {
-        final List<String> paymentControlPluginNames = new LinkedList<String>();
-        paymentControlPluginNames.addAll(paymentOptions.getPaymentControlPluginNames());
-        if (!paymentControlPluginNames.contains(InvoicePaymentControlPluginApi.PLUGIN_NAME)) {
-            paymentControlPluginNames.add(InvoicePaymentControlPluginApi.PLUGIN_NAME);
-        }
-
-        return new InvoicePaymentPaymentOptions(paymentOptions.isExternalPayment(), paymentControlPluginNames);
-    }
-
-    private static final class InvoicePaymentPaymentOptions implements PaymentOptions {
-
-        private final boolean isExternalPayment;
-        private final List<String> paymentControlPluginNames;
-
-        public InvoicePaymentPaymentOptions(final boolean isExternalPayment, final List<String> getPaymentControlPluginNames) {
-            this.isExternalPayment = isExternalPayment;
-            this.paymentControlPluginNames = getPaymentControlPluginNames;
-        }
-
-        @Override
-        public boolean isExternalPayment() {
-            return isExternalPayment;
-        }
-
-        @Override
-        public List<String> getPaymentControlPluginNames() {
-            return paymentControlPluginNames;
-        }
-
-        @Override
-        public String toString() {
-            final StringBuilder sb = new StringBuilder("InvoicePaymentPaymentOptions{");
-            sb.append("isExternalPayment=").append(isExternalPayment);
-            sb.append(", paymentControlPluginNames=").append(paymentControlPluginNames);
-            sb.append('}');
-            return sb.toString();
-        }
-    }
 }
diff --git a/payment/src/main/java/org/killbill/billing/payment/api/svcs/DefaultInvoicePaymentInternalApi.java b/payment/src/main/java/org/killbill/billing/payment/api/svcs/DefaultInvoicePaymentInternalApi.java
new file mode 100644
index 0000000..4b8313f
--- /dev/null
+++ b/payment/src/main/java/org/killbill/billing/payment/api/svcs/DefaultInvoicePaymentInternalApi.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
+ *
+ * The Billing Project 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 org.killbill.billing.payment.api.svcs;
+
+import java.math.BigDecimal;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+import org.killbill.billing.account.api.Account;
+import org.killbill.billing.callcontext.InternalCallContext;
+import org.killbill.billing.catalog.api.Currency;
+import org.killbill.billing.invoice.api.InvoiceInternalApi;
+import org.killbill.billing.invoice.api.InvoicePayment;
+import org.killbill.billing.payment.api.InvoicePaymentInternalApi;
+import org.killbill.billing.payment.api.Payment;
+import org.killbill.billing.payment.api.PaymentApiException;
+import org.killbill.billing.payment.api.PaymentOptions;
+import org.killbill.billing.payment.api.PaymentTransaction;
+import org.killbill.billing.payment.api.PluginProperty;
+import org.killbill.billing.payment.api.TransactionType;
+import org.killbill.billing.payment.core.PluginControlPaymentProcessor;
+import org.killbill.billing.util.UUIDs;
+import org.killbill.billing.util.callcontext.CallContext;
+import org.killbill.billing.util.callcontext.InternalCallContextFactory;
+import org.killbill.billing.util.callcontext.TenantContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.MoreObjects;
+import com.google.inject.Inject;
+
+import static org.killbill.billing.payment.logging.PaymentLoggingHelper.logEnterAPICall;
+import static org.killbill.billing.payment.logging.PaymentLoggingHelper.logExitAPICall;
+
+public class DefaultInvoicePaymentInternalApi implements InvoicePaymentInternalApi {
+
+    private static final Logger log = LoggerFactory.getLogger(DefaultInvoicePaymentInternalApi.class);
+
+    private final InvoiceInternalApi invoiceInternalApi;
+    private final PluginControlPaymentProcessor pluginControlPaymentProcessor;
+    private final InternalCallContextFactory internalCallContextFactory;
+
+    @Inject
+    public DefaultInvoicePaymentInternalApi(final InvoiceInternalApi invoiceInternalApi,
+                                            final PluginControlPaymentProcessor pluginControlPaymentProcessor,
+                                            final InternalCallContextFactory internalCallContextFactory) {
+        this.invoiceInternalApi = invoiceInternalApi;
+        this.pluginControlPaymentProcessor = pluginControlPaymentProcessor;
+        this.internalCallContextFactory = internalCallContextFactory;
+    }
+
+    @Override
+    public InvoicePayment createPurchaseForInvoice(final boolean isApiPayment,
+                                                   final Account account,
+                                                   final UUID invoiceId,
+                                                   final UUID paymentMethodId,
+                                                   final UUID paymentId,
+                                                   final BigDecimal amount,
+                                                   final Currency currency,
+                                                   final DateTime effectiveDate,
+                                                   final String paymentExternalKey,
+                                                   final String originalPaymentTransactionExternalKey,
+                                                   final Iterable<PluginProperty> originalProperties,
+                                                   final PaymentOptions paymentOptions,
+                                                   final InternalCallContext internalCallContext) throws PaymentApiException {
+        final Collection<PluginProperty> pluginProperties = new LinkedList<PluginProperty>();
+        if (originalProperties != null) {
+            for (final PluginProperty pluginProperty : originalProperties) {
+                pluginProperties.add(pluginProperty);
+            }
+        }
+        pluginProperties.add(new PluginProperty("IPCD_INVOICE_ID", invoiceId.toString(), false));
+
+        final String paymentTransactionExternalKey = MoreObjects.firstNonNull(originalPaymentTransactionExternalKey, UUIDs.randomUUID().toString());
+        final CallContext callContext = internalCallContextFactory.createCallContext(internalCallContext);
+
+        final List<String> paymentControlPluginNames = InvoicePaymentPaymentOptions.create(paymentOptions).getPaymentControlPluginNames();
+
+        final String transactionType = TransactionType.PURCHASE.name();
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        PaymentApiException exception = null;
+        try {
+            logEnterAPICall(log, transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, paymentControlPluginNames);
+
+            payment = pluginControlPaymentProcessor.createPurchase(isApiPayment,
+                                                                   account,
+                                                                   paymentMethodId,
+                                                                   paymentId,
+                                                                   amount,
+                                                                   currency,
+                                                                   effectiveDate,
+                                                                   paymentExternalKey,
+                                                                   paymentTransactionExternalKey,
+                                                                   pluginProperties,
+                                                                   paymentControlPluginNames,
+                                                                   callContext,
+                                                                   internalCallContext);
+
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        } catch (final PaymentApiException e) {
+            exception = e;
+            throw e;
+        } finally {
+            logExitAPICall(log,
+                           transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           paymentControlPluginNames,
+                           exception);
+        }
+
+        return getInvoicePayment(payment.getId(), paymentTransactionExternalKey, callContext);
+    }
+
+    private InvoicePayment getInvoicePayment(final UUID paymentId, final String paymentTransactionExternalKey, final TenantContext context) {
+        for (final InvoicePayment invoicePayment : invoiceInternalApi.getInvoicePayments(paymentId, context)) {
+            if (invoicePayment.getPaymentCookieId().compareTo(paymentTransactionExternalKey) == 0) {
+                return invoicePayment;
+            }
+        }
+        return null;
+    }
+}
diff --git a/payment/src/main/java/org/killbill/billing/payment/api/svcs/InvoicePaymentPaymentOptions.java b/payment/src/main/java/org/killbill/billing/payment/api/svcs/InvoicePaymentPaymentOptions.java
new file mode 100644
index 0000000..f6e81c8
--- /dev/null
+++ b/payment/src/main/java/org/killbill/billing/payment/api/svcs/InvoicePaymentPaymentOptions.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
+ *
+ * The Billing Project 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 org.killbill.billing.payment.api.svcs;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.killbill.billing.payment.api.PaymentOptions;
+import org.killbill.billing.payment.invoice.InvoicePaymentControlPluginApi;
+
+public class InvoicePaymentPaymentOptions implements PaymentOptions {
+
+    private final boolean isExternalPayment;
+    private final List<String> paymentControlPluginNames;
+
+    public InvoicePaymentPaymentOptions(final boolean isExternalPayment, final List<String> getPaymentControlPluginNames) {
+        this.isExternalPayment = isExternalPayment;
+        this.paymentControlPluginNames = getPaymentControlPluginNames;
+    }
+
+    public static InvoicePaymentPaymentOptions create(final PaymentOptions paymentOptions) {
+        final List<String> paymentControlPluginNames = new LinkedList<String>();
+        paymentControlPluginNames.addAll(paymentOptions.getPaymentControlPluginNames());
+        if (!paymentControlPluginNames.contains(InvoicePaymentControlPluginApi.PLUGIN_NAME)) {
+            paymentControlPluginNames.add(InvoicePaymentControlPluginApi.PLUGIN_NAME);
+        }
+
+        return new InvoicePaymentPaymentOptions(paymentOptions.isExternalPayment(), paymentControlPluginNames);
+    }
+
+    @Override
+    public boolean isExternalPayment() {
+        return isExternalPayment;
+    }
+
+    @Override
+    public List<String> getPaymentControlPluginNames() {
+        return paymentControlPluginNames;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("InvoicePaymentPaymentOptions{");
+        sb.append("isExternalPayment=").append(isExternalPayment);
+        sb.append(", paymentControlPluginNames=").append(paymentControlPluginNames);
+        sb.append('}');
+        return sb.toString();
+    }
+}
diff --git a/payment/src/main/java/org/killbill/billing/payment/bus/PaymentBusEventHandler.java b/payment/src/main/java/org/killbill/billing/payment/bus/PaymentBusEventHandler.java
index e32b32a..4566e17 100644
--- a/payment/src/main/java/org/killbill/billing/payment/bus/PaymentBusEventHandler.java
+++ b/payment/src/main/java/org/killbill/billing/payment/bus/PaymentBusEventHandler.java
@@ -29,12 +29,11 @@ import org.killbill.billing.account.api.AccountInternalApi;
 import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.events.InvoiceCreationInternalEvent;
 import org.killbill.billing.events.PaymentInternalEvent;
-import org.killbill.billing.payment.api.InvoicePaymentApi;
+import org.killbill.billing.payment.api.InvoicePaymentInternalApi;
 import org.killbill.billing.payment.api.PaymentApiException;
 import org.killbill.billing.payment.api.PaymentOptions;
 import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.payment.core.janitor.Janitor;
-import org.killbill.billing.util.callcontext.CallContext;
 import org.killbill.billing.util.callcontext.CallOrigin;
 import org.killbill.billing.util.callcontext.InternalCallContextFactory;
 import org.killbill.billing.util.callcontext.UserType;
@@ -52,7 +51,7 @@ public class PaymentBusEventHandler {
     private static final Logger log = LoggerFactory.getLogger(PaymentBusEventHandler.class);
 
     private final AccountInternalApi accountApi;
-    private final InvoicePaymentApi invoicePaymentApi;
+    private final InvoicePaymentInternalApi invoicePaymentInternalApi;
     private final InternalCallContextFactory internalCallContextFactory;
     private final PaymentConfig paymentConfig;
     private final Janitor janitor;
@@ -60,12 +59,12 @@ public class PaymentBusEventHandler {
     @Inject
     public PaymentBusEventHandler(final PaymentConfig paymentConfig,
                                   final AccountInternalApi accountApi,
-                                  final InvoicePaymentApi invoicePaymentApi,
+                                  final InvoicePaymentInternalApi invoicePaymentInternalApi,
                                   final Janitor janitor,
                                   final InternalCallContextFactory internalCallContextFactory) {
         this.paymentConfig = paymentConfig;
         this.accountApi = accountApi;
-        this.invoicePaymentApi = invoicePaymentApi;
+        this.invoicePaymentInternalApi = invoicePaymentInternalApi;
         this.janitor = janitor;
         this.internalCallContextFactory = internalCallContextFactory;
     }
@@ -82,37 +81,37 @@ public class PaymentBusEventHandler {
         log.info("Received invoice creation notification for accountId='{}', invoiceId='{}'", event.getAccountId(), event.getInvoiceId());
 
         final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(event.getSearchKey2(), event.getSearchKey1(), "PaymentRequestProcessor", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
-        final CallContext callContext = internalCallContextFactory.createCallContext(internalContext);
 
         final BigDecimal amountToBePaid = null; // We let the plugin compute how much should be paid
         final List<String> paymentControlPluginNames = paymentConfig.getPaymentControlPluginNames(internalContext) != null ? new LinkedList<String>(paymentConfig.getPaymentControlPluginNames(internalContext)) : new LinkedList<String>();
 
-        Account account;
+        final Account account;
         try {
             account = accountApi.getAccountById(event.getAccountId(), internalContext);
 
-            invoicePaymentApi.createPurchaseForInvoice(account,
-                                                       event.getInvoiceId(),
-                                                       account.getPaymentMethodId(),
-                                                       null,
-                                                       amountToBePaid,
-                                                       account.getCurrency(),
-                                                       null,
-                                                       null,
-                                                       null,
-                                                       ImmutableList.<PluginProperty>of(),
-                                                       new PaymentOptions() {
-                                                           @Override
-                                                           public boolean isExternalPayment() {
-                                                               return false;
-                                                           }
-
-                                                           @Override
-                                                           public List<String> getPaymentControlPluginNames() {
-                                                               return paymentControlPluginNames;
-                                                           }
-                                                       },
-                                                       callContext);
+            invoicePaymentInternalApi.createPurchaseForInvoice(false,
+                                                               account,
+                                                               event.getInvoiceId(),
+                                                               account.getPaymentMethodId(),
+                                                               null,
+                                                               amountToBePaid,
+                                                               account.getCurrency(),
+                                                               null,
+                                                               null,
+                                                               null,
+                                                               ImmutableList.<PluginProperty>of(),
+                                                               new PaymentOptions() {
+                                                                   @Override
+                                                                   public boolean isExternalPayment() {
+                                                                       return false;
+                                                                   }
+
+                                                                   @Override
+                                                                   public List<String> getPaymentControlPluginNames() {
+                                                                       return paymentControlPluginNames;
+                                                                   }
+                                                               },
+                                                               internalContext);
         } catch (final AccountApiException e) {
             log.warn("Failed to process invoice payment", e);
         } catch (final PaymentApiException e) {
diff --git a/payment/src/main/java/org/killbill/billing/payment/glue/PaymentModule.java b/payment/src/main/java/org/killbill/billing/payment/glue/PaymentModule.java
index 92f7235..d9d06b0 100644
--- a/payment/src/main/java/org/killbill/billing/payment/glue/PaymentModule.java
+++ b/payment/src/main/java/org/killbill/billing/payment/glue/PaymentModule.java
@@ -23,6 +23,7 @@ import javax.inject.Provider;
 import org.killbill.automaton.DefaultStateMachineConfig;
 import org.killbill.automaton.StateMachineConfig;
 import org.killbill.billing.control.plugin.api.PaymentControlPluginApi;
+import org.killbill.billing.invoice.api.InvoiceInternalApi;
 import org.killbill.billing.osgi.api.OSGIServiceRegistration;
 import org.killbill.billing.payment.api.AdminPaymentApi;
 import org.killbill.billing.payment.api.DefaultAdminPaymentApi;
@@ -30,9 +31,11 @@ import org.killbill.billing.payment.api.DefaultInvoicePaymentApi;
 import org.killbill.billing.payment.api.DefaultPaymentApi;
 import org.killbill.billing.payment.api.DefaultPaymentGatewayApi;
 import org.killbill.billing.payment.api.InvoicePaymentApi;
+import org.killbill.billing.payment.api.InvoicePaymentInternalApi;
 import org.killbill.billing.payment.api.PaymentApi;
 import org.killbill.billing.payment.api.PaymentGatewayApi;
 import org.killbill.billing.payment.api.PaymentService;
+import org.killbill.billing.payment.api.svcs.DefaultInvoicePaymentInternalApi;
 import org.killbill.billing.payment.bus.PaymentBusEventHandler;
 import org.killbill.billing.payment.config.MultiTenantPaymentConfig;
 import org.killbill.billing.payment.caching.EhCacheStateMachineConfigCache;
@@ -154,6 +157,7 @@ public class PaymentModule extends KillBillModule {
 
         bind(PaymentApi.class).to(DefaultPaymentApi.class).asEagerSingleton();
         bind(InvoicePaymentApi.class).to(DefaultInvoicePaymentApi.class).asEagerSingleton();
+        bind(InvoicePaymentInternalApi.class).to(DefaultInvoicePaymentInternalApi.class).asEagerSingleton();
         bind(PaymentGatewayApi.class).to(DefaultPaymentGatewayApi.class).asEagerSingleton();
         bind(AdminPaymentApi.class).to(DefaultAdminPaymentApi.class).asEagerSingleton();
         bind(PaymentBusEventHandler.class).asEagerSingleton();
diff --git a/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java b/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java
index 377bec1..8780762 100644
--- a/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java
+++ b/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java
@@ -19,7 +19,6 @@
 package org.killbill.billing.payment;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
@@ -36,7 +35,6 @@ import org.killbill.billing.payment.api.PaymentApiException;
 import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.payment.dao.PaymentAttemptModelDao;
 import org.killbill.billing.payment.dao.PaymentTransactionModelDao;
-import org.killbill.billing.payment.invoice.InvoicePaymentControlPluginApi;
 import org.killbill.billing.payment.provider.MockPaymentProviderPlugin;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
@@ -55,6 +53,7 @@ import static org.testng.Assert.assertTrue;
 public class TestRetryService extends PaymentTestSuiteNoDB {
 
     private static final int TIMEOUT = 10;
+    private static final ImmutableList<PluginProperty> NO_PROPERTIES = ImmutableList.<PluginProperty>of();
 
     private MockPaymentProviderPlugin mockPaymentProviderPlugin;
 
@@ -128,7 +127,7 @@ public class TestRetryService extends PaymentTestSuiteNoDB {
                                                        null,
                                                        paymentExternalKey,
                                                        transactionExternalKey,
-                                                       ImmutableList.<PluginProperty>of(),
+                                                       NO_PROPERTIES,
                                                        PAYMENT_OPTIONS,
                                                        callContext);
         } catch (final PaymentApiException e) {
@@ -183,7 +182,7 @@ public class TestRetryService extends PaymentTestSuiteNoDB {
                                                    null,
                                                    paymentExternalKey,
                                                    transactionExternalKey,
-                                                   ImmutableList.<PluginProperty>of(),
+                                                   NO_PROPERTIES,
                                                    PAYMENT_OPTIONS,
                                                    callContext);
 
@@ -266,7 +265,7 @@ public class TestRetryService extends PaymentTestSuiteNoDB {
                                                    null,
                                                    paymentExternalKey,
                                                    transactionExternalKey,
-                                                   ImmutableList.<PluginProperty>of(),
+                                                   NO_PROPERTIES,
                                                    PAYMENT_OPTIONS,
                                                    callContext);
 
@@ -359,7 +358,7 @@ public class TestRetryService extends PaymentTestSuiteNoDB {
                                                    null,
                                                    paymentExternalKey,
                                                    transactionExternalKey,
-                                                   ImmutableList.<PluginProperty>of(),
+                                                   NO_PROPERTIES,
                                                    PAYMENT_OPTIONS,
                                                    callContext);