diff --git a/api/build.gradle b/api/build.gradle index 30e9f7b2..517670be 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -14,8 +14,7 @@ dependencies { testAnnotationProcessor project(':pallet:pallet-codegen') - testImplementation 'ch.qos.logback:logback-classic:1.2.11' - testImplementation 'org.testcontainers:testcontainers:1.17.1' - testImplementation 'org.testcontainers:junit-jupiter:1.17.1' + testImplementation 'org.testcontainers:testcontainers:1.17.2' + testImplementation 'org.testcontainers:junit-jupiter:1.17.2' testImplementation 'org.awaitility:awaitility:4.2.0' } \ No newline at end of file diff --git a/build.gradle b/build.gradle index a53b1cbf..e8804dd4 100644 --- a/build.gradle +++ b/build.gradle @@ -23,17 +23,17 @@ subprojects { sourceCompatibility = '1.8' dependencies { - implementation 'com.google.guava:guava:30.1.1-jre' - implementation 'org.slf4j:slf4j-api:1.7.32' + implementation 'com.google.guava:guava:31.1-jre' + implementation 'org.slf4j:slf4j-api:1.7.36' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' testImplementation 'org.junit.jupiter:junit-jupiter-params:5.8.2' - testImplementation 'org.assertj:assertj-core:3.22.0' - testImplementation 'org.mockito:mockito-core:3.12.4' - testImplementation 'org.mockito:mockito-inline:3.12.4' - testImplementation 'org.slf4j:slf4j-simple:1.7.32' + testImplementation 'org.assertj:assertj-core:3.23.1' + testImplementation 'org.mockito:mockito-core:4.6.1' + testImplementation 'org.mockito:mockito-inline:4.6.1' + testImplementation 'org.slf4j:slf4j-simple:1.7.36' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.2' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2' } test { diff --git a/pallet/build.gradle b/pallet/build.gradle index 07e06440..f850ded4 100644 --- a/pallet/build.gradle +++ b/pallet/build.gradle @@ -10,7 +10,6 @@ dependencies { testAnnotationProcessor project(':rpc:rpc-codegen') - testImplementation 'org.testcontainers:testcontainers:1.17.1' - testImplementation 'org.testcontainers:junit-jupiter:1.17.1' - testImplementation 'ch.qos.logback:logback-classic:1.2.11' + testImplementation 'org.testcontainers:testcontainers:1.17.2' + testImplementation 'org.testcontainers:junit-jupiter:1.17.2' } \ No newline at end of file diff --git a/pallet/pallet-codegen/src/main/java/com/strategyobject/substrateclient/pallet/codegen/Constants.java b/pallet/pallet-codegen/src/main/java/com/strategyobject/substrateclient/pallet/codegen/Constants.java index 8f2564d7..7d1fd405 100644 --- a/pallet/pallet-codegen/src/main/java/com/strategyobject/substrateclient/pallet/codegen/Constants.java +++ b/pallet/pallet-codegen/src/main/java/com/strategyobject/substrateclient/pallet/codegen/Constants.java @@ -3,8 +3,6 @@ class Constants { static final String STATE = "state"; static final String CLASS_NAME_TEMPLATE = "%sImpl"; - static final String SCALE_READER_REGISTRY = "scaleReaderRegistry"; - static final String SCALE_WRITER_REGISTRY = "scaleWriterRegistry"; static final String STORAGE_FACTORY_METHOD = "with"; static final String STORAGE_KEY_PROVIDER_FACTORY_METHOD = "of"; static final String STORAGE_KEY_PROVIDER_ADD_HASHERS = "use"; diff --git a/pallet/pallet-codegen/src/main/java/com/strategyobject/substrateclient/pallet/codegen/StorageProcessor.java b/pallet/pallet-codegen/src/main/java/com/strategyobject/substrateclient/pallet/codegen/StorageProcessor.java index ca1d58e4..9dae149c 100644 --- a/pallet/pallet-codegen/src/main/java/com/strategyobject/substrateclient/pallet/codegen/StorageProcessor.java +++ b/pallet/pallet-codegen/src/main/java/com/strategyobject/substrateclient/pallet/codegen/StorageProcessor.java @@ -19,8 +19,6 @@ import com.strategyobject.substrateclient.scale.codegen.ScaleAnnotationParser; import com.strategyobject.substrateclient.scale.codegen.reader.ReaderCompositor; import com.strategyobject.substrateclient.scale.codegen.writer.WriterCompositor; -import com.strategyobject.substrateclient.scale.registries.ScaleReaderRegistry; -import com.strategyobject.substrateclient.scale.registries.ScaleWriterRegistry; import lombok.NonNull; import lombok.val; import lombok.var; @@ -104,15 +102,9 @@ private MethodSpec backFieldInitializer(String palletName, .addAnnotation(suppressWarnings("unchecked", "rawtypes")) .returns(TypeName.get(returnType)); - declareReaderAndWriterRegistries(methodSpecBuilder); - val scaleAnnotationParser = new ScaleAnnotationParser(context); - val readerCompositor = ReaderCompositor.disallowOpenGeneric( - context, - SCALE_READER_REGISTRY); - val writerCompositor = WriterCompositor.disallowOpenGeneric( - context, - SCALE_WRITER_REGISTRY); + val readerCompositor = ReaderCompositor.disallowOpenGeneric(context); + val writerCompositor = WriterCompositor.disallowOpenGeneric(context); assignStorageMapImpl(methodSpecBuilder, palletName, @@ -432,10 +424,4 @@ private void ensureNameIsSet(ExecutableElement method, AnnotationMirror storageA method.getSimpleName()); } } - - private void declareReaderAndWriterRegistries(MethodSpec.Builder methodSpecBuilder) { - methodSpecBuilder - .addStatement("$1T $2L = $1T.getInstance()", ScaleReaderRegistry.class, SCALE_READER_REGISTRY) - .addStatement("$1T $2L = $1T.getInstance()", ScaleWriterRegistry.class, SCALE_WRITER_REGISTRY); - } } diff --git a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/Blake2B128ConcatTests.java b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/Blake2B128ConcatTests.java index 5cc48f58..dc416691 100644 --- a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/Blake2B128ConcatTests.java +++ b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/Blake2B128ConcatTests.java @@ -42,7 +42,7 @@ private static Stream getTestCasesForGetHash() { @SuppressWarnings("unchecked") private static byte[] decode(Class type, T value) { val buf = new ByteArrayOutputStream(); - ((ScaleWriter) ScaleWriterRegistry.getInstance().resolve(type)).write(value, buf); + ((ScaleWriter) ScaleWriterRegistry.resolve(type)).write(value, buf); return buf.toByteArray(); } diff --git a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/IdentityTests.java b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/IdentityTests.java index 11304829..cbe3dd8f 100644 --- a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/IdentityTests.java +++ b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/IdentityTests.java @@ -29,7 +29,7 @@ private static Stream getTestCasesForGetHash() { @SuppressWarnings("unchecked") private static byte[] encode(Class type, T value) { val buf = new ByteArrayOutputStream(); - ((ScaleWriter) ScaleWriterRegistry.getInstance().resolve(type)).write(value, buf); + ((ScaleWriter) ScaleWriterRegistry.resolve(type)).write(value, buf); return buf.toByteArray(); } diff --git a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/KeyHasherTests.java b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/KeyHasherTests.java index 03b6b7aa..336299b7 100644 --- a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/KeyHasherTests.java +++ b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/KeyHasherTests.java @@ -29,8 +29,8 @@ private static Stream getTestCasesForGetHash() { return Stream.of( Arguments.of( 10, - ScaleReaderRegistry.getInstance().resolve(Integer.class), - ScaleWriterRegistry.getInstance().resolve(Integer.class), + ScaleReaderRegistry.resolve(Integer.class), + ScaleWriterRegistry.resolve(Integer.class), TwoX64Concat.getInstance(), "0xa6b274250e6753f00a000000" ), @@ -39,15 +39,15 @@ private static Stream getTestCasesForGetHash() { SS58Codec.decode( "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty") .getAddress()), - ScaleReaderRegistry.getInstance().resolve(AccountId.class), - ScaleWriterRegistry.getInstance().resolve(AccountId.class), + ScaleReaderRegistry.resolve(AccountId.class), + ScaleWriterRegistry.resolve(AccountId.class), Blake2B128Concat.getInstance(), "0x4f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48" ), Arguments.of( Hash256.fromBytes(HexConverter.toBytes("0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")), - ScaleReaderRegistry.getInstance().resolve(BlockHash.class), - ScaleWriterRegistry.getInstance().resolve(BlockHash.class), + ScaleReaderRegistry.resolve(BlockHash.class), + ScaleWriterRegistry.resolve(BlockHash.class), Identity.getInstance(), "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" ) @@ -60,8 +60,8 @@ private static Stream getTestCasesForExtractKey() { new ByteArrayInputStream( HexConverter.toBytes("0x5153cb1f00942ff401000000") ), - ScaleReaderRegistry.getInstance().resolve(Integer.class), - ScaleWriterRegistry.getInstance().resolve(Integer.class), + ScaleReaderRegistry.resolve(Integer.class), + ScaleWriterRegistry.resolve(Integer.class), TwoX64Concat.getInstance(), 1, 0 @@ -70,8 +70,8 @@ private static Stream getTestCasesForExtractKey() { new ByteArrayInputStream( HexConverter.toBytes("0x969e061847da7e84337ea78dc577cd1d05000000") ), - ScaleReaderRegistry.getInstance().resolve(Integer.class), - ScaleWriterRegistry.getInstance().resolve(Integer.class), + ScaleReaderRegistry.resolve(Integer.class), + ScaleWriterRegistry.resolve(Integer.class), Blake2B128Concat.getInstance(), 5, 0 @@ -90,8 +90,8 @@ private static Stream getTestCasesForExtractKey() { new ByteArrayInputStream( HexConverter.toBytes("0x") ), - ScaleReaderRegistry.getInstance().resolve(Void.class), - ScaleWriterRegistry.getInstance().resolve(Void.class), + ScaleReaderRegistry.resolve(Void.class), + ScaleWriterRegistry.resolve(Void.class), Identity.getInstance(), null, 0 @@ -101,8 +101,8 @@ private static Stream getTestCasesForExtractKey() { HexConverter.toBytes("0x4f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48" + "a6b274250e6753f00a000000") ), - ScaleReaderRegistry.getInstance().resolve(AccountId.class), - ScaleWriterRegistry.getInstance().resolve(AccountId.class), + ScaleReaderRegistry.resolve(AccountId.class), + ScaleWriterRegistry.resolve(AccountId.class), Blake2B128Concat.getInstance(), AccountId.fromBytes( SS58Codec.decode( @@ -113,8 +113,8 @@ private static Stream getTestCasesForExtractKey() { Arguments.of( new ByteArrayInputStream( HexConverter.toBytes("0xabcdef98765432100123456789abcdefabcdef98765432100123456789abcdef")), - ScaleReaderRegistry.getInstance().resolve(BlockHash.class), - ScaleWriterRegistry.getInstance().resolve(BlockHash.class), + ScaleReaderRegistry.resolve(BlockHash.class), + ScaleWriterRegistry.resolve(BlockHash.class), Identity.getInstance(), Hash256.fromBytes(HexConverter.toBytes("0xabcdef98765432100123456789abcdefabcdef98765432100123456789abcdef")), 0 @@ -122,8 +122,8 @@ private static Stream getTestCasesForExtractKey() { Arguments.of( new ByteArrayInputStream( HexConverter.toBytes("0x518366b5b1bc7c99d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d")), - ScaleReaderRegistry.getInstance().resolve(BlockHash.class), - ScaleWriterRegistry.getInstance().resolve(BlockHash.class), + ScaleReaderRegistry.resolve(BlockHash.class), + ScaleWriterRegistry.resolve(BlockHash.class), TwoX64Concat.getInstance(), AccountId.fromBytes( SS58Codec.decode( diff --git a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageDoubleMapImplTests.java b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageDoubleMapImplTests.java index 1cffdbb7..7a09305f 100644 --- a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageDoubleMapImplTests.java +++ b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageDoubleMapImplTests.java @@ -38,13 +38,13 @@ void societyVotes() throws Exception { val state = RpcGeneratedSectionFactory.create(State.class, wsProvider); val storage = StorageDoubleMapImpl.with( state, - (ScaleReader) ScaleReaderRegistry.getInstance().resolve(Void.class), + (ScaleReader) ScaleReaderRegistry.resolve(Void.class), StorageKeyProvider.of("Society", "Votes") - .use(KeyHasher.with((ScaleWriter) ScaleWriterRegistry.getInstance().resolve(AccountId.class), - (ScaleReader) ScaleReaderRegistry.getInstance().resolve(AccountId.class), + .use(KeyHasher.with((ScaleWriter) ScaleWriterRegistry.resolve(AccountId.class), + (ScaleReader) ScaleReaderRegistry.resolve(AccountId.class), TwoX64Concat.getInstance()), - KeyHasher.with((ScaleWriter) ScaleWriterRegistry.getInstance().resolve(AccountId.class), - (ScaleReader) ScaleReaderRegistry.getInstance().resolve(AccountId.class), + KeyHasher.with((ScaleWriter) ScaleWriterRegistry.resolve(AccountId.class), + (ScaleReader) ScaleReaderRegistry.resolve(AccountId.class), TwoX64Concat.getInstance()))); val alice = AccountId.fromBytes( SS58Codec.decode( diff --git a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageKeyProviderTests.java b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageKeyProviderTests.java index 3baaa0cc..54e71da9 100644 --- a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageKeyProviderTests.java +++ b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageKeyProviderTests.java @@ -45,8 +45,8 @@ private static Stream getTestCasesForGetBySingleKey() { Arguments.of("System", "BlockHash", KeyHasher.with( - (ScaleWriter) ScaleWriterRegistry.getInstance().resolve(Integer.class), - (ScaleReader) ScaleReaderRegistry.getInstance().resolve(Integer.class), + (ScaleWriter) ScaleWriterRegistry.resolve(Integer.class), + (ScaleReader) ScaleReaderRegistry.resolve(Integer.class), TwoX64Concat.getInstance() ), 2, @@ -59,12 +59,12 @@ private static Stream getTestCasesForGetBySingleKey() { @SuppressWarnings({"unchecked", "SameParameterValue"}) private static ScaleReader resolveReader(Class clazz) { - return (ScaleReader) ScaleReaderRegistry.getInstance().resolve(clazz); + return (ScaleReader) ScaleReaderRegistry.resolve(clazz); } @SuppressWarnings({"unchecked", "SameParameterValue"}) private static ScaleWriter resolveWriter(Class clazz) { - return (ScaleWriter) ScaleWriterRegistry.getInstance().resolve(clazz); + return (ScaleWriter) ScaleWriterRegistry.resolve(clazz); } private static Stream getTestCasesForGetByDoubleKey() { diff --git a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageMapImplTests.java b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageMapImplTests.java index bcf1f6c1..e20edf64 100644 --- a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageMapImplTests.java +++ b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageMapImplTests.java @@ -38,10 +38,10 @@ void systemBlockHash() throws Exception { val state = RpcGeneratedSectionFactory.create(State.class, wsProvider); val storage = StorageMapImpl.with( state, - (ScaleReader) ScaleReaderRegistry.getInstance().resolve(BlockHash.class), + (ScaleReader) ScaleReaderRegistry.resolve(BlockHash.class), StorageKeyProvider.of("System", "BlockHash") - .use(KeyHasher.with((ScaleWriter) ScaleWriterRegistry.getInstance().resolve(Integer.class), - (ScaleReader) ScaleReaderRegistry.getInstance().resolve(Integer.class), + .use(KeyHasher.with((ScaleWriter) ScaleWriterRegistry.resolve(Integer.class), + (ScaleReader) ScaleReaderRegistry.resolve(Integer.class), TwoX64Concat.getInstance()))); val actual = storage.get(0).get(); diff --git a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageNMapImplTests.java b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageNMapImplTests.java index 638f8732..d7061445 100644 --- a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageNMapImplTests.java +++ b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageNMapImplTests.java @@ -47,10 +47,10 @@ class StorageNMapImplTests { private static StorageNMapImpl newSystemBlockHashStorage(State state) { return StorageNMapImpl.with( state, - (ScaleReader) ScaleReaderRegistry.getInstance().resolve(BlockHash.class), + (ScaleReader) ScaleReaderRegistry.resolve(BlockHash.class), StorageKeyProvider.of("System", "BlockHash") - .use(KeyHasher.with((ScaleWriter) ScaleWriterRegistry.getInstance().resolve(BlockNumber.class), - (ScaleReader) ScaleReaderRegistry.getInstance().resolve(BlockNumber.class), + .use(KeyHasher.with((ScaleWriter) ScaleWriterRegistry.resolve(BlockNumber.class), + (ScaleReader) ScaleReaderRegistry.resolve(BlockNumber.class), TwoX64Concat.getInstance()))); } @@ -97,7 +97,7 @@ void multiToDifferentStorages() throws Exception { val state = RpcGeneratedSectionFactory.create(State.class, wsProvider); val storageValue = StorageNMapImpl.with( state, - ScaleReaderRegistry.getInstance().resolve(AccountId.class), + ScaleReaderRegistry.resolve(AccountId.class), StorageKeyProvider.of("Sudo", "Key")); val storageMap = newSystemBlockHashStorage(state); diff --git a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageValueImplTests.java b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageValueImplTests.java index c933faf6..151cc2d8 100644 --- a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageValueImplTests.java +++ b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/StorageValueImplTests.java @@ -41,7 +41,7 @@ void sudoKey() throws Exception { val state = RpcGeneratedSectionFactory.create(State.class, wsProvider); val storage = StorageValueImpl.with( state, - ScaleReaderRegistry.getInstance().resolve(AccountId.class), + ScaleReaderRegistry.resolve(AccountId.class), StorageKeyProvider.of("Sudo", "Key")); val actual = storage.get().get(); @@ -68,7 +68,7 @@ void sudoKeyAtGenesis() throws Exception { val blockHash = chain.getBlockHash(BlockNumber.GENESIS).get(); val storage = StorageValueImpl.with( state, - ScaleReaderRegistry.getInstance().resolve(AccountId.class), + ScaleReaderRegistry.resolve(AccountId.class), StorageKeyProvider.of("Sudo", "Key")); val actual = storage.at(blockHash).get(); diff --git a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/TwoX64ConcatTests.java b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/TwoX64ConcatTests.java index e4e2e8a4..c063bab7 100644 --- a/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/TwoX64ConcatTests.java +++ b/pallet/src/test/java/com/strategyobject/substrateclient/pallet/storage/TwoX64ConcatTests.java @@ -55,7 +55,7 @@ private static Stream getTestCasesForGetHash() { @SuppressWarnings("unchecked") private static byte[] decode(Class type, T value) { val buf = new ByteArrayOutputStream(); - ((ScaleWriter) ScaleWriterRegistry.getInstance().resolve(type)).write(value, buf); + ((ScaleWriter) ScaleWriterRegistry.resolve(type)).write(value, buf); return buf.toByteArray(); } diff --git a/rpc/rpc-api/build.gradle b/rpc/rpc-api/build.gradle index e23e265e..2b1cfdb9 100644 --- a/rpc/rpc-api/build.gradle +++ b/rpc/rpc-api/build.gradle @@ -12,8 +12,7 @@ dependencies { testAnnotationProcessor project(':scale:scale-codegen') - testImplementation 'ch.qos.logback:logback-classic:1.2.11' - testImplementation 'org.testcontainers:testcontainers:1.17.1' - testImplementation 'org.testcontainers:junit-jupiter:1.17.1' + testImplementation 'org.testcontainers:testcontainers:1.17.2' + testImplementation 'org.testcontainers:junit-jupiter:1.17.2' testImplementation 'org.awaitility:awaitility:4.2.0' } \ No newline at end of file diff --git a/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/AddressKindWriter.java b/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/AddressKindWriter.java index c041b7c5..bd7bcc0c 100644 --- a/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/AddressKindWriter.java +++ b/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/AddressKindWriter.java @@ -16,6 +16,6 @@ public class AddressKindWriter implements ScaleWriter { public void write(@NonNull AddressKind value, @NonNull OutputStream stream, ScaleWriter... writers) throws IOException { Preconditions.checkArgument(writers == null || writers.length == 0); - ((ScaleWriter) ScaleWriterRegistry.getInstance().resolve(byte.class)).write(value.getValue(), stream); + ((ScaleWriter) ScaleWriterRegistry.resolve(byte.class)).write(value.getValue(), stream); } } diff --git a/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/BlockNumberU32Reader.java b/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/BlockNumberU32Reader.java index f434a580..8fbe51c4 100644 --- a/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/BlockNumberU32Reader.java +++ b/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/BlockNumberU32Reader.java @@ -18,7 +18,7 @@ public class BlockNumberU32Reader implements ScaleReader { public BlockNumber read(@NonNull InputStream stream, ScaleReader... readers) throws IOException { Preconditions.checkArgument(readers == null || readers.length == 0); - val u32Reader = (ScaleReader) ScaleReaderRegistry.getInstance().resolve(ScaleType.U32.class); + val u32Reader = (ScaleReader) ScaleReaderRegistry.resolve(ScaleType.U32.class); return BlockNumber.of(u32Reader.read(stream)); } } diff --git a/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/BlockNumberU32Writer.java b/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/BlockNumberU32Writer.java index 0faf830f..4adca3f5 100644 --- a/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/BlockNumberU32Writer.java +++ b/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/BlockNumberU32Writer.java @@ -17,7 +17,7 @@ public class BlockNumberU32Writer implements ScaleWriter { public void write(@NonNull BlockNumber value, @NonNull OutputStream stream, ScaleWriter... writers) throws IOException { Preconditions.checkArgument(writers == null || writers.length == 0); - ((ScaleWriter) ScaleWriterRegistry.getInstance().resolve(ScaleType.U32.class)) + ((ScaleWriter) ScaleWriterRegistry.resolve(ScaleType.U32.class)) .write(value.getValue().longValue(), stream); } } diff --git a/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/ExtrinsicStatusDecoder.java b/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/ExtrinsicStatusDecoder.java index 2a8472b9..6b7e6e16 100644 --- a/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/ExtrinsicStatusDecoder.java +++ b/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/ExtrinsicStatusDecoder.java @@ -39,7 +39,7 @@ protected ExtrinsicStatus decodeNonNull(RpcObject value, DecoderPair[] decode .filter(e -> STATUS_TO_CLASS.containsKey(e.getKey())) .findFirst() .map(e -> - (ExtrinsicStatus) RpcDecoderRegistry.getInstance() + (ExtrinsicStatus) RpcDecoderRegistry .resolve(STATUS_TO_CLASS.get(e.getKey())) .decode(value) ); diff --git a/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/ExtrinsicWriter.java b/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/ExtrinsicWriter.java index c83ff061..4e2d2f69 100644 --- a/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/ExtrinsicWriter.java +++ b/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/ExtrinsicWriter.java @@ -31,7 +31,7 @@ public void write(@NonNull Extrinsic value, @SuppressWarnings("unchecked") private void wrapToVec(ByteArrayOutputStream encodedExtrinsic, OutputStream stream) throws IOException { - ((ScaleWriter) ScaleWriterRegistry.getInstance().resolve(ScaleType.CompactInteger.class)) + ((ScaleWriter) ScaleWriterRegistry.resolve(ScaleType.CompactInteger.class)) .write(encodedExtrinsic.size(), stream); stream.write(encodedExtrinsic.toByteArray()); @@ -39,7 +39,7 @@ private void wrapToVec(ByteArrayOutputStream encodedExtrinsic, OutputStream stre @SuppressWarnings("unchecked") private void writeExtrinsic(Extrinsic value, ByteArrayOutputStream stream) throws IOException { - val u8Writer = (ScaleWriter) ScaleWriterRegistry.getInstance().resolve(ScaleType.U8.class); + val u8Writer = (ScaleWriter) ScaleWriterRegistry.resolve(ScaleType.U8.class); val maybeSignature = value.getSignature(); if (maybeSignature.isPresent()) { u8Writer.write(VERSION | 0b1000_0000, stream); diff --git a/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/SignatureKindWriter.java b/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/SignatureKindWriter.java index 7734cf6b..57d408db 100644 --- a/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/SignatureKindWriter.java +++ b/rpc/rpc-api/src/main/java/com/strategyobject/substrateclient/rpc/api/SignatureKindWriter.java @@ -16,6 +16,6 @@ public class SignatureKindWriter implements ScaleWriter { public void write(@NonNull SignatureKind value, @NonNull OutputStream stream, ScaleWriter... writers) throws IOException { Preconditions.checkArgument(writers == null || writers.length == 0); - ((ScaleWriter) ScaleWriterRegistry.getInstance().resolve(byte.class)).write(value.getValue(), stream); + ((ScaleWriter) ScaleWriterRegistry.resolve(byte.class)).write(value.getValue(), stream); } } diff --git a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/Constants.java b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/Constants.java index bb90a7d7..6fbb4d57 100644 --- a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/Constants.java +++ b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/Constants.java @@ -27,12 +27,6 @@ public class Constants { public static final String DECODERS_ARG = "decoders"; public static final String ENCODERS_ARG = "encoders"; - public static final String ENCODER_REGISTRY = "encoderRegistry"; - public static final String DECODER_REGISTRY = "decoderRegistry"; - - public static final String SCALE_WRITER_REGISTRY = "scaleWriterRegistry"; - public static final String SCALE_READER_REGISTRY = "scaleReaderRegistry"; - private Constants() { } } diff --git a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/decoder/DecoderCompositor.java b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/decoder/DecoderCompositor.java index dd72aae6..b29fb436 100644 --- a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/decoder/DecoderCompositor.java +++ b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/decoder/DecoderCompositor.java @@ -7,8 +7,10 @@ import com.strategyobject.substrateclient.rpc.DecoderPair; import com.strategyobject.substrateclient.rpc.RpcDecoder; import com.strategyobject.substrateclient.rpc.RpcRegistryHelper; +import com.strategyobject.substrateclient.rpc.registries.RpcDecoderRegistry; import com.strategyobject.substrateclient.scale.ScaleReader; import com.strategyobject.substrateclient.scale.ScaleRegistryHelper; +import com.strategyobject.substrateclient.scale.registries.ScaleReaderRegistry; import lombok.NonNull; import lombok.var; @@ -24,17 +26,13 @@ public class DecoderCompositor extends TypeTraverser { private final String decoderAccessor; private final String readerAccessor; private final String readerMethod; - private final String decoderRegistryVarName; - private final String scaleRegistryVarName; private final TypeMirror arrayType; public DecoderCompositor(@NonNull ProcessorContext context, @NonNull Map typeVarMap, @NonNull String decoderAccessor, @NonNull String readerAccessor, - @NonNull String readerMethod, - @NonNull String decoderRegistryVarName, - @NonNull String scaleRegistryVarName) { + @NonNull String readerMethod) { super(CodeBlock.class); this.context = context; @@ -42,8 +40,6 @@ public DecoderCompositor(@NonNull ProcessorContext context, this.decoderAccessor = decoderAccessor; this.readerAccessor = readerAccessor; this.readerMethod = readerMethod; - this.decoderRegistryVarName = decoderRegistryVarName; - this.scaleRegistryVarName = scaleRegistryVarName; this.arrayType = context.erasure(context.getType(Array.class)); } @@ -60,9 +56,9 @@ private CodeBlock getTypeVarCodeBlock(TypeVariable type) { private CodeBlock getNonGenericCodeBlock(TypeMirror type) { return CodeBlock.builder() .add("$T.$L(", DecoderPair.class, PAIR_FACTORY_METHOD) - .add("($T) $L.resolve($T.class)", RpcDecoder.class, decoderRegistryVarName, type) + .add("($T) $T.resolve($T.class)", RpcDecoder.class, RpcDecoderRegistry.class, type) .add(", ") - .add("($T) $L.resolve($T.class)", ScaleReader.class, scaleRegistryVarName, type) + .add("($T) $T.resolve($T.class)", ScaleReader.class, ScaleReaderRegistry.class, type) .add(")") .build(); } diff --git a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/decoder/RpcDecoderAnnotatedClass.java b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/decoder/RpcDecoderAnnotatedClass.java index d8dd7d8a..d4feb92a 100644 --- a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/decoder/RpcDecoderAnnotatedClass.java +++ b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/decoder/RpcDecoderAnnotatedClass.java @@ -102,8 +102,6 @@ private MethodSpec generateDecodeMethod(ProcessorContext context, TypeName class private void addMethodBody(MethodSpec.Builder methodSpec, ProcessorContext context) throws ProcessingException { val resultType = JavaPoet.setEachGenericParameterAs(classElement, TypeName.OBJECT); methodSpec - .addStatement("$1T $2L = $1T.getInstance()", RpcDecoderRegistry.class, DECODER_REGISTRY) - .addStatement("$1T $2L = $1T.getInstance()", ScaleReaderRegistry.class, SCALE_READER_REGISTRY) .addStatement("$T<$T, $T> $L = $L.asMap()", Map.class, String.class, RpcObject.class, MAP_VAR, VALUE_ARG) .addStatement("$1T $2L = new $1T()", resultType, RESULT_VAR) .beginControlFlow("try"); @@ -123,15 +121,12 @@ private void setFields(MethodSpec.Builder methodSpec, ProcessorContext context) typeVarMap, String.format("%s[$L].%s", DECODERS_ARG, DECODER_UNSAFE_ACCESSOR), String.format("%s[$L].%s", DECODERS_ARG, READER_UNSAFE_ACCESSOR), - READER_UNSAFE_ACCESSOR, - DECODER_REGISTRY, - SCALE_READER_REGISTRY); + READER_UNSAFE_ACCESSOR); val scaleAnnotationParser = new ScaleAnnotationParser(context); val scaleReaderCompositor = ReaderCompositor.forAnyType( context, typeVarMap, - String.format("%s[$L].%s", DECODERS_ARG, READER_ACCESSOR), - SCALE_READER_REGISTRY); + String.format("%s[$L].%s", DECODERS_ARG, READER_ACCESSOR)); for (VariableElement field : fields) { if (field.getAnnotation(Ignore.class) != null) { diff --git a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/encoder/EncoderCompositor.java b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/encoder/EncoderCompositor.java index e794a1e0..17927195 100644 --- a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/encoder/EncoderCompositor.java +++ b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/encoder/EncoderCompositor.java @@ -7,8 +7,10 @@ import com.strategyobject.substrateclient.rpc.EncoderPair; import com.strategyobject.substrateclient.rpc.RpcEncoder; import com.strategyobject.substrateclient.rpc.RpcRegistryHelper; +import com.strategyobject.substrateclient.rpc.registries.RpcEncoderRegistry; import com.strategyobject.substrateclient.scale.ScaleRegistryHelper; import com.strategyobject.substrateclient.scale.ScaleWriter; +import com.strategyobject.substrateclient.scale.registries.ScaleWriterRegistry; import lombok.NonNull; import lombok.val; import lombok.var; @@ -25,17 +27,13 @@ public class EncoderCompositor extends TypeTraverser { private final String encoderAccessor; private final String writerAccessor; private final String writerMethod; - private final String encoderRegistryVarName; - private final String scaleRegistryVarName; private final TypeMirror arrayType; public EncoderCompositor(@NonNull ProcessorContext context, @NonNull Map typeVarMap, @NonNull String encoderAccessor, @NonNull String writerAccessor, - @NonNull String writerMethod, - @NonNull String encoderRegistryVarName, - @NonNull String scaleRegistryVarName) { + @NonNull String writerMethod) { super(CodeBlock.class); this.context = context; this.typeVarMap = typeVarMap; @@ -43,21 +41,19 @@ public EncoderCompositor(@NonNull ProcessorContext context, this.encoderAccessor = encoderAccessor; this.writerAccessor = writerAccessor; this.writerMethod = writerMethod; - this.encoderRegistryVarName = encoderRegistryVarName; - this.scaleRegistryVarName = scaleRegistryVarName; this.arrayType = context.erasure(context.getType(Array.class)); } private CodeBlock getNonGenericCodeBlock(TypeMirror type) { return CodeBlock.builder() .add("$T.$L(($T) ", EncoderPair.class, PAIR_FACTORY_METHOD, RpcEncoder.class) - .add("$L.resolve($T.class)", - encoderRegistryVarName, + .add("$T.resolve($T.class)", + RpcEncoderRegistry.class, context.isAssignable(type, selfEncodable) ? selfEncodable : type) .add(", ($T) ", ScaleWriter.class) - .add("$L.resolve($T.class)", scaleRegistryVarName, type) + .add("$T.resolve($T.class)", ScaleWriterRegistry.class, type) .add(")") .build(); } @@ -94,7 +90,7 @@ protected CodeBlock whenTypeVar(@NonNull TypeVariable type, TypeMirror _override .add("$T.$L(($T) ", EncoderPair.class, PAIR_FACTORY_METHOD, RpcEncoder.class); if (context.isAssignable(type, selfEncodable)) { - builder.add("$L.resolve($T.class)", encoderRegistryVarName, selfEncodable); + builder.add("$T.resolve($T.class)", RpcEncoderRegistry.class, selfEncodable); } else { builder.add(encoderAccessor, typeVarMap.get(type.toString())); } diff --git a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/encoder/RpcEncoderAnnotatedClass.java b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/encoder/RpcEncoderAnnotatedClass.java index e968ce54..d84c66a2 100644 --- a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/encoder/RpcEncoderAnnotatedClass.java +++ b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/encoder/RpcEncoderAnnotatedClass.java @@ -101,8 +101,6 @@ private MethodSpec generateEncodeMethod(ProcessorContext context, TypeName class private void addMethodBody(MethodSpec.Builder methodSpec, ProcessorContext context) throws ProcessingException { methodSpec - .addStatement("$1T $2L = $1T.getInstance()", RpcEncoderRegistry.class, ENCODER_REGISTRY) - .addStatement("$1T $2L = $1T.getInstance()", ScaleWriterRegistry.class, SCALE_WRITER_REGISTRY) .addStatement("$1T<$2T, $3T> $4L = new $1T<>()", HashMap.class, String.class, Object.class, RESULT_VAR) .beginControlFlow("try"); @@ -120,14 +118,12 @@ private void setFields(MethodSpec.Builder methodSpec, ProcessorContext context) typeVarMap, String.format("%s[$L].%s", ENCODERS_ARG, ENCODER_UNSAFE_ACCESSOR), String.format("%s[$L].%s", ENCODERS_ARG, WRITER_UNSAFE_ACCESSOR), - WRITER_UNSAFE_ACCESSOR, - ENCODER_REGISTRY, - SCALE_WRITER_REGISTRY); + WRITER_UNSAFE_ACCESSOR + ); val scaleAnnotationParser = new ScaleAnnotationParser(context); val scaleWriterCompositor = WriterCompositor.forAnyType(context, typeVarMap, - String.format("%s[$L].%s", ENCODERS_ARG, WRITER_ACCESSOR), - SCALE_WRITER_REGISTRY); + String.format("%s[$L].%s", ENCODERS_ARG, WRITER_ACCESSOR)); for (VariableElement field : fields) { if (field.getAnnotation(Ignore.class) != null) { diff --git a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/sections/RpcCallProcessor.java b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/sections/RpcCallProcessor.java index 5491fbca..9f61ea31 100644 --- a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/sections/RpcCallProcessor.java +++ b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/sections/RpcCallProcessor.java @@ -54,11 +54,10 @@ protected void callProviderInterface(MethodSpec.Builder methodSpecBuilder, val rpcMethodName = String.format(RPC_METHOD_NAME_TEMPLATE, section, annotation.value()); val paramsArgument = method.getParameters().isEmpty() ? "" : String.format(", %s", PARAMS_VAR); - val isReturnVoid = isReturnVoid(method, context); val code = CodeBlock.builder() .add("return $L.$L($S$L).$L(", PROVIDER_INTERFACE, SEND, rpcMethodName, paramsArgument, THEN_APPLY_ASYNC); - if (isReturnVoid) { + if (returnsVoid(method, context)) { code.add("$L -> null", CALL_BACK_ARG); } else { code @@ -70,11 +69,6 @@ protected void callProviderInterface(MethodSpec.Builder methodSpecBuilder, methodSpecBuilder.addStatement(code.build()); } - @Override - protected boolean useDecodeRegistries(ExecutableElement method, ProcessorContext context) { - return !isReturnVoid(method, context); - } - @Override protected boolean shouldBePassedToProvider(ExecutableElement method, VariableElement param, ProcessorContext context) { return true; @@ -101,7 +95,7 @@ protected void ensureMethodHasAppropriateReturnType(ExecutableElement method, } } - private boolean isReturnVoid(ExecutableElement method, ProcessorContext context) { + private boolean returnsVoid(ExecutableElement method, ProcessorContext context) { val futureParameter = getFutureParameter(method); return context.isSameType(futureParameter, context.getType(Void.class)); diff --git a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/sections/RpcMethodProcessor.java b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/sections/RpcMethodProcessor.java index 347d3aee..e4be95f7 100644 --- a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/sections/RpcMethodProcessor.java +++ b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/sections/RpcMethodProcessor.java @@ -9,8 +9,6 @@ import com.strategyobject.substrateclient.rpc.RpcDecoder; import com.strategyobject.substrateclient.rpc.codegen.decoder.DecoderCompositor; import com.strategyobject.substrateclient.rpc.codegen.encoder.EncoderCompositor; -import com.strategyobject.substrateclient.rpc.registries.RpcDecoderRegistry; -import com.strategyobject.substrateclient.rpc.registries.RpcEncoderRegistry; import com.strategyobject.substrateclient.scale.ScaleReader; import com.strategyobject.substrateclient.scale.ScaleUtils; import com.strategyobject.substrateclient.scale.ScaleWriter; @@ -19,8 +17,6 @@ import com.strategyobject.substrateclient.scale.codegen.ScaleAnnotationParser; import com.strategyobject.substrateclient.scale.codegen.reader.ReaderCompositor; import com.strategyobject.substrateclient.scale.codegen.writer.WriterCompositor; -import com.strategyobject.substrateclient.scale.registries.ScaleReaderRegistry; -import com.strategyobject.substrateclient.scale.registries.ScaleWriterRegistry; import lombok.NonNull; import lombok.val; @@ -93,10 +89,6 @@ private void sendRequest(MethodSpec.Builder methodSpecBuilder, A annotation, ScaleAnnotationParser scaleAnnotationParser, ProcessorContext context) { - if (useDecodeRegistries(method, context)) { - declareDecoderAndReaderRegistries(methodSpecBuilder); - } - callProviderInterface(methodSpecBuilder, method, section, @@ -128,9 +120,7 @@ private CodeBlock getRpcDecodeCodeBlock(TypeMirror resultType, String arg, Proce EMPTY_TYPE_VAR_MAP, String.format("%s[$L].%s", DECODERS_ARG, DECODER_UNSAFE_ACCESSOR), String.format("%s[$L].%s", DECODERS_ARG, READER_UNSAFE_ACCESSOR), - READER_UNSAFE_ACCESSOR, - DECODER_REGISTRY, - SCALE_READER_REGISTRY); + READER_UNSAFE_ACCESSOR); val decodeCode = decoderCompositor.traverse(resultType); @@ -147,8 +137,7 @@ private CodeBlock getScaleReadCodeBlock(AnnotatedConstruct annotated, String arg, ScaleAnnotationParser scaleAnnotationParser, ProcessorContext context) { - val readerCompositor = ReaderCompositor.disallowOpenGeneric(context, - SCALE_READER_REGISTRY); + val readerCompositor = ReaderCompositor.disallowOpenGeneric(context); val typeOverride = scaleAnnotationParser.parse(annotated); val readerCode = typeOverride != null ? readerCompositor.traverse(resultType, typeOverride) : @@ -163,8 +152,6 @@ private CodeBlock getScaleReadCodeBlock(AnnotatedConstruct annotated, .build(); } - protected abstract boolean useDecodeRegistries(ExecutableElement method, ProcessorContext context); - private void processParameters(MethodSpec.Builder methodSpecBuilder, ExecutableElement method, ScaleAnnotationParser scaleAnnotationParser, @@ -175,25 +162,21 @@ private void processParameters(MethodSpec.Builder methodSpecBuilder, return; } - val writerCompositor = WriterCompositor.disallowOpenGeneric(context, - SCALE_WRITER_REGISTRY); + val writerCompositor = WriterCompositor.disallowOpenGeneric(context); val encoderCompositor = new EncoderCompositor( context, EMPTY_TYPE_VAR_MAP, String.format("%s[$L].%s", ENCODERS_ARG, ENCODER_UNSAFE_ACCESSOR), String.format("%s[$L].%s", ENCODERS_ARG, WRITER_UNSAFE_ACCESSOR), - WRITER_UNSAFE_ACCESSOR, - ENCODER_REGISTRY, - SCALE_WRITER_REGISTRY); + WRITER_UNSAFE_ACCESSOR + ); methodSpecBuilder .addStatement("$1T<$2T> $3L = new $4T<$2T>()", List.class, Object.class, PARAMS_VAR, - ArrayList.class) - .addStatement("$1T $2L = $1T.getInstance()", RpcEncoderRegistry.class, ENCODER_REGISTRY) - .addStatement("$1T $2L = $1T.getInstance()", ScaleWriterRegistry.class, SCALE_WRITER_REGISTRY); + ArrayList.class); for (val param : method.getParameters()) { try { @@ -262,12 +245,6 @@ private CodeBlock getRpcEncodeCodeBlock(VariableElement param, protected abstract void onParametersVisited(ExecutableElement method) throws ProcessingException; - private void declareDecoderAndReaderRegistries(MethodSpec.Builder methodSpecBuilder) { - methodSpecBuilder - .addStatement("$1T $2L = $1T.getInstance()", RpcDecoderRegistry.class, DECODER_REGISTRY) - .addStatement("$1T $2L = $1T.getInstance()", ScaleReaderRegistry.class, SCALE_READER_REGISTRY); - } - protected abstract void ensureMethodHasAppropriateReturnType(ExecutableElement method, TypeMirror returnType, ProcessorContext context) throws ProcessingException; protected abstract void ensureAnnotationIsFilled(ExecutableElement method, A annotation) throws ProcessingException; diff --git a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/sections/RpcSubscriptionProcessor.java b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/sections/RpcSubscriptionProcessor.java index e65ca641..0fb17ff4 100644 --- a/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/sections/RpcSubscriptionProcessor.java +++ b/rpc/rpc-codegen/src/main/java/com/strategyobject/substrateclient/rpc/codegen/sections/RpcSubscriptionProcessor.java @@ -93,11 +93,6 @@ protected void callProviderInterface(MethodSpec.Builder methodSpecBuilder, .build()); } - @Override - protected boolean useDecodeRegistries(ExecutableElement method, ProcessorContext context) { - return !isCallbackResultVoid(context); - } - @Override protected boolean shouldBePassedToProvider(ExecutableElement method, VariableElement param, ProcessorContext context) throws ProcessingException { val paramType = param.asType(); diff --git a/rpc/rpc-codegen/src/test/java/com/strategyobject/substrateclient/rpc/codegen/decoder/RpcDecoderProcessorTests.java b/rpc/rpc-codegen/src/test/java/com/strategyobject/substrateclient/rpc/codegen/decoder/RpcDecoderProcessorTests.java index d3dea00a..9b97887b 100644 --- a/rpc/rpc-codegen/src/test/java/com/strategyobject/substrateclient/rpc/codegen/decoder/RpcDecoderProcessorTests.java +++ b/rpc/rpc-codegen/src/test/java/com/strategyobject/substrateclient/rpc/codegen/decoder/RpcDecoderProcessorTests.java @@ -2,8 +2,8 @@ import com.google.gson.Gson; import com.google.testing.compile.JavaFileObjects; -import com.strategyobject.substrateclient.rpc.codegen.substitutes.TestDecodable; import com.strategyobject.substrateclient.rpc.DecoderPair; +import com.strategyobject.substrateclient.rpc.codegen.substitutes.TestDecodable; import com.strategyobject.substrateclient.rpc.registries.RpcDecoderRegistry; import com.strategyobject.substrateclient.transport.RpcObject; import lombok.val; @@ -56,9 +56,8 @@ void compiles() { @Test void compilesAndDecodes() { // TODO move this test out of the project - val registry = RpcDecoderRegistry.getInstance(); - val decoder = registry.resolve(TestDecodable.class) - .inject(DecoderPair.of(registry.resolve(String.class), null)); + val decoder = RpcDecoderRegistry.resolve(TestDecodable.class) + .inject(DecoderPair.of(RpcDecoderRegistry.resolve(String.class), null)); /* { diff --git a/rpc/rpc-codegen/src/test/java/com/strategyobject/substrateclient/rpc/codegen/encoder/RpcEncoderProcessorTests.java b/rpc/rpc-codegen/src/test/java/com/strategyobject/substrateclient/rpc/codegen/encoder/RpcEncoderProcessorTests.java index 8a40c187..0df4adfc 100644 --- a/rpc/rpc-codegen/src/test/java/com/strategyobject/substrateclient/rpc/codegen/encoder/RpcEncoderProcessorTests.java +++ b/rpc/rpc-codegen/src/test/java/com/strategyobject/substrateclient/rpc/codegen/encoder/RpcEncoderProcessorTests.java @@ -2,9 +2,9 @@ import com.google.gson.Gson; import com.google.testing.compile.JavaFileObjects; -import com.strategyobject.substrateclient.rpc.codegen.substitutes.TestEncodable; import com.strategyobject.substrateclient.rpc.EncoderPair; import com.strategyobject.substrateclient.rpc.RpcEncoder; +import com.strategyobject.substrateclient.rpc.codegen.substitutes.TestEncodable; import com.strategyobject.substrateclient.rpc.registries.RpcEncoderRegistry; import lombok.val; import org.junit.jupiter.api.Test; @@ -60,14 +60,13 @@ void compiles() { @Test @SuppressWarnings("unchecked") void compilesAndDecodes() { // TODO move this test out of the project - val registry = RpcEncoderRegistry.getInstance(); - val encoder = (RpcEncoder>) registry.resolve(TestEncodable.class) + val encoder = (RpcEncoder>) RpcEncoderRegistry.resolve(TestEncodable.class) .inject( EncoderPair.of( - registry + RpcEncoderRegistry .resolve(TestEncodable.Subclass.class) .inject(EncoderPair.of( - registry.resolve(int.class), + RpcEncoderRegistry.resolve(int.class), null )), null)); diff --git a/rpc/src/main/java/com/strategyobject/substrateclient/rpc/RpcRegistryHelper.java b/rpc/src/main/java/com/strategyobject/substrateclient/rpc/RpcRegistryHelper.java index 5d627cfd..173d3bc9 100644 --- a/rpc/src/main/java/com/strategyobject/substrateclient/rpc/RpcRegistryHelper.java +++ b/rpc/src/main/java/com/strategyobject/substrateclient/rpc/RpcRegistryHelper.java @@ -10,7 +10,7 @@ private RpcRegistryHelper() { @SuppressWarnings("unchecked") public static RpcDecoder resolveAndInjectOrNull(Class clazz, DecoderPair... dependencies) { - val target = (RpcDecoder) RpcDecoderRegistry.getInstance().resolve(clazz); + val target = (RpcDecoder) RpcDecoderRegistry.resolve(clazz); if (target == null) { return null; @@ -21,7 +21,7 @@ public static RpcDecoder resolveAndInjectOrNull(Class clazz, DecoderPa @SuppressWarnings("unchecked") public static RpcEncoder resolveAndInjectOrNull(Class clazz, EncoderPair... dependencies) { - val target = (RpcEncoder) RpcEncoderRegistry.getInstance().resolve(clazz); + val target = (RpcEncoder) RpcEncoderRegistry.resolve(clazz); if (target == null) { return null; diff --git a/rpc/src/main/java/com/strategyobject/substrateclient/rpc/RpcSelfEncodable.java b/rpc/src/main/java/com/strategyobject/substrateclient/rpc/RpcSelfEncodable.java index 067d1d65..55f68924 100644 --- a/rpc/src/main/java/com/strategyobject/substrateclient/rpc/RpcSelfEncodable.java +++ b/rpc/src/main/java/com/strategyobject/substrateclient/rpc/RpcSelfEncodable.java @@ -5,7 +5,7 @@ public interface RpcSelfEncodable> { @SuppressWarnings("unchecked") default Object encode(T source) { - return ((RpcSelfEncodable) RpcEncoderRegistry.getInstance() + return ((RpcSelfEncodable) RpcEncoderRegistry .resolve(this.getClass())) .encode(source); } diff --git a/rpc/src/main/java/com/strategyobject/substrateclient/rpc/registries/RpcDecoderRegistry.java b/rpc/src/main/java/com/strategyobject/substrateclient/rpc/registries/RpcDecoderRegistry.java index 5c2c37aa..5c9f118c 100644 --- a/rpc/src/main/java/com/strategyobject/substrateclient/rpc/registries/RpcDecoderRegistry.java +++ b/rpc/src/main/java/com/strategyobject/substrateclient/rpc/registries/RpcDecoderRegistry.java @@ -18,10 +18,12 @@ public final class RpcDecoderRegistry { private static final Logger logger = LoggerFactory.getLogger(RpcDecoderRegistry.class); private static final String ROOT_PREFIX = "com.strategyobject.substrateclient"; - private static volatile RpcDecoderRegistry instance; - private final Map, RpcDecoder> decoders; + private static final Map, RpcDecoder> decoders; private RpcDecoderRegistry() { + } + + static { decoders = new ConcurrentHashMap<>(128); register(new ListDecoder(), List.class); @@ -41,19 +43,7 @@ private RpcDecoderRegistry() { registerAnnotatedFrom(ROOT_PREFIX); } - public static RpcDecoderRegistry getInstance() { - if (instance == null) { - synchronized (RpcDecoderRegistry.class) { - if (instance == null) { - instance = new RpcDecoderRegistry(); - } - } - } - - return instance; - } - - public void registerAnnotatedFrom(String... prefixes) { + public static void registerAnnotatedFrom(String... prefixes) { Scanner.forPrefixes(prefixes) .getSubTypesOf(RpcDecoder.class).forEach(decoder -> { val autoRegister = decoder.getAnnotation(AutoRegister.class); @@ -73,13 +63,13 @@ public void registerAnnotatedFrom(String... prefixes) { }); } - public void register(@NonNull RpcDecoder decoder, @NonNull Class... clazz) { + public static void register(@NonNull RpcDecoder decoder, @NonNull Class... clazz) { for (val type : clazz) { decoders.put(type, decoder); } } - public RpcDecoder resolve(@NonNull Class clazz) { + public static RpcDecoder resolve(@NonNull Class clazz) { return decoders.get(clazz); } } diff --git a/rpc/src/main/java/com/strategyobject/substrateclient/rpc/registries/RpcEncoderRegistry.java b/rpc/src/main/java/com/strategyobject/substrateclient/rpc/registries/RpcEncoderRegistry.java index 4279ad3e..02d7ea1b 100644 --- a/rpc/src/main/java/com/strategyobject/substrateclient/rpc/registries/RpcEncoderRegistry.java +++ b/rpc/src/main/java/com/strategyobject/substrateclient/rpc/registries/RpcEncoderRegistry.java @@ -18,10 +18,12 @@ public final class RpcEncoderRegistry { private static final Logger logger = LoggerFactory.getLogger(RpcEncoderRegistry.class); private static final String ROOT_PREFIX = "com.strategyobject.substrateclient"; - private static volatile RpcEncoderRegistry instance; - private final Map, RpcEncoder> encoders; + private static final Map, RpcEncoder> encoders; private RpcEncoderRegistry() { + } + + static { encoders = new ConcurrentHashMap<>(128); register(new PlainEncoder<>(), @@ -36,19 +38,7 @@ private RpcEncoderRegistry() { registerAnnotatedFrom(ROOT_PREFIX); } - public static RpcEncoderRegistry getInstance() { - if (instance == null) { - synchronized (RpcEncoderRegistry.class) { - if (instance == null) { - instance = new RpcEncoderRegistry(); - } - } - } - - return instance; - } - - public void registerAnnotatedFrom(String... prefixes) { + public static void registerAnnotatedFrom(String... prefixes) { Scanner.forPrefixes(prefixes) .getSubTypesOf(RpcEncoder.class).forEach(encoder -> { val autoRegister = encoder.getAnnotation(AutoRegister.class); @@ -68,13 +58,13 @@ public void registerAnnotatedFrom(String... prefixes) { }); } - public void register(@NonNull RpcEncoder encoder, @NonNull Class... clazz) { + public static void register(@NonNull RpcEncoder encoder, @NonNull Class... clazz) { for (val type : clazz) { encoders.put(type, encoder); } } - public RpcEncoder resolve(@NonNull Class clazz) { + public static RpcEncoder resolve(@NonNull Class clazz) { return encoders.get(clazz); } } diff --git a/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/reader/ReaderCompositor.java b/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/reader/ReaderCompositor.java index 7755970d..ef8f2f9b 100644 --- a/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/reader/ReaderCompositor.java +++ b/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/reader/ReaderCompositor.java @@ -5,6 +5,7 @@ import com.strategyobject.substrateclient.common.codegen.ProcessorContext; import com.strategyobject.substrateclient.common.codegen.TypeTraverser; import com.strategyobject.substrateclient.common.types.Array; +import com.strategyobject.substrateclient.scale.registries.ScaleReaderRegistry; import lombok.NonNull; import lombok.var; @@ -15,32 +16,27 @@ public class ReaderCompositor extends TypeTraverser { private final ProcessorContext context; private final Map typeVarMap; private final String readerAccessor; - private final String registryVarName; private final TypeMirror arrayType; private ReaderCompositor(ProcessorContext context, Map typeVarMap, - String readerAccessor, - String registryVarName) { + String readerAccessor) { super(CodeBlock.class); this.context = context; this.typeVarMap = typeVarMap; this.readerAccessor = readerAccessor; - this.registryVarName = registryVarName; this.arrayType = context.erasure(context.getType(Array.class)); } public static ReaderCompositor forAnyType(@NonNull ProcessorContext context, @NonNull Map typeVarMap, - @NonNull String readerAccessor, - @NonNull String registryVarName) { - return new ReaderCompositor(context, typeVarMap, readerAccessor, registryVarName); + @NonNull String readerAccessor) { + return new ReaderCompositor(context, typeVarMap, readerAccessor); } - public static ReaderCompositor disallowOpenGeneric(@NonNull ProcessorContext context, - @NonNull String registryVarName) { - return new ReaderCompositor(context, null, null, registryVarName); + public static ReaderCompositor disallowOpenGeneric(@NonNull ProcessorContext context) { + return new ReaderCompositor(context, null, null); } private CodeBlock getTypeVarCodeBlock(TypeVariable type) { @@ -55,7 +51,7 @@ private CodeBlock getTypeVarCodeBlock(TypeVariable type) { private CodeBlock getNonGenericCodeBlock(TypeMirror type, TypeMirror override) { return CodeBlock.builder() - .add("$L.resolve($T.class)", registryVarName, override != null ? override : type) + .add("$T.resolve($T.class)", ScaleReaderRegistry.class, override != null ? override : type) .build(); } @@ -64,7 +60,7 @@ private CodeBlock getGenericCodeBlock(TypeMirror type, TypeMirror override, Code if (override != null) { if (context.isNonGeneric(override)) { return CodeBlock.builder() - .add("$L.resolve($T.class)", registryVarName, override) + .add("$T.resolve($T.class)", ScaleReaderRegistry.class, override) .build(); } @@ -73,7 +69,7 @@ private CodeBlock getGenericCodeBlock(TypeMirror type, TypeMirror override, Code resolveType = context.erasure(type); } - var builder = CodeBlock.builder().add("$L.resolve($T.class).inject(", registryVarName, resolveType); + var builder = CodeBlock.builder().add("$T.resolve($T.class).inject(", ScaleReaderRegistry.class, resolveType); for (var i = 0; i < subtypes.length; i++) { if (i > 0) builder.add(", "); builder.add(subtypes[i]); diff --git a/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/reader/ScaleReaderAnnotatedClass.java b/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/reader/ScaleReaderAnnotatedClass.java index 6b0a4d31..c8574ac8 100644 --- a/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/reader/ScaleReaderAnnotatedClass.java +++ b/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/reader/ScaleReaderAnnotatedClass.java @@ -9,7 +9,6 @@ import com.strategyobject.substrateclient.scale.annotation.Ignore; import com.strategyobject.substrateclient.scale.codegen.ScaleAnnotationParser; import com.strategyobject.substrateclient.scale.codegen.ScaleProcessorHelper; -import com.strategyobject.substrateclient.scale.registries.ScaleReaderRegistry; import lombok.NonNull; import lombok.val; import lombok.var; @@ -32,7 +31,6 @@ public class ScaleReaderAnnotatedClass { private static final String READERS_ARG = "readers"; - private static final String REGISTRY = "registry"; private final TypeElement classElement; private final Map typeVarMap; @@ -104,15 +102,13 @@ private void addMethodBody(MethodSpec.Builder methodSpec, ProcessorContext context) throws ProcessingException { val resultType = JavaPoet.setEachGenericParameterAs(classElement, TypeName.OBJECT); methodSpec - .addStatement("$1T $2L = $1T.getInstance()", ScaleReaderRegistry.class, REGISTRY) .addStatement("$1T result = new $1T()", resultType) .beginControlFlow("try"); val scaleAnnotationParser = new ScaleAnnotationParser(context); val compositor = ReaderCompositor.forAnyType(context, typeVarMap, - String.format("%s[$L]", READERS_ARG), - REGISTRY); + String.format("%s[$L]", READERS_ARG)); for (Element element : classElement.getEnclosedElements()) { if (element instanceof VariableElement) { val field = (VariableElement) element; diff --git a/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/writer/ScaleWriterAnnotatedClass.java b/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/writer/ScaleWriterAnnotatedClass.java index 7481e891..eb4d140f 100644 --- a/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/writer/ScaleWriterAnnotatedClass.java +++ b/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/writer/ScaleWriterAnnotatedClass.java @@ -9,7 +9,6 @@ import com.strategyobject.substrateclient.scale.annotation.Ignore; import com.strategyobject.substrateclient.scale.codegen.ScaleAnnotationParser; import com.strategyobject.substrateclient.scale.codegen.ScaleProcessorHelper; -import com.strategyobject.substrateclient.scale.registries.ScaleWriterRegistry; import lombok.NonNull; import lombok.val; import lombok.var; @@ -31,7 +30,6 @@ public class ScaleWriterAnnotatedClass { private static final String WRITERS_ARG = "writers"; - private static final String REGISTRY = "registry"; private final TypeElement classElement; private final Map typeVarMap; @@ -104,15 +102,12 @@ private void addValidationRules(MethodSpec.Builder methodSpec, private void addMethodBody(MethodSpec.Builder methodSpec, ProcessorContext context) throws ProcessingException { - methodSpec - .addStatement("$1T registry = $1T.getInstance()", ScaleWriterRegistry.class) - .beginControlFlow("try"); + methodSpec.beginControlFlow("try"); val scaleAnnotationParser = new ScaleAnnotationParser(context); val compositor = WriterCompositor.forAnyType(context, typeVarMap, - String.format("%s[$L]", WRITERS_ARG), - REGISTRY); + String.format("%s[$L]", WRITERS_ARG)); for (Element element : classElement.getEnclosedElements()) { if (element instanceof VariableElement) { val field = (VariableElement) element; diff --git a/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/writer/WriterCompositor.java b/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/writer/WriterCompositor.java index 7023542c..ad47c994 100644 --- a/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/writer/WriterCompositor.java +++ b/scale/scale-codegen/src/main/java/com/strategyobject/substrateclient/scale/codegen/writer/WriterCompositor.java @@ -4,6 +4,7 @@ import com.strategyobject.substrateclient.common.codegen.ProcessorContext; import com.strategyobject.substrateclient.common.codegen.TypeTraverser; import com.strategyobject.substrateclient.common.types.Array; +import com.strategyobject.substrateclient.scale.registries.ScaleWriterRegistry; import lombok.NonNull; import lombok.var; @@ -17,40 +18,35 @@ public class WriterCompositor extends TypeTraverser { private final Map typeVarMap; private final TypeMirror selfWritable; private final String writerAccessor; - private final String registryVarName; private final TypeMirror arrayType; private WriterCompositor(ProcessorContext context, Map typeVarMap, - String writerAccessor, - String registryVarName) { + String writerAccessor) { super(CodeBlock.class); this.context = context; this.typeVarMap = typeVarMap; this.selfWritable = context.erasure(context.getType(SCALE_SELF_WRITABLE)); this.writerAccessor = writerAccessor; - this.registryVarName = registryVarName; this.arrayType = context.erasure(context.getType(Array.class)); } public static WriterCompositor forAnyType(@NonNull ProcessorContext context, @NonNull Map typeVarMap, - @NonNull String writerAccessor, - @NonNull String registryVarName) { - return new WriterCompositor(context, typeVarMap, writerAccessor, registryVarName); + @NonNull String writerAccessor) { + return new WriterCompositor(context, typeVarMap, writerAccessor); } - public static WriterCompositor disallowOpenGeneric(@NonNull ProcessorContext context, - @NonNull String registryVarName) { - return new WriterCompositor(context, null, null, registryVarName); + public static WriterCompositor disallowOpenGeneric(@NonNull ProcessorContext context) { + return new WriterCompositor(context, null, null); } private CodeBlock getNonGenericCodeBlock(TypeMirror type, TypeMirror override) { return CodeBlock.builder() - .add("$L.resolve($T.class)", - registryVarName, + .add("$T.resolve($T.class)", + ScaleWriterRegistry.class, override != null ? override : context.isAssignable(type, selfWritable) ? @@ -64,7 +60,7 @@ private CodeBlock getGenericCodeBlock(TypeMirror type, TypeMirror override, Code if (override != null) { if (context.isNonGeneric(override)) { return CodeBlock.builder() - .add("$L.resolve($T.class)", registryVarName, override) + .add("$T.resolve($T.class)", ScaleWriterRegistry.class, override) .build(); } @@ -73,11 +69,11 @@ private CodeBlock getGenericCodeBlock(TypeMirror type, TypeMirror override, Code resolveType = context.erasure(type); if (context.isAssignable(resolveType, selfWritable)) { - return CodeBlock.builder().add("$L.resolve($T.class)", registryVarName, selfWritable).build(); + return CodeBlock.builder().add("$T.resolve($T.class)", ScaleWriterRegistry.class, selfWritable).build(); } } - var builder = CodeBlock.builder().add("$L.resolve($T.class).inject(", registryVarName, resolveType); + var builder = CodeBlock.builder().add("$T.resolve($T.class).inject(", ScaleWriterRegistry.class, resolveType); for (var i = 0; i < subtypes.length; i++) { if (i > 0) builder.add(", "); builder.add(subtypes[i]); @@ -90,7 +86,7 @@ private CodeBlock getGenericCodeBlock(TypeMirror type, TypeMirror override, Code protected CodeBlock whenTypeVar(@NonNull TypeVariable type, TypeMirror _override) { return context.isAssignable(type, selfWritable) ? CodeBlock.builder() - .add("$L.resolve($T.class)", registryVarName, selfWritable) + .add("$T.resolve($T.class)", ScaleWriterRegistry.class, selfWritable) .build() : CodeBlock.builder() .add(writerAccessor, typeVarMap.get(type.toString())) @@ -113,7 +109,7 @@ protected CodeBlock whenGenericType(@NonNull DeclaredType type, TypeMirror overr if (override != null) { if (context.isNonGeneric(override)) { return CodeBlock.builder() - .add("$L.resolve($T.class)", registryVarName, override) + .add("$T.resolve($T.class)", ScaleWriterRegistry.class, override) .build(); } @@ -122,11 +118,11 @@ protected CodeBlock whenGenericType(@NonNull DeclaredType type, TypeMirror overr resolveType = context.erasure(type); if (context.isAssignable(resolveType, selfWritable)) { - return CodeBlock.builder().add("$L.resolve($T.class)", registryVarName, selfWritable).build(); + return CodeBlock.builder().add("$T.resolve($T.class)", ScaleWriterRegistry.class, selfWritable).build(); } } - var builder = CodeBlock.builder().add("$L.resolve($T.class).inject(", registryVarName, resolveType); + var builder = CodeBlock.builder().add("$T.resolve($T.class).inject(", ScaleWriterRegistry.class, resolveType); for (var i = 0; i < subtypes.length; i++) { if (i > 0) builder.add(", "); builder.add(subtypes[i]); diff --git a/scale/src/main/java/com/strategyobject/substrateclient/scale/ScaleRegistryHelper.java b/scale/src/main/java/com/strategyobject/substrateclient/scale/ScaleRegistryHelper.java index 612a5f26..8ced9fa2 100644 --- a/scale/src/main/java/com/strategyobject/substrateclient/scale/ScaleRegistryHelper.java +++ b/scale/src/main/java/com/strategyobject/substrateclient/scale/ScaleRegistryHelper.java @@ -10,7 +10,7 @@ private ScaleRegistryHelper() { @SuppressWarnings("unchecked") public static ScaleReader resolveAndInjectOrNull(Class clazz, ScaleReader... dependencies) { - val target = (ScaleReader) ScaleReaderRegistry.getInstance().resolve(clazz); + val target = (ScaleReader) ScaleReaderRegistry.resolve(clazz); if (target == null) { return null; @@ -21,7 +21,7 @@ public static ScaleReader resolveAndInjectOrNull(Class clazz, ScaleRea @SuppressWarnings("unchecked") public static ScaleWriter resolveAndInjectOrNull(Class clazz, ScaleWriter... dependencies) { - val target = (ScaleWriter) ScaleWriterRegistry.getInstance().resolve(clazz); + val target = (ScaleWriter) ScaleWriterRegistry.resolve(clazz); if (target == null) { return null; diff --git a/scale/src/main/java/com/strategyobject/substrateclient/scale/ScaleSelfWritable.java b/scale/src/main/java/com/strategyobject/substrateclient/scale/ScaleSelfWritable.java index 13ae13c3..ab02b6db 100644 --- a/scale/src/main/java/com/strategyobject/substrateclient/scale/ScaleSelfWritable.java +++ b/scale/src/main/java/com/strategyobject/substrateclient/scale/ScaleSelfWritable.java @@ -10,9 +10,7 @@ public interface ScaleSelfWritable> { @SuppressWarnings("unchecked") default void write(@NonNull OutputStream stream) throws IOException { - val writer = (ScaleWriter) ScaleWriterRegistry - .getInstance() - .resolve(this.getClass()); + val writer = (ScaleWriter) ScaleWriterRegistry.resolve(this.getClass()); writer.write((T) this, stream); } diff --git a/scale/src/main/java/com/strategyobject/substrateclient/scale/ScaleUtils.java b/scale/src/main/java/com/strategyobject/substrateclient/scale/ScaleUtils.java index 13f74602..4ab9d374 100644 --- a/scale/src/main/java/com/strategyobject/substrateclient/scale/ScaleUtils.java +++ b/scale/src/main/java/com/strategyobject/substrateclient/scale/ScaleUtils.java @@ -15,7 +15,7 @@ public final class ScaleUtils { @SuppressWarnings("unchecked") public static T fromBytes(byte @NonNull [] bytes, Class clazz) { val stream = new ByteArrayInputStream(bytes); - val reader = (ScaleReader) ScaleReaderRegistry.getInstance().resolve(clazz); + val reader = (ScaleReader) ScaleReaderRegistry.resolve(clazz); try { return reader.read(stream); } catch (IOException e) { @@ -26,7 +26,7 @@ public static T fromBytes(byte @NonNull [] bytes, Class clazz) { @SuppressWarnings("unchecked") public static byte[] toBytes(T value, Class clazz) { val stream = new ByteArrayOutputStream(); - val writer = (ScaleWriter) ScaleWriterRegistry.getInstance().resolve(clazz); + val writer = (ScaleWriter) ScaleWriterRegistry.resolve(clazz); try { writer.write(value, stream); } catch (IOException e) { diff --git a/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleReaderRegistry.java b/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleReaderRegistry.java index 381be5cb..9a68dae6 100644 --- a/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleReaderRegistry.java +++ b/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleReaderRegistry.java @@ -24,10 +24,12 @@ public final class ScaleReaderRegistry { private static final Logger logger = LoggerFactory.getLogger(ScaleReaderRegistry.class); private static final String ROOT_PREFIX = "com.strategyobject.substrateclient"; - private static volatile ScaleReaderRegistry instance; - private final Map, ScaleReader> readers; + private static final Map, ScaleReader> readers; private ScaleReaderRegistry() { + } + + static { readers = new ConcurrentHashMap<>(128); register(new BoolReader(), ScaleType.Bool.class, Boolean.class, boolean.class); @@ -72,18 +74,7 @@ private ScaleReaderRegistry() { registerAnnotatedFrom(ROOT_PREFIX); } - public static ScaleReaderRegistry getInstance() { - if (instance == null) { - synchronized (ScaleReaderRegistry.class) { - if (instance == null) { - instance = new ScaleReaderRegistry(); - } - } - } - return instance; - } - - public void registerAnnotatedFrom(String... prefixes) { + public static void registerAnnotatedFrom(String... prefixes) { Scanner.forPrefixes(prefixes) .getSubTypesOf(ScaleReader.class).forEach(reader -> { val autoRegister = reader.getAnnotation(AutoRegister.class); @@ -103,13 +94,13 @@ public void registerAnnotatedFrom(String... prefixes) { }); } - public void register(@NonNull ScaleReader scaleReader, @NonNull Class... clazz) { + public static void register(@NonNull ScaleReader scaleReader, @NonNull Class... clazz) { for (val type : clazz) { readers.put(type, scaleReader); } } - public ScaleReader resolve(@NonNull Class clazz) { + public static ScaleReader resolve(@NonNull Class clazz) { return readers.get(clazz); } } diff --git a/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleWriterRegistry.java b/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleWriterRegistry.java index fa775035..56bf08c7 100644 --- a/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleWriterRegistry.java +++ b/scale/src/main/java/com/strategyobject/substrateclient/scale/registries/ScaleWriterRegistry.java @@ -25,10 +25,12 @@ public final class ScaleWriterRegistry { private static final Logger logger = LoggerFactory.getLogger(ScaleWriterRegistry.class); private static final String ROOT_PREFIX = "com.strategyobject.substrateclient"; - private static volatile ScaleWriterRegistry instance; - private final Map, ScaleWriter> writers; + private static final Map, ScaleWriter> writers; private ScaleWriterRegistry() { + } + + static { writers = new ConcurrentHashMap<>(128); register(new BoolWriter(), ScaleType.Bool.class, Boolean.class, boolean.class); @@ -74,18 +76,7 @@ private ScaleWriterRegistry() { registerAnnotatedFrom(ROOT_PREFIX); } - public static ScaleWriterRegistry getInstance() { - if (instance == null) { - synchronized (ScaleWriterRegistry.class) { - if (instance == null) { - instance = new ScaleWriterRegistry(); - } - } - } - return instance; - } - - public void registerAnnotatedFrom(String... prefixes) { + public static void registerAnnotatedFrom(String... prefixes) { Scanner.forPrefixes(prefixes) .getSubTypesOf(ScaleWriter.class).forEach(writer -> { val autoRegister = writer.getAnnotation(AutoRegister.class); @@ -105,13 +96,13 @@ public void registerAnnotatedFrom(String... prefixes) { }); } - public void register(@NonNull ScaleWriter scaleWriter, @NonNull Class... clazz) { + public static void register(@NonNull ScaleWriter scaleWriter, @NonNull Class... clazz) { for (val type : clazz) { writers.put(type, scaleWriter); } } - public ScaleWriter resolve(@NonNull Class clazz) { + public static ScaleWriter resolve(@NonNull Class clazz) { return writers.get(clazz); } } diff --git a/tests/build.gradle b/tests/build.gradle index dfab4466..5d2ac6bf 100644 --- a/tests/build.gradle +++ b/tests/build.gradle @@ -1,4 +1,4 @@ dependencies { - implementation 'org.testcontainers:testcontainers:1.17.1' + implementation 'org.testcontainers:testcontainers:1.17.2' implementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' } \ No newline at end of file diff --git a/transport/build.gradle b/transport/build.gradle index a01a0c33..269cec3d 100644 --- a/transport/build.gradle +++ b/transport/build.gradle @@ -5,9 +5,9 @@ dependencies { implementation 'com.google.code.gson:gson:2.9.0' testImplementation project(':tests') - testImplementation 'ch.qos.logback:logback-classic:1.2.11' - testImplementation 'org.testcontainers:testcontainers:1.17.1' - testImplementation 'org.testcontainers:junit-jupiter:1.17.1' - testImplementation 'org.testcontainers:toxiproxy:1.17.1' + + testImplementation 'org.testcontainers:testcontainers:1.17.2' + testImplementation 'org.testcontainers:junit-jupiter:1.17.2' + testImplementation 'org.testcontainers:toxiproxy:1.17.2' testImplementation 'org.awaitility:awaitility:4.2.0' } \ No newline at end of file