From a6c87e906e7c1b485af665e77631fd32cff9e034 Mon Sep 17 00:00:00 2001 From: domkun <1139208+domkun@users.noreply.github.com> Date: Fri, 1 Sep 2023 08:07:37 +0200 Subject: [PATCH] Fix custom codec registration for more than one codec --- .../client/datasource/CustomCodecTest.java | 90 ++++++++++++++----- .../runtime/client/RedisClientRecorder.java | 5 +- 2 files changed, 72 insertions(+), 23 deletions(-) diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/datasource/CustomCodecTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/datasource/CustomCodecTest.java index cc5e86c6d0c8b..39b9bd89e77de 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/datasource/CustomCodecTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/datasource/CustomCodecTest.java @@ -28,7 +28,8 @@ public class CustomCodecTest { @RegisterExtension static final QuarkusUnitTest unitTest = new QuarkusUnitTest() .setArchiveProducer( - () -> ShrinkWrap.create(JavaArchive.class).addClass(Jedi.class).addClass(MyCustomCodec.class)) + () -> ShrinkWrap.create(JavaArchive.class).addClass(Jedi.class).addClass(Sith.class) + .addClass(CustomJediCodec.class).addClass(CustomSithCodec.class)) .overrideConfigKey("quarkus.redis.hosts", "${quarkus.redis.tr}"); @Inject @@ -37,28 +38,45 @@ public class CustomCodecTest { @Test void testCustomCodecs() { String key1 = UUID.randomUUID().toString(); - // Check that the codec is registered - assertThat(Codecs.getDefaultCodecFor(Jedi.class)).isInstanceOf(MyCustomCodec.class); - - HashCommands hash1 = ds.hash(Jedi.class); - hash1.hset(key1, "test", new Jedi("luke", "skywalker")); - var retrieved = hash1.hget(key1, "test"); - assertThat(retrieved.firstName).isEqualTo("luke"); - assertThat(retrieved.lastName).isEqualTo("SKYWALKER"); - - HashCommands hash2 = ds.hash(String.class, Jedi.class, String.class); - hash2.hset(key1, new Jedi("luke", "skywalker"), "test"); - var retrieved2 = hash2.hget(key1, new Jedi("luke", "skywalker")); - assertThat(retrieved2).isEqualTo("test"); - - HashCommands hash3 = ds.hash(Jedi.class, String.class, String.class); - hash3.hset(new Jedi("luke", "skywalker"), "key", "value"); - var retrieved3 = hash3.hget(new Jedi("luke", "skywalker"), "key"); - assertThat(retrieved3).isEqualTo("value"); + // Check that all codec are registered + assertThat(Codecs.getDefaultCodecFor(Jedi.class)).isInstanceOf(CustomJediCodec.class); + assertThat(Codecs.getDefaultCodecFor(Sith.class)).isInstanceOf(CustomSithCodec.class); + + HashCommands jediHash1 = ds.hash(Jedi.class); + jediHash1.hset(key1, "test", new Jedi("luke", "skywalker")); + var jediRetrieved = jediHash1.hget(key1, "test"); + assertThat(jediRetrieved.firstName).isEqualTo("luke"); + assertThat(jediRetrieved.lastName).isEqualTo("SKYWALKER"); + + HashCommands jediHash2 = ds.hash(String.class, Jedi.class, String.class); + jediHash2.hset(key1, new Jedi("luke", "skywalker"), "test"); + var jediRetrieved2 = jediHash2.hget(key1, new Jedi("luke", "skywalker")); + assertThat(jediRetrieved2).isEqualTo("test"); + + HashCommands jediHash3 = ds.hash(Jedi.class, String.class, String.class); + jediHash3.hset(new Jedi("luke", "skywalker"), "key", "value"); + var jediRetrieved3 = jediHash3.hget(new Jedi("luke", "skywalker"), "key"); + assertThat(jediRetrieved3).isEqualTo("value"); + + HashCommands sithHash1 = ds.hash(Sith.class); + sithHash1.hset(key1, "test", new Sith("darth", "sidious")); + var sithRetrieved = sithHash1.hget(key1, "test"); + assertThat(sithRetrieved.firstName).isEqualTo("darth"); + assertThat(sithRetrieved.lastName).isEqualTo("SIDIOUS"); + + HashCommands sithHash2 = ds.hash(String.class, Sith.class, String.class); + sithHash2.hset(key1, new Sith("darth", "sidious"), "test"); + var sithRetrieved2 = sithHash2.hget(key1, new Sith("darth", "sidious")); + assertThat(sithRetrieved2).isEqualTo("test"); + + HashCommands sithHash3 = ds.hash(Sith.class, String.class, String.class); + sithHash3.hset(new Sith("darth", "sidious"), "key", "value"); + var sithRetrieved3 = sithHash3.hget(new Sith("darth", "sidious"), "key"); + assertThat(sithRetrieved3).isEqualTo("value"); } @ApplicationScoped - public static class MyCustomCodec implements Codec { + public static class CustomJediCodec implements Codec { @Override public boolean canHandle(Type clazz) { @@ -79,6 +97,28 @@ public Object decode(byte[] item) { } } + @ApplicationScoped + public static class CustomSithCodec implements Codec { + + @Override + public boolean canHandle(Type clazz) { + return clazz.equals(Sith.class); + } + + @Override + public byte[] encode(Object item) { + var sith = (Sith) item; + return (sith.firstName + ";" + sith.lastName).getBytes(StandardCharsets.UTF_8); + } + + @Override + public Object decode(byte[] item) { + String s = new String(item, StandardCharsets.UTF_8); + String[] strings = s.split(";"); + return new Sith(strings[0], strings[1].toUpperCase()); + } + } + public static class Jedi { public final String firstName; public final String lastName; @@ -89,4 +129,14 @@ public Jedi(String firstName, String lastName) { } } + public static class Sith { + public final String firstName; + public final String lastName; + + public Sith(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + } + } diff --git a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/RedisClientRecorder.java b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/RedisClientRecorder.java index 1060772089656..cec469fc5d52d 100644 --- a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/RedisClientRecorder.java +++ b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/RedisClientRecorder.java @@ -65,9 +65,8 @@ public void initialize(RuntimeValue vertx, Set name private static void _registerCodecs() { Instance codecs = CDI.current().select(Codec.class); - if (codecs.isResolvable()) { - Codecs.register(codecs.stream()); - } + + Codecs.register(codecs.stream()); } public void _initialize(io.vertx.core.Vertx vertx, Set names) {