From e2690921a38ccfc3206ef4a4d03523474f41af6b Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 20 Dec 2018 08:43:00 +0300 Subject: [PATCH] Fixed - RBitSet object couldn't be used as nested object. #1751 --- .../java/org/redisson/RedissonBitSet.java | 2 +- .../java/org/redisson/RedissonObject.java | 20 +++++++++---------- .../redisson/command/CommandAsyncService.java | 9 ++------- .../core/RedissonObjectBuilder.java | 4 +++- .../redisson/misc/RedissonObjectFactory.java | 8 ++++++-- .../org/redisson/RedissonReferenceTest.java | 17 ++++++++++++++++ 6 files changed, 39 insertions(+), 21 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonBitSet.java b/redisson/src/main/java/org/redisson/RedissonBitSet.java index a58fcce46..87ac51e70 100644 --- a/redisson/src/main/java/org/redisson/RedissonBitSet.java +++ b/redisson/src/main/java/org/redisson/RedissonBitSet.java @@ -38,7 +38,7 @@ import org.redisson.command.CommandBatchService; public class RedissonBitSet extends RedissonExpirable implements RBitSet { public RedissonBitSet(CommandAsyncExecutor connectionManager, String name) { - super(connectionManager, name); + super(null, connectionManager, name); } @Override diff --git a/redisson/src/main/java/org/redisson/RedissonObject.java b/redisson/src/main/java/org/redisson/RedissonObject.java index b65a639e3..2592756fe 100644 --- a/redisson/src/main/java/org/redisson/RedissonObject.java +++ b/redisson/src/main/java/org/redisson/RedissonObject.java @@ -101,7 +101,7 @@ public abstract class RedissonObject implements RObject { @Override public RFuture sizeInMemoryAsync() { - return commandExecutor.writeAsync(getName(), RedisCommands.MEMORY_USAGE, getName()); + return commandExecutor.writeAsync(getName(), StringCodec.INSTANCE, RedisCommands.MEMORY_USAGE, getName()); } public final RFuture sizeInMemoryAsync(List keys) { @@ -124,7 +124,7 @@ public abstract class RedissonObject implements RObject { @Override public RFuture renameAsync(String newName) { - return commandExecutor.writeAsync(getName(), RedisCommands.RENAME, getName(), newName); + return commandExecutor.writeAsync(getName(), StringCodec.INSTANCE, RedisCommands.RENAME, getName(), newName); } @Override @@ -134,7 +134,7 @@ public abstract class RedissonObject implements RObject { @Override public RFuture migrateAsync(String host, int port, int database, long timeout) { - return commandExecutor.writeAsync(getName(), RedisCommands.MIGRATE, host, port, getName(), database, timeout); + return commandExecutor.writeAsync(getName(), StringCodec.INSTANCE, RedisCommands.MIGRATE, host, port, getName(), database, timeout); } @Override @@ -144,7 +144,7 @@ public abstract class RedissonObject implements RObject { @Override public RFuture copyAsync(String host, int port, int database, long timeout) { - return commandExecutor.writeAsync(getName(), RedisCommands.MIGRATE, host, port, getName(), database, timeout, "COPY"); + return commandExecutor.writeAsync(getName(), StringCodec.INSTANCE, RedisCommands.MIGRATE, host, port, getName(), database, timeout, "COPY"); } @Override @@ -154,7 +154,7 @@ public abstract class RedissonObject implements RObject { @Override public RFuture moveAsync(int database) { - return commandExecutor.writeAsync(getName(), RedisCommands.MOVE, getName(), database); + return commandExecutor.writeAsync(getName(), StringCodec.INSTANCE, RedisCommands.MOVE, getName(), database); } @Override @@ -164,7 +164,7 @@ public abstract class RedissonObject implements RObject { @Override public RFuture renamenxAsync(String newName) { - return commandExecutor.writeAsync(getName(), RedisCommands.RENAMENX, getName(), newName); + return commandExecutor.writeAsync(getName(), StringCodec.INSTANCE, RedisCommands.RENAMENX, getName(), newName); } @Override @@ -174,7 +174,7 @@ public abstract class RedissonObject implements RObject { @Override public RFuture deleteAsync() { - return commandExecutor.writeAsync(getName(), RedisCommands.DEL_BOOL, getName()); + return commandExecutor.writeAsync(getName(), StringCodec.INSTANCE, RedisCommands.DEL_BOOL, getName()); } @Override @@ -184,7 +184,7 @@ public abstract class RedissonObject implements RObject { @Override public RFuture unlinkAsync() { - return commandExecutor.writeAsync(getName(), RedisCommands.UNLINK_BOOL, getName()); + return commandExecutor.writeAsync(getName(), StringCodec.INSTANCE, RedisCommands.UNLINK_BOOL, getName()); } @Override @@ -194,7 +194,7 @@ public abstract class RedissonObject implements RObject { @Override public RFuture touchAsync() { - return commandExecutor.writeAsync(getName(), codec, RedisCommands.TOUCH, getName()); + return commandExecutor.writeAsync(getName(), StringCodec.INSTANCE, RedisCommands.TOUCH, getName()); } @Override @@ -204,7 +204,7 @@ public abstract class RedissonObject implements RObject { @Override public RFuture isExistsAsync() { - return commandExecutor.readAsync(getName(), codec, RedisCommands.EXISTS, getName()); + return commandExecutor.readAsync(getName(), StringCodec.INSTANCE, RedisCommands.EXISTS, getName()); } @Override diff --git a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java index cabfd1ec7..63a382938 100644 --- a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java +++ b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java @@ -1070,12 +1070,7 @@ public class CommandAsyncService implements CommandAsyncExecutor { } private void handleReference(RPromise mainPromise, R res) { - try { - mainPromise.trySuccess((R) tryHandleReference(res)); - } catch (Exception e) { - //fall back and let other part of the code handle the type conversion. - mainPromise.trySuccess(res); - } + mainPromise.trySuccess((R) tryHandleReference(res)); } protected Object tryHandleReference(Object o) { @@ -1198,7 +1193,7 @@ public class CommandAsyncService implements CommandAsyncExecutor { } return RedissonObjectFactory.fromReference(redissonRx, (RedissonReference) res); } catch (Exception exception) { - return res; + throw new IllegalStateException(exception); } } diff --git a/redisson/src/main/java/org/redisson/liveobject/core/RedissonObjectBuilder.java b/redisson/src/main/java/org/redisson/liveobject/core/RedissonObjectBuilder.java index c55587938..4bd973dfd 100644 --- a/redisson/src/main/java/org/redisson/liveobject/core/RedissonObjectBuilder.java +++ b/redisson/src/main/java/org/redisson/liveobject/core/RedissonObjectBuilder.java @@ -84,7 +84,9 @@ public class RedissonObjectBuilder { public void store(RObject ar, String fieldName, RMap liveMap) { Codec codec = ar.getCodec(); - codecProvider.registerCodec((Class) codec.getClass(), codec); + if (codec != null) { + codecProvider.registerCodec((Class) codec.getClass(), codec); + } liveMap.fastPut(fieldName, new RedissonReference(ar.getClass(), ar.getName(), codec)); } diff --git a/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java b/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java index a70083824..e7219369f 100644 --- a/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java +++ b/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java @@ -171,14 +171,18 @@ public class RedissonObjectFactory { Class clazz = object.getClass().getInterfaces()[0]; RObject rObject = ((RObject) object); - config.getReferenceCodecProvider().registerCodec((Class) rObject.getCodec().getClass(), rObject.getCodec()); + if (rObject.getCodec() != null) { + config.getReferenceCodecProvider().registerCodec((Class) rObject.getCodec().getClass(), rObject.getCodec()); + } return new RedissonReference(clazz, rObject.getName(), rObject.getCodec()); } if (object instanceof RObjectReactive && !(object instanceof RLiveObject)) { Class clazz = object.getClass().getInterfaces()[0]; RObjectReactive rObject = ((RObjectReactive) object); - config.getReferenceCodecProvider().registerCodec((Class) rObject.getCodec().getClass(), rObject.getCodec()); + if (rObject.getCodec() != null) { + config.getReferenceCodecProvider().registerCodec((Class) rObject.getCodec().getClass(), rObject.getCodec()); + } return new RedissonReference(clazz, rObject.getName(), rObject.getCodec()); } diff --git a/redisson/src/test/java/org/redisson/RedissonReferenceTest.java b/redisson/src/test/java/org/redisson/RedissonReferenceTest.java index 38628334e..9ebf95f99 100644 --- a/redisson/src/test/java/org/redisson/RedissonReferenceTest.java +++ b/redisson/src/test/java/org/redisson/RedissonReferenceTest.java @@ -2,8 +2,10 @@ package org.redisson; import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; import static org.junit.Assert.*; +import static org.assertj.core.api.Assertions.*; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; @@ -19,6 +21,21 @@ import org.redisson.config.Config; */ public class RedissonReferenceTest extends BaseTest { + @Test + public void testBitSet() { + RMap data = redisson.getMap("data-00"); + RBitSet bs = redisson.getBitSet("data-01"); + bs.set(5); + bs.set(7); + data.put("a", bs); + + assertThat(data.entrySet()).hasSize(1); + for (Map.Entry entry : data.entrySet()) { + assertThat(entry.getValue().get(5)).isTrue(); + assertThat(entry.getValue().get(7)).isTrue(); + } + } + @Test public void testBasic() { RBucket b1 = redisson.getBucket("b1"); -- GitLab