killbill-memoizeit
Changes
Details
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
index 0c2b5b3..95168b3 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -45,6 +45,7 @@ import org.killbill.billing.invoice.api.Invoice;
import org.killbill.billing.invoice.api.InvoiceApiException;
import org.killbill.billing.invoice.api.InvoiceApiHelper;
import org.killbill.billing.invoice.api.InvoiceItem;
+import org.killbill.billing.invoice.api.InvoiceItemType;
import org.killbill.billing.invoice.api.InvoiceUserApi;
import org.killbill.billing.invoice.api.WithAccountLock;
import org.killbill.billing.invoice.dao.InvoiceDao;
@@ -72,6 +73,7 @@ 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.Collections2;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
@@ -365,10 +367,16 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
}
};
- final List<InvoiceItem> creditInvoiceItems = invoiceApiHelper.dispatchToInvoicePluginsAndInsertItems(accountId, false, withAccountLock, context);
+ final Collection<InvoiceItem> creditInvoiceItems = Collections2.<InvoiceItem>filter(invoiceApiHelper.dispatchToInvoicePluginsAndInsertItems(accountId, false, withAccountLock, context),
+ new Predicate<InvoiceItem>() {
+ @Override
+ public boolean apply(final InvoiceItem invoiceItem) {
+ return InvoiceItemType.CREDIT_ADJ.equals(invoiceItem.getInvoiceItemType());
+ }
+ });
Preconditions.checkState(creditInvoiceItems.size() == 1, "Should have created a single credit invoice item: " + creditInvoiceItems);
- return creditInvoiceItems.get(0);
+ return creditInvoiceItems.iterator().next();
}
@Override
@@ -401,10 +409,16 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
}
};
- final List<InvoiceItem> adjustmentInvoiceItems = invoiceApiHelper.dispatchToInvoicePluginsAndInsertItems(accountId, false, withAccountLock, context);
+ final Collection<InvoiceItem> adjustmentInvoiceItems = Collections2.<InvoiceItem>filter(invoiceApiHelper.dispatchToInvoicePluginsAndInsertItems(accountId, false, withAccountLock, context),
+ new Predicate<InvoiceItem>() {
+ @Override
+ public boolean apply(final InvoiceItem invoiceItem) {
+ return InvoiceItemType.ITEM_ADJ.equals(invoiceItem.getInvoiceItemType());
+ }
+ });
Preconditions.checkState(adjustmentInvoiceItems.size() == 1, "Should have created a single adjustment item: " + adjustmentInvoiceItems);
- return adjustmentInvoiceItems.get(0);
+ return adjustmentInvoiceItems.iterator().next();
}
@Override
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PluginInfoJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PluginInfoJson.java
index 0e2f116..0aa0ad5 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PluginInfoJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PluginInfoJson.java
@@ -17,23 +17,93 @@
package org.killbill.billing.jaxrs.json;
-import java.util.HashMap;
-import java.util.Map;
import java.util.Set;
+import org.killbill.billing.osgi.api.PluginInfo;
+import org.killbill.billing.osgi.api.PluginInfo.PluginServiceInfo;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
public class PluginInfoJson {
- private final Map<String, Iterable<String>> registeredPlugins;
+ private final String bundleSymbolicName;
+
+ private final String pluginName;
+
+ private final String version;
+
+ private final boolean running;
+
+ private final Set<PluginServiceInfoJson> services;
+
+ @JsonCreator
+ public PluginInfoJson(@JsonProperty("bundleSymbolicName") final String bundleSymbolicName,
+ @JsonProperty("pluginName") final String pluginName,
+ @JsonProperty("version") final String version,
+ @JsonProperty("running") final boolean running,
+ @JsonProperty("services") final Set<PluginServiceInfoJson> services) {
+ this.bundleSymbolicName = bundleSymbolicName;
+ this.pluginName = pluginName;
+ this.version = version;
+ this.running = running;
+ this.services = services;
+ }
+
+ public PluginInfoJson(final PluginInfo input) {
+ this(input.getBundleSymbolicName(),
+ input.getPluginName(),
+ input.getVersion(),
+ input.isRunning(),
+ ImmutableSet.copyOf(Iterables.transform(input.getServices(), new Function<PluginServiceInfo, PluginServiceInfoJson>() {
+ @Override
+ public PluginServiceInfoJson apply(final PluginServiceInfo input) {
+ return new PluginServiceInfoJson(input.getServiceTypeName(), input.getRegistrationName());
+ }
+ })));
+ }
+
+ public String getBundleSymbolicName() {
+ return bundleSymbolicName;
+ }
+
+ public String getPluginName() {
+ return pluginName;
+ }
+
+ public String getVersion() {
+ return version;
+ }
- public PluginInfoJson() {
- this.registeredPlugins = new HashMap<String, Iterable<String>>();
+ public boolean isRunning() {
+ return running;
}
- public void addEntriesForType(final String type, final Set<String> entries) {
- registeredPlugins.put(type, entries);
+ public Set<PluginServiceInfoJson> getServices() {
+ return services;
}
- public Map<String, Iterable<String>> getRegisteredPlugins() {
- return registeredPlugins;
+ public static class PluginServiceInfoJson {
+
+ private final String serviceTypeName;
+ private final String registrationName;
+
+ @JsonCreator
+ public PluginServiceInfoJson(@JsonProperty("serviceTypeName") final String serviceTypeName,
+ @JsonProperty("registrationName") final String registrationName) {
+ this.serviceTypeName = serviceTypeName;
+ this.registrationName = registrationName;
+ }
+
+ public String getServiceTypeName() {
+ return serviceTypeName;
+ }
+
+ public String getRegistrationName() {
+ return registrationName;
+ }
}
}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PluginInfoResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PluginInfoResource.java
index 71293c5..1ddf2a7 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PluginInfoResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PluginInfoResource.java
@@ -21,16 +21,16 @@ import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.killbill.billing.account.api.AccountUserApi;
import org.killbill.billing.entitlement.api.SubscriptionApiException;
-import org.killbill.billing.jaxrs.json.BundleJson;
+import org.killbill.billing.jaxrs.json.PluginInfoJson;
import org.killbill.billing.jaxrs.util.Context;
import org.killbill.billing.jaxrs.util.JaxrsUriBuilder;
+import org.killbill.billing.osgi.api.PluginInfo;
import org.killbill.billing.osgi.api.PluginsInfoApi;
import org.killbill.billing.payment.api.PaymentApi;
import org.killbill.billing.util.api.AuditUserApi;
@@ -39,7 +39,9 @@ import org.killbill.billing.util.api.TagUserApi;
import org.killbill.clock.Clock;
import com.codahale.metrics.annotation.Timed;
+import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
@@ -68,10 +70,14 @@ public class PluginInfoResource extends JaxRsResourceBase {
@Timed
@GET
@Produces(APPLICATION_JSON)
- @ApiOperation(value = "Retrieve the list of registered plugins", response = BundleJson.class)
- public Response getBundle(@PathParam("bundleId") final String bundleId,
- @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionApiException {
- return Response.status(Status.OK).entity(ImmutableList.copyOf(pluginsInfoApi.getPluginsInfo())).build();
+ @ApiOperation(value = "Retrieve the list of registered plugins", response = PluginInfoResource.class)
+ public Response getPluginsInfo(@javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionApiException {
+ return Response.status(Status.OK).entity(ImmutableList.copyOf(Iterables.transform(pluginsInfoApi.getPluginsInfo(), new Function<PluginInfo, PluginInfoJson>() {
+ @Override
+ public PluginInfoJson apply(final PluginInfo input) {
+ return new PluginInfoJson(input);
+ }
+ }))).build();
}
}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PluginResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PluginResource.java
index 66d1b43..10ff827 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PluginResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PluginResource.java
@@ -24,6 +24,8 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.Charset;
+import java.util.Collections;
+import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -48,6 +50,7 @@ import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
import org.killbill.billing.account.api.AccountUserApi;
import org.killbill.billing.jaxrs.util.Context;
@@ -61,10 +64,13 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.codahale.metrics.annotation.Timed;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.LinkedHashMultimap;
import com.google.common.io.ByteStreams;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.inject.name.Named;
+import com.sun.jersey.api.representation.Form;
import com.wordnik.swagger.annotations.Api;
@Singleton
@@ -97,8 +103,9 @@ public class PluginResource extends JaxRsResourceBase {
public Response doDELETE(@javax.ws.rs.core.Context final HttpServletRequest request,
@javax.ws.rs.core.Context final HttpServletResponse response,
@javax.ws.rs.core.Context final ServletContext servletContext,
- @javax.ws.rs.core.Context final ServletConfig servletConfig) throws ServletException, IOException {
- return serviceViaOSGIPlugin(request, response, servletContext, servletConfig);
+ @javax.ws.rs.core.Context final ServletConfig servletConfig,
+ @javax.ws.rs.core.Context final UriInfo uriInfo) throws ServletException, IOException {
+ return serviceViaOSGIPlugin(request, response, servletContext, servletConfig, uriInfo);
}
@Timed
@@ -106,8 +113,9 @@ public class PluginResource extends JaxRsResourceBase {
public Response doGET(@javax.ws.rs.core.Context final HttpServletRequest request,
@javax.ws.rs.core.Context final HttpServletResponse response,
@javax.ws.rs.core.Context final ServletContext servletContext,
- @javax.ws.rs.core.Context final ServletConfig servletConfig) throws ServletException, IOException {
- return serviceViaOSGIPlugin(request, response, servletContext, servletConfig);
+ @javax.ws.rs.core.Context final ServletConfig servletConfig,
+ @javax.ws.rs.core.Context final UriInfo uriInfo) throws ServletException, IOException {
+ return serviceViaOSGIPlugin(request, response, servletContext, servletConfig, uriInfo);
}
@Timed
@@ -115,8 +123,9 @@ public class PluginResource extends JaxRsResourceBase {
public Response doOPTIONS(@javax.ws.rs.core.Context final HttpServletRequest request,
@javax.ws.rs.core.Context final HttpServletResponse response,
@javax.ws.rs.core.Context final ServletContext servletContext,
- @javax.ws.rs.core.Context final ServletConfig servletConfig) throws ServletException, IOException {
- return serviceViaOSGIPlugin(request, response, servletContext, servletConfig);
+ @javax.ws.rs.core.Context final ServletConfig servletConfig,
+ @javax.ws.rs.core.Context final UriInfo uriInfo) throws ServletException, IOException {
+ return serviceViaOSGIPlugin(request, response, servletContext, servletConfig, uriInfo);
}
@Timed
@@ -126,8 +135,9 @@ public class PluginResource extends JaxRsResourceBase {
@javax.ws.rs.core.Context final HttpServletRequest request,
@javax.ws.rs.core.Context final HttpServletResponse response,
@javax.ws.rs.core.Context final ServletContext servletContext,
- @javax.ws.rs.core.Context final ServletConfig servletConfig) throws ServletException, IOException {
- return serviceViaOSGIPlugin(form, request, response, servletContext, servletConfig);
+ @javax.ws.rs.core.Context final ServletConfig servletConfig,
+ @javax.ws.rs.core.Context final UriInfo uriInfo) throws ServletException, IOException {
+ return serviceViaOSGIPlugin(form, request, response, servletContext, servletConfig, uriInfo);
}
@Timed
@@ -135,8 +145,9 @@ public class PluginResource extends JaxRsResourceBase {
public Response doPOST(@javax.ws.rs.core.Context final HttpServletRequest request,
@javax.ws.rs.core.Context final HttpServletResponse response,
@javax.ws.rs.core.Context final ServletContext servletContext,
- @javax.ws.rs.core.Context final ServletConfig servletConfig) throws ServletException, IOException {
- return serviceViaOSGIPlugin(request, response, servletContext, servletConfig);
+ @javax.ws.rs.core.Context final ServletConfig servletConfig,
+ @javax.ws.rs.core.Context final UriInfo uriInfo) throws ServletException, IOException {
+ return serviceViaOSGIPlugin(request, response, servletContext, servletConfig, uriInfo);
}
@Timed
@@ -144,8 +155,9 @@ public class PluginResource extends JaxRsResourceBase {
public Response doPUT(@javax.ws.rs.core.Context final HttpServletRequest request,
@javax.ws.rs.core.Context final HttpServletResponse response,
@javax.ws.rs.core.Context final ServletContext servletContext,
- @javax.ws.rs.core.Context final ServletConfig servletConfig) throws ServletException, IOException {
- return serviceViaOSGIPlugin(request, response, servletContext, servletConfig);
+ @javax.ws.rs.core.Context final ServletConfig servletConfig,
+ @javax.ws.rs.core.Context final UriInfo uriInfo) throws ServletException, IOException {
+ return serviceViaOSGIPlugin(request, response, servletContext, servletConfig, uriInfo);
}
@Timed
@@ -153,30 +165,34 @@ public class PluginResource extends JaxRsResourceBase {
public Response doHEAD(@javax.ws.rs.core.Context final HttpServletRequest request,
@javax.ws.rs.core.Context final HttpServletResponse response,
@javax.ws.rs.core.Context final ServletContext servletContext,
- @javax.ws.rs.core.Context final ServletConfig servletConfig) throws ServletException, IOException {
- serviceViaOSGIPlugin(request, response, servletContext, servletConfig);
+ @javax.ws.rs.core.Context final ServletConfig servletConfig,
+ @javax.ws.rs.core.Context final UriInfo uriInfo) throws ServletException, IOException {
+ serviceViaOSGIPlugin(request, response, servletContext, servletConfig, uriInfo);
// Make sure to return 204
return Response.noContent().build();
}
private Response serviceViaOSGIPlugin(final HttpServletRequest request, final HttpServletResponse response,
- final ServletContext servletContext, final ServletConfig servletConfig) throws ServletException, IOException {
- return serviceViaOSGIPlugin(request, request.getInputStream(), response, servletContext, servletConfig);
+ final ServletContext servletContext, final ServletConfig servletConfig,
+ final UriInfo uriInfo) throws ServletException, IOException {
+ return serviceViaOSGIPlugin(request, request.getInputStream(), new Form(), response, servletContext, servletConfig, uriInfo);
}
private Response serviceViaOSGIPlugin(final MultivaluedMap<String, String> form,
final HttpServletRequest request, final HttpServletResponse response,
- final ServletContext servletContext, final ServletConfig servletConfig) throws ServletException, IOException {
+ final ServletContext servletContext, final ServletConfig servletConfig,
+ final UriInfo uriInfo) throws ServletException, IOException {
// form will contain form parameters, if any. Even if the request contains such parameters, it may be empty
// if a filter (e.g. Shiro) has already consumed them (see kludge below)
- return serviceViaOSGIPlugin(request, createInputStream(request, form), response, servletContext, servletConfig);
+ return serviceViaOSGIPlugin(request, createInputStream(request, form), form, response, servletContext, servletConfig, uriInfo);
}
- private Response serviceViaOSGIPlugin(final HttpServletRequest request, final InputStream inputStream, final HttpServletResponse response,
- final ServletContext servletContext, final ServletConfig servletConfig) throws ServletException, IOException {
+ private Response serviceViaOSGIPlugin(final HttpServletRequest request, final InputStream inputStream, final MultivaluedMap<String, String> formData,
+ final HttpServletResponse response, final ServletContext servletContext,
+ final ServletConfig servletConfig, final UriInfo uriInfo) throws ServletException, IOException {
prepareOSGIRequest(request, servletContext, servletConfig);
- osgiServlet.service(new OSGIServletRequestWrapper(request, inputStream), new OSGIServletResponseWrapper(response));
+ osgiServlet.service(new OSGIServletRequestWrapper(request, inputStream, formData, uriInfo.getQueryParameters()), new OSGIServletResponseWrapper(response));
if (response.isCommitted()) {
if (response.getStatus() >= 400) {
@@ -233,10 +249,52 @@ public class PluginResource extends JaxRsResourceBase {
private static final class OSGIServletRequestWrapper extends HttpServletRequestWrapper {
private final InputStream inputStream;
+ private final Map<String, String[]> parameterMap;
- public OSGIServletRequestWrapper(final HttpServletRequest request, final InputStream inputStream) {
+ public OSGIServletRequestWrapper(final HttpServletRequest request, final InputStream inputStream, final MultivaluedMap<String, String> formData, final MultivaluedMap<String, String> queryParameters) {
super(request);
this.inputStream = inputStream;
+ this.parameterMap = new HashMap<String, String[]>();
+
+ // Query string parameters and posted form data must appear in the parameters
+ final LinkedHashMultimap<String, String> tmpParameterMap = LinkedHashMultimap.<String, String>create();
+ for (final String formDataKey : formData.keySet()) {
+ tmpParameterMap.putAll(formDataKey, formData.get(formDataKey));
+ }
+ for (final String queryParameterKey : queryParameters.keySet()) {
+ tmpParameterMap.putAll(queryParameterKey, queryParameters.get(queryParameterKey));
+ }
+ for (final String parameterKey : request.getParameterMap().keySet()) {
+ tmpParameterMap.putAll(parameterKey, ImmutableList.<String>copyOf(request.getParameterMap().get(parameterKey)));
+ }
+ for (final String value : tmpParameterMap.keys()) {
+ parameterMap.put(value, tmpParameterMap.get(value).toArray(new String[0]));
+ }
+ }
+
+ @Override
+ public String getParameter(final String name) {
+ final String[] values = parameterMap.get(name);
+ if (values == null || values.length == 0) {
+ return null;
+ } else {
+ return values[0];
+ }
+ }
+
+ @Override
+ public Map<String, String[]> getParameterMap() {
+ return Collections.<String, String[]>unmodifiableMap(parameterMap);
+ }
+
+ @Override
+ public Enumeration<String> getParameterNames() {
+ return Collections.<String>enumeration(parameterMap.keySet());
+ }
+
+ @Override
+ public String[] getParameterValues(final String name) {
+ return parameterMap.get(name);
}
@Override
diff --git a/payment/src/main/java/org/killbill/billing/payment/provider/ExternalPaymentProviderPlugin.java b/payment/src/main/java/org/killbill/billing/payment/provider/ExternalPaymentProviderPlugin.java
index 33f1e30..fbd0fea 100644
--- a/payment/src/main/java/org/killbill/billing/payment/provider/ExternalPaymentProviderPlugin.java
+++ b/payment/src/main/java/org/killbill/billing/payment/provider/ExternalPaymentProviderPlugin.java
@@ -117,7 +117,7 @@ public class ExternalPaymentProviderPlugin implements PaymentPluginApi {
@Override
public List<PaymentMethodInfoPlugin> getPaymentMethods(final UUID kbAccountId, final boolean refreshFromGateway, final Iterable<PluginProperty> properties, final CallContext context) throws PaymentPluginApiException {
- return ImmutableList.<PaymentMethodInfoPlugin>of();
+ throw new PaymentPluginApiException("Not implemented", "");
}
@Override
diff --git a/payment/src/test/java/org/killbill/billing/payment/api/TestExternalPaymentPlugin.java b/payment/src/test/java/org/killbill/billing/payment/api/TestExternalPaymentPlugin.java
index e198698..3252d8d 100644
--- a/payment/src/test/java/org/killbill/billing/payment/api/TestExternalPaymentPlugin.java
+++ b/payment/src/test/java/org/killbill/billing/payment/api/TestExternalPaymentPlugin.java
@@ -41,7 +41,6 @@ public class TestExternalPaymentPlugin extends PaymentTestSuiteWithEmbeddedDB {
@BeforeClass(groups = "slow")
protected void beforeClass() throws Exception {
super.beforeClass();
- plugin = (ExternalPaymentProviderPlugin) registry.getServiceForName(ExternalPaymentProviderPlugin.PLUGIN_NAME);
}
@BeforeMethod(groups = "slow")
@@ -103,7 +102,7 @@ public class TestExternalPaymentPlugin extends PaymentTestSuiteWithEmbeddedDB {
ImmutableList.<PluginProperty>of(), callContext);
final Pagination<PaymentMethod> paymentMethods = paymentApi.getPaymentMethods(0L, 10L, false, null, callContext);
- final Pagination<PaymentMethod> paymentMethodsPlugin = paymentApi.getPaymentMethods(0L, 10L, true, null,callContext);
+ final Pagination<PaymentMethod> paymentMethodsPlugin = paymentApi.getPaymentMethods(0L, 10L, true, null, callContext);
Assert.assertTrue(paymentMethods.getTotalNbRecords() == 1);
Assert.assertTrue(paymentMethodsPlugin.getTotalNbRecords() == 1);