From d7b0dada9c9e3e79360b7c711ea6fe25685cec65 Mon Sep 17 00:00:00 2001 From: xsalefter Date: Mon, 22 May 2023 23:04:15 +0700 Subject: [PATCH 1/9] refactor guava classes to Java 8 stream classes or killbill's utils classes --- .../plugin/api/core/PaymentApiWrapper.java | 15 +++---- .../plugin/api/core/PluginPaymentOptions.java | 9 ++-- .../PluginTenantConfigurable.java | 7 ++- .../payment/PluginGatewayNotification.java | 19 ++++---- ...PluginHostedPaymentPageFormDescriptor.java | 13 +++--- .../api/payment/PluginPaymentPluginApi.java | 37 +++++----------- .../billing/plugin/core/PluginServlet.java | 17 ++++--- .../core/config/PluginEnvironmentConfig.java | 2 +- .../core/resources/ExceptionResponse.java | 27 +++++------- .../billing/plugin/dao/PluginDao.java | 2 +- .../plugin/dao/payment/PluginPaymentDao.java | 5 +-- .../billing/plugin/util/KillBillContext.java | 5 +-- .../billing/plugin/util/http/HttpClient.java | 7 ++- .../plugin/util/http/QueryComputer.java | 2 +- .../killbill/billing/plugin/TestUtils.java | 44 ++++++++++--------- .../core/TestPluginEntitlementSpecifier.java | 17 ++++--- .../api/core/TestPluginPaymentOptions.java | 13 +++--- .../TestPluginPlanPhasePriceOverride.java | 21 +++++---- .../api/invoice/TestPluginTaxCalculator.java | 21 ++++----- ...enantConfigurableConfigurationHandler.java | 19 ++++---- .../TestPluginGatewayNotification.java | 22 +++++----- ...PluginHostedPaymentPageFormDescriptor.java | 38 +++++++--------- .../TestPluginPaymentMethodPlugin.java | 17 ++++--- ...estPluginPaymentTransactionInfoPlugin.java | 21 +++++---- .../dao/payment/TestPaymentPluginApi.java | 4 +- .../plugin/util/http/TestHttpClient.java | 9 ++-- 26 files changed, 187 insertions(+), 226 deletions(-) diff --git a/src/main/java/org/killbill/billing/plugin/api/core/PaymentApiWrapper.java b/src/main/java/org/killbill/billing/plugin/api/core/PaymentApiWrapper.java index 910a5566..aa6de8ce 100644 --- a/src/main/java/org/killbill/billing/plugin/api/core/PaymentApiWrapper.java +++ b/src/main/java/org/killbill/billing/plugin/api/core/PaymentApiWrapper.java @@ -19,6 +19,7 @@ package org.killbill.billing.plugin.api.core; import java.math.BigDecimal; +import java.util.Collections; import java.util.List; import java.util.UUID; @@ -38,12 +39,10 @@ import org.killbill.billing.payment.plugin.api.PaymentPluginStatus; import org.killbill.billing.util.callcontext.CallContext; import org.killbill.billing.util.callcontext.TenantContext; +import org.killbill.commons.utils.Strings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Splitter; -import com.google.common.collect.ImmutableList; - public class PaymentApiWrapper { private static final Logger logger = LoggerFactory.getLogger(PaymentApiWrapper.class); @@ -64,11 +63,11 @@ public List getPaymentControlPluginNames(final UUID kbPaymentId, final T return null; } - final Payment payment = osgiKillbillAPI.getPaymentApi().getPayment(kbPaymentId, false, true, ImmutableList.of(), context); + final Payment payment = osgiKillbillAPI.getPaymentApi().getPayment(kbPaymentId, false, true, Collections.emptyList(), context); if (payment.getPaymentAttempts() != null && !payment.getPaymentAttempts().isEmpty()) { - return ImmutableList.copyOf(Splitter.on(",").split(payment.getPaymentAttempts().get(0).getPluginName())); + return Strings.split(payment.getPaymentAttempts().get(0).getPluginName(), ","); } else { - return ImmutableList.of(); + return Collections.emptyList(); } } @@ -125,8 +124,8 @@ public PaymentTransaction fixPaymentTransactionState(final Payment payment, updatedPaymentTransaction.getPaymentInfoPlugin().getStatus(), paymentPluginStatus); - osgiKillbillAPI.getAdminPaymentApi().fixPaymentTransactionState(payment, updatedPaymentTransaction, transactionStatus, lastSuccessfulPaymentStateName, currentPaymentStateName, ImmutableList.of(), context); - final Payment fixedPayment = osgiKillbillAPI.getPaymentApi().getPayment(payment.getId(), true, false, ImmutableList.of(), context); + osgiKillbillAPI.getAdminPaymentApi().fixPaymentTransactionState(payment, updatedPaymentTransaction, transactionStatus, lastSuccessfulPaymentStateName, currentPaymentStateName, Collections.emptyList(), context); + final Payment fixedPayment = osgiKillbillAPI.getPaymentApi().getPayment(payment.getId(), true, false, Collections.emptyList(), context); return filterForTransaction(fixedPayment, updatedPaymentTransaction.getId()); } diff --git a/src/main/java/org/killbill/billing/plugin/api/core/PluginPaymentOptions.java b/src/main/java/org/killbill/billing/plugin/api/core/PluginPaymentOptions.java index ada38574..96debb15 100644 --- a/src/main/java/org/killbill/billing/plugin/api/core/PluginPaymentOptions.java +++ b/src/main/java/org/killbill/billing/plugin/api/core/PluginPaymentOptions.java @@ -18,17 +18,18 @@ package org.killbill.billing.plugin.api.core; +import java.util.Collections; import java.util.List; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.google.common.collect.ImmutableList; -import org.killbill.billing.payment.api.PaymentOptions; + import org.killbill.billing.payment.api.boilerplate.PaymentOptionsImp; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + @JsonDeserialize( builder = PluginPaymentOptions.Builder.class ) public class PluginPaymentOptions extends PaymentOptionsImp { public PluginPaymentOptions() { - this(false, ImmutableList.of()); + this(false, Collections.emptyList()); } public PluginPaymentOptions(final List paymentControlPluginNames) { diff --git a/src/main/java/org/killbill/billing/plugin/api/notification/PluginTenantConfigurable.java b/src/main/java/org/killbill/billing/plugin/api/notification/PluginTenantConfigurable.java index 00032f51..a20cc82f 100644 --- a/src/main/java/org/killbill/billing/plugin/api/notification/PluginTenantConfigurable.java +++ b/src/main/java/org/killbill/billing/plugin/api/notification/PluginTenantConfigurable.java @@ -21,13 +21,12 @@ import java.io.Closeable; import java.io.IOException; import java.util.Map; +import java.util.Objects; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Nullable; -import com.google.common.base.MoreObjects; - public class PluginTenantConfigurable { private static final String MONO_TENANT = "MONO_TENANT"; @@ -56,7 +55,7 @@ public void setDefaultConfigurable(final C defaultConfigurable) { public C get(@Nullable final UUID kbTenantId) { final String key = getKey(kbTenantId); final C configurableForTenant = perTenantConfigurable.get(key); - return MoreObjects.firstNonNull(configurableForTenant, defaultConfigurable); + return Objects.requireNonNullElse(configurableForTenant, defaultConfigurable); } public void put(@Nullable final UUID kbTenantId, @Nullable final C configurableForTenant) { @@ -66,7 +65,7 @@ public void put(@Nullable final UUID kbTenantId, @Nullable final C configurableF if (configurableForTenant == null && defaultConfigurable == null) { oldConfigurable = perTenantConfigurable.remove(key); } else { - oldConfigurable = perTenantConfigurable.put(key, MoreObjects.firstNonNull(configurableForTenant, defaultConfigurable)); + oldConfigurable = perTenantConfigurable.put(key, Objects.requireNonNullElse(configurableForTenant, defaultConfigurable)); } // Cleanup the old value diff --git a/src/main/java/org/killbill/billing/plugin/api/payment/PluginGatewayNotification.java b/src/main/java/org/killbill/billing/plugin/api/payment/PluginGatewayNotification.java index eeb37cc8..8d27f98e 100644 --- a/src/main/java/org/killbill/billing/plugin/api/payment/PluginGatewayNotification.java +++ b/src/main/java/org/killbill/billing/plugin/api/payment/PluginGatewayNotification.java @@ -18,26 +18,25 @@ package org.killbill.billing.plugin.api.payment; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.UUID; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import org.killbill.billing.payment.api.PluginProperty; -import org.killbill.billing.payment.plugin.api.GatewayNotification; import org.killbill.billing.payment.plugin.api.boilerplate.GatewayNotificationImp; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + @JsonDeserialize( builder = PluginGatewayNotification.Builder.class ) public class PluginGatewayNotification extends GatewayNotificationImp { public PluginGatewayNotification(final String entity) { this(null, - 200, - entity, - ImmutableMap.>of(), - ImmutableList.of()); + 200, + entity, + Collections.emptyMap(), + Collections.emptyList()); } public PluginGatewayNotification(final UUID kbPaymentId, @@ -68,8 +67,8 @@ public static class Builder> public Builder() { this.withStatus(200); - this.withHeaders(ImmutableMap.>of()); - this.withProperties(ImmutableList.of()); + this.withHeaders(Collections.emptyMap()); + this.withProperties(Collections.emptyList()); } public Builder(final Builder that) { diff --git a/src/main/java/org/killbill/billing/plugin/api/payment/PluginHostedPaymentPageFormDescriptor.java b/src/main/java/org/killbill/billing/plugin/api/payment/PluginHostedPaymentPageFormDescriptor.java index 0800e136..b5a94138 100644 --- a/src/main/java/org/killbill/billing/plugin/api/payment/PluginHostedPaymentPageFormDescriptor.java +++ b/src/main/java/org/killbill/billing/plugin/api/payment/PluginHostedPaymentPageFormDescriptor.java @@ -20,17 +20,18 @@ import java.net.URI; import java.net.URISyntaxException; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.UUID; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.google.common.collect.ImmutableList; + import org.killbill.billing.payment.api.PluginProperty; -import org.killbill.billing.payment.plugin.api.HostedPaymentPageFormDescriptor; import org.killbill.billing.payment.plugin.api.boilerplate.HostedPaymentPageFormDescriptorImp; import org.killbill.billing.plugin.util.http.QueryComputer; import org.killbill.billing.plugin.util.http.URIUtils; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + @JsonDeserialize( builder = PluginHostedPaymentPageFormDescriptor.Builder.class ) public class PluginHostedPaymentPageFormDescriptor extends HostedPaymentPageFormDescriptorImp { @@ -38,7 +39,7 @@ public class PluginHostedPaymentPageFormDescriptor extends HostedPaymentPageForm public static final String POST = "POST"; public PluginHostedPaymentPageFormDescriptor(final UUID kbAccountId, final String formUrl) { - this(kbAccountId, GET, formUrl, ImmutableList.of()); + this(kbAccountId, GET, formUrl, Collections.emptyList()); } public PluginHostedPaymentPageFormDescriptor(final UUID kbAccountId, final String formUrl, final List formFields) { @@ -46,7 +47,7 @@ public PluginHostedPaymentPageFormDescriptor(final UUID kbAccountId, final Strin } public PluginHostedPaymentPageFormDescriptor(final UUID kbAccountId, final String formMethod, final String formUrl, final List formFields) { - this(kbAccountId, formMethod, formUrl, formFields, ImmutableList.of()); + this(kbAccountId, formMethod, formUrl, formFields, Collections.emptyList()); } public PluginHostedPaymentPageFormDescriptor(final UUID kbAccountId, final String formUrl, final Map queryParams) throws URISyntaxException { @@ -54,7 +55,7 @@ public PluginHostedPaymentPageFormDescriptor(final UUID kbAccountId, final Strin } public PluginHostedPaymentPageFormDescriptor(final UUID kbAccountId, final String formMethod, final String formUrl, final Map queryParams) throws URISyntaxException { - this(kbAccountId,formMethod, toFullUrl(formUrl, queryParams), ImmutableList.of(), ImmutableList.of()); + this(kbAccountId,formMethod, toFullUrl(formUrl, queryParams), Collections.emptyList(), Collections.emptyList()); } public PluginHostedPaymentPageFormDescriptor(final UUID kbAccountId, diff --git a/src/main/java/org/killbill/billing/plugin/api/payment/PluginPaymentPluginApi.java b/src/main/java/org/killbill/billing/plugin/api/payment/PluginPaymentPluginApi.java index 52a05df5..91bc63a0 100644 --- a/src/main/java/org/killbill/billing/plugin/api/payment/PluginPaymentPluginApi.java +++ b/src/main/java/org/killbill/billing/plugin/api/payment/PluginPaymentPluginApi.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; import org.joda.time.DateTime; import org.jooq.Table; @@ -43,11 +44,6 @@ import org.killbill.billing.util.entity.Pagination; import org.killbill.clock.Clock; -import com.google.common.base.Function; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; - public abstract class PluginPaymentPluginApi, RESP_T extends Table, PM_R extends UpdatableRecord, PM_T extends Table> extends PluginApi implements PaymentPluginApi { // By convention, support the same keys as the Ruby plugins (https://github.com/killbill/killbill-plugin-framework-ruby/blob/master/lib/killbill/helpers/active_merchant/payment_plugin.rb) @@ -100,14 +96,9 @@ public List getPaymentInfo(final UUID kbAccountId, } catch (final SQLException e) { throw new PaymentPluginApiException("Unable to retrieve payments for kbPaymentId " + kbPaymentId, e); } - - return Lists.transform(records, - new Function() { - @Override - public PaymentTransactionInfoPlugin apply(final RESP_R record) { - return buildPaymentTransactionInfoPlugin(record); - } - }); + return records.stream() + .map(this::buildPaymentTransactionInfoPlugin) + .collect(Collectors.toUnmodifiableList()); } @Override @@ -171,13 +162,9 @@ public List getPaymentMethods(final UUID kbAccountId, f throw new PaymentPluginApiException("Unable to retrieve payment methods for kbAccountId " + kbAccountId, e); } - return Lists.transform(records, - new Function() { - @Override - public PaymentMethodInfoPlugin apply(final PM_R record) { - return buildPaymentMethodInfoPlugin(record); - } - }); + return records.stream() + .map(this::buildPaymentMethodInfoPlugin) + .collect(Collectors.toUnmodifiableList()); } @Override @@ -194,13 +181,9 @@ public void resetPaymentMethods(final UUID kbAccountId, final List existingPaymentMethodIds = ImmutableSet.copyOf(Iterables.transform(records, - new Function() { - @Override - public UUID apply(final PM_R input) { - return UUID.fromString(getPaymentMethodId(input)); - } - })); + final Set existingPaymentMethodIds = records.stream() + .map(input -> UUID.fromString(getPaymentMethodId(input))) + .collect(Collectors.toUnmodifiableSet()); final DateTime utcNow = clock.getUTCNow(); for (final PaymentMethodInfoPlugin existingPaymentMethod : paymentMethods) { diff --git a/src/main/java/org/killbill/billing/plugin/core/PluginServlet.java b/src/main/java/org/killbill/billing/plugin/core/PluginServlet.java index 436a4fc4..2fa6ef52 100644 --- a/src/main/java/org/killbill/billing/plugin/core/PluginServlet.java +++ b/src/main/java/org/killbill/billing/plugin/core/PluginServlet.java @@ -20,6 +20,8 @@ import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -34,12 +36,9 @@ import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.killbill.billing.tenant.api.Tenant; - -import com.google.common.base.Charsets; -import com.google.common.base.MoreObjects; -import com.google.common.base.Strings; -import com.google.common.io.ByteStreams; -import com.google.common.net.HttpHeaders; +import org.killbill.commons.utils.Strings; +import org.killbill.commons.utils.io.ByteStreams; +import org.killbill.commons.utils.net.HttpHeaders; public class PluginServlet extends HttpServlet { @@ -68,7 +67,7 @@ protected LocalDate getParameterAsLocalDate(final String parameterName, final Se } protected String getCreatedBy(final HttpServletRequest req) { - return MoreObjects.firstNonNull(req.getHeader(HDR_CREATED_BY), req.getRemoteAddr()); + return Objects.requireNonNullElse(req.getHeader(HDR_CREATED_BY), req.getRemoteAddr()); } protected String getReason(final HttpServletRequest req) { @@ -76,7 +75,7 @@ protected String getReason(final HttpServletRequest req) { } protected String getComment(final HttpServletRequest req) { - return MoreObjects.firstNonNull(req.getHeader(HDR_COMMENT), req.getRequestURI()); + return Objects.requireNonNullElse(req.getHeader(HDR_COMMENT), req.getRequestURI()); } protected Tenant getTenant(final ServletRequest req) { @@ -87,7 +86,7 @@ protected Tenant getTenant(final ServletRequest req) { protected String getRequestData(final ServletRequest req) throws IOException { final InputStream inputStream = req.getInputStream(); try { - return new String(ByteStreams.toByteArray(inputStream), Charsets.UTF_8); + return new String(ByteStreams.toByteArray(inputStream), StandardCharsets.UTF_8); } finally { inputStream.close(); } diff --git a/src/main/java/org/killbill/billing/plugin/core/config/PluginEnvironmentConfig.java b/src/main/java/org/killbill/billing/plugin/core/config/PluginEnvironmentConfig.java index a47f4e99..eda449e4 100644 --- a/src/main/java/org/killbill/billing/plugin/core/config/PluginEnvironmentConfig.java +++ b/src/main/java/org/killbill/billing/plugin/core/config/PluginEnvironmentConfig.java @@ -20,7 +20,7 @@ import java.util.Properties; -import com.google.common.base.Strings; +import org.killbill.commons.utils.Strings; public class PluginEnvironmentConfig { diff --git a/src/main/java/org/killbill/billing/plugin/core/resources/ExceptionResponse.java b/src/main/java/org/killbill/billing/plugin/core/resources/ExceptionResponse.java index 281acf2e..d9346ee1 100644 --- a/src/main/java/org/killbill/billing/plugin/core/resources/ExceptionResponse.java +++ b/src/main/java/org/killbill/billing/plugin/core/resources/ExceptionResponse.java @@ -18,7 +18,10 @@ package org.killbill.billing.plugin.core.resources; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.annotation.Nullable; @@ -26,8 +29,6 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; public class ExceptionResponse { @@ -60,22 +61,18 @@ public ExceptionResponse(final Exception exception, final boolean withStackTrace exception.getLocalizedMessage(), exception.getCause() == null ? null : exception.getCause().getClass().getName(), exception.getCause() == null ? null : exception.getCause().getLocalizedMessage(), - !withStackTrace ? ImmutableList.of() : - Lists.transform(ImmutableList.copyOf(exception.getStackTrace()), - input -> new StackTraceElementJson(input.getClassName(), - input.getFileName(), - input.getLineNumber(), - input.getMethodName(), - input.isNativeMethod()))); + !withStackTrace ? Collections.emptyList() : Stream.of(exception.getStackTrace()) + .map(input -> new StackTraceElementJson( + input.getClassName(), + input.getFileName(), + input.getLineNumber(), + input.getMethodName(), + input.isNativeMethod() + )).collect(Collectors.toUnmodifiableList())); } public ExceptionResponse(final String message) { - this(null, - null, - message, - null, - null, - null); + this(null, null, message, null, null, null); } public String getClassName() { diff --git a/src/main/java/org/killbill/billing/plugin/dao/PluginDao.java b/src/main/java/org/killbill/billing/plugin/dao/PluginDao.java index 00f8d547..a172c05e 100644 --- a/src/main/java/org/killbill/billing/plugin/dao/PluginDao.java +++ b/src/main/java/org/killbill/billing/plugin/dao/PluginDao.java @@ -38,13 +38,13 @@ import org.jooq.conf.RenderMapping; import org.jooq.conf.RenderNameCase; import org.jooq.conf.Settings; +import org.killbill.commons.utils.Strings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; -import com.google.common.base.Strings; public class PluginDao { diff --git a/src/main/java/org/killbill/billing/plugin/dao/payment/PluginPaymentDao.java b/src/main/java/org/killbill/billing/plugin/dao/payment/PluginPaymentDao.java index e34d4ae2..b1b8602b 100644 --- a/src/main/java/org/killbill/billing/plugin/dao/payment/PluginPaymentDao.java +++ b/src/main/java/org/killbill/billing/plugin/dao/payment/PluginPaymentDao.java @@ -40,8 +40,7 @@ import org.killbill.billing.payment.api.TransactionType; import org.killbill.billing.plugin.api.payment.PluginPaymentPluginApi; import org.killbill.billing.plugin.dao.PluginDao; - -import com.google.common.base.Strings; +import org.killbill.commons.utils.Strings; public abstract class PluginPaymentDao, RESP_T extends Table, PM_R extends UpdatableRecord, PM_T extends Table> extends PluginDao { @@ -241,7 +240,7 @@ public void addPaymentMethod(final UUID kbAccountId, final UUID kbPaymentMethodI final String country = clonedProperties.remove(PluginPaymentPluginApi.PROPERTY_COUNTRY); /* Calculate last 4 digits of the credit card number */ - final String ccLast4 = (Strings.isNullOrEmpty(ccNumber) || ccNumber.length() < 4) ? null : ccNumber.substring(ccNumber.length() - 4, ccNumber.length()); + final String ccLast4 = (Strings.isNullOrEmpty(ccNumber) || ccNumber.length() < 4) ? null : ccNumber.substring(ccNumber.length() - 4, ccNumber.length()); /* Calculate the additional data to store */ final String additionalData = asString(clonedProperties); diff --git a/src/main/java/org/killbill/billing/plugin/util/KillBillContext.java b/src/main/java/org/killbill/billing/plugin/util/KillBillContext.java index 053b7450..f2ab5afc 100644 --- a/src/main/java/org/killbill/billing/plugin/util/KillBillContext.java +++ b/src/main/java/org/killbill/billing/plugin/util/KillBillContext.java @@ -18,12 +18,11 @@ package org.killbill.billing.plugin.util; +import java.util.Objects; import java.util.UUID; import org.slf4j.MDC; -import com.google.common.base.MoreObjects; - public abstract class KillBillContext { // See KillbillMDCInsertingServletFilter @@ -33,6 +32,6 @@ private KillBillContext() {} public static String getXRequestId() { // We know Kill Bill passed the X-Request-Id from the user in the slf4j MDC. Maybe one day, there will be a real API for it? - return MoreObjects.firstNonNull(MDC.get(MDC_REQUEST_ID), UUID.randomUUID().toString()); + return Objects.requireNonNullElse(MDC.get(MDC_REQUEST_ID), UUID.randomUUID().toString()); } } diff --git a/src/main/java/org/killbill/billing/plugin/util/http/HttpClient.java b/src/main/java/org/killbill/billing/plugin/util/http/HttpClient.java index b425b38b..eb16fc4d 100644 --- a/src/main/java/org/killbill/billing/plugin/util/http/HttpClient.java +++ b/src/main/java/org/killbill/billing/plugin/util/http/HttpClient.java @@ -40,6 +40,8 @@ import javax.annotation.Nullable; +import org.killbill.commons.utils.annotation.VisibleForTesting; +import org.killbill.commons.utils.io.CharStreams; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,9 +50,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.json.JsonMapper; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Charsets; -import com.google.common.io.CharStreams; import static org.killbill.billing.plugin.util.http.ResponseFormat.RAW; @@ -213,7 +212,7 @@ protected T deserializeResponse(final HttpResponse response, fi try (final InputStream in = response.body()) { switch (format) { case TEXT: - return (T) CharStreams.toString(new InputStreamReader(in, Charsets.UTF_8)); + return (T) CharStreams.toString(new InputStreamReader(in, StandardCharsets.UTF_8)); default: return mapper.readValue(in, clazz); } diff --git a/src/main/java/org/killbill/billing/plugin/util/http/QueryComputer.java b/src/main/java/org/killbill/billing/plugin/util/http/QueryComputer.java index c0a8c56f..9cdf4af8 100644 --- a/src/main/java/org/killbill/billing/plugin/util/http/QueryComputer.java +++ b/src/main/java/org/killbill/billing/plugin/util/http/QueryComputer.java @@ -20,7 +20,7 @@ import java.util.Map; -import com.google.common.base.Strings; +import org.killbill.commons.utils.Strings; public enum QueryComputer { diff --git a/src/test/java/org/killbill/billing/plugin/TestUtils.java b/src/test/java/org/killbill/billing/plugin/TestUtils.java index fea7fa89..bc7b9e07 100644 --- a/src/test/java/org/killbill/billing/plugin/TestUtils.java +++ b/src/test/java/org/killbill/billing/plugin/TestUtils.java @@ -22,12 +22,14 @@ import java.io.InputStream; import java.io.StringReader; import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.Properties; import java.util.UUID; @@ -60,6 +62,8 @@ import org.killbill.billing.plugin.api.PluginProperties; import org.killbill.billing.util.callcontext.CallContext; import org.killbill.billing.util.callcontext.TenantContext; +import org.killbill.commons.utils.io.ByteStreams; +import org.killbill.commons.utils.io.Resources; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -69,11 +73,6 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.base.Charsets; -import com.google.common.base.MoreObjects; -import com.google.common.collect.ImmutableList; -import com.google.common.io.ByteStreams; -import com.google.common.io.Resources; public abstract class TestUtils { @@ -91,7 +90,7 @@ public static Properties loadProperties(final String fileName) throws IOExceptio public static String toString(final String resourceName) throws IOException { final InputStream inputStream = Resources.getResource(resourceName).openStream(); try { - return new String(ByteStreams.toByteArray(inputStream), Charsets.UTF_8); + return new String(ByteStreams.toByteArray(inputStream), StandardCharsets.UTF_8); } finally { inputStream.close(); } @@ -116,7 +115,12 @@ public Payment answer(final InvocationOnMock invocation) throws Throwable { PaymentTransaction paymentTransaction = null; final UUID kbPaymentTransactionId = (UUID) invocation.getArguments()[1]; - for (final Payment p : paymentApi.getAccountPayments(account.getId(), false, false, ImmutableList.of(), (TenantContext) invocation.getArguments()[3])) { + final List accountPayments = paymentApi.getAccountPayments(account.getId(), + false, + false, + Collections.emptyList(), + (TenantContext) invocation.getArguments()[3]); + for (final Payment p : accountPayments) { for (final PaymentTransaction t : p.getTransactions()) { if (kbPaymentTransactionId.equals(t.getId())) { payment = p; @@ -149,7 +153,7 @@ public Payment answer(final InvocationOnMock invocation) throws Throwable { .then(new Answer() { @Override public Payment answer(final InvocationOnMock invocation) throws Throwable { - final List payments = paymentApi.getAccountPayments(account.getId(), false, false, ImmutableList.of(), (TenantContext) invocation.getArguments()[6]); + final List payments = paymentApi.getAccountPayments(account.getId(), false, false, Collections.emptyList(), (TenantContext) invocation.getArguments()[6]); final Payment payment; if (payments == null || payments.isEmpty()) { payment = buildPayment(account.getId(), account.getPaymentMethodId(), (Currency) invocation.getArguments()[3], killbillApi); @@ -171,7 +175,7 @@ public Payment answer(final InvocationOnMock invocation) throws Throwable { @Override public Payment answer(final InvocationOnMock invocation) throws Throwable { final UUID kbPaymentId = (UUID) invocation.getArguments()[1]; - final Payment payment = paymentApi.getPayment(kbPaymentId, false, false, ImmutableList.of(), (TenantContext) invocation.getArguments()[4]); + final Payment payment = paymentApi.getPayment(kbPaymentId, false, false, Collections.emptyList(), (TenantContext) invocation.getArguments()[4]); Assert.assertNotNull(payment); final String kbPaymentTransactionExternalKey = (String) invocation.getArguments()[3]; @@ -229,11 +233,11 @@ public static void updateOSGIKillbillAPI(final OSGIKillbill killbillApi, final P public Payment answer(final InvocationOnMock invocation) throws Throwable { final UUID accountId = ((Account) invocation.getArguments()[0]).getId(); final UUID paymentMethodId = (UUID) invocation.getArguments()[1]; - final UUID paymentId = MoreObjects.firstNonNull((UUID) invocation.getArguments()[2], UUID.randomUUID()); + final UUID paymentId = Objects.requireNonNullElse((UUID) invocation.getArguments()[2], UUID.randomUUID()); final BigDecimal amount = (BigDecimal) invocation.getArguments()[3]; final Currency currency = (Currency) invocation.getArguments()[4]; - final String paymentExternalKey = MoreObjects.firstNonNull((String) invocation.getArguments()[6], UUID.randomUUID().toString()); - final String paymentTransactionExternalKey = MoreObjects.firstNonNull((String) invocation.getArguments()[7], paymentExternalKey); + final String paymentExternalKey = Objects.requireNonNullElse((String) invocation.getArguments()[6], UUID.randomUUID().toString()); + final String paymentTransactionExternalKey = Objects.requireNonNullElse((String) invocation.getArguments()[7], paymentExternalKey); final Payment payment = buildPayment(accountId, paymentMethodId, paymentId, currency, paymentExternalKey, killbillApi); final PaymentTransaction paymentTransaction = buildPaymentTransaction(payment, paymentTransactionExternalKey, TransactionType.AUTHORIZE, TransactionStatus.UNKNOWN, amount, currency); @@ -266,11 +270,11 @@ public Payment answer(final InvocationOnMock invocation) throws Throwable { public Payment answer(final InvocationOnMock invocation) throws Throwable { final UUID accountId = ((Account) invocation.getArguments()[0]).getId(); final UUID paymentMethodId = (UUID) invocation.getArguments()[1]; - final UUID paymentId = MoreObjects.firstNonNull((UUID) invocation.getArguments()[2], UUID.randomUUID()); + final UUID paymentId = Objects.requireNonNullElse((UUID) invocation.getArguments()[2], UUID.randomUUID()); final BigDecimal amount = (BigDecimal) invocation.getArguments()[3]; final Currency currency = (Currency) invocation.getArguments()[4]; - final String paymentExternalKey = MoreObjects.firstNonNull((String) invocation.getArguments()[6], UUID.randomUUID().toString()); - final String paymentTransactionExternalKey = MoreObjects.firstNonNull((String) invocation.getArguments()[7], paymentExternalKey); + final String paymentExternalKey = Objects.requireNonNullElse((String) invocation.getArguments()[6], UUID.randomUUID().toString()); + final String paymentTransactionExternalKey = Objects.requireNonNullElse((String) invocation.getArguments()[7], paymentExternalKey); final Payment payment = buildPayment(accountId, paymentMethodId, paymentId, currency, paymentExternalKey, killbillApi); final PaymentTransaction paymentTransaction = buildPaymentTransaction(payment, paymentTransactionExternalKey, TransactionType.PURCHASE, TransactionStatus.UNKNOWN, amount, currency); @@ -303,11 +307,11 @@ public Payment answer(final InvocationOnMock invocation) throws Throwable { public Payment answer(final InvocationOnMock invocation) throws Throwable { final UUID accountId = ((Account) invocation.getArguments()[0]).getId(); final UUID paymentMethodId = (UUID) invocation.getArguments()[1]; - final UUID paymentId = MoreObjects.firstNonNull((UUID) invocation.getArguments()[2], UUID.randomUUID()); + final UUID paymentId = Objects.requireNonNullElse((UUID) invocation.getArguments()[2], UUID.randomUUID()); final BigDecimal amount = (BigDecimal) invocation.getArguments()[3]; final Currency currency = (Currency) invocation.getArguments()[4]; - final String paymentExternalKey = MoreObjects.firstNonNull((String) invocation.getArguments()[6], UUID.randomUUID().toString()); - final String paymentTransactionExternalKey = MoreObjects.firstNonNull((String) invocation.getArguments()[7], paymentExternalKey); + final String paymentExternalKey = Objects.requireNonNullElse((String) invocation.getArguments()[6], UUID.randomUUID().toString()); + final String paymentTransactionExternalKey = Objects.requireNonNullElse((String) invocation.getArguments()[7], paymentExternalKey); final Payment payment = buildPayment(accountId, paymentMethodId, paymentId, currency, paymentExternalKey, killbillApi); final PaymentTransaction paymentTransaction = buildPaymentTransaction(payment, paymentTransactionExternalKey, TransactionType.CREDIT, TransactionStatus.UNKNOWN, amount, currency); @@ -432,7 +436,7 @@ public static Payment buildPayment(final UUID accountId, final UUID paymentMetho if (killbillApi != null) { Mockito.when(killbillApi.getPaymentApi().getPayment(Mockito.eq(payment.getId()), Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.>any(), Mockito.any())).thenReturn(payment); - final List payments = MoreObjects.firstNonNull(killbillApi.getPaymentApi().getAccountPayments(accountId, false, false, ImmutableList.of(), Mockito.mock(TenantContext.class)), new LinkedList()); + final List payments = Objects.requireNonNullElse(killbillApi.getPaymentApi().getAccountPayments(accountId, false, false, Collections.emptyList(), Mockito.mock(TenantContext.class)), new LinkedList()); payments.add(payment); Mockito.when(killbillApi.getPaymentApi().getAccountPayments(Mockito.eq(accountId), Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.>any(), Mockito.any())).thenReturn(payments); @@ -487,7 +491,7 @@ public static PaymentMethod buildPaymentMethod(final UUID accountId, final UUID Mockito.when(paymentMethod.getPluginName()).thenReturn(pluginName); if (killbillApi != null) { - Mockito.when(killbillApi.getPaymentApi().getAccountPaymentMethods(Mockito.eq(accountId), Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.>any(), Mockito.any())).thenReturn(ImmutableList.of(paymentMethod)); + Mockito.when(killbillApi.getPaymentApi().getAccountPaymentMethods(Mockito.eq(accountId), Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.>any(), Mockito.any())).thenReturn(List.of(paymentMethod)); Mockito.when(killbillApi.getPaymentApi().getPaymentMethodById(Mockito.eq(paymentMethod.getId()), Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.>any(), Mockito.any())).thenReturn(paymentMethod); } diff --git a/src/test/java/org/killbill/billing/plugin/api/core/TestPluginEntitlementSpecifier.java b/src/test/java/org/killbill/billing/plugin/api/core/TestPluginEntitlementSpecifier.java index b3da8c85..635bcd0c 100644 --- a/src/test/java/org/killbill/billing/plugin/api/core/TestPluginEntitlementSpecifier.java +++ b/src/test/java/org/killbill/billing/plugin/api/core/TestPluginEntitlementSpecifier.java @@ -16,26 +16,25 @@ package org.killbill.billing.plugin.api.core; +import java.util.Collections; +import java.util.List; + +import org.killbill.billing.catalog.api.PlanPhasePriceOverride; +import org.killbill.billing.catalog.api.PlanPhaseSpecifier; import org.testng.Assert; import org.testng.annotations.Test; -import java.util.List; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.joda.JodaModule; +import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.util.StdDateFormat; -import com.google.common.collect.ImmutableList; -import org.killbill.billing.catalog.api.PlanPhasePriceOverride; -import org.killbill.billing.catalog.api.PlanPhaseSpecifier; +import com.fasterxml.jackson.datatype.joda.JodaModule; @Test(groups = { "fast" }) public class TestPluginEntitlementSpecifier { final private Integer billCycleDay = 1; final private String externalKey = "TestExternalKey"; - final private List overrides = ImmutableList.of(); + final private List overrides = Collections.emptyList(); final private PlanPhaseSpecifier planPhaseSpecifier = null; @Test diff --git a/src/test/java/org/killbill/billing/plugin/api/core/TestPluginPaymentOptions.java b/src/test/java/org/killbill/billing/plugin/api/core/TestPluginPaymentOptions.java index db88cb66..c3e03b3c 100644 --- a/src/test/java/org/killbill/billing/plugin/api/core/TestPluginPaymentOptions.java +++ b/src/test/java/org/killbill/billing/plugin/api/core/TestPluginPaymentOptions.java @@ -16,23 +16,22 @@ package org.killbill.billing.plugin.api.core; +import java.util.Collections; +import java.util.List; + import org.testng.Assert; import org.testng.annotations.Test; -import java.util.List; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.joda.JodaModule; +import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.util.StdDateFormat; -import com.google.common.collect.ImmutableList; +import com.fasterxml.jackson.datatype.joda.JodaModule; @Test(groups = { "fast" }) public class TestPluginPaymentOptions { final private boolean isExternalPayment = true; - final private List paymentControlPluginNames = ImmutableList.of(); + final private List paymentControlPluginNames = Collections.emptyList(); @Test void builderIsEquivalentToConstructor() { diff --git a/src/test/java/org/killbill/billing/plugin/api/core/TestPluginPlanPhasePriceOverride.java b/src/test/java/org/killbill/billing/plugin/api/core/TestPluginPlanPhasePriceOverride.java index 6d1cffeb..c37bdef2 100644 --- a/src/test/java/org/killbill/billing/plugin/api/core/TestPluginPlanPhasePriceOverride.java +++ b/src/test/java/org/killbill/billing/plugin/api/core/TestPluginPlanPhasePriceOverride.java @@ -15,21 +15,20 @@ */ package org.killbill.billing.plugin.api.core; -import org.testng.Assert; -import org.testng.annotations.Test; - import java.math.BigDecimal; +import java.util.Collections; import java.util.List; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.joda.JodaModule; -import com.fasterxml.jackson.databind.util.StdDateFormat; -import com.google.common.collect.ImmutableList; + import org.killbill.billing.catalog.api.Currency; import org.killbill.billing.catalog.api.PlanPhaseSpecifier; import org.killbill.billing.catalog.api.UsagePriceOverride; +import org.testng.Assert; +import org.testng.annotations.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.util.StdDateFormat; +import com.fasterxml.jackson.datatype.joda.JodaModule; @Test(groups = { "fast" }) public class TestPluginPlanPhasePriceOverride { @@ -39,7 +38,7 @@ public class TestPluginPlanPhasePriceOverride { protected String phaseName = "TestPhaseName"; protected PlanPhaseSpecifier planPhaseSpecifier = null; protected BigDecimal recurringPrice = new BigDecimal("200000"); - protected List usagePriceOverrides = ImmutableList.of(); + protected List usagePriceOverrides = Collections.emptyList(); @Test void builderIsEquivalentToConstructor() { diff --git a/src/test/java/org/killbill/billing/plugin/api/invoice/TestPluginTaxCalculator.java b/src/test/java/org/killbill/billing/plugin/api/invoice/TestPluginTaxCalculator.java index 7fd42fc1..fb5bbac9 100644 --- a/src/test/java/org/killbill/billing/plugin/api/invoice/TestPluginTaxCalculator.java +++ b/src/test/java/org/killbill/billing/plugin/api/invoice/TestPluginTaxCalculator.java @@ -19,9 +19,10 @@ package org.killbill.billing.plugin.api.invoice; import java.math.BigDecimal; +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Set; -import java.util.UUID; import org.killbill.billing.account.api.Account; import org.killbill.billing.catalog.api.Currency; @@ -38,10 +39,6 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; - public class TestPluginTaxCalculator { private static final class PluginTaxCalculatorTest extends PluginTaxCalculator { @@ -108,7 +105,7 @@ public void testComputeWithNewTaxableItemNoAdjustment() throws Exception { * $1 Tax item I2 */ invoice1.getInvoiceItems().add(invoice1TaxItem); - newItemsToTax = pluginTaxCalculatorTest.computeTaxItems(invoice1, ImmutableMap.>of(invoice1TaxableItem.getId(), ImmutableSet.of()), tenantContext); + newItemsToTax = pluginTaxCalculatorTest.computeTaxItems(invoice1, Map.of(invoice1TaxableItem.getId(), Collections.emptySet()), tenantContext); // Nothing to do Assert.assertEquals(newItemsToTax.size(), 0); } @@ -139,7 +136,7 @@ public void testComputeWithNewTaxableItemAndNewAdjustment() throws Exception { * $1 Tax item I3 */ invoice1.getInvoiceItems().add(invoice1TaxItem); - newItemsToTax = pluginTaxCalculatorTest.computeTaxItems(invoice1, ImmutableMap.>of(invoice1TaxableItem.getId(), ImmutableSet.of(invoice1AdjustmentItemForInvoice1TaxableItem.getId())), tenantContext); + newItemsToTax = pluginTaxCalculatorTest.computeTaxItems(invoice1, Map.of(invoice1TaxableItem.getId(), Set.of(invoice1AdjustmentItemForInvoice1TaxableItem.getId())), tenantContext); // Nothing to do Assert.assertEquals(newItemsToTax.size(), 0); } @@ -155,7 +152,7 @@ public void testComputeWithTaxableItemAndNewAdjustment() throws Exception { invoice1.getInvoiceItems().add(invoice1TaxableItem); invoice1.getInvoiceItems().add(invoice1AdjustmentItemForInvoice1TaxableItem); invoice1.getInvoiceItems().add(invoice1TaxItem); - List newItemsToTax = pluginTaxCalculatorTest.computeTaxItems(invoice1, ImmutableMap.>of(invoice1TaxableItem.getId(), ImmutableSet.of()), tenantContext); + List newItemsToTax = pluginTaxCalculatorTest.computeTaxItems(invoice1, Map.of(invoice1TaxableItem.getId(), Collections.emptySet()), tenantContext); // 1 item to return Assert.assertEquals(newItemsToTax.size(), 1); Assert.assertEquals(newItemsToTax.get(0).getInvoice(), invoice1); @@ -173,7 +170,7 @@ public void testComputeWithTaxableItemAndNewAdjustment() throws Exception { * -$1 Tax item I4 */ invoice1.getInvoiceItems().add(invoice1TaxItem2); - newItemsToTax = pluginTaxCalculatorTest.computeTaxItems(invoice1, ImmutableMap.>of(invoice1TaxableItem.getId(), ImmutableSet.of(invoice1AdjustmentItemForInvoice1TaxableItem.getId())), tenantContext); + newItemsToTax = pluginTaxCalculatorTest.computeTaxItems(invoice1, Map.of(invoice1TaxableItem.getId(), Set.of(invoice1AdjustmentItemForInvoice1TaxableItem.getId())), tenantContext); // Nothing to do Assert.assertEquals(newItemsToTax.size(), 0); } @@ -202,20 +199,20 @@ public void testComputeWithRepair() throws Exception { * -$0.01 Tax item I2 */ invoice2.getInvoiceItems().add(invoice2TaxItem); - newItemsToTax = pluginTaxCalculatorTest.computeTaxItems(invoice1, ImmutableMap.>of(invoice1TaxableItem.getId(), ImmutableSet.of(invoice2AdjustmentItemForInvoice1TaxableItem.getId())), tenantContext); + newItemsToTax = pluginTaxCalculatorTest.computeTaxItems(invoice1, Map.of(invoice1TaxableItem.getId(), Set.of(invoice2AdjustmentItemForInvoice1TaxableItem.getId())), tenantContext); // Nothing to do Assert.assertEquals(newItemsToTax.size(), 0); } @Test(groups = "fast") public void testNetAmount() throws Exception { - final BigDecimal sum = pluginTaxCalculatorTest.netAmount(invoice1TaxableItem, ImmutableList.of(invoice1AdjustmentItemForInvoice1TaxableItem)); + final BigDecimal sum = pluginTaxCalculatorTest.netAmount(invoice1TaxableItem, List.of(invoice1AdjustmentItemForInvoice1TaxableItem)); Assert.assertEquals(sum.compareTo(new BigDecimal("9")), 0); } @Test(groups = "fast") public void testSum() throws Exception { - final ImmutableList invoiceItems = ImmutableList.of(invoice1TaxableItem, invoice1TaxItem, invoice1AdjustmentItemForInvoice1TaxableItem); + final List invoiceItems = List.of(invoice1TaxableItem, invoice1TaxItem, invoice1AdjustmentItemForInvoice1TaxableItem); final BigDecimal sum = pluginTaxCalculatorTest.sum(invoiceItems); Assert.assertEquals(sum.compareTo(BigDecimal.TEN), 0); } diff --git a/src/test/java/org/killbill/billing/plugin/api/notification/TestPluginTenantConfigurableConfigurationHandler.java b/src/test/java/org/killbill/billing/plugin/api/notification/TestPluginTenantConfigurableConfigurationHandler.java index 38f9bcf6..04d440c3 100644 --- a/src/test/java/org/killbill/billing/plugin/api/notification/TestPluginTenantConfigurableConfigurationHandler.java +++ b/src/test/java/org/killbill/billing/plugin/api/notification/TestPluginTenantConfigurableConfigurationHandler.java @@ -18,6 +18,7 @@ package org.killbill.billing.plugin.api.notification; +import java.util.Collections; import java.util.List; import java.util.Properties; import java.util.UUID; @@ -36,8 +37,6 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import com.google.common.collect.ImmutableList; - public class TestPluginTenantConfigurableConfigurationHandler { private TenantUserApi tenantUserApi; @@ -65,7 +64,7 @@ public void setUp() throws Exception { public void testConfigurationForTenant() throws Exception { final UUID configuredTenant = UUID.randomUUID(); final UUID otherTenant = UUID.randomUUID(); - mockTenantKvs(configuredTenant, ImmutableList.of("key=CONFIGURED_TENANT"), otherTenant, ImmutableList.of()); + mockTenantKvs(configuredTenant, List.of("key=CONFIGURED_TENANT"), otherTenant, Collections.emptyList()); final String initialConfigurableForConfiguredTenant = configurationHandler.getConfigurable(configuredTenant); Assert.assertEquals(initialConfigurableForConfiguredTenant, "CONFIGURED_TENANT"); @@ -75,7 +74,7 @@ public void testConfigurationForTenant() throws Exception { Assert.assertEquals(configurationHandler.getConfigurable(null), "DEFAULT"); // Configure the other tenant explicitly - mockTenantKvs(configuredTenant, ImmutableList.of("key=CONFIGURED_TENANT"), otherTenant, ImmutableList.of("key=OTHER_CONFIGURED_TENANT")); + mockTenantKvs(configuredTenant, List.of("key=CONFIGURED_TENANT"), otherTenant, List.of("key=OTHER_CONFIGURED_TENANT")); configurationHandler.configure(otherTenant); final String subsequentConfigurableForConfiguredTenant = configurationHandler.getConfigurable(configuredTenant); @@ -92,7 +91,7 @@ public void testCloseable() throws Exception { final UUID nonConfiguredTenant = UUID.randomUUID(); // configure tenants - mockTenantKvsCloseable(configuredTenant, ImmutableList.of("CloseableTest"), nonConfiguredTenant, ImmutableList.of()); + mockTenantKvsCloseable(configuredTenant, List.of("CloseableTest"), nonConfiguredTenant, Collections.emptyList()); closableConfigurationHandler.configure(configuredTenant); final CloseableTest o = closableConfigurationHandler.getConfigurable(configuredTenant); @@ -102,7 +101,7 @@ public void testCloseable() throws Exception { Assert.assertEquals(o2, defaultCloseable); // deconfigure tenants - mockTenantKvsCloseable(configuredTenant, ImmutableList.of(), nonConfiguredTenant, ImmutableList.of()); + mockTenantKvsCloseable(configuredTenant, Collections.emptyList(), nonConfiguredTenant, Collections.emptyList()); closableConfigurationHandler.configure(configuredTenant); Assert.assertTrue(o.isClosed()); Assert.assertFalse(defaultCloseable.isClosed()); @@ -113,7 +112,7 @@ private void mockTenantKvs(final UUID kbTenantIdA, final List tenantKvsA @Override public List answer(final InvocationOnMock invocation) throws Throwable { if (!"PLUGIN_CONFIG_test".equals(invocation.getArguments()[0])) { - return ImmutableList.of(); + return Collections.emptyList(); } final TenantContext context = (TenantContext) invocation.getArguments()[1]; @@ -122,7 +121,7 @@ public List answer(final InvocationOnMock invocation) throws Throwable { } else if (kbTenantIdB.equals(context.getTenantId())) { return tenantKvsB; } else { - return ImmutableList.of(); + return Collections.emptyList(); } } }); @@ -134,7 +133,7 @@ private void mockTenantKvsCloseable(final UUID kbTenantIdA, final List t @Override public List answer(final InvocationOnMock invocation) throws Throwable { if (!"PLUGIN_CONFIG_closeable".equals(invocation.getArguments()[0])) { - return ImmutableList.of(); + return Collections.emptyList(); } final TenantContext context = (TenantContext) invocation.getArguments()[1]; @@ -143,7 +142,7 @@ public List answer(final InvocationOnMock invocation) throws Throwable { } else if (kbTenantIdB.equals(context.getTenantId())) { return tenantKvsB; } else { - return ImmutableList.of(); + return Collections.emptyList(); } } }); diff --git a/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginGatewayNotification.java b/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginGatewayNotification.java index dd922d47..acd36585 100644 --- a/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginGatewayNotification.java +++ b/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginGatewayNotification.java @@ -16,29 +16,27 @@ package org.killbill.billing.plugin.api.payment; -import org.testng.Assert; -import org.testng.annotations.Test; - +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.UUID; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.SerializationFeature; + +import org.killbill.billing.payment.api.PluginProperty; +import org.testng.Assert; +import org.testng.annotations.Test; + import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.joda.JodaModule; +import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.util.StdDateFormat; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import org.killbill.billing.payment.api.PluginProperty; +import com.fasterxml.jackson.datatype.joda.JodaModule; @Test(groups = { "fast" }) public class TestPluginGatewayNotification { private final String entity = "TestEntity"; - private final Map> headers = ImmutableMap.>of(); + private final Map> headers = Collections.emptyMap(); private final UUID kbPaymentId = UUID.fromString("00000000-0000-0000-0000-000000000001"); - private final List properties = ImmutableList.of(); + private final List properties = Collections.emptyList(); private final int status = 400; @Test diff --git a/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginHostedPaymentPageFormDescriptor.java b/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginHostedPaymentPageFormDescriptor.java index 6b320506..47935923 100644 --- a/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginHostedPaymentPageFormDescriptor.java +++ b/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginHostedPaymentPageFormDescriptor.java @@ -16,35 +16,31 @@ package org.killbill.billing.plugin.api.payment; +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +import org.killbill.billing.payment.api.PluginProperty; import org.testng.Assert; import org.testng.annotations.Test; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.joda.JodaModule; +import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.util.StdDateFormat; -import com.google.common.collect.ImmutableList; -import org.killbill.billing.payment.api.PluginProperty; +import com.fasterxml.jackson.datatype.joda.JodaModule; public class TestPluginHostedPaymentPageFormDescriptor { - private final List formFields = ImmutableList.of(); + private final List formFields = Collections.emptyList(); private final String formMethod = PluginHostedPaymentPageFormDescriptor.POST; private final String formUrl = "https://www.nowhere.com/target"; private final UUID kbAccountId = UUID.fromString("00000000-0000-0000-0000-000000000001"); - private final List properties = ImmutableList.of(); + private final List properties = Collections.emptyList(); @Test void builderIsEquivalentToConstructor() { - PluginHostedPaymentPageFormDescriptor a = new PluginHostedPaymentPageFormDescriptor.Builder<>() + final PluginHostedPaymentPageFormDescriptor a = new PluginHostedPaymentPageFormDescriptor.Builder<>() .withKbAccountId(kbAccountId) .withFormMethod(formMethod) .withFormUrl(formUrl) @@ -52,14 +48,14 @@ void builderIsEquivalentToConstructor() { .withProperties(properties) .build(); - PluginHostedPaymentPageFormDescriptor b = new PluginHostedPaymentPageFormDescriptor( + final PluginHostedPaymentPageFormDescriptor b = new PluginHostedPaymentPageFormDescriptor( kbAccountId, formMethod, formUrl, formFields, properties); - Assert.assertTrue(a.equals(b)); + Assert.assertEquals(b, a); } @Test @@ -78,7 +74,7 @@ void differentInstances() { @Test void callAllGetters() { - PluginHostedPaymentPageFormDescriptor a = new PluginHostedPaymentPageFormDescriptor.Builder<>() + final PluginHostedPaymentPageFormDescriptor a = new PluginHostedPaymentPageFormDescriptor.Builder<>() .withKbAccountId(kbAccountId) .withFormMethod(formMethod) .withFormUrl(formUrl) @@ -96,7 +92,7 @@ void callAllGetters() { @Test void roundTripJson() throws Exception { - ObjectMapper mapper = new ObjectMapper(); + final ObjectMapper mapper = new ObjectMapper(); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); mapper.setDateFormat(new StdDateFormat().withColonInTimeZone(true)); mapper.registerModule(new JodaModule()); @@ -110,10 +106,10 @@ void roundTripJson() throws Exception .withProperties(properties) .build(); - String json = mapper.writeValueAsString(a);; - PluginHostedPaymentPageFormDescriptor b = mapper.readValue(json, PluginHostedPaymentPageFormDescriptor.class); + final String json = mapper.writeValueAsString(a);; + final PluginHostedPaymentPageFormDescriptor b = mapper.readValue(json, PluginHostedPaymentPageFormDescriptor.class); - Assert.assertTrue(a.equals(b)); + Assert.assertEquals(b, a); } } diff --git a/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginPaymentMethodPlugin.java b/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginPaymentMethodPlugin.java index 64e8e96e..b5364cba 100644 --- a/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginPaymentMethodPlugin.java +++ b/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginPaymentMethodPlugin.java @@ -16,19 +16,18 @@ package org.killbill.billing.plugin.api.payment; +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +import org.killbill.billing.payment.api.PluginProperty; import org.testng.Assert; import org.testng.annotations.Test; -import java.util.List; -import java.util.UUID; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.joda.JodaModule; +import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.util.StdDateFormat; -import com.google.common.collect.ImmutableList; -import org.killbill.billing.payment.api.PluginProperty; +import com.fasterxml.jackson.datatype.joda.JodaModule; @Test(groups = { "fast" }) public class TestPluginPaymentMethodPlugin { @@ -36,7 +35,7 @@ public class TestPluginPaymentMethodPlugin { private final String externalPaymentMethodId = "TestExternalPaymentMethodId"; private final boolean isDefaultPaymentMethod = true; private final UUID kbPaymentMethodId = UUID.fromString("00000000-0000-0000-0000-000000000001"); - private final List properties = ImmutableList.of(); + private final List properties = Collections.emptyList(); @Test void builderIsEquivalentToConstructor() { diff --git a/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginPaymentTransactionInfoPlugin.java b/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginPaymentTransactionInfoPlugin.java index 78d1a22e..f51b741d 100644 --- a/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginPaymentTransactionInfoPlugin.java +++ b/src/test/java/org/killbill/billing/plugin/api/payment/TestPluginPaymentTransactionInfoPlugin.java @@ -16,24 +16,23 @@ package org.killbill.billing.plugin.api.payment; -import org.testng.Assert; -import org.testng.annotations.Test; - import java.math.BigDecimal; +import java.util.Collections; import java.util.List; import java.util.UUID; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.joda.JodaModule; -import com.fasterxml.jackson.databind.util.StdDateFormat; -import com.google.common.collect.ImmutableList; + import org.joda.time.DateTime; import org.killbill.billing.catalog.api.Currency; import org.killbill.billing.payment.api.PluginProperty; import org.killbill.billing.payment.api.TransactionType; import org.killbill.billing.payment.plugin.api.PaymentPluginStatus; +import org.testng.Assert; +import org.testng.annotations.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.util.StdDateFormat; +import com.fasterxml.jackson.datatype.joda.JodaModule; @Test(groups = { "fast" }) public class TestPluginPaymentTransactionInfoPlugin { @@ -47,7 +46,7 @@ public class TestPluginPaymentTransactionInfoPlugin { private final String gatewayErrorCode = "TestGatewayErrorCode"; private final UUID kbPaymentId = UUID.fromString("00000000-0000-0000-0000-000000000001"); private final UUID kbTransactionPaymentId = UUID.fromString("00000000-0000-0000-0000-000000000002"); - private final List properties = ImmutableList.of(); + private final List properties = Collections.emptyList(); private final String secondPaymentReferenceId = "TestSecondPaymentReferenceId"; private final PaymentPluginStatus status = PaymentPluginStatus.PENDING; private final TransactionType transactionType = TransactionType.CHARGEBACK; diff --git a/src/test/java/org/killbill/billing/plugin/dao/payment/TestPaymentPluginApi.java b/src/test/java/org/killbill/billing/plugin/dao/payment/TestPaymentPluginApi.java index 9e1a3514..9ca656ae 100644 --- a/src/test/java/org/killbill/billing/plugin/dao/payment/TestPaymentPluginApi.java +++ b/src/test/java/org/killbill/billing/plugin/dao/payment/TestPaymentPluginApi.java @@ -19,7 +19,6 @@ package org.killbill.billing.plugin.dao.payment; import java.math.BigDecimal; -import java.time.ZoneId; import java.time.ZoneOffset; import java.util.List; import java.util.UUID; @@ -49,8 +48,7 @@ import org.killbill.billing.plugin.dao.payment.gen.tables.records.TestResponsesRecord; import org.killbill.billing.util.callcontext.CallContext; import org.killbill.clock.Clock; - -import com.google.common.base.Strings; +import org.killbill.commons.utils.Strings; public class TestPaymentPluginApi extends PluginPaymentPluginApiof("nocache", "1"), - ImmutableMap.of("X-Plugin-Client", "12345"), + Map.of("nocache", "1"), + Map.of("X-Plugin-Client", "12345"), Car.class, ResponseFormat.JSON); } @@ -205,8 +204,8 @@ public InputStream doAuth() throws Exception { return doCall(GET, url + "/secure/", null, - ImmutableMap.of("nocache", "1"), - ImmutableMap.of("X-Plugin-Client", "12345"), + Map.of("nocache", "1"), + Map.of("X-Plugin-Client", "12345"), InputStream.class, ResponseFormat.RAW); } From f463324dc731d665e946c420322b8dd89d48d11c Mon Sep 17 00:00:00 2001 From: xsalefter Date: Tue, 23 May 2023 02:19:55 +0700 Subject: [PATCH 2/9] use JDK Base64 instead of guava when decoding authHeaderChunks --- .../billing/plugin/core/resources/BaseResource.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/killbill/billing/plugin/core/resources/BaseResource.java b/src/main/java/org/killbill/billing/plugin/core/resources/BaseResource.java index fea45016..574494b6 100644 --- a/src/main/java/org/killbill/billing/plugin/core/resources/BaseResource.java +++ b/src/main/java/org/killbill/billing/plugin/core/resources/BaseResource.java @@ -19,6 +19,8 @@ package org.killbill.billing.plugin.core.resources; import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; +import java.util.Base64; import java.util.concurrent.Callable; import org.jooby.Result; @@ -29,8 +31,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.io.BaseEncoding; - public class BaseResource { private static final Logger logger = LoggerFactory.getLogger(BaseResource.class); @@ -67,7 +67,7 @@ protected void login(final String authHeader) throws UnsupportedEncodingExceptio return; } - final String credentials = new String(BaseEncoding.base64().decode(authHeaderChunks[1]), "UTF-8"); + final String credentials = new String(Base64.getDecoder().decode(authHeaderChunks[1]), StandardCharsets.UTF_8); final int p = credentials.indexOf(":"); if (p == -1) { return; From 86539f6566077c23168c3bd31a7a71698e3d886c Mon Sep 17 00:00:00 2001 From: xsalefter Date: Tue, 23 May 2023 02:26:50 +0700 Subject: [PATCH 3/9] use Java 8 stream in PluginApi.getBlockingHistory() and add test for this --- .../billing/plugin/api/PluginApi.java | 64 ++++------ .../billing/plugin/api/TestPluginApi.java | 118 ++++++++++++++++++ 2 files changed, 141 insertions(+), 41 deletions(-) create mode 100644 src/test/java/org/killbill/billing/plugin/api/TestPluginApi.java diff --git a/src/main/java/org/killbill/billing/plugin/api/PluginApi.java b/src/main/java/org/killbill/billing/plugin/api/PluginApi.java index 18488f17..14b6334e 100644 --- a/src/main/java/org/killbill/billing/plugin/api/PluginApi.java +++ b/src/main/java/org/killbill/billing/plugin/api/PluginApi.java @@ -20,10 +20,13 @@ import java.math.BigDecimal; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.UUID; +import java.util.stream.Collectors; import org.joda.time.DateTime; import org.joda.time.LocalDate; @@ -70,12 +73,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Function; -import com.google.common.base.MoreObjects; -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; - public abstract class PluginApi { private static final Logger logger = LoggerFactory.getLogger(PluginApi.class); @@ -89,7 +86,7 @@ public abstract class PluginApi { // See convention in InternalCallContextFactory protected static final long INTERNAL_TENANT_RECORD_ID = 0L; - protected static final Iterable PLUGIN_PROPERTIES = ImmutableList.of(); + protected static final Iterable PLUGIN_PROPERTIES = Collections.emptyList(); protected final OSGIKillbillAPI killbillAPI; protected final OSGIConfigPropertiesService configProperties; @@ -221,31 +218,20 @@ protected Long getSubscriptionEventRecordId(final UUID subscriptionEventId, fina protected Iterable getBlockingHistory(final UUID accountId, final TenantContext context) throws OSGIServiceNotAvailable { final List bundles = getSubscriptionBundlesForAccount(accountId, context); - - // Find all subscription events for that account - final Iterable subscriptionEvents = Iterables.concat(Iterables.>transform(bundles, - new Function>() { - @Override - public List apply(final SubscriptionBundle bundle) { - return bundle == null ? ImmutableList.of() : bundle.getTimeline().getSubscriptionEvents(); - } - } - )); - - // Filter all service state changes - return Iterables.filter(subscriptionEvents, - new Predicate() { - @Override - public boolean apply(final SubscriptionEvent event) { - return event != null && - event.getSubscriptionEventType() != null && - // We want events coming from the blocking states table... - ObjectType.BLOCKING_STATES.equals(event.getSubscriptionEventType().getObjectType()) && - // ...that are for any service but entitlement - !ENTITLEMENT_SERVICE_NAME.equals(event.getServiceName()); - } - } - ); + if (bundles != null) { + // Find all subscription events for that account + return bundles.stream() + .map(subscriptionBundle -> subscriptionBundle.getTimeline().getSubscriptionEvents()) + .flatMap(Collection::stream) + .filter(event -> event != null && + event.getSubscriptionEventType() != null && + // We want events coming from the blocking states table... + ObjectType.BLOCKING_STATES.equals(event.getSubscriptionEventType().getObjectType()) && + // ...that are for any service but entitlement + !ENTITLEMENT_SERVICE_NAME.equals(event.getServiceName())) + .collect(Collectors.toUnmodifiableList()); + } + return Collections.emptyList(); } // @@ -321,7 +307,7 @@ protected Plan getPlanFromInvoiceItem(final InvoiceItem invoiceItem, final Tenan try { final VersionedCatalog catalog = getCatalog(context); // getCatalogEffectiveDate was introduced in 0.21.x - final DateTime catalogEffectiveDate = MoreObjects.firstNonNull(invoiceItem.getCatalogEffectiveDate(), invoiceItem.getCreatedDate()); + final DateTime catalogEffectiveDate = Objects.requireNonNullElse(invoiceItem.getCatalogEffectiveDate(), invoiceItem.getCreatedDate()); return catalog.getVersion(catalogEffectiveDate.toDate()).findPlan(invoiceItem.getPlanName()); } catch (final CatalogApiException e) { logger.info("Unable to retrieve plan for invoice item {}", invoiceItem.getId(), e); @@ -333,7 +319,7 @@ protected PlanPhase getPlanPhaseFromInvoiceItem(final InvoiceItem invoiceItem, f try { final VersionedCatalog catalog = getCatalog(context); // getCatalogEffectiveDate was introduced in 0.21.x - final DateTime catalogEffectiveDate = MoreObjects.firstNonNull(invoiceItem.getCatalogEffectiveDate(), invoiceItem.getCreatedDate()); + final DateTime catalogEffectiveDate = Objects.requireNonNullElse(invoiceItem.getCatalogEffectiveDate(), invoiceItem.getCreatedDate()); return catalog.getVersion(catalogEffectiveDate.toDate()).findPhase(invoiceItem.getPhaseName()); } catch (final CatalogApiException e) { logger.info("Unable to retrieve phase for invoice item {}", invoiceItem.getId(), e); @@ -451,13 +437,9 @@ protected PaymentTransaction getPaymentTransaction(final UUID kbPaymentId, final } protected PaymentTransaction getPaymentTransaction(final UUID kbTransactionId, final Payment payment) throws OSGIServiceNotAvailable { - return Iterables.find(payment.getTransactions(), - new Predicate() { - @Override - public boolean apply(final PaymentTransaction input) { - return input != null && kbTransactionId.equals(input.getId()); - } - }); + return payment.getTransactions().stream() + .filter(input -> input != null && kbTransactionId.equals(input.getId())) + .findFirst().get(); } protected Long getPaymentRecordId(final UUID paymentId, final TenantContext context) throws OSGIServiceNotAvailable { diff --git a/src/test/java/org/killbill/billing/plugin/api/TestPluginApi.java b/src/test/java/org/killbill/billing/plugin/api/TestPluginApi.java new file mode 100644 index 00000000..510edcf7 --- /dev/null +++ b/src/test/java/org/killbill/billing/plugin/api/TestPluginApi.java @@ -0,0 +1,118 @@ +/* + * Copyright 2020-2023 Equinix, Inc + * Copyright 2014-2023 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.plugin.api; + +import java.util.ArrayList; +import java.util.List; + +import org.killbill.billing.entitlement.api.SubscriptionBundle; +import org.killbill.billing.entitlement.api.SubscriptionBundleTimeline; +import org.killbill.billing.entitlement.api.SubscriptionEvent; +import org.killbill.billing.entitlement.api.SubscriptionEventType; +import org.killbill.billing.entitlement.api.boilerplate.SubscriptionBundleImp; +import org.killbill.billing.entitlement.api.boilerplate.SubscriptionBundleTimelineImp; +import org.killbill.billing.entitlement.api.boilerplate.SubscriptionEventImp; +import org.killbill.billing.osgi.libs.killbill.OSGIConfigPropertiesService; +import org.killbill.billing.osgi.libs.killbill.OSGIKillbillAPI; +import org.killbill.clock.Clock; +import org.killbill.commons.utils.collect.Iterables; +import org.mockito.Mockito; +import org.testng.Assert; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +public class TestPluginApi { + + private OSGIKillbillAPI osgiKillbillAPI; + private OSGIConfigPropertiesService configProperties; + private Clock clock; + + private PluginApi pluginApi; + + @BeforeMethod(groups = "fast") + public void beforeMethod() { + osgiKillbillAPI = Mockito.mock(OSGIKillbillAPI.class); + configProperties = Mockito.mock(OSGIConfigPropertiesService.class); + clock = Mockito.mock(Clock.class); + + final PluginApi toSpy = new PluginApi(osgiKillbillAPI, configProperties, clock) {}; + pluginApi = Mockito.spy(toSpy); + } + + @Test(groups = "fast") + public void testGetBlockingHistory() { + final TestGetBlockingHistorySamples samples = new TestGetBlockingHistorySamples(); + + Mockito.doReturn(samples.getSample1()).when(pluginApi).getSubscriptionBundlesForAccount(Mockito.any(), Mockito.any()); + + Iterable history = pluginApi.getBlockingHistory(Mockito.any(), Mockito.any()); + Assert.assertEquals(Iterables.size(history), 14); // 5 + 3 + 6 + history.forEach(evt -> Assert.assertTrue(List.of("A", "C", "E").contains(evt.getServiceName()))); + + Mockito.doReturn(samples.getSample2()).when(pluginApi).getSubscriptionBundlesForAccount(Mockito.any(), Mockito.any()); + + history = pluginApi.getBlockingHistory(Mockito.any(), Mockito.any()); + Assert.assertEquals(Iterables.size(history), 4); // 2 + 2 + history.forEach(evt -> Assert.assertTrue(List.of("A", "C").contains(evt.getServiceName()))); + } + + private static class TestGetBlockingHistorySamples { + + List getSample1() { + final List result = new ArrayList<>(); + result.add(newSubsBundle(0 , null, null)); // [x] + result.add(newSubsBundle(5 , "A", SubscriptionEventType.START_ENTITLEMENT)); // [v] ObjectType.BLOCKING_STATES + result.add(newSubsBundle(7 , "B", SubscriptionEventType.START_BILLING)); // [x] ObjectType.SUBSCRIPTION_EVENT + result.add(newSubsBundle(3 , "C", SubscriptionEventType.PAUSE_ENTITLEMENT)); // [v] ObjectType.BLOCKING_STATES + result.add(newSubsBundle(10, "D", SubscriptionEventType.CHANGE)); // [x] ObjectType.SUBSCRIPTION_EVENT + result.add(newSubsBundle(6 , "E", SubscriptionEventType.STOP_ENTITLEMENT)); // [v] ObjectType.BLOCKING_STATES + + return result; + } + + List getSample2() { + final List result = new ArrayList<>(); + result.add(newSubsBundle(2 , "entitlement-service", SubscriptionEventType.START_ENTITLEMENT)); // [x] ObjectType.BLOCKING_STATES + result.add(newSubsBundle(2 , "entitlement-service", SubscriptionEventType.START_BILLING)); // [x] ObjectType.SUBSCRIPTION_EVENT + result.add(newSubsBundle(2 , "A", SubscriptionEventType.PAUSE_ENTITLEMENT)); // [v] ObjectType.BLOCKING_STATES + result.add(newSubsBundle(2 , "B", SubscriptionEventType.CHANGE)); // [x] ObjectType.SUBSCRIPTION_EVENT + result.add(newSubsBundle(2 , "C", SubscriptionEventType.STOP_ENTITLEMENT)); // [v] ObjectType.BLOCKING_STATES + + return result; + } + + private SubscriptionBundle newSubsBundle(final int eventCount, final String serviceName, final SubscriptionEventType eventType) { + final List events = new ArrayList<>(); + if (eventCount <= 0) { + events.add(null); + } else { + for (int i = 0; i < eventCount; i++) { + events.add(newSubscriptionEvent(serviceName, eventType)); + } + } + + final SubscriptionBundleTimeline timeline = new SubscriptionBundleTimelineImp.Builder<>().withSubscriptionEvents(events).build(); + + return new SubscriptionBundleImp.Builder<>().withTimeline(timeline).build(); + } + + private SubscriptionEvent newSubscriptionEvent(final String serviceName, final SubscriptionEventType eventType) { + return new SubscriptionEventImp.Builder<>().withServiceName(serviceName).withSubscriptionEventType(eventType).build(); + } + } +} From f54bf896e352f245635dc157e9175a79af585adf Mon Sep 17 00:00:00 2001 From: xsalefter Date: Tue, 23 May 2023 02:33:33 +0700 Subject: [PATCH 4/9] use Java 8 stream in PluginProperties. read more in next paragraph When PluginProperties.buildPluginProperties() called, there's no guarantee that the first added map entry would be the first element of the List. When using guava's ImmutableMap, it's known that guava make its implementation "sorted", so this assertion will always valid. This will not the same with JDK map. For short: - "pluginProperties1.get(0).getKey()" using Guava's ImmutableMap.of() : Will always return "foo" - "pluginProperties1.get(0).getKey()" using JDK Map.of() : No guarantee. If someone wants to see old assertions, the commit hash is: 25abb935 --- .../billing/plugin/api/PluginProperties.java | 76 ++++++++----------- .../plugin/api/TestPluginProperties.java | 65 ++++++++-------- 2 files changed, 65 insertions(+), 76 deletions(-) diff --git a/src/main/java/org/killbill/billing/plugin/api/PluginProperties.java b/src/main/java/org/killbill/billing/plugin/api/PluginProperties.java index 8bf98b17..515b16ca 100644 --- a/src/main/java/org/killbill/billing/plugin/api/PluginProperties.java +++ b/src/main/java/org/killbill/billing/plugin/api/PluginProperties.java @@ -18,39 +18,41 @@ package org.killbill.billing.plugin.api; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.regex.Pattern; +import java.util.stream.Collectors; import javax.annotation.Nullable; import org.killbill.billing.payment.api.PluginProperty; import org.killbill.billing.plugin.util.http.UTF8UrlDecoder; +import org.killbill.commons.utils.Strings; +import org.killbill.commons.utils.collect.Iterables; -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Strings; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; -import com.google.common.collect.Maps; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; public abstract class PluginProperties { // Last one has precedence + @SafeVarargs public static Iterable merge(final Iterable... propertiesLists) { return buildPluginProperties(toMap(propertiesLists)); } // Last one has precedence - public static Iterable merge(@Nullable final Map data, final Iterable... propertiesLists) { + @SafeVarargs + public static Iterable merge(@Nullable final Map data, final Iterable... propertiesLists) { return merge(buildPluginProperties(data), merge(propertiesLists)); } // Last one has precedence + @SafeVarargs public static Map toMap(final Iterable... propertiesLists) { - final Map mergedProperties = new HashMap(); + final Map mergedProperties = new HashMap<>(); for (final Iterable propertiesList : propertiesLists) { if (propertiesList == null) { continue; @@ -65,14 +67,12 @@ public static Map toMap(final Iterable... proper } // Last one has precedence + @SafeVarargs public static Map toStringMap(final Iterable... propertiesLists) { - return Maps.transformValues(toMap(propertiesLists), - new Function() { - @Override - public String apply(final Object input) { - return input == null ? null : input.toString(); - } - }); + return toMap(propertiesLists) + .entrySet() + .stream() + .collect(Collectors.toMap(Entry::getKey, entry -> entry.getValue() == null ? null : entry.getValue().toString())); } // Return the value from the plugin properties if it exists, or the fallback otherwise @@ -86,13 +86,9 @@ public static String findPluginPropertyValue(final String pluginPropertyName, @N return null; } - final PluginProperty pluginProperty = Iterables.tryFind(properties, - new Predicate() { - @Override - public boolean apply(final PluginProperty input) { - return input != null && pluginPropertyName.equals(input.getKey()); - } - }).orNull(); + final PluginProperty pluginProperty = Iterables.toStream(properties) + .filter(input -> input != null && pluginPropertyName.equals(input.getKey())) + .findFirst().orElse(null); if (pluginProperty == null || pluginProperty.getValue() == null) { return null; @@ -111,13 +107,9 @@ public static Iterable findPluginProperties(final String key, @N return null; } - return Iterables.filter(properties, - new Predicate() { - @Override - public boolean apply(final PluginProperty input) { - return key != null && key.equals(input.getKey()); - } - }); + return Iterables.toStream(properties) + .filter(input -> key != null && input != null && key.equals(input.getKey())) + .collect(Collectors.toUnmodifiableSet()); } public static Iterable findPluginProperties(final Pattern keyPattern, @Nullable final Iterable properties) { @@ -125,26 +117,18 @@ public static Iterable findPluginProperties(final Pattern keyPat return null; } - return Iterables.filter(properties, - new Predicate() { - @Override - public boolean apply(final PluginProperty input) { - return input != null && keyPattern.matcher(input.getKey()).matches(); - } - }); + return Iterables.toStream(properties) + .filter(input -> keyPattern != null && input != null && keyPattern.matcher(input.getKey()).matches()) + .collect(Collectors.toUnmodifiableSet()); } @SuppressFBWarnings("WMI_WRONG_MAP_ITERATOR") - public static List buildPluginProperties(@Nullable final Map data) { - final ImmutableList.Builder propertiesBuilder = ImmutableList.builder(); - if (data != null) { - for (final Object key : data.keySet()) { - if (key != null) { - final PluginProperty property = new PluginProperty(key.toString(), data.get(key), false); - propertiesBuilder.add(property); - } - } + public static List buildPluginProperties(@Nullable final Map data) { + if (data == null || data.isEmpty()) { + return Collections.emptyList(); } - return propertiesBuilder.build(); + return data.entrySet().stream() + .map(entry -> new PluginProperty(entry.getKey().toString(), entry.getValue(), false)) + .collect(Collectors.toUnmodifiableList()); } } diff --git a/src/test/java/org/killbill/billing/plugin/api/TestPluginProperties.java b/src/test/java/org/killbill/billing/plugin/api/TestPluginProperties.java index 14ceed2b..1de969ec 100644 --- a/src/test/java/org/killbill/billing/plugin/api/TestPluginProperties.java +++ b/src/test/java/org/killbill/billing/plugin/api/TestPluginProperties.java @@ -18,38 +18,33 @@ package org.killbill.billing.plugin.api; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.regex.Pattern; +import java.util.stream.Collectors; import org.killbill.billing.payment.api.PluginProperty; +import org.killbill.commons.utils.collect.Iterables; import org.testng.Assert; import org.testng.annotations.Test; -import com.google.common.base.Function; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Ordering; - public class TestPluginProperties { - private final List pluginProperties1 = PluginProperties.buildPluginProperties(ImmutableMap.of("foo", "bar", - "baz", 12L)); - private final List pluginProperties2 = PluginProperties.buildPluginProperties(ImmutableMap.of("foo", "override", - "baz2", "something else")); + private final List pluginProperties1 = PluginProperties.buildPluginProperties(Map.of("foo", "bar", "baz", 12L)); + private final List pluginProperties2 = PluginProperties.buildPluginProperties(Map.of("foo", "override", "baz2", "something else")); private final String encodedPropertyValue = "%7B%22eventType%22%3A%22voidEvent%22%2C%22transactionType%22%3A%22void%22%2C%22contractType%22%3A%22temp%22%7D"; private final String decodedPropertyValue = "{\"eventType\":\"voidEvent\",\"transactionType\":\"void\",\"contractType\":\"temp\"}"; - private final List pluginProperties3 = PluginProperties.buildPluginProperties(ImmutableMap.of("foo", encodedPropertyValue)); + private final List pluginProperties3 = PluginProperties.buildPluginProperties(Map.of("foo", encodedPropertyValue)); @Test(groups = "fast") - public void testMerge() throws Exception { - final List pluginPropertiesRaw = ImmutableList.copyOf(PluginProperties.merge(pluginProperties1, pluginProperties2)); - - final List pluginProperties = sort(pluginPropertiesRaw); + public void testMerge() { + final List pluginProperties = sort(PluginProperties.merge(pluginProperties1, pluginProperties2)); Assert.assertEquals(pluginProperties.size(), 3); Assert.assertEquals(pluginProperties.get(0).getKey(), "baz"); - Assert.assertEquals(pluginProperties.get(0).getValue(), (Long) 12L); + Assert.assertEquals(pluginProperties.get(0).getValue(), 12L); Assert.assertFalse(pluginProperties.get(0).getIsUpdatable()); Assert.assertEquals(pluginProperties.get(1).getKey(), "baz2"); Assert.assertEquals(pluginProperties.get(1).getValue(), "something else"); @@ -58,16 +53,16 @@ public void testMerge() throws Exception { Assert.assertEquals(pluginProperties.get(2).getValue(), "override"); Assert.assertFalse(pluginProperties.get(2).getIsUpdatable()); - final List pluginPropertiesRaw2 = ImmutableList.copyOf(PluginProperties.merge(PluginProperties.toMap(pluginProperties1), pluginProperties2)); + final Iterable pluginPropertiesRaw2 = PluginProperties.merge(PluginProperties.toMap(pluginProperties1), pluginProperties2); Assert.assertEquals(sort(pluginPropertiesRaw2), pluginProperties); - final List pluginPropertiesRaw3 = ImmutableList.copyOf(PluginProperties.merge(PluginProperties.toMap(pluginProperties1), pluginProperties1, pluginProperties2)); + final Iterable pluginPropertiesRaw3 = PluginProperties.merge(PluginProperties.toMap(pluginProperties1), pluginProperties1, pluginProperties2); Assert.assertEquals(sort(pluginPropertiesRaw3), pluginProperties); - final List pluginPropertiesRaw4 = ImmutableList.copyOf(PluginProperties.merge(ImmutableMap.of(), pluginProperties1, pluginProperties2)); + final Iterable pluginPropertiesRaw4 = PluginProperties.merge(PluginProperties.merge(Collections.emptyMap(), pluginProperties1, pluginProperties2)); Assert.assertEquals(sort(pluginPropertiesRaw4), pluginProperties); - final List pluginPropertiesRaw5 = ImmutableList.copyOf(PluginProperties.merge((Map) null, pluginProperties1, pluginProperties2)); + final Iterable pluginPropertiesRaw5 = PluginProperties.merge((Map) null, pluginProperties1, pluginProperties2); Assert.assertEquals(sort(pluginPropertiesRaw5), pluginProperties); } @@ -128,24 +123,34 @@ public void testFindPluginPropertiesUsingPattern() throws Exception { } @Test(groups = "fast") - public void testBuildPluginProperties() throws Exception { + public void testBuildPluginProperties() { + Assert.assertEquals(pluginProperties1.size(), 2); + Assert.assertTrue(pluginProperties1.stream().anyMatch(i -> "foo".equals(i.getKey()))); + Assert.assertTrue(pluginProperties1.stream().anyMatch(i -> "baz".equals(i.getKey()))); + + Assert.assertTrue(pluginProperties1.stream().anyMatch(i -> "bar".equals(i.getValue()))); + Assert.assertTrue(pluginProperties1.stream().anyMatch(i -> i.getValue() != null && "12".equals(i.getValue().toString()))); + + // When PluginProperties.buildPluginProperties() called, there's no guarantee that the first added map entry + // would be the first element of the List. When using guava's ImmutableMap, it's known that guava make its + // implementation "sorted", so this assertion will always valid. This will not the same with JDK map. For short: + // - "pluginProperties1.get(0).getKey()" using Guava's ImmutableMap.of() : Will always return "foo" + // - "pluginProperties1.get(0).getKey()" using JDK Map.of() : No guarantee. + // + // Keep old assertion here just in case we need to rethink about this. + /* Assert.assertEquals(pluginProperties1.size(), 2); Assert.assertEquals(pluginProperties1.get(0).getKey(), "foo"); Assert.assertEquals(pluginProperties1.get(0).getValue(), "bar"); Assert.assertFalse(pluginProperties1.get(0).getIsUpdatable()); Assert.assertEquals(pluginProperties1.get(1).getKey(), "baz"); - Assert.assertEquals(pluginProperties1.get(1).getValue(), (Long) 12L); - Assert.assertFalse(pluginProperties1.get(1).getIsUpdatable()); + Assert.assertEquals(pluginProperties1.get(1).getValue(), 12L); + Assert.assertFalse(pluginProperties1.get(1).getIsUpdatable()); */ } private List sort(final Iterable pluginProperties) { - return Ordering.natural() - .onResultOf(new Function() { - @Override - public String apply(final PluginProperty pluginProperty) { - return pluginProperty.getKey(); - } - }) - .immutableSortedCopy(pluginProperties); + return Iterables.toStream(pluginProperties) + .sorted(Comparator.comparing(PluginProperty::getKey)) + .collect(Collectors.toUnmodifiableList()); } } From 1a0b56e3dde9f4217fac82b3a9d11b67ad1fc617 Mon Sep 17 00:00:00 2001 From: xsalefter Date: Tue, 23 May 2023 02:36:34 +0700 Subject: [PATCH 5/9] use killbill's MultiValueMap instead of guava's Multimap --- .../api/invoice/PluginTaxCalculator.java | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/killbill/billing/plugin/api/invoice/PluginTaxCalculator.java b/src/main/java/org/killbill/billing/plugin/api/invoice/PluginTaxCalculator.java index 5b1f166d..77d4e8b5 100644 --- a/src/main/java/org/killbill/billing/plugin/api/invoice/PluginTaxCalculator.java +++ b/src/main/java/org/killbill/billing/plugin/api/invoice/PluginTaxCalculator.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.Set; import java.util.UUID; @@ -37,23 +38,19 @@ import org.killbill.billing.invoice.api.InvoiceItemType; import org.killbill.billing.osgi.libs.killbill.OSGIKillbillAPI; import org.killbill.billing.util.callcontext.TenantContext; - -import com.google.common.base.MoreObjects; -import com.google.common.base.Preconditions; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Multimap; +import org.killbill.commons.utils.Preconditions; +import org.killbill.commons.utils.collect.MultiValueHashMap; +import org.killbill.commons.utils.collect.MultiValueMap; // This calculator implicitly assumes that tax items are not adjusted, only the taxable items are // (tax adjustments show up as negative TAX items, linked to the original taxable item). public abstract class PluginTaxCalculator { - public static final List TAXABLE_ITEM_TYPES = ImmutableList.of(InvoiceItemType.EXTERNAL_CHARGE, - InvoiceItemType.FIXED, - InvoiceItemType.RECURRING, - InvoiceItemType.USAGE); - public static final List ADJUSTMENT_ITEM_TYPES = ImmutableList.of(InvoiceItemType.ITEM_ADJ, - InvoiceItemType.REPAIR_ADJ); + public static final List TAXABLE_ITEM_TYPES = List.of(InvoiceItemType.EXTERNAL_CHARGE, + InvoiceItemType.FIXED, + InvoiceItemType.RECURRING, + InvoiceItemType.USAGE); + public static final List ADJUSTMENT_ITEM_TYPES = List.of(InvoiceItemType.ITEM_ADJ, InvoiceItemType.REPAIR_ADJ); protected final OSGIKillbillAPI osgiKillbillAPI; @@ -82,13 +79,13 @@ public List computeTaxItems(final Invoice invoice, // All taxable invoice item ids either on that invoice, or referenced to by that invoice (REPAIR_ADJ usecase) final Map allTaxableItems = new HashMap(); // Mapping of invoice item ids to their invoice item adjustment ids. In case of repair, keys may point to taxable items on previous invoices - final Multimap adjustmentsByLinkedId = HashMultimap.create(); + final MultiValueMap adjustmentsByLinkedId = new MultiValueHashMap<>(); for (final InvoiceItem invoiceItem : invoice.getInvoiceItems()) { allItems.put(invoiceItem.getId(), invoiceItem); if (isTaxableItem(invoiceItem)) { allTaxableItems.put(invoiceItem.getId(), invoiceItem); } else if (isAdjustmentItem(invoiceItem)) { - adjustmentsByLinkedId.put(invoiceItem.getLinkedItemId(), invoiceItem.getId()); + adjustmentsByLinkedId.putElement(invoiceItem.getLinkedItemId(), invoiceItem.getId()); } } @@ -135,7 +132,7 @@ public List computeTaxItems(final Invoice invoice, // Compute the difference between adjustments already taken into account and new ones final Set adjustmentsAlreadyTakenIntoAccount = alreadyTaxedItemsWithAdjustments == null ? null : alreadyTaxedItemsWithAdjustments.get(taxableItemId); - final Collection currentAdjustmentIdsForTaxableId = MoreObjects.firstNonNull(adjustmentsByLinkedId.get(taxableItemId), new LinkedList()); + final Collection currentAdjustmentIdsForTaxableId = Objects.requireNonNullElse(adjustmentsByLinkedId.get(taxableItemId), new LinkedList()); if (adjustmentsAlreadyTakenIntoAccount != null) { currentAdjustmentIdsForTaxableId.removeAll(adjustmentsAlreadyTakenIntoAccount); } @@ -195,12 +192,12 @@ protected InvoiceItem buildTaxItem(final InvoiceItem originalItem, adjustmentItem.getStartDate(), adjustmentItem.getEndDate(), amount, - MoreObjects.firstNonNull(description, "Tax")); + Objects.requireNonNullElse(description, "Tax")); } else { return PluginInvoiceItem.createTaxItem(originalItem, invoiceId, amount, - MoreObjects.firstNonNull(description, "Tax")); + Objects.requireNonNullElse(description, "Tax")); } } } From b96a470bd978264c879bdcb31e7c2865129fa853 Mon Sep 17 00:00:00 2001 From: xsalefter Date: Tue, 23 May 2023 02:39:44 +0700 Subject: [PATCH 6/9] remove guava dependency and add killbill-utils dependency --- pom.xml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 271fa5f9..88fac095 100644 --- a/pom.xml +++ b/pom.xml @@ -79,10 +79,6 @@ com.google.code.findbugs jsr305 - - com.google.guava - guava - com.typesafe config @@ -240,6 +236,11 @@ killbill-embeddeddb-postgresql test + + org.kill-bill.commons + killbill-utils + provided + org.kill-bill.testing testing-mysql-server From c8ffac9b34fb985907f880df260d4484838928cb Mon Sep 17 00:00:00 2001 From: xsalefter Date: Tue, 23 May 2023 03:21:59 +0700 Subject: [PATCH 7/9] update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 287eea68..bebd35c6 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ Convenience library to help write Kill Bill plugins. | 4.1.y | 0.22.z | | 4.2.y | 0.22.z | | 5.0.y | 0.24.z | +| 5.1.y | 0.24.z | We've upgraded numerous dependencies in 4.2.x (required for Java 11 support). From ff9cca62061da73e4a54c6d64149cb3e08c36eff Mon Sep 17 00:00:00 2001 From: xsalefter Date: Tue, 23 May 2023 03:22:26 +0700 Subject: [PATCH 8/9] NEWS: updates --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index e3587d0d..de1bca86 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,7 @@ +5.1.0 + Make java.net.http.HttpClient.Builder overridable + Remove all Guava classes and dependency + 4.2.15 Update killbill-oss-parent to 0.144.68 From c9ac1c6c1cc4ece8f8db84d8608c2de33b1daf86 Mon Sep 17 00:00:00 2001 From: xsalefter Date: Tue, 23 May 2023 03:22:57 +0700 Subject: [PATCH 9/9] update version and killbill-oss-parent version --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 88fac095..183d9a58 100644 --- a/pom.xml +++ b/pom.xml @@ -21,11 +21,11 @@ org.kill-bill.billing killbill-oss-parent - 0.146.10 + 0.146.11 org.kill-bill.billing.plugin.java killbill-base-plugin - 5.0.2-SNAPSHOT + 5.1.0-SNAPSHOT jar Kill Bill base OSGI plugin Kill Bill base OSGI plugin