diff --git a/cj-btc-json/build.gradle b/cj-btc-json/build.gradle index ac89bb0bf..c7d611148 100644 --- a/cj-btc-json/build.gradle +++ b/cj-btc-json/build.gradle @@ -1,13 +1,26 @@ +import net.ltgt.gradle.errorprone.CheckSeverity + plugins { id 'java-library' } +apply plugin: 'net.ltgt.errorprone' ext.moduleName = 'org.consensusj.bitcoin.json' dependencies { + api libs.jspecify api libs.bitcoinj.core api libs.jackson.core api libs.jackson.databind + + errorprone libs.errorprone.core +} + +tasks.withType(JavaCompile) { + options.errorprone { + check("NullAway", CheckSeverity.ERROR) + option("NullAway:OnlyNullMarked") + } } jar { diff --git a/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/conversion/RpcClientModule.java b/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/conversion/RpcClientModule.java index 24cd9d485..69aa1bbf8 100644 --- a/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/conversion/RpcClientModule.java +++ b/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/conversion/RpcClientModule.java @@ -24,6 +24,7 @@ import org.bitcoinj.crypto.ECKey; import org.bitcoinj.base.Sha256Hash; import org.bitcoinj.core.Transaction; +import org.jspecify.annotations.Nullable; import java.util.Objects; @@ -43,7 +44,7 @@ public RpcClientModule() { * @param network Which network we are going to be a client for (may be null if {@code strictAddressParsing} is false) * @param strictAddressParsing set to {@code true} to throw exceptions when deserializing addresses that don't match {@code network} */ - protected RpcClientModule(Network network, boolean strictAddressParsing) { + protected RpcClientModule(@Nullable Network network, boolean strictAddressParsing) { super("BitcoinJMappingClient", new Version(1, 0, 0, null, null, null)); this.addDeserializer(Address.class, strictAddressParsing ? new AddressDeserializer(Objects.requireNonNull(network)) : new AddressDeserializer()) diff --git a/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/conversion/package-info.java b/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/conversion/package-info.java index 838075b7a..9ab390321 100644 --- a/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/conversion/package-info.java +++ b/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/conversion/package-info.java @@ -16,4 +16,7 @@ /** * Jackson JSON serializers, deserializers, modules, and utilities. */ -package org.consensusj.bitcoin.json.conversion; \ No newline at end of file +@NullMarked +package org.consensusj.bitcoin.json.conversion; + +import org.jspecify.annotations.NullMarked; diff --git a/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/AddressGroupingItem.java b/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/AddressGroupingItem.java index e893a91ba..335104d12 100644 --- a/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/AddressGroupingItem.java +++ b/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/AddressGroupingItem.java @@ -19,6 +19,7 @@ import org.bitcoinj.base.Address; import org.bitcoinj.base.AddressParser; import org.bitcoinj.base.Coin; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -30,7 +31,7 @@ public class AddressGroupingItem { private static final AddressParser addressParser = AddressParser.getDefault(); private final Address address; private final Coin balance; - private final String account; + @Nullable private final String account; public AddressGroupingItem(Address address, Coin balance, String account) { this.address = address; @@ -57,6 +58,7 @@ public Coin getBalance() { return balance; } + @Nullable public String getAccount() { return account; } diff --git a/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/AddressInfo.java b/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/AddressInfo.java index 4e73b68a5..67e3f6820 100644 --- a/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/AddressInfo.java +++ b/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/AddressInfo.java @@ -21,6 +21,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.bitcoinj.base.Address; +import org.jspecify.annotations.Nullable; public class AddressInfo { private final Address address; @@ -35,6 +36,7 @@ public class AddressInfo { private final boolean iscompressed; private final String label; private final boolean ischange; + @Nullable private final Instant timestamp; private final List labels; diff --git a/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/RawTransactionInfo.java b/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/RawTransactionInfo.java index e6501afb3..09017f1bc 100644 --- a/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/RawTransactionInfo.java +++ b/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/RawTransactionInfo.java @@ -24,6 +24,7 @@ import org.bitcoinj.base.Coin; import org.bitcoinj.base.Sha256Hash; import org.bitcoinj.core.Transaction; +import org.jspecify.annotations.Nullable; import java.time.Instant; import java.util.ArrayList; @@ -33,7 +34,6 @@ /** * RawTransaction POJO */ -// "hash" property added (present in Bitcoin 0.13) public class RawTransactionInfo { private final String hex; private final Sha256Hash txid; @@ -41,6 +41,7 @@ public class RawTransactionInfo { private final LockTime lockTime; private final List vin; private final List vout; + @Nullable private final Sha256Hash blockhash; private final int confirmations; private final Instant time; @@ -130,6 +131,7 @@ public List getVout() { return vout; } + @Nullable public Sha256Hash getBlockhash() { return blockhash; } diff --git a/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/bitcore/package-info.java b/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/bitcore/package-info.java index 66801a942..a4104f3a6 100644 --- a/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/bitcore/package-info.java +++ b/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/bitcore/package-info.java @@ -21,4 +21,4 @@ *

* OmniCore PR #1180 */ -package org.consensusj.bitcoin.json.pojo.bitcore; \ No newline at end of file +package org.consensusj.bitcoin.json.pojo.bitcore; diff --git a/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/package-info.java b/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/package-info.java index 4b2f33f0f..134e57f2f 100644 --- a/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/package-info.java +++ b/cj-btc-json/src/main/java/org/consensusj/bitcoin/json/pojo/package-info.java @@ -16,4 +16,4 @@ /** * POJOs definitions for JSON objects */ -package org.consensusj.bitcoin.json.pojo; \ No newline at end of file +package org.consensusj.bitcoin.json.pojo; diff --git a/consensusj-jsonrpc/src/main/java/org/consensusj/jsonrpc/DefaultRpcClient.java b/consensusj-jsonrpc/src/main/java/org/consensusj/jsonrpc/DefaultRpcClient.java index 993bd72ed..b578a61df 100644 --- a/consensusj-jsonrpc/src/main/java/org/consensusj/jsonrpc/DefaultRpcClient.java +++ b/consensusj-jsonrpc/src/main/java/org/consensusj/jsonrpc/DefaultRpcClient.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -86,14 +87,14 @@ public interface TransportFactory { private final JavaType defaultType; private final JsonRpcTransport transport; - public DefaultRpcClient(URI server, final String rpcUser, final String rpcPassword) { + public DefaultRpcClient(URI server, @Nullable String rpcUser, @Nullable String rpcPassword) { this(JsonRpcTransport.getDefaultSSLContext(), DEFAULT_JSON_RPC_VERSION, server, rpcUser, rpcPassword); } - public DefaultRpcClient(JsonRpcMessage.Version jsonRpcVersion, URI server, final String rpcUser, final String rpcPassword) { + public DefaultRpcClient(JsonRpcMessage.Version jsonRpcVersion, URI server, @Nullable String rpcUser, @Nullable String rpcPassword) { this(JsonRpcTransport.getDefaultSSLContext(), jsonRpcVersion, server, rpcUser, rpcPassword); } - public DefaultRpcClient(SSLContext sslContext, JsonRpcMessage.Version jsonRpcVersion, URI server, final String rpcUser, final String rpcPassword) { + public DefaultRpcClient(SSLContext sslContext, JsonRpcMessage.Version jsonRpcVersion, URI server, @Nullable String rpcUser, @Nullable String rpcPassword) { this((m) -> new JsonRpcClientJavaNet(m, sslContext, server, rpcUser, rpcPassword), jsonRpcVersion); } diff --git a/consensusj-jsonrpc/src/main/java/org/consensusj/jsonrpc/JsonRpcClient.java b/consensusj-jsonrpc/src/main/java/org/consensusj/jsonrpc/JsonRpcClient.java index 46cc2eacb..9de11ff17 100644 --- a/consensusj-jsonrpc/src/main/java/org/consensusj/jsonrpc/JsonRpcClient.java +++ b/consensusj-jsonrpc/src/main/java/org/consensusj/jsonrpc/JsonRpcClient.java @@ -15,6 +15,8 @@ */ package org.consensusj.jsonrpc; +import org.jspecify.annotations.Nullable; + import java.io.IOException; import java.lang.reflect.Type; import java.util.Arrays; @@ -84,15 +86,15 @@ default CompletableFuture sendAsync(String method, List params) * @throws IOException network error * @throws JsonRpcStatusException JSON RPC status error */ - default Object send(String method, Object... params) throws IOException, JsonRpcStatusException { + default Object send(String method, @Nullable Object... params) throws IOException, JsonRpcStatusException { return send(method, Arrays.asList(params)); } - default R send(String method, Class resultType, Object... params) throws IOException, JsonRpcStatusException { + default R send(String method, Class resultType, @Nullable Object... params) throws IOException, JsonRpcStatusException { return send(method, resultType, Arrays.asList(params)); } - default CompletableFuture sendAsync(String method, Class resultType, Object... params) { + default CompletableFuture sendAsync(String method, Class resultType, @Nullable Object... params) { return sendAsync(method, resultType, Arrays.asList(params)); } @@ -132,11 +134,11 @@ default Object send(String method, T resultType, List params) throws IOE /** * Varargs version */ - default Object send(String method, T resultType, Object... params) throws IOException, JsonRpcStatusException { + default Object send(String method, T resultType, @Nullable Object... params) throws IOException, JsonRpcStatusException { return syncGet(sendRequestForResultAsync(buildJsonRequest(method, params), resultType)); } - default CompletableFuture sendAsync(String method, T resultType, Object... params) { + default CompletableFuture sendAsync(String method, T resultType, @Nullable Object... params) { return sendRequestForResultAsync(buildJsonRequest(method, params), resultType); } @@ -167,7 +169,7 @@ default JsonRpcRequest buildJsonRequest(String method, List params) { return new JsonRpcRequest(getJsonRpcVersion(), method, params); } - default JsonRpcRequest buildJsonRequest(String method, Object... params) { + default JsonRpcRequest buildJsonRequest(String method, @Nullable Object... params) { return new JsonRpcRequest(getJsonRpcVersion(), method, Arrays.asList(params)); } diff --git a/consensusj-jsonrpc/src/main/java/org/consensusj/jsonrpc/JsonRpcClientJavaNet.java b/consensusj-jsonrpc/src/main/java/org/consensusj/jsonrpc/JsonRpcClientJavaNet.java index 444136049..bfe27d2c3 100644 --- a/consensusj-jsonrpc/src/main/java/org/consensusj/jsonrpc/JsonRpcClientJavaNet.java +++ b/consensusj-jsonrpc/src/main/java/org/consensusj/jsonrpc/JsonRpcClientJavaNet.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +43,9 @@ public class JsonRpcClientJavaNet implements JsonRpcTransport { private final ObjectMapper mapper; private final URI serverURI; + @Nullable private final String username; + @Nullable private final String password; private final HttpClient client; private static final String UTF8 = StandardCharsets.UTF_8.name(); @@ -52,7 +55,7 @@ public JsonRpcClientJavaNet(ObjectMapper mapper, URI server, final String rpcUse this(mapper, JsonRpcTransport.getDefaultSSLContext(), server, rpcUser, rpcPassword); } - public JsonRpcClientJavaNet(ObjectMapper mapper, SSLContext sslContext, URI server, final String rpcUser, final String rpcPassword) { + public JsonRpcClientJavaNet(ObjectMapper mapper, SSLContext sslContext, URI server, @Nullable String rpcUser, @Nullable String rpcPassword) { log.debug("Constructing JSON-RPC client for: {}", server); this.mapper = mapper; this.serverURI = server;