From dac88df5e2689d64c070512d9ac21371985006ac Mon Sep 17 00:00:00 2001
From: Nikita <abracham.mitchell@gmail.com>
Date: Wed, 7 Jun 2017 21:49:02 +0300
Subject: [PATCH] RedissonReference refactoring

---
 .../src/main/java/org/redisson/Redisson.java  |  4 +-
 .../java/org/redisson/RedissonObject.java     | 22 ++++++++++
 .../redisson/command/CommandAsyncService.java |  9 ++--
 .../redisson/command/CommandBatchService.java |  4 +-
 .../connection/ConnectionManager.java         |  3 ++
 .../MasterSlaveConnectionManager.java         | 21 +++++-----
 .../redisson/misc/RedissonObjectFactory.java  | 41 ++++---------------
 7 files changed, 52 insertions(+), 52 deletions(-)

diff --git a/redisson/src/main/java/org/redisson/Redisson.java b/redisson/src/main/java/org/redisson/Redisson.java
index 3189d2eca..9ba46c096 100755
--- a/redisson/src/main/java/org/redisson/Redisson.java
+++ b/redisson/src/main/java/org/redisson/Redisson.java
@@ -114,8 +114,8 @@ public class Redisson implements RedissonClient {
         
         connectionManager = ConfigSupport.createConnectionManager(configCopy);
         evictionScheduler = new EvictionScheduler(connectionManager.getCommandExecutor());
-        codecProvider = config.getCodecProvider();
-        resolverProvider = config.getResolverProvider();
+        codecProvider = configCopy.getCodecProvider();
+        resolverProvider = configCopy.getResolverProvider();
     }
     
     public EvictionScheduler getEvictionScheduler() {
diff --git a/redisson/src/main/java/org/redisson/RedissonObject.java b/redisson/src/main/java/org/redisson/RedissonObject.java
index 5c5a1aba8..a1285a43b 100644
--- a/redisson/src/main/java/org/redisson/RedissonObject.java
+++ b/redisson/src/main/java/org/redisson/RedissonObject.java
@@ -24,6 +24,7 @@ import org.redisson.client.codec.Codec;
 import org.redisson.client.protocol.RedisCommands;
 import org.redisson.command.CommandAsyncExecutor;
 import org.redisson.misc.RPromise;
+import org.redisson.misc.RedissonObjectFactory;
 
 /**
  * Base Redisson object
@@ -162,6 +163,13 @@ public abstract class RedissonObject implements RObject {
     }
     
     protected byte[] encode(Object value) {
+        if (commandExecutor.isRedissonReferenceSupportEnabled()) {
+            RedissonReference reference = RedissonObjectFactory.toReference(commandExecutor.getConnectionManager().getCfg(), value);
+            if (reference != null) {
+                value = reference;
+            }
+        }
+        
         try {
             return codec.getValueEncoder().encode(value);
         } catch (IOException e) {
@@ -170,6 +178,13 @@ public abstract class RedissonObject implements RObject {
     }
     
     protected byte[] encodeMapKey(Object value) {
+        if (commandExecutor.isRedissonReferenceSupportEnabled()) {
+            RedissonReference reference = RedissonObjectFactory.toReference(commandExecutor.getConnectionManager().getCfg(), value);
+            if (reference != null) {
+                value = reference;
+            }
+        }
+        
         try {
             return codec.getMapKeyEncoder().encode(value);
         } catch (IOException e) {
@@ -178,6 +193,13 @@ public abstract class RedissonObject implements RObject {
     }
 
     protected byte[] encodeMapValue(Object value) {
+        if (commandExecutor.isRedissonReferenceSupportEnabled()) {
+            RedissonReference reference = RedissonObjectFactory.toReference(commandExecutor.getConnectionManager().getCfg(), value);
+            if (reference != null) {
+                value = reference;
+            }
+        }
+
         try {
             return codec.getMapValueEncoder().encode(value);
         } catch (IOException e) {
diff --git a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java
index 7e7e26cf5..fb18a6f56 100644
--- a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java
+++ b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java
@@ -26,7 +26,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.redisson.RedisClientResult;
@@ -484,10 +483,10 @@ public class CommandAsyncService implements CommandAsyncExecutor {
         if (isRedissonReferenceSupportEnabled()) {
             try {
                 for (int i = 0; i < params.length; i++) {
-                    RedissonReference reference = redisson != null
-                            ? RedissonObjectFactory.toReference(redisson, params[i])
-                                    : RedissonObjectFactory.toReference(redissonReactive, params[i]);
-                            params[i] = reference == null ? params[i] : reference;
+                    RedissonReference reference = RedissonObjectFactory.toReference(getConnectionManager().getCfg(), params[i]);
+                    if (reference != null) {
+                        params[i] = reference;
+                    }
                 }
             } catch (Exception e) {
                 connectionManager.getShutdownLatch().release();
diff --git a/redisson/src/main/java/org/redisson/command/CommandBatchService.java b/redisson/src/main/java/org/redisson/command/CommandBatchService.java
index c2656ebf9..6ef8b0df8 100644
--- a/redisson/src/main/java/org/redisson/command/CommandBatchService.java
+++ b/redisson/src/main/java/org/redisson/command/CommandBatchService.java
@@ -114,9 +114,7 @@ public class CommandBatchService extends CommandReactiveService {
         }
         if (isRedissonReferenceSupportEnabled()) {
             for (int i = 0; i < params.length; i++) {
-                RedissonReference reference = redisson != null
-                        ? RedissonObjectFactory.toReference(redisson, params[i])
-                        : RedissonObjectFactory.toReference(redissonReactive, params[i]);
+                RedissonReference reference = RedissonObjectFactory.toReference(connectionManager.getCfg(), params[i]);
                 if (reference != null) {
                     params[i] = reference;
                 }
diff --git a/redisson/src/main/java/org/redisson/connection/ConnectionManager.java b/redisson/src/main/java/org/redisson/connection/ConnectionManager.java
index eb64cb0e8..6a6ee0517 100644
--- a/redisson/src/main/java/org/redisson/connection/ConnectionManager.java
+++ b/redisson/src/main/java/org/redisson/connection/ConnectionManager.java
@@ -30,6 +30,7 @@ import org.redisson.client.RedisPubSubListener;
 import org.redisson.client.codec.Codec;
 import org.redisson.client.protocol.RedisCommand;
 import org.redisson.command.CommandSyncService;
+import org.redisson.config.Config;
 import org.redisson.config.MasterSlaveServersConfig;
 import org.redisson.misc.InfinitySemaphoreLatch;
 import org.redisson.misc.RPromise;
@@ -51,6 +52,8 @@ public interface ConnectionManager {
     ExecutorService getExecutor();
     
     URI getLastClusterNode();
+    
+    Config getCfg();
 
     boolean isClusterMode();
 
diff --git a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java
index ddb46e020..4f825f43c 100644
--- a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java
+++ b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java
@@ -148,12 +148,10 @@ public class MasterSlaveConnectionManager implements ConnectionManager {
     
     private final AsyncSemaphore freePubSubLock = new AsyncSemaphore(1);
     
-    private final boolean sharedEventLoopGroup;
-
-    private final boolean sharedExecutor;
-
     private final CommandSyncService commandExecutor;
     
+    private final Config cfg;
+    
     {
         for (int i = 0; i < locks.length; i++) {
             locks[i] = new AsyncSemaphore(1);
@@ -202,11 +200,10 @@ public class MasterSlaveConnectionManager implements ConnectionManager {
         } else {
             executor = cfg.getExecutor();
         }
-       
+
+        this.cfg = cfg;
         this.codec = cfg.getCodec();
         this.shutdownPromise = newPromise();
-        this.sharedEventLoopGroup = cfg.getEventLoopGroup() != null;
-        this.sharedExecutor = cfg.getExecutor() != null;
         this.commandExecutor = new CommandSyncService(this);
     }
 
@@ -222,6 +219,10 @@ public class MasterSlaveConnectionManager implements ConnectionManager {
         return connectionWatcher;
     }
 
+    public Config getCfg() {
+        return cfg;
+    }
+    
     @Override
     public MasterSlaveServersConfig getConfig() {
         return config;
@@ -784,8 +785,8 @@ public class MasterSlaveConnectionManager implements ConnectionManager {
         for (MasterSlaveEntry entry : entries.values()) {
             entry.shutdown();
         }
-        
-        if (!sharedExecutor) {
+
+        if (cfg.getExecutor() == null) {
             executor.shutdown();
             try {
                 executor.awaitTermination(timeout, unit);
@@ -794,7 +795,7 @@ public class MasterSlaveConnectionManager implements ConnectionManager {
             }
         }
         
-        if (!sharedEventLoopGroup) {
+        if (cfg.getEventLoopGroup() == null) {
             group.shutdownGracefully(quietPeriod, timeout, unit).syncUninterruptibly();
         }
         timer.stop();
diff --git a/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java b/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java
index 230a3ebf5..666ceed6a 100644
--- a/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java
+++ b/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java
@@ -23,7 +23,6 @@ import java.util.List;
 import java.util.Map;
 
 import org.redisson.RedissonReference;
-import org.redisson.client.codec.Codec;
 import org.redisson.api.RLiveObject;
 import org.redisson.api.RLiveObjectService;
 import org.redisson.api.RObject;
@@ -32,7 +31,9 @@ import org.redisson.api.RedissonClient;
 import org.redisson.api.RedissonReactiveClient;
 import org.redisson.api.annotation.REntity;
 import org.redisson.api.annotation.RId;
+import org.redisson.client.codec.Codec;
 import org.redisson.codec.CodecProvider;
+import org.redisson.config.Config;
 import org.redisson.liveobject.misc.Introspectior;
 import org.redisson.liveobject.resolver.NamingScheme;
 
@@ -55,10 +56,10 @@ public class RedissonObjectFactory {
         }
     }
     
-    private static final Map<Class, RedissonObjectBuilder> builders;
+    private static final Map<Class<?>, RedissonObjectBuilder> builders;
     
     static {
-        HashMap<Class, RedissonObjectBuilder> b = new HashMap<Class, RedissonObjectBuilder>();
+        HashMap<Class<?>, RedissonObjectBuilder> b = new HashMap<Class<?>, RedissonObjectBuilder>();
         for (Method method : RedissonClient.class.getDeclaredMethods()) {
             if (!method.getReturnType().equals(Void.TYPE)
                     && RObject.class.isAssignableFrom(method.getReturnType())
@@ -130,10 +131,6 @@ public class RedissonObjectFactory {
 
     
     public static <T> T fromReference(RedissonReactiveClient redisson, RedissonReference rr) throws Exception {
-        return fromReference(redisson, rr, null);
-    }
-
-    public static <T> T fromReference(RedissonReactiveClient redisson, RedissonReference rr, Class<?> expected) throws Exception {
         Class<? extends Object> type = rr.getReactiveType();
         CodecProvider codecProvider = redisson.getConfig().getCodecProvider();
         /**
@@ -153,49 +150,29 @@ public class RedissonObjectFactory {
         throw new ClassNotFoundException("No RObjectReactive is found to match class type of " + rr.getReactiveTypeName()+ " with codec type of " + rr.getCodecName());
     }
 
-    public static RedissonReference toReference(RedissonClient redisson, Object object) {
+    public static RedissonReference toReference(Config config, Object object) {
         if (object != null && object.getClass().isAnnotationPresent(REntity.class)) {
             throw new IllegalArgumentException("REntity should be attached to Redisson before save");
         }
         
         if (object instanceof RObject && !(object instanceof RLiveObject)) {
             RObject rObject = ((RObject) object);
-            redisson.getCodecProvider().registerCodec((Class) rObject.getCodec().getClass(), (Class) rObject.getClass(), rObject.getName(), rObject.getCodec());
+            config.getCodecProvider().registerCodec((Class) rObject.getCodec().getClass(), (Class) rObject.getClass(), rObject.getName(), rObject.getCodec());
             return new RedissonReference(object.getClass(), ((RObject) object).getName(), ((RObject) object).getCodec());
         }
-        try {
-            if (object instanceof RLiveObject) {
-                Class<? extends Object> rEntity = object.getClass().getSuperclass();
-                REntity anno = rEntity.getAnnotation(REntity.class);
-                NamingScheme ns = anno.namingScheme()
-                        .getDeclaredConstructor(Codec.class)
-                        .newInstance(redisson.getCodecProvider().getCodec(anno, (Class) rEntity));
-                String name = Introspectior
-                        .getFieldsWithAnnotation(rEntity, RId.class)
-                        .getOnly().getName();
-                Class<?> type = rEntity.getDeclaredField(name).getType();
-                return new RedissonReference(rEntity,
-                        ns.getName(rEntity, type, name, ((RLiveObject) object).getLiveObjectId()));
-            }
-        } catch (Exception e) {
-            throw new IllegalArgumentException(e);
-        }
-        return null;
-    }
-
-    public static RedissonReference toReference(RedissonReactiveClient redissonReactive, Object object) {
         if (object instanceof RObjectReactive && !(object instanceof RLiveObject)) {
             RObjectReactive rObject = ((RObjectReactive) object);
-            redissonReactive.getCodecProvider().registerCodec((Class) rObject.getCodec().getClass(), (Class) rObject.getClass(), rObject.getName(), rObject.getCodec());
+            config.getCodecProvider().registerCodec((Class) rObject.getCodec().getClass(), (Class) rObject.getClass(), rObject.getName(), rObject.getCodec());
             return new RedissonReference(object.getClass(), ((RObjectReactive) object).getName(), ((RObjectReactive) object).getCodec());
         }
+        
         try {
             if (object instanceof RLiveObject) {
                 Class<? extends Object> rEntity = object.getClass().getSuperclass();
                 REntity anno = rEntity.getAnnotation(REntity.class);
                 NamingScheme ns = anno.namingScheme()
                         .getDeclaredConstructor(Codec.class)
-                        .newInstance(redissonReactive.getCodecProvider().getCodec(anno, (Class) rEntity));
+                        .newInstance(config.getCodecProvider().getCodec(anno, (Class) rEntity));
                 String name = Introspectior
                         .getFieldsWithAnnotation(rEntity, RId.class)
                         .getOnly().getName();