diff --git a/redisson/src/main/java/org/redisson/RedissonReference.java b/redisson/src/main/java/org/redisson/RedissonReference.java index 45a9bcd96..83f2b276b 100644 --- a/redisson/src/main/java/org/redisson/RedissonReference.java +++ b/redisson/src/main/java/org/redisson/RedissonReference.java @@ -86,10 +86,6 @@ public class RedissonReference { this.codec = codec != null ? codec.getClass().getName() : null; } - public boolean isDefaultCodec() { - return codec == null; - } - /** * @return the type * @throws java.lang.Exception - which could be: @@ -152,6 +148,10 @@ public class RedissonReference { public void setKeyName(String keyName) { this.keyName = keyName; } + + public String getCodec() { + return codec; + } /** * @return the codec diff --git a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java index 46276a37c..2433fd0b6 100644 --- a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java +++ b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java @@ -768,73 +768,80 @@ public class CommandAsyncService implements CommandAsyncExecutor { ((RedisClientResult)res).setRedisClient(addr); } - if (isRedissonReferenceSupportEnabled() && (res instanceof List || res instanceof ListScanResult)) { - List r = res instanceof ListScanResult ? ((ListScanResult)res).getValues() : (List) res; - for (int i = 0; i < r.size(); i++) { - if (r.get(i) instanceof RedissonReference) { - try { - r.set(i ,(redisson != null - ? RedissonObjectFactory.fromReference(redisson, (RedissonReference) r.get(i)) - : RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) r.get(i)))); - } catch (Exception exception) {//skip and carry on to next one. - } - } else if (r.get(i) instanceof ScoredEntry && ((ScoredEntry) r.get(i)).getValue() instanceof RedissonReference) { - try { - ScoredEntry se = ((ScoredEntry) r.get(i)); - r.set(i ,new ScoredEntry(se.getScore(), redisson != null - ? RedissonObjectFactory.fromReference(redisson, (RedissonReference) se.getValue()) - : RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) se.getValue()))); - } catch (Exception exception) {//skip and carry on to next one. - } - } - } + if (isRedissonReferenceSupportEnabled()) { + handleReference(details.getMainPromise(), res); + } else { details.getMainPromise().trySuccess(res); - } else if (isRedissonReferenceSupportEnabled() && (res instanceof MapScanResult)) { - Map map = ((MapScanResult)res).getMap(); - HashMap toAdd = null; - for (Map.Entry e : (Set>) map.entrySet()) { - if (e.getValue().getObj() instanceof RedissonReference) { - try { - e.setValue(new ScanObjectEntry(e.getValue().getBuf(), redisson != null - ? RedissonObjectFactory.fromReference(redisson, (RedissonReference) e.getValue().getObj()) - : RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) e.getValue().getObj()))); - } catch (Exception exception) {//skip and carry on to next one. - } + } + } else { + details.getMainPromise().tryFailure(future.cause()); + } + AsyncDetails.release(details); + } + + private void handleReference(RPromise mainPromise, R res) { + if (res instanceof List || res instanceof ListScanResult) { + List r = res instanceof ListScanResult ? ((ListScanResult)res).getValues() : (List) res; + for (int i = 0; i < r.size(); i++) { + if (r.get(i) instanceof RedissonReference) { + try { + r.set(i ,(redisson != null + ? RedissonObjectFactory.fromReference(redisson, (RedissonReference) r.get(i)) + : RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) r.get(i)))); + } catch (Exception exception) {//skip and carry on to next one. } - if (e.getKey().getObj() instanceof RedissonReference) { - if (toAdd == null) { - toAdd = new HashMap(); - } - toAdd.put(e.getKey(), e.getValue()); + } else if (r.get(i) instanceof ScoredEntry && ((ScoredEntry) r.get(i)).getValue() instanceof RedissonReference) { + try { + ScoredEntry se = ((ScoredEntry) r.get(i)); + r.set(i ,new ScoredEntry(se.getScore(), redisson != null + ? RedissonObjectFactory.fromReference(redisson, (RedissonReference) se.getValue()) + : RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) se.getValue()))); + } catch (Exception exception) {//skip and carry on to next one. } } - if (toAdd != null) { - for (Map.Entry e : (Set>) toAdd.entrySet()) { - try { - map.put(new ScanObjectEntry(e.getValue().getBuf(), (redisson != null - ? RedissonObjectFactory.fromReference(redisson, (RedissonReference) e.getKey().getObj()) - : RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) e.getKey().getObj()))), map.remove(e.getKey())); - } catch (Exception exception) {//skip and carry on to next one. - } + } + mainPromise.trySuccess(res); + } else if (res instanceof MapScanResult) { + Map map = ((MapScanResult)res).getMap(); + HashMap toAdd = null; + for (Map.Entry e : map.entrySet()) { + if (e.getValue().getObj() instanceof RedissonReference) { + try { + e.setValue(new ScanObjectEntry(e.getValue().getBuf(), redisson != null + ? RedissonObjectFactory.fromReference(redisson, (RedissonReference) e.getValue().getObj()) + : RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) e.getValue().getObj()))); + } catch (Exception exception) {//skip and carry on to next one. } } - details.getMainPromise().trySuccess(res); - } else if (isRedissonReferenceSupportEnabled() && (res instanceof MapScanResult)) { - } else if (isRedissonReferenceSupportEnabled() && res instanceof RedissonReference) { - try { - details.getMainPromise().trySuccess(redisson != null - ? RedissonObjectFactory.fromReference(redisson, (RedissonReference) res) - : RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) res)); - } catch (Exception exception) { - details.getMainPromise().trySuccess(res);//fallback + if (e.getKey().getObj() instanceof RedissonReference) { + if (toAdd == null) { + toAdd = new HashMap(); + } + toAdd.put(e.getKey(), e.getValue()); } - } else { - details.getMainPromise().trySuccess(res); + } + if (toAdd != null) { + for (Map.Entry e : toAdd.entrySet()) { + try { + map.put(new ScanObjectEntry(e.getValue().getBuf(), (redisson != null + ? RedissonObjectFactory.fromReference(redisson, (RedissonReference) e.getKey().getObj()) + : RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) e.getKey().getObj()))), map.remove(e.getKey())); + } catch (Exception exception) {//skip and carry on to next one. + } + } + } + mainPromise.trySuccess(res); + } else if (res instanceof RedissonReference) { + try { + mainPromise.trySuccess(redisson != null + ? RedissonObjectFactory.fromReference(redisson, (RedissonReference) res) + : RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) res)); + } catch (Exception exception) { + mainPromise.trySuccess(res);//fallback } } else { - details.getMainPromise().tryFailure(future.cause()); + mainPromise.trySuccess(res); } - AsyncDetails.release(details); } } diff --git a/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java b/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java index cf9ddbc9a..d68181a71 100644 --- a/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java +++ b/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java @@ -118,8 +118,8 @@ public class RedissonObjectFactory { List> interfaces = Arrays.asList(type.getInterfaces()); for (Class iType : interfaces) { if (builders.containsKey(iType)) {// user cache to speed up things a little. - Method builder = builders.get(iType).get(rr.isDefaultCodec()); - return (T) (rr.isDefaultCodec() + Method builder = builders.get(iType).get(isDefaultCodec(rr)); + return (T) (isDefaultCodec(rr) ? builder.invoke(redisson, rr.getKeyName()) : builder.invoke(redisson, rr.getKeyName(), codecProvider.getCodec(rr.getCodecType()))); } @@ -128,6 +128,11 @@ public class RedissonObjectFactory { throw new ClassNotFoundException("No RObject is found to match class type of " + rr.getTypeName() + " with codec type of " + rr.getCodecName()); } + public static boolean isDefaultCodec(RedissonReference rr) { + return rr.getCodec() == null; + } + + public static T fromReference(RedissonReactiveClient redisson, RedissonReference rr) throws Exception { return fromReference(redisson, rr, null); } @@ -142,8 +147,8 @@ public class RedissonObjectFactory { List> interfaces = Arrays.asList(type.getInterfaces()); for (Class iType : interfaces) { if (builders.containsKey(iType)) {// user cache to speed up things a little. - Method builder = builders.get(iType).get(rr.isDefaultCodec()); - return (T) (rr.isDefaultCodec() + Method builder = builders.get(iType).get(isDefaultCodec(rr)); + return (T) (isDefaultCodec(rr) ? builder.invoke(redisson, rr.getKeyName()) : builder.invoke(redisson, rr.getKeyName(), codecProvider.getCodec(rr.getCodecType()))); }