diff --git a/README.md b/README.md index 79e449f..3e61a43 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ # Open Payments Java SDK -[![CI](https://github.com/bonifacekabaso/open-payments-java/actions/workflows/ci.yml/badge.svg)](https://github.com/bonifacekabaso/open-payments-java/actions/workflows/ci.yml) -[![codecov](https://codecov.io/gh/bonifacekabaso/open-payments-java/branch/main/graph/badge.svg)](https://codecov.io/gh/bonifacekabaso/open-payments-java) +[![CI](https://github.com/boniface/open-payments-java/actions/workflows/ci.yml/badge.svg)](https://github.com/bonifacekabaso/open-payments-java/actions/workflows/ci.yml) +[![Security & Quality](https://img.shields.io/github/actions/workflow/status/boniface/open-payments-java/ci.yml?label=Security%20%26%20Quality&query=jobs.security-and-quality.conclusion)](https://github.com/bonifacekabaso/open-payments-java/actions/workflows/ci.yml) +[![JaCoCo](https://img.shields.io/badge/JaCoCo-Coverage-green.svg)](https://github.com/boniface/open-payments-java/actions/workflows/ci.yml) [![Java](https://img.shields.io/badge/Java-25-orange.svg)](https://openjdk.java.net/) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) [![Project Stage](https://img.shields.io/badge/Project%20Stage-Development-yellow.svg)]() @@ -34,12 +35,12 @@ graph TD ASE["Financial Accounts
(Ledger, Wallet, etc)"] subgraph SDK["Open Payments API Servers"] - + Auth["Authorization Server
(GNAP Protocol)"] Resource["Resource Server Payments
(Payment, Quotes...)"] Auth ~~~ Note Resource ~~~ Note - + Note["Operated by Account Service Entity (ASE)
(Bank, Wallet Provider, Payment Processor)"] end @@ -267,4 +268,3 @@ Licensed under the [Apache License 2.0](LICENSE). --- **Status**: 🚧 Under Development | **Version**: 1.0-SNAPSHOT | **Java**: 25+ - diff --git a/config/pmd/ruleset.xml b/config/pmd/ruleset.xml index 835f718..43a28ef 100644 --- a/config/pmd/ruleset.xml +++ b/config/pmd/ruleset.xml @@ -8,14 +8,12 @@ - - - - + + @@ -45,7 +43,6 @@ - diff --git a/src/main/java/zm/hashcode/openpayments/http/interceptor/AuthenticationInterceptor.java b/src/main/java/zm/hashcode/openpayments/http/interceptor/AuthenticationInterceptor.java index aebd00d..90ad63d 100644 --- a/src/main/java/zm/hashcode/openpayments/http/interceptor/AuthenticationInterceptor.java +++ b/src/main/java/zm/hashcode/openpayments/http/interceptor/AuthenticationInterceptor.java @@ -30,9 +30,7 @@ * client.addRequestInterceptor(gnap); * } */ -public final class AuthenticationInterceptor implements RequestInterceptor { - - private final String authorizationHeaderValue; +public record AuthenticationInterceptor(String authorizationHeaderValue) implements RequestInterceptor { /** * Creates an authentication interceptor with the given Authorization header value. @@ -40,9 +38,8 @@ public final class AuthenticationInterceptor implements RequestInterceptor { * @param authorizationHeaderValue * the full value for the Authorization header */ - private AuthenticationInterceptor(String authorizationHeaderValue) { - this.authorizationHeaderValue = Objects.requireNonNull(authorizationHeaderValue, - "authorizationHeaderValue must not be null"); + public AuthenticationInterceptor { + Objects.requireNonNull(authorizationHeaderValue, "authorizationHeaderValue must not be null"); } /** diff --git a/src/main/java/zm/hashcode/openpayments/http/interceptor/ErrorHandlingInterceptor.java b/src/main/java/zm/hashcode/openpayments/http/interceptor/ErrorHandlingInterceptor.java index 072d17b..65d241f 100644 --- a/src/main/java/zm/hashcode/openpayments/http/interceptor/ErrorHandlingInterceptor.java +++ b/src/main/java/zm/hashcode/openpayments/http/interceptor/ErrorHandlingInterceptor.java @@ -35,20 +35,18 @@ * client.addResponseInterceptor(errorHandler); * } */ -public final class ErrorHandlingInterceptor implements ResponseInterceptor { +public record ErrorHandlingInterceptor(ObjectMapper objectMapper) implements ResponseInterceptor { private static final Logger LOGGER = Logger.getLogger(ErrorHandlingInterceptor.class.getName()); - private final ObjectMapper objectMapper; - /** * Creates an error handling interceptor. * * @param objectMapper * the JSON object mapper for parsing error responses */ - public ErrorHandlingInterceptor(ObjectMapper objectMapper) { - this.objectMapper = Objects.requireNonNull(objectMapper, "objectMapper must not be null"); + public ErrorHandlingInterceptor { + Objects.requireNonNull(objectMapper, "objectMapper must not be null"); } @Override diff --git a/src/main/java/zm/hashcode/openpayments/http/interceptor/LoggingRequestInterceptor.java b/src/main/java/zm/hashcode/openpayments/http/interceptor/LoggingRequestInterceptor.java index a6e453d..16b66b1 100644 --- a/src/main/java/zm/hashcode/openpayments/http/interceptor/LoggingRequestInterceptor.java +++ b/src/main/java/zm/hashcode/openpayments/http/interceptor/LoggingRequestInterceptor.java @@ -20,14 +20,11 @@ * client.addRequestInterceptor(new LoggingRequestInterceptor()); * } */ -public final class LoggingRequestInterceptor implements RequestInterceptor { +public record LoggingRequestInterceptor(Level logLevel, boolean logHeaders, + boolean logBody) implements RequestInterceptor { private static final Logger LOGGER = Logger.getLogger(LoggingRequestInterceptor.class.getName()); - private final Level logLevel; - private final boolean logHeaders; - private final boolean logBody; - /** * Creates a logging interceptor with INFO level and headers logging enabled. */ diff --git a/src/main/java/zm/hashcode/openpayments/http/interceptor/LoggingResponseInterceptor.java b/src/main/java/zm/hashcode/openpayments/http/interceptor/LoggingResponseInterceptor.java index e09688d..f5c6d39 100644 --- a/src/main/java/zm/hashcode/openpayments/http/interceptor/LoggingResponseInterceptor.java +++ b/src/main/java/zm/hashcode/openpayments/http/interceptor/LoggingResponseInterceptor.java @@ -21,16 +21,12 @@ * client.addResponseInterceptor(new LoggingResponseInterceptor()); * } */ -public final class LoggingResponseInterceptor implements ResponseInterceptor { +public record LoggingResponseInterceptor(Level logLevel, Level errorLogLevel, boolean logHeaders, + boolean logBody) implements ResponseInterceptor { private static final Logger LOGGER = Logger.getLogger(LoggingResponseInterceptor.class.getName()); private static final int MAX_BODY_LOG_LENGTH = 1000; - private final Level logLevel; - private final Level errorLogLevel; - private final boolean logHeaders; - private final boolean logBody; - /** * Creates a logging interceptor with INFO level for success and WARNING for errors. */ diff --git a/src/main/java/zm/hashcode/openpayments/payment/incoming/DefaultIncomingPaymentService.java b/src/main/java/zm/hashcode/openpayments/payment/incoming/DefaultIncomingPaymentService.java index bb45a17..5104e74 100644 --- a/src/main/java/zm/hashcode/openpayments/payment/incoming/DefaultIncomingPaymentService.java +++ b/src/main/java/zm/hashcode/openpayments/payment/incoming/DefaultIncomingPaymentService.java @@ -27,16 +27,14 @@ *

* Thread-safe and can be reused across multiple requests. */ -public final class DefaultIncomingPaymentService implements IncomingPaymentService { +public record DefaultIncomingPaymentService(HttpClient httpClient, + ObjectMapper objectMapper) implements IncomingPaymentService { private static final String CONTENT_TYPE_JSON = "application/json"; private static final String ACCEPT_HEADER = "Accept"; private static final String INCOMING_PAYMENTS_PATH = "/incoming-payments"; private static final String COMPLETE_PATH = "/complete"; - private final HttpClient httpClient; - private final ObjectMapper objectMapper; - /** * Creates a new DefaultIncomingPaymentService. * @@ -47,9 +45,9 @@ public final class DefaultIncomingPaymentService implements IncomingPaymentServi * @throws NullPointerException * if any parameter is null */ - public DefaultIncomingPaymentService(HttpClient httpClient, ObjectMapper objectMapper) { - this.httpClient = Objects.requireNonNull(httpClient, "httpClient must not be null"); - this.objectMapper = Objects.requireNonNull(objectMapper, "objectMapper must not be null"); + public DefaultIncomingPaymentService { + Objects.requireNonNull(httpClient, "httpClient must not be null"); + Objects.requireNonNull(objectMapper, "objectMapper must not be null"); } @Override diff --git a/src/main/java/zm/hashcode/openpayments/payment/outgoing/DefaultOutgoingPaymentService.java b/src/main/java/zm/hashcode/openpayments/payment/outgoing/DefaultOutgoingPaymentService.java index 24e88d6..d149754 100644 --- a/src/main/java/zm/hashcode/openpayments/payment/outgoing/DefaultOutgoingPaymentService.java +++ b/src/main/java/zm/hashcode/openpayments/payment/outgoing/DefaultOutgoingPaymentService.java @@ -27,15 +27,13 @@ *

* Thread-safe and can be reused across multiple requests. */ -public final class DefaultOutgoingPaymentService implements OutgoingPaymentService { +public record DefaultOutgoingPaymentService(HttpClient httpClient, + ObjectMapper objectMapper) implements OutgoingPaymentService { private static final String CONTENT_TYPE_JSON = "application/json"; private static final String ACCEPT_HEADER = "Accept"; private static final String OUTGOING_PAYMENTS_PATH = "/outgoing-payments"; - private final HttpClient httpClient; - private final ObjectMapper objectMapper; - /** * Creates a new DefaultOutgoingPaymentService. * diff --git a/src/main/java/zm/hashcode/openpayments/payment/quote/DefaultQuoteService.java b/src/main/java/zm/hashcode/openpayments/payment/quote/DefaultQuoteService.java index 06e957d..c6acf98 100644 --- a/src/main/java/zm/hashcode/openpayments/payment/quote/DefaultQuoteService.java +++ b/src/main/java/zm/hashcode/openpayments/payment/quote/DefaultQuoteService.java @@ -25,15 +25,12 @@ *

* Thread-safe and can be reused across multiple requests. */ -public final class DefaultQuoteService implements QuoteService { +public record DefaultQuoteService(HttpClient httpClient, ObjectMapper objectMapper) implements QuoteService { private static final String CONTENT_TYPE_JSON = "application/json"; private static final String ACCEPT_HEADER = "Accept"; private static final String QUOTES_PATH = "/quotes"; - private final HttpClient httpClient; - private final ObjectMapper objectMapper; - /** * Creates a new DefaultQuoteService. * @@ -44,9 +41,9 @@ public final class DefaultQuoteService implements QuoteService { * @throws NullPointerException * if any parameter is null */ - public DefaultQuoteService(HttpClient httpClient, ObjectMapper objectMapper) { - this.httpClient = Objects.requireNonNull(httpClient, "httpClient must not be null"); - this.objectMapper = Objects.requireNonNull(objectMapper, "objectMapper must not be null"); + public DefaultQuoteService { + Objects.requireNonNull(httpClient, "httpClient must not be null"); + Objects.requireNonNull(objectMapper, "objectMapper must not be null"); } @Override diff --git a/src/main/java/zm/hashcode/openpayments/wallet/DefaultWalletAddressService.java b/src/main/java/zm/hashcode/openpayments/wallet/DefaultWalletAddressService.java index 4b7faaf..8f52e12 100644 --- a/src/main/java/zm/hashcode/openpayments/wallet/DefaultWalletAddressService.java +++ b/src/main/java/zm/hashcode/openpayments/wallet/DefaultWalletAddressService.java @@ -23,14 +23,12 @@ *

* Thread-safe and can be reused across multiple requests. */ -public final class DefaultWalletAddressService implements WalletAddressService { +public record DefaultWalletAddressService(HttpClient httpClient, + ObjectMapper objectMapper) implements WalletAddressService { private static final String CONTENT_TYPE_JSON = "application/json"; private static final String JWKS_PATH = "/jwks.json"; - private final HttpClient httpClient; - private final ObjectMapper objectMapper; - /** * Creates a new DefaultWalletAddressService. * @@ -41,9 +39,9 @@ public final class DefaultWalletAddressService implements WalletAddressService { * @throws NullPointerException * if any parameter is null */ - public DefaultWalletAddressService(HttpClient httpClient, ObjectMapper objectMapper) { - this.httpClient = Objects.requireNonNull(httpClient, "httpClient must not be null"); - this.objectMapper = Objects.requireNonNull(objectMapper, "objectMapper must not be null"); + public DefaultWalletAddressService { + Objects.requireNonNull(httpClient, "httpClient must not be null"); + Objects.requireNonNull(objectMapper, "objectMapper must not be null"); } @Override