From de2f4781be1ba56e9c537cb3d52ccb6de3e1ed0d Mon Sep 17 00:00:00 2001 From: Igor Fedoronchuk Date: Sun, 2 Aug 2026 18:56:38 +0200 Subject: [PATCH 1/2] refactor: replace generic SingletonRepository with BalanceRepository SingletonRepository had exactly one instantiation (Balance) anywhere in the codebase. A generic base existed for a single use site. --- src/main/java/com/didww/sdk/DidwwClient.java | 6 +++--- ...tonRepository.java => BalanceRepository.java} | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) rename src/main/java/com/didww/sdk/repository/{SingletonRepository.java => BalanceRepository.java} (63%) diff --git a/src/main/java/com/didww/sdk/DidwwClient.java b/src/main/java/com/didww/sdk/DidwwClient.java index ee969742..c957eae2 100644 --- a/src/main/java/com/didww/sdk/DidwwClient.java +++ b/src/main/java/com/didww/sdk/DidwwClient.java @@ -4,9 +4,9 @@ import com.didww.sdk.exception.DidwwClientException; import com.didww.sdk.http.ApiKeyInterceptor; import com.didww.sdk.http.JsonApiMediaType; +import com.didww.sdk.repository.BalanceRepository; import com.didww.sdk.repository.ReadOnlyRepository; import com.didww.sdk.repository.Repository; -import com.didww.sdk.repository.SingletonRepository; import com.didww.sdk.resource.*; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -129,8 +129,8 @@ public ReadOnlyRepository supportingDocumentTemplate } // Singleton repository - public SingletonRepository balance() { - return new SingletonRepository<>(httpClient, converter, baseUrl, "balance", Balance.class, objectMapper); + public BalanceRepository balance() { + return new BalanceRepository(httpClient, converter, baseUrl, "balance", objectMapper); } // CRUD repositories diff --git a/src/main/java/com/didww/sdk/repository/SingletonRepository.java b/src/main/java/com/didww/sdk/repository/BalanceRepository.java similarity index 63% rename from src/main/java/com/didww/sdk/repository/SingletonRepository.java rename to src/main/java/com/didww/sdk/repository/BalanceRepository.java index 983c4951..d95b9b10 100644 --- a/src/main/java/com/didww/sdk/repository/SingletonRepository.java +++ b/src/main/java/com/didww/sdk/repository/BalanceRepository.java @@ -2,6 +2,7 @@ import com.didww.sdk.exception.DidwwClientException; import com.didww.sdk.http.QueryParams; +import com.didww.sdk.resource.Balance; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.jasminb.jsonapi.JSONAPIDocument; import com.github.jasminb.jsonapi.ResourceConverter; @@ -10,26 +11,25 @@ import okhttp3.Request; import okhttp3.Response; -public class SingletonRepository extends ReadOnlyRepository { +public class BalanceRepository extends ReadOnlyRepository { - public SingletonRepository(OkHttpClient httpClient, ResourceConverter converter, - String baseUrl, String endpoint, Class resourceClass, - ObjectMapper objectMapper) { - super(httpClient, converter, baseUrl, endpoint, resourceClass, objectMapper); + public BalanceRepository(OkHttpClient httpClient, ResourceConverter converter, + String baseUrl, String endpoint, ObjectMapper objectMapper) { + super(httpClient, converter, baseUrl, endpoint, Balance.class, objectMapper); } - public ApiResponse find() { + public ApiResponse find() { return find((QueryParams) null); } - public ApiResponse find(QueryParams params) { + public ApiResponse find(QueryParams params) { String url = baseUrl + "/" + endpoint + (params != null ? params.toQueryString() : ""); Request request = new Request.Builder().url(url).get().build(); try (Response response = httpClient.newCall(request).execute()) { handleErrorResponse(response); byte[] body = getResponseBody(response); - JSONAPIDocument document = converter.readDocument(body, resourceClass); + JSONAPIDocument document = converter.readDocument(body, resourceClass); return new ApiResponse<>(document.get(), extractMeta(document)); } catch (IOException e) { throw new DidwwClientException("Failed to find " + endpoint, e); From 97a41fc029af741698302a45f7753779984c49fd Mon Sep 17 00:00:00 2001 From: Igor Fedoronchuk Date: Sun, 2 Aug 2026 19:13:08 +0200 Subject: [PATCH 2/2] refactor: use InputStream.transferTo for gzip decompression buffer copy Replace hand-rolled byte[8192] read/write loop in downloadAndDecompressExport with stdlib InputStream.transferTo (Java 9+, build targets 11). Tightened the existing end-to-end decompression test to assert exact output instead of partial contains() checks, pinning current behavior before the swap. --- src/main/java/com/didww/sdk/DidwwClient.java | 6 +----- src/test/java/com/didww/sdk/resource/ExportTest.java | 3 +-- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/didww/sdk/DidwwClient.java b/src/main/java/com/didww/sdk/DidwwClient.java index c957eae2..7cbe730f 100644 --- a/src/main/java/com/didww/sdk/DidwwClient.java +++ b/src/main/java/com/didww/sdk/DidwwClient.java @@ -327,11 +327,7 @@ public void downloadAndDecompressExport(String url, Path destination) { try (InputStream fis = Files.newInputStream(tempFile); InputStream gzis = new GZIPInputStream(fis); OutputStream out = Files.newOutputStream(destination)) { - byte[] buffer = new byte[8192]; - int len; - while ((len = gzis.read(buffer)) != -1) { - out.write(buffer, 0, len); - } + gzis.transferTo(out); } } catch (IOException e) { throw new DidwwClientException("Failed to download and decompress export", e); diff --git a/src/test/java/com/didww/sdk/resource/ExportTest.java b/src/test/java/com/didww/sdk/resource/ExportTest.java index 9c60e4c4..539e2472 100644 --- a/src/test/java/com/didww/sdk/resource/ExportTest.java +++ b/src/test/java/com/didww/sdk/resource/ExportTest.java @@ -159,8 +159,7 @@ void testDownloadAndDecompressExport() throws Exception { try { client.downloadAndDecompressExport(wireMock.baseUrl() + "/v3/exports/test-id.csv.gz", tempFile); String content = Files.readString(tempFile); - assertThat(content).contains("Date/Time Start (UTC)"); - assertThat(content).contains("972397239159652"); + assertThat(content).isEqualTo(csvContent); } finally { Files.deleteIfExists(tempFile); }