From 406c021b8adfdc6ec1c9a086abae1f513600feb3 Mon Sep 17 00:00:00 2001 From: nyg Date: Sat, 29 Nov 2025 15:34:15 +0100 Subject: [PATCH] build(java)!: update to Java 25 --- .github/workflows/pr-build.yml | 2 +- README.md | 4 ++-- RELEASE.md | 7 ++++--- .../kraken/example/EoyBalanceExample.java | 2 +- .../andstuff/kraken/example/SimpleExamples.java | 2 +- .../example/StakingRewardsSummaryExample.java | 2 +- .../kraken/example/helper/CredentialsHelper.java | 2 +- .../account/csv/RecordMappingStrategy.java | 5 ++--- .../endpoint/account/response/LedgerEntry.java | 15 ++++++++++----- .../api/endpoint/account/response/Report.java | 13 +++++++++++-- .../kraken/api/rest/KrakenCredentials.java | 2 +- pom.xml | 2 +- 12 files changed, 36 insertions(+), 22 deletions(-) diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml index cf3211b..f3f9676 100644 --- a/.github/workflows/pr-build.yml +++ b/.github/workflows/pr-build.yml @@ -17,7 +17,7 @@ jobs: uses: actions/setup-java@v5 with: distribution: 'temurin' - java-version: '23' + java-version: '25' - name: Build pull request run: mvn clean package diff --git a/README.md b/README.md index 906a062..7f6f855 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ This example will generate the `eoy-balance.csv` file, showing the balance of yo mvn -pl examples exec:java -Dexec.mainClass=dev.andstuff.kraken.example.EoyBalanceExample -Dexec.args="2025-01-31T00:00:00Z" ``` -## Libary usage +## Library usage ### Public endpoints @@ -58,7 +58,7 @@ Map pairs = api.assetPairs(List.of("ETH/BTC", "ETH/USD")); // {ETH/BTC=AssetPair[alternateName=ETHXBT, webSocketName=ETH/XBT, … ``` -If the endpoint has not yet been implemented (feel free to submit a PR!), the generic `query` method can be used, which will return a `JsonNode` of the [Jackson][2] deserialization libary: +If the endpoint has not yet been implemented (feel free to submit a PR!), the generic `query` method can be used, which will return a `JsonNode` of the [Jackson][2] deserialization library: ```java JsonNode ticker = api.query(KrakenAPI.Public.TICKER, Map.of("pair", "XBTEUR")); diff --git a/RELEASE.md b/RELEASE.md index 81ed950..8f1d6ba 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -2,7 +2,8 @@ This document explains how a kraken-api-java release is created and describes what are the tools used and how they interact with each other. -When a release is created, the visible "output" is an updated [CHANGLOG.md](https://github.com/nyg/kraken-api-java/blob/master/CHANGELOG.md) file, a [GitHub release](https://github.com/nyg/kraken-api-java/releases) with a changelog, and the [release artifact](https://repo1.maven.org/maven2/dev/andstuff/kraken/kraken-api/) available in the Maven Central repository. +When a release is created, the visible "output" is an updated [CHANGELOG.md](https://github.com/nyg/kraken-api-java/blob/master/CHANGELOG.md) +file, a [GitHub release](https://github.com/nyg/kraken-api-java/releases) with a changelog, and the [release artifact](https://repo1.maven.org/maven2/dev/andstuff/kraken/kraken-api/) available in the Maven Central repository. ## Overview @@ -19,7 +20,7 @@ Also note that we do not use GitHub's own Maven repository, a.k.a. [GitHub Packa ## Detailed steps -The Maven release plugin helps automatizing certain tasks when making releases for Maven-based projects. Releasing requires invoking two of the plugin's goals: `prepare` and `perform`. +The Maven release plugin helps to automatize certain tasks when making releases for Maven-based projects. Releasing requires invoking two of the plugin's goals: `prepare` and `perform`. In short, the `prepare` goal updates version numbers in the POMs and creates a tag in the SCM (e.g. Git). The `perform` goal checks out the created tag, builds the project artifacts and publishes them on a remote Maven repository. @@ -47,7 +48,7 @@ The detailed list of steps executed by the prepare goal are defined [here](https 6. Create and push a commit with the changes made above. The message of the commit can be customized with the `scmDevelopmentCommitComment`. -The prepare goal also creates a `release.properties` file that is used by the `perform` goal in order to know which tag to checkout and build. +The prepare goal also creates a `release.properties` file that is used by the `perform` goal in order to know which tag to check out and build. Finally, when wanting to make a release, the command line looks like this: diff --git a/examples/src/main/java/dev/andstuff/kraken/example/EoyBalanceExample.java b/examples/src/main/java/dev/andstuff/kraken/example/EoyBalanceExample.java index 33a80b1..a19c3cb 100644 --- a/examples/src/main/java/dev/andstuff/kraken/example/EoyBalanceExample.java +++ b/examples/src/main/java/dev/andstuff/kraken/example/EoyBalanceExample.java @@ -27,7 +27,7 @@ public class EoyBalanceExample { private final KrakenAPI api; - public static void main(String[] args) { + static void main(String[] args) { KrakenCredentials credentials = readFromFile("/api-keys.properties"); Instant dateTo = Instant.parse(args.length > 1 ? args[1] : "2024-01-01T00:00:00Z"); new EoyBalanceExample(new KrakenAPI(credentials)) diff --git a/examples/src/main/java/dev/andstuff/kraken/example/SimpleExamples.java b/examples/src/main/java/dev/andstuff/kraken/example/SimpleExamples.java index b817c9e..fdb7e3c 100644 --- a/examples/src/main/java/dev/andstuff/kraken/example/SimpleExamples.java +++ b/examples/src/main/java/dev/andstuff/kraken/example/SimpleExamples.java @@ -19,7 +19,7 @@ @Slf4j public class SimpleExamples { - public static void main(String[] args) { + static void main() { /* Public endpoint examples */ diff --git a/examples/src/main/java/dev/andstuff/kraken/example/StakingRewardsSummaryExample.java b/examples/src/main/java/dev/andstuff/kraken/example/StakingRewardsSummaryExample.java index 3bb5618..4cd3a74 100644 --- a/examples/src/main/java/dev/andstuff/kraken/example/StakingRewardsSummaryExample.java +++ b/examples/src/main/java/dev/andstuff/kraken/example/StakingRewardsSummaryExample.java @@ -30,7 +30,7 @@ public class StakingRewardsSummaryExample { private final KrakenAPI api; - public static void main(String[] args) { + static void main() { KrakenCredentials credentials = readFromFile("/api-keys.properties"); new StakingRewardsSummaryExample(new KrakenAPI(credentials)) .generate("rewards.csv", "rewards-summary.csv"); diff --git a/examples/src/main/java/dev/andstuff/kraken/example/helper/CredentialsHelper.java b/examples/src/main/java/dev/andstuff/kraken/example/helper/CredentialsHelper.java index de1383a..468620a 100644 --- a/examples/src/main/java/dev/andstuff/kraken/example/helper/CredentialsHelper.java +++ b/examples/src/main/java/dev/andstuff/kraken/example/helper/CredentialsHelper.java @@ -19,7 +19,7 @@ public static KrakenCredentials readFromFile(String path) { return new KrakenCredentials(properties.getProperty("key"), properties.getProperty("secret")); } catch (IOException e) { - throw new IllegalStateException(String.format("Could not read properties from file: %s", path)); + throw new IllegalStateException("Could not read properties from file: %s".formatted(path), e); } } } diff --git a/library/src/main/java/dev/andstuff/kraken/api/endpoint/account/csv/RecordMappingStrategy.java b/library/src/main/java/dev/andstuff/kraken/api/endpoint/account/csv/RecordMappingStrategy.java index 407e898..d060e74 100644 --- a/library/src/main/java/dev/andstuff/kraken/api/endpoint/account/csv/RecordMappingStrategy.java +++ b/library/src/main/java/dev/andstuff/kraken/api/endpoint/account/csv/RecordMappingStrategy.java @@ -12,7 +12,6 @@ import com.opencsv.bean.AbstractCsvConverter; import com.opencsv.bean.HeaderColumnNameMappingStrategy; import com.opencsv.exceptions.CsvBeanIntrospectionException; -import com.opencsv.exceptions.CsvChainedException; import com.opencsv.exceptions.CsvConstraintViolationException; import com.opencsv.exceptions.CsvDataTypeMismatchException; import com.opencsv.exceptions.CsvFieldAssignmentException; @@ -29,7 +28,7 @@ public RecordMappingStrategy(Class type) { } @Override - public T populateNewBean(String[] line) throws CsvBeanIntrospectionException, CsvFieldAssignmentException, CsvChainedException { + public T populateNewBean(String[] line) throws CsvBeanIntrospectionException, CsvFieldAssignmentException { RecordComponent[] recordComponents = type.getRecordComponents(); if (recordComponents.length != line.length) { throw new CsvRuntimeException("Mismatch between line values and record components"); @@ -71,7 +70,7 @@ private Map createValuesMap(String[] line) throws CsvConstraintV public static class KrakenInstantConverter extends AbstractCsvConverter { @Override - public Object convertToRead(String value) throws CsvDataTypeMismatchException, CsvConstraintViolationException { + public Object convertToRead(String value) { String[] dateTime = value.split(" "); return Instant.parse("%sT%sZ".formatted(dateTime[0], dateTime[1])); } diff --git a/library/src/main/java/dev/andstuff/kraken/api/endpoint/account/response/LedgerEntry.java b/library/src/main/java/dev/andstuff/kraken/api/endpoint/account/response/LedgerEntry.java index 730d9f1..a65f158 100644 --- a/library/src/main/java/dev/andstuff/kraken/api/endpoint/account/response/LedgerEntry.java +++ b/library/src/main/java/dev/andstuff/kraken/api/endpoint/account/response/LedgerEntry.java @@ -82,11 +82,16 @@ public enum Type { TRANSFER, WITHDRAWAL, - @JsonProperty("custodytransfer") CUSTODY_TRANSFER, - @JsonProperty("nftcreatorfee") NFT_CREATOR_FEE, - @JsonProperty("nftrebate") NFT_REBATE, - @JsonProperty("nfttrade") NFT_TRADE, + @JsonProperty("custodytransfer") + CUSTODY_TRANSFER, + @JsonProperty("nftcreatorfee") + NFT_CREATOR_FEE, + @JsonProperty("nftrebate") + NFT_REBATE, + @JsonProperty("nfttrade") + NFT_TRADE, - @JsonEnumDefaultValue UNKNOWN + @JsonEnumDefaultValue + UNKNOWN } } diff --git a/library/src/main/java/dev/andstuff/kraken/api/endpoint/account/response/Report.java b/library/src/main/java/dev/andstuff/kraken/api/endpoint/account/response/Report.java index af7787e..5737350 100644 --- a/library/src/main/java/dev/andstuff/kraken/api/endpoint/account/response/Report.java +++ b/library/src/main/java/dev/andstuff/kraken/api/endpoint/account/response/Report.java @@ -2,6 +2,7 @@ import java.time.Instant; +import com.fasterxml.jackson.annotation.JsonEnumDefaultValue; import com.fasterxml.jackson.annotation.JsonProperty; import dev.andstuff.kraken.api.endpoint.account.params.ReportFormat; @@ -10,7 +11,7 @@ public record Report(String id, @JsonProperty("descr") String description, ReportFormat format, String subType, - String status, // TODO enum + Status status, String fields, @JsonProperty("createdtm") Instant requestDate, @JsonProperty("starttm") Instant creationDate, @@ -19,7 +20,15 @@ public record Report(String id, @JsonProperty("dataendtm") Instant reportToDate, String asset) { + enum Status { + QUEUED, + PROCESSING, + PROCESSED, + @JsonEnumDefaultValue + UNKNOWN + } + public boolean isProcessed() { - return "Processed".equals(status); + return status == Status.PROCESSED; } } diff --git a/library/src/main/java/dev/andstuff/kraken/api/rest/KrakenCredentials.java b/library/src/main/java/dev/andstuff/kraken/api/rest/KrakenCredentials.java index 551b262..576b9a2 100644 --- a/library/src/main/java/dev/andstuff/kraken/api/rest/KrakenCredentials.java +++ b/library/src/main/java/dev/andstuff/kraken/api/rest/KrakenCredentials.java @@ -49,7 +49,7 @@ public static byte[] hmacSha512(byte[] key, byte[] message) { return mac.doFinal(message); } catch (InvalidKeyException | NoSuchAlgorithmException e) { - throw new IllegalStateException("Could not compute HMAC digest"); + throw new IllegalStateException("Could not compute HMAC digest", e); } } diff --git a/pom.xml b/pom.xml index 9197a7f..7e9c5d5 100644 --- a/pom.xml +++ b/pom.xml @@ -132,7 +132,7 @@ maven-compiler-plugin ${maven-compiler-plugin.version} - 23 + 25 org.projectlombok