killbill-uncached
Changes
osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPaymentPlugin.java 12(+11 -1)
osgi-bundles/tests/beatrix/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java 36(+35 -1)
osgi-bundles/tests/payment/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java 41(+40 -1)
payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentInfoPlugin.java 33(+25 -8)
Details
diff --git a/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPaymentPlugin.java b/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPaymentPlugin.java
index 68195ff..6377b2d 100644
--- a/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPaymentPlugin.java
+++ b/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPaymentPlugin.java
@@ -40,7 +40,7 @@ import com.ning.billing.util.callcontext.CallContext;
import com.ning.billing.util.callcontext.TenantContext;
import com.ning.billing.util.entity.Pagination;
-public class JRubyPaymentPlugin extends JRubyPlugin implements PaymentPluginApi {
+public class JRubyPaymentPlugin extends JRubyPlugin implements PaymentPluginApi {
private volatile ServiceRegistration<PaymentPluginApi> paymentInfoPluginRegistration;
@@ -90,6 +90,16 @@ public class JRubyPaymentPlugin extends JRubyPlugin implements PaymentPluginApi
}
@Override
+ public Pagination<PaymentInfoPlugin> searchPayments(final String searchKey, final Long offset, final Long limit, final TenantContext tenantContext) throws PaymentPluginApiException {
+ return callWithRuntimeAndChecking(new PluginCallback(VALIDATION_PLUGIN_TYPE.PAYMENT) {
+ @Override
+ public Pagination<PaymentInfoPlugin> doCall(final Ruby runtime) throws PaymentPluginApiException {
+ return ((PaymentPluginApi) pluginInstance).searchPayments(searchKey, offset, limit, tenantContext);
+ }
+ });
+ }
+
+ @Override
public RefundInfoPlugin processRefund(final UUID kbAccountId, final UUID kbPaymentId, final BigDecimal refundAmount, final Currency currency, final CallContext context) throws PaymentPluginApiException {
return callWithRuntimeAndChecking(new PluginCallback(VALIDATION_PLUGIN_TYPE.PAYMENT) {
diff --git a/osgi-bundles/tests/beatrix/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java b/osgi-bundles/tests/beatrix/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java
index 718ca6b..3396d2c 100644
--- a/osgi-bundles/tests/beatrix/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java
+++ b/osgi-bundles/tests/beatrix/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java
@@ -52,6 +52,11 @@ public class TestPaymentPluginApi implements PaymentPluginApi {
testDao.insertProcessedPayment(kbPaymentId, kbPaymentMethodId, amount);
return new PaymentInfoPlugin() {
@Override
+ public UUID getKbPaymentId() {
+ return kbPaymentId;
+ }
+
+ @Override
public BigDecimal getAmount() {
return amount;
}
@@ -104,6 +109,36 @@ public class TestPaymentPluginApi implements PaymentPluginApi {
}
@Override
+ public Pagination<PaymentInfoPlugin> searchPayments(final String searchKey, final Long offset, final Long limit, final TenantContext tenantContext) throws PaymentPluginApiException {
+ return new Pagination<PaymentInfoPlugin>() {
+ @Override
+ public Long getCurrentOffset() {
+ return 0L;
+ }
+
+ @Override
+ public Long getNextOffset() {
+ return null;
+ }
+
+ @Override
+ public Long getMaxNbRecords() {
+ return 0L;
+ }
+
+ @Override
+ public Long getTotalNbRecords() {
+ return 0L;
+ }
+
+ @Override
+ public Iterator<PaymentInfoPlugin> iterator() {
+ return null;
+ }
+ };
+ }
+
+ @Override
public RefundInfoPlugin processRefund(final UUID kbAccountId, final UUID kbPaymentId, final BigDecimal refundAmount, final Currency currency, final CallContext context) throws PaymentPluginApiException {
return null;
}
@@ -165,7 +200,6 @@ public class TestPaymentPluginApi implements PaymentPluginApi {
};
}
-
@Override
public void resetPaymentMethods(final UUID kbAccountId, final List<PaymentMethodInfoPlugin> paymentMethods) throws PaymentPluginApiException {
}
diff --git a/osgi-bundles/tests/payment/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java b/osgi-bundles/tests/payment/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java
index f5c0871..854aa07 100644
--- a/osgi-bundles/tests/payment/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java
+++ b/osgi-bundles/tests/payment/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java
@@ -53,6 +53,11 @@ public class TestPaymentPluginApi implements PaymentPluginApiWithTestControl {
public PaymentInfoPlugin processPayment(final UUID accountId, final UUID kbPaymentId, final UUID kbPaymentMethodId, final BigDecimal amount, final Currency currency, final CallContext context) throws PaymentPluginApiException {
return withRuntimeCheckForExceptions(new PaymentInfoPlugin() {
@Override
+ public UUID getKbPaymentId() {
+ return kbPaymentId;
+ }
+
+ @Override
public BigDecimal getAmount() {
return amount;
}
@@ -105,6 +110,11 @@ public class TestPaymentPluginApi implements PaymentPluginApiWithTestControl {
final BigDecimal someAmount = new BigDecimal("12.45");
return withRuntimeCheckForExceptions(new PaymentInfoPlugin() {
@Override
+ public UUID getKbPaymentId() {
+ return kbPaymentId;
+ }
+
+ @Override
public BigDecimal getAmount() {
return someAmount;
}
@@ -152,6 +162,36 @@ public class TestPaymentPluginApi implements PaymentPluginApiWithTestControl {
}
@Override
+ public Pagination<PaymentInfoPlugin> searchPayments(final String searchKey, final Long offset, final Long limit, final TenantContext tenantContext) throws PaymentPluginApiException {
+ return new Pagination<PaymentInfoPlugin>() {
+ @Override
+ public Long getCurrentOffset() {
+ return 0L;
+ }
+
+ @Override
+ public Long getNextOffset() {
+ return null;
+ }
+
+ @Override
+ public Long getMaxNbRecords() {
+ return 0L;
+ }
+
+ @Override
+ public Long getTotalNbRecords() {
+ return 0L;
+ }
+
+ @Override
+ public Iterator<PaymentInfoPlugin> iterator() {
+ return null;
+ }
+ };
+ }
+
+ @Override
public RefundInfoPlugin processRefund(final UUID accountId, final UUID kbPaymentId, final BigDecimal refundAmount, final Currency currency, final CallContext context) throws PaymentPluginApiException {
final BigDecimal someAmount = new BigDecimal("12.45");
@@ -259,7 +299,6 @@ public class TestPaymentPluginApi implements PaymentPluginApiWithTestControl {
public void resetPaymentMethods(final UUID accountId, final List<PaymentMethodInfoPlugin> paymentMethods) throws PaymentPluginApiException {
}
-
private <T> T withRuntimeCheckForExceptions(final T result) throws PaymentPluginApiException {
if (paymentPluginApiExceptionOnNextCalls != null) {
throw paymentPluginApiExceptionOnNextCalls;
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 8352981..0ee1c3b 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
@@ -90,6 +90,16 @@ public class DefaultPaymentApi implements PaymentApi {
}
@Override
+ public Pagination<Payment> searchPayments(final String searchKey, final Long offset, final Long limit, final TenantContext context) {
+ return paymentProcessor.searchPayments(searchKey, offset, limit, internalCallContextFactory.createInternalTenantContext(context));
+ }
+
+ @Override
+ public Pagination<Payment> searchPayments(final String searchKey, final Long offset, final Long limit, final String pluginName, final TenantContext context) throws PaymentApiException {
+ return paymentProcessor.searchPayments(searchKey, offset, limit, pluginName, internalCallContextFactory.createInternalTenantContext(context));
+ }
+
+ @Override
public List<Payment> getInvoicePayments(final UUID invoiceId, final TenantContext context) {
return paymentProcessor.getInvoicePayments(invoiceId, internalCallContextFactory.createInternalTenantContext(context));
}
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 f6bf2ae..19f8e02 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
@@ -86,10 +86,6 @@ public class PaymentMethodProcessor extends ProcessorBase {
super(pluginRegistry, accountInternalApi, eventBus, paymentDao, nonEntityDao, tagUserApi, locker, executor, invoiceApi);
}
- public Set<String> getAvailablePlugins() {
- return pluginRegistry.getAllServices();
- }
-
public UUID addPaymentMethod(final String paymentPluginServiceName, final Account account,
final boolean setDefault, final PaymentMethodPlugin paymentMethodProps, final InternalCallContext context)
throws PaymentApiException {
diff --git a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
index 6ee14fa..addd642 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
@@ -16,8 +16,12 @@
package com.ning.billing.payment.core;
+import com.google.common.base.Function;
import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterators;
import com.google.inject.name.Named;
import com.ning.billing.ErrorCode;
import com.ning.billing.ObjectType;
@@ -32,12 +36,16 @@ import com.ning.billing.osgi.api.OSGIServiceRegistration;
import com.ning.billing.payment.api.DefaultPayment;
import com.ning.billing.payment.api.DefaultPaymentErrorEvent;
import com.ning.billing.payment.api.DefaultPaymentInfoEvent;
+import com.ning.billing.payment.api.DefaultPaymentMethod;
import com.ning.billing.payment.api.DefaultPaymentPluginErrorEvent;
import com.ning.billing.payment.api.Payment;
import com.ning.billing.payment.api.PaymentApiException;
+import com.ning.billing.payment.api.PaymentMethod;
+import com.ning.billing.payment.api.PaymentMethodPlugin;
import com.ning.billing.payment.api.PaymentStatus;
import com.ning.billing.payment.dao.PaymentAttemptModelDao;
import com.ning.billing.payment.dao.PaymentDao;
+import com.ning.billing.payment.dao.PaymentMethodModelDao;
import com.ning.billing.payment.dao.PaymentModelDao;
import com.ning.billing.payment.dao.RefundModelDao;
import com.ning.billing.payment.dispatcher.PluginDispatcher;
@@ -56,6 +64,9 @@ import com.ning.billing.events.PaymentErrorInternalEvent;
import com.ning.billing.account.api.AccountInternalApi;
import com.ning.billing.invoice.api.InvoiceInternalApi;
import com.ning.billing.tag.TagInternalApi;
+import com.ning.billing.util.entity.DefaultPagination;
+import com.ning.billing.util.entity.Pagination;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -138,6 +149,73 @@ public class PaymentProcessor extends ProcessorBase {
return fromPaymentModelDao(model, pluginInfo, context);
}
+ public Pagination<Payment> searchPayments(final String searchKey, final Long offset, final Long limit, final InternalTenantContext internalTenantContext) {
+ // Note that we cannot easily do streaming here, since we would have to rely on the statistics
+ // returned by the Pagination objects from the plugins and we probably don't want to do that (if
+ // one plugin gets it wrong, it may starve the others).
+ final List<Payment> allResults = new LinkedList<Payment>();
+ Long totalNbRecords = 0L;
+ Long maxNbRecords = 0L;
+
+ // Search in all plugins (we treat the full set of results as a union with respect to offset/limit)
+ boolean firstSearch = true;
+ for (final String pluginName : getAvailablePlugins()) {
+ try {
+ final Pagination<Payment> payments;
+ if (allResults.size() >= limit) {
+ // We have enough results, we just keep going (limit 1) to get the stats
+ payments = searchPayments(searchKey, firstSearch ? offset : 0L, 1L, pluginName, internalTenantContext);
+ // Required to close database connections
+ ImmutableList.<Payment>copyOf(payments);
+ } else {
+ payments = searchPayments(searchKey, firstSearch ? offset : 0L, limit - allResults.size(), pluginName, internalTenantContext);
+ allResults.addAll(ImmutableList.<Payment>copyOf(payments));
+ }
+ firstSearch = false;
+ totalNbRecords += payments.getTotalNbRecords();
+ maxNbRecords += payments.getMaxNbRecords();
+ } catch (final PaymentApiException e) {
+ log.warn("Error while searching plugin " + pluginName, e);
+ // Non-fatal, continue to search other plugins
+ }
+ }
+
+ return new DefaultPagination<Payment>(offset, limit, totalNbRecords, maxNbRecords, allResults.iterator());
+ }
+
+ public Pagination<Payment> searchPayments(final String searchKey, final Long offset, final Long limit, final String pluginName, final InternalTenantContext internalTenantContext) throws PaymentApiException {
+ final PaymentPluginApi pluginApi = getPaymentPluginApi(pluginName);
+ final Pagination<PaymentInfoPlugin> payments;
+ try {
+ payments = pluginApi.searchPayments(searchKey, offset, limit, buildTenantContext(internalTenantContext));
+ } catch (final PaymentPluginApiException e) {
+ throw new PaymentApiException(e, ErrorCode.PAYMENT_PLUGIN_SEARCH_PAYMENTS, pluginName, searchKey);
+ }
+
+ return new DefaultPagination<Payment>(payments,
+ limit,
+ Iterators.<Payment>filter(Iterators.<PaymentInfoPlugin, Payment>transform(payments.iterator(),
+ new Function<PaymentInfoPlugin, Payment>() {
+ @Override
+ public Payment apply(final PaymentInfoPlugin paymentInfoPlugin) {
+ if (paymentInfoPlugin.getKbPaymentId() == null) {
+ // Garbage from the plugin?
+ log.debug("Plugin {} returned a payment without a kbPaymentId for searchKey {}", pluginName, searchKey);
+ return null;
+ }
+
+ final PaymentModelDao model = paymentDao.getPayment(paymentInfoPlugin.getKbPaymentId(), internalTenantContext);
+ if (model == null) {
+ log.warn("Unable to find payment id " + paymentInfoPlugin.getKbPaymentId() + " present in plugin " + pluginName);
+ return null;
+ }
+
+ return fromPaymentModelDao(model, paymentInfoPlugin, internalTenantContext);
+ }
+ }),
+ Predicates.<Payment>notNull()));
+ }
+
public List<Payment> getInvoicePayments(final UUID invoiceId, final InternalTenantContext context) {
return getPayments(paymentDao.getPaymentsForInvoice(invoiceId, context), context);
}
diff --git a/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java b/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java
index b582bc8..a68b447 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java
@@ -17,6 +17,7 @@
package com.ning.billing.payment.core;
import java.util.List;
+import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
@@ -113,6 +114,10 @@ public abstract class ProcessorBase {
}
}
+ public Set<String> getAvailablePlugins() {
+ return pluginRegistry.getAllServices();
+ }
+
protected PaymentPluginApi getPaymentPluginApi(final String pluginName) throws PaymentApiException {
final PaymentPluginApi pluginApi = pluginRegistry.getServiceForName(pluginName);
if (pluginApi == null) {
diff --git a/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentInfoPlugin.java b/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentInfoPlugin.java
index e7590c8..d23374f 100644
--- a/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentInfoPlugin.java
+++ b/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentInfoPlugin.java
@@ -17,6 +17,7 @@
package com.ning.billing.payment.provider;
import java.math.BigDecimal;
+import java.util.UUID;
import org.joda.time.DateTime;
@@ -26,6 +27,7 @@ import com.ning.billing.payment.plugin.api.PaymentPluginStatus;
public class DefaultNoOpPaymentInfoPlugin implements PaymentInfoPlugin {
+ private final UUID kbPaymentId;
private final BigDecimal amount;
private final DateTime effectiveDate;
private final DateTime createdDate;
@@ -33,8 +35,9 @@ public class DefaultNoOpPaymentInfoPlugin implements PaymentInfoPlugin {
private final String error;
private final Currency currency;
- public DefaultNoOpPaymentInfoPlugin(final BigDecimal amount, final Currency currency, final DateTime effectiveDate,
+ public DefaultNoOpPaymentInfoPlugin(final UUID kbPaymentId, final BigDecimal amount, final Currency currency, final DateTime effectiveDate,
final DateTime createdDate, final PaymentPluginStatus status, final String error) {
+ this.kbPaymentId = kbPaymentId;
this.amount = amount;
this.effectiveDate = effectiveDate;
this.createdDate = createdDate;
@@ -44,6 +47,11 @@ public class DefaultNoOpPaymentInfoPlugin implements PaymentInfoPlugin {
}
@Override
+ public UUID getKbPaymentId() {
+ return kbPaymentId;
+ }
+
+ @Override
public BigDecimal getAmount() {
return amount;
}
@@ -90,13 +98,14 @@ public class DefaultNoOpPaymentInfoPlugin implements PaymentInfoPlugin {
@Override
public String toString() {
- final StringBuilder sb = new StringBuilder();
- sb.append("DefaultNoOpPaymentInfoPlugin");
- sb.append("{amount=").append(amount);
+ final StringBuilder sb = new StringBuilder("DefaultNoOpPaymentInfoPlugin{");
+ sb.append("kbPaymentId=").append(kbPaymentId);
+ sb.append(", amount=").append(amount);
sb.append(", effectiveDate=").append(effectiveDate);
sb.append(", createdDate=").append(createdDate);
sb.append(", status=").append(status);
sb.append(", error='").append(error).append('\'');
+ sb.append(", currency=").append(currency);
sb.append('}');
return sb.toString();
}
@@ -112,18 +121,24 @@ public class DefaultNoOpPaymentInfoPlugin implements PaymentInfoPlugin {
final DefaultNoOpPaymentInfoPlugin that = (DefaultNoOpPaymentInfoPlugin) o;
- if (amount != null ? !amount.equals(that.amount) : that.amount != null) {
+ if (amount != null ? amount.compareTo(that.amount) != 0 : that.amount != null) {
return false;
}
- if (createdDate != null ? !createdDate.equals(that.createdDate) : that.createdDate != null) {
+ if (createdDate != null ? createdDate.compareTo(that.createdDate) != 0 : that.createdDate != null) {
return false;
}
- if (effectiveDate != null ? !effectiveDate.equals(that.effectiveDate) : that.effectiveDate != null) {
+ if (currency != that.currency) {
+ return false;
+ }
+ if (effectiveDate != null ? effectiveDate.compareTo(that.effectiveDate) != 0 : that.effectiveDate != null) {
return false;
}
if (error != null ? !error.equals(that.error) : that.error != null) {
return false;
}
+ if (kbPaymentId != null ? !kbPaymentId.equals(that.kbPaymentId) : that.kbPaymentId != null) {
+ return false;
+ }
if (status != that.status) {
return false;
}
@@ -133,11 +148,13 @@ public class DefaultNoOpPaymentInfoPlugin implements PaymentInfoPlugin {
@Override
public int hashCode() {
- int result = amount != null ? amount.hashCode() : 0;
+ int result = kbPaymentId != null ? kbPaymentId.hashCode() : 0;
+ result = 31 * result + (amount != null ? amount.hashCode() : 0);
result = 31 * result + (effectiveDate != null ? effectiveDate.hashCode() : 0);
result = 31 * result + (createdDate != null ? createdDate.hashCode() : 0);
result = 31 * result + (status != null ? status.hashCode() : 0);
result = 31 * result + (error != null ? error.hashCode() : 0);
+ result = 31 * result + (currency != null ? currency.hashCode() : 0);
return result;
}
}
diff --git a/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentProviderPlugin.java b/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentProviderPlugin.java
index 9de86b6..066000e 100644
--- a/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentProviderPlugin.java
+++ b/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentProviderPlugin.java
@@ -96,7 +96,7 @@ public class DefaultNoOpPaymentProviderPlugin implements NoOpPaymentPluginApi {
}
final PaymentPluginStatus status = (makeAllInvoicesFailWithError.get() || makeNextInvoiceFailWithError.getAndSet(false)) ? PaymentPluginStatus.ERROR : PaymentPluginStatus.PROCESSED;
- final PaymentInfoPlugin result = new DefaultNoOpPaymentInfoPlugin(amount, currency, clock.getUTCNow(), clock.getUTCNow(), status, null);
+ final PaymentInfoPlugin result = new DefaultNoOpPaymentInfoPlugin(kbPaymentId, amount, currency, clock.getUTCNow(), clock.getUTCNow(), status, null);
payments.put(kbPaymentId.toString(), result);
return result;
}
@@ -111,6 +111,29 @@ public class DefaultNoOpPaymentProviderPlugin implements NoOpPaymentPluginApi {
}
@Override
+ public Pagination<PaymentInfoPlugin> searchPayments(final String searchKey, final Long offset, final Long limit, final TenantContext tenantContext) throws PaymentPluginApiException {
+ final ImmutableList<PaymentInfoPlugin> allResults = ImmutableList.<PaymentInfoPlugin>copyOf(Iterables.<PaymentInfoPlugin>filter(Iterables.<PaymentInfoPlugin>concat(payments.values()), new Predicate<PaymentInfoPlugin>() {
+ @Override
+ public boolean apply(final PaymentInfoPlugin input) {
+ return (input.getKbPaymentId() != null && input.getKbPaymentId().toString().equals(searchKey)) ||
+ (input.getFirstPaymentReferenceId() != null && input.getFirstPaymentReferenceId().contains(searchKey)) ||
+ (input.getSecondPaymentReferenceId() != null && input.getSecondPaymentReferenceId().contains(searchKey));
+ }
+ }));
+
+ final List<PaymentInfoPlugin> results;
+ if (offset >= allResults.size()) {
+ results = ImmutableList.<PaymentInfoPlugin>of();
+ } else if (offset + limit > allResults.size()) {
+ results = allResults.subList(offset.intValue(), allResults.size());
+ } else {
+ results = allResults.subList(offset.intValue(), offset.intValue() + limit.intValue());
+ }
+
+ return new DefaultPagination<PaymentInfoPlugin>(offset, limit, (long) results.size(), (long) payments.values().size(), results.iterator());
+ }
+
+ @Override
public void addPaymentMethod(final UUID kbAccountId, final UUID kbPaymentMethodId, final PaymentMethodPlugin paymentMethodProps, final boolean setDefault, final CallContext context) throws PaymentPluginApiException {
final PaymentMethodPlugin realWithID = new DefaultNoOpPaymentMethodPlugin(kbPaymentMethodId, paymentMethodProps);
List<PaymentMethodPlugin> pms = paymentMethods.get(kbPaymentMethodId.toString());
diff --git a/payment/src/main/java/com/ning/billing/payment/provider/ExternalPaymentProviderPlugin.java b/payment/src/main/java/com/ning/billing/payment/provider/ExternalPaymentProviderPlugin.java
index 8658da9..ba12401 100644
--- a/payment/src/main/java/com/ning/billing/payment/provider/ExternalPaymentProviderPlugin.java
+++ b/payment/src/main/java/com/ning/billing/payment/provider/ExternalPaymentProviderPlugin.java
@@ -60,12 +60,17 @@ public class ExternalPaymentProviderPlugin implements PaymentPluginApi {
@Override
public PaymentInfoPlugin processPayment(final UUID kbAccountId, final UUID kbPaymentId, final UUID kbPaymentMethodId, final BigDecimal amount, final Currency currency, final CallContext context) throws PaymentPluginApiException {
- return new DefaultNoOpPaymentInfoPlugin(amount, currency, clock.getUTCNow(), clock.getUTCNow(), PaymentPluginStatus.PROCESSED, null);
+ return new DefaultNoOpPaymentInfoPlugin(kbPaymentId, amount, currency, clock.getUTCNow(), clock.getUTCNow(), PaymentPluginStatus.PROCESSED, null);
}
@Override
public PaymentInfoPlugin getPaymentInfo(final UUID kbAccountId, final UUID kbPaymentId, final TenantContext context) throws PaymentPluginApiException {
- return new DefaultNoOpPaymentInfoPlugin(BigDecimal.ZERO, null, clock.getUTCNow(), clock.getUTCNow(), PaymentPluginStatus.PROCESSED, null);
+ return new DefaultNoOpPaymentInfoPlugin(kbPaymentId, BigDecimal.ZERO, null, clock.getUTCNow(), clock.getUTCNow(), PaymentPluginStatus.PROCESSED, null);
+ }
+
+ @Override
+ public Pagination<PaymentInfoPlugin> searchPayments(final String searchKey, final Long offset, final Long limit, final TenantContext tenantContext) throws PaymentPluginApiException {
+ return new DefaultPagination<PaymentInfoPlugin>(offset, limit, 0L, 0L, Iterators.<PaymentInfoPlugin>emptyIterator());
}
@Override
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 f4e4ec9..39d330b 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
@@ -102,7 +102,7 @@ public class MockPaymentProviderPlugin implements NoOpPaymentPluginApi {
}
final PaymentPluginStatus status = (makeAllInvoicesFailWithError.get() || makeNextInvoiceFailWithError.getAndSet(false)) ? PaymentPluginStatus.ERROR : PaymentPluginStatus.PROCESSED;
- final PaymentInfoPlugin result = new DefaultNoOpPaymentInfoPlugin(amount, currency, clock.getUTCNow(), clock.getUTCNow(), status, null);
+ final PaymentInfoPlugin result = new DefaultNoOpPaymentInfoPlugin(kbPaymentId, amount, currency, clock.getUTCNow(), clock.getUTCNow(), status, null);
payments.put(kbPaymentId.toString(), result);
return result;
}
@@ -116,6 +116,18 @@ public class MockPaymentProviderPlugin implements NoOpPaymentPluginApi {
return payment;
}
+ @Override
+ public Pagination<PaymentInfoPlugin> searchPayments(final String searchKey, final Long offset, final Long limit, final TenantContext tenantContext) throws PaymentPluginApiException {
+ final ImmutableList<PaymentInfoPlugin> results = ImmutableList.<PaymentInfoPlugin>copyOf(Iterables.<PaymentInfoPlugin>filter(payments.values(), new Predicate<PaymentInfoPlugin>() {
+ @Override
+ public boolean apply(final PaymentInfoPlugin input) {
+ return (input.getKbPaymentId() != null && input.getKbPaymentId().equals(searchKey)) ||
+ (input.getFirstPaymentReferenceId() != null && input.getFirstPaymentReferenceId().contains(searchKey)) ||
+ (input.getSecondPaymentReferenceId() != null && input.getSecondPaymentReferenceId().contains(searchKey));
+ }
+ }));
+ return DefaultPagination.<PaymentInfoPlugin>build(offset, limit, results);
+ }
@Override
public void addPaymentMethod(final UUID kbAccountId, final UUID kbPaymentMethodId, final PaymentMethodPlugin paymentMethodProps, final boolean setDefault, final CallContext context) throws PaymentPluginApiException {
diff --git a/payment/src/test/java/com/ning/billing/payment/provider/TestDefaultNoOpPaymentInfoPlugin.java b/payment/src/test/java/com/ning/billing/payment/provider/TestDefaultNoOpPaymentInfoPlugin.java
index f74c0e0..c056958 100644
--- a/payment/src/test/java/com/ning/billing/payment/provider/TestDefaultNoOpPaymentInfoPlugin.java
+++ b/payment/src/test/java/com/ning/billing/payment/provider/TestDefaultNoOpPaymentInfoPlugin.java
@@ -31,21 +31,22 @@ public class TestDefaultNoOpPaymentInfoPlugin extends PaymentTestSuiteNoDB {
@Test(groups = "fast")
public void testEquals() throws Exception {
+ final UUID kbPaymentId = UUID.randomUUID();
final BigDecimal amount = new BigDecimal("1.394810E-3");
final DateTime effectiveDate = clock.getUTCNow().plusDays(1);
final DateTime createdDate = clock.getUTCNow();
final PaymentPluginStatus status = PaymentPluginStatus.UNDEFINED;
final String error = UUID.randomUUID().toString();
- final DefaultNoOpPaymentInfoPlugin info = new DefaultNoOpPaymentInfoPlugin(amount, Currency.USD, effectiveDate, createdDate,
+ final DefaultNoOpPaymentInfoPlugin info = new DefaultNoOpPaymentInfoPlugin(kbPaymentId, amount, Currency.USD, effectiveDate, createdDate,
status, error);
Assert.assertEquals(info, info);
- final DefaultNoOpPaymentInfoPlugin sameInfo = new DefaultNoOpPaymentInfoPlugin(amount, Currency.USD, effectiveDate, createdDate,
+ final DefaultNoOpPaymentInfoPlugin sameInfo = new DefaultNoOpPaymentInfoPlugin(kbPaymentId, amount, Currency.USD, effectiveDate, createdDate,
status, error);
Assert.assertEquals(sameInfo, info);
- final DefaultNoOpPaymentInfoPlugin otherInfo = new DefaultNoOpPaymentInfoPlugin(amount, Currency.USD, effectiveDate, createdDate,
+ final DefaultNoOpPaymentInfoPlugin otherInfo = new DefaultNoOpPaymentInfoPlugin(kbPaymentId, amount, Currency.USD, effectiveDate, createdDate,
status, UUID.randomUUID().toString());
Assert.assertNotEquals(otherInfo, info);
}