diff --git a/payment/src/main/java/org/killbill/billing/payment/core/PaymentMethodProcessor.java b/payment/src/main/java/org/killbill/billing/payment/core/PaymentMethodProcessor.java
index 19be993..66e289d 100644
--- a/payment/src/main/java/org/killbill/billing/payment/core/PaymentMethodProcessor.java
+++ b/payment/src/main/java/org/killbill/billing/payment/core/PaymentMethodProcessor.java
@@ -66,8 +66,10 @@ import org.slf4j.LoggerFactory;
import com.google.common.base.Function;
import com.google.common.base.Objects;
+import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import static org.killbill.billing.util.entity.dao.DefaultPaginationHelper.getEntityPagination;
@@ -113,6 +115,9 @@ public class PaymentMethodProcessor extends ProcessorBase {
public PluginDispatcherReturnType<UUID> doOperation() throws PaymentApiException {
PaymentMethod pm = null;
try {
+
+ validateUniqueExternalPaymentMethod(account.getId(), paymentPluginServiceName);
+
pm = new DefaultPaymentMethod(paymentMethodExternalKey, account.getId(), paymentPluginServiceName, paymentMethodProps);
final PaymentPluginApi pluginApi = getPaymentPluginApi(paymentPluginServiceName);
pluginApi.addPaymentMethod(account.getId(), pm.getId(), paymentMethodProps, setDefault, properties, callContext);
@@ -138,6 +143,21 @@ public class PaymentMethodProcessor extends ProcessorBase {
}
return PluginDispatcher.createPluginDispatcherReturnType(pm.getId());
}
+
+
+ private void validateUniqueExternalPaymentMethod(final UUID accountId, final String pluginName) throws PaymentApiException {
+ if (ExternalPaymentProviderPlugin.PLUGIN_NAME.equals(pluginName)) {
+ final List<PaymentMethodModelDao> accountPaymentMethods = paymentDao.getPaymentMethods(accountId, context);
+ if (Iterables.any(accountPaymentMethods, new Predicate<PaymentMethodModelDao>() {
+ @Override
+ public boolean apply(final PaymentMethodModelDao input) {
+ return ExternalPaymentProviderPlugin.PLUGIN_NAME.equals(input.getPluginName());
+ }
+ })) {
+ throw new PaymentApiException(ErrorCode.PAYMENT_EXTERNAL_PAYMENT_METHOD_ALREADY_EXISTS, accountId);
+ }
+ }
+ }
}),
uuidPluginNotificationDispatcher);
}
diff --git a/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java b/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java
index de2d296..52e64ac 100644
--- a/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java
+++ b/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java
@@ -28,6 +28,7 @@ import java.util.concurrent.TimeoutException;
import org.killbill.automaton.OperationException;
import org.killbill.billing.payment.logging.SpyLogger;
+import org.killbill.billing.payment.provider.ExternalPaymentProviderPlugin;
import org.killbill.commons.request.Request;
import org.killbill.commons.request.RequestData;
@@ -96,6 +97,18 @@ public class TestPaymentApi extends PaymentTestSuiteWithEmbeddedDB {
}
@Test(groups = "slow")
+ public void testUniqueExternalPaymentMethod() throws PaymentApiException {
+ paymentApi.addPaymentMethod(account, "thisonewillwork", ExternalPaymentProviderPlugin.PLUGIN_NAME, true, null, ImmutableList.<PluginProperty>of(), callContext);
+
+ try {
+ paymentApi.addPaymentMethod(account, "thisonewillnotwork", ExternalPaymentProviderPlugin.PLUGIN_NAME, true, null, ImmutableList.<PluginProperty>of(), callContext);
+
+ } catch (PaymentApiException e) {
+ assertEquals(e.getCode(), ErrorCode.PAYMENT_EXTERNAL_PAYMENT_METHOD_ALREADY_EXISTS.getCode());
+ }
+ }
+
+ @Test(groups = "slow")
public void testCreateSuccessPurchase() throws PaymentApiException {
final BigDecimal requestedAmount = BigDecimal.TEN;