diff --git a/src/main/java/org/redisson/Config.java b/src/main/java/org/redisson/Config.java index 7b1374ae7..7d35012e6 100644 --- a/src/main/java/org/redisson/Config.java +++ b/src/main/java/org/redisson/Config.java @@ -15,9 +15,10 @@ */ package org.redisson; +import java.io.IOException; + import org.redisson.client.codec.Codec; import org.redisson.codec.JsonJacksonCodec; -import org.redisson.connection.ConnectionListener; /** * Redisson configuration @@ -49,8 +50,6 @@ public class Config { private boolean useLinuxNativeEpoll; - private ConnectionListener connectionListener; - public Config() { } @@ -62,7 +61,6 @@ public class Config { oldConf.setCodec(new JsonJacksonCodec()); } - setConnectionListener(oldConf.getConnectionListener()); setThreads(oldConf.getThreads()); setCodec(oldConf.getCodec()); if (oldConf.getSingleServerConfig() != null) { @@ -337,21 +335,15 @@ public class Config { return useLinuxNativeEpoll; } - @Deprecated - public ConnectionListener getConnectionListener() { - return connectionListener; + public static Config fromJSON(String content) throws IOException { + ConfigSupport support = new ConfigSupport(); + return support.fromJSON(content); } - /** - * Use {@code org.redisson.core.NodesGroup#addConnectionListener(ConnectionListener)} - * - * @param connectionListener - * @return - */ - @Deprecated - public Config setConnectionListener(ConnectionListener connectionListener) { - this.connectionListener = connectionListener; - return this; + public String toJSON() throws IOException { + ConfigSupport support = new ConfigSupport(); + return support.toJSON(this); } + } diff --git a/src/main/java/org/redisson/ConfigSupport.java b/src/main/java/org/redisson/ConfigSupport.java new file mode 100644 index 000000000..b5fe56e4f --- /dev/null +++ b/src/main/java/org/redisson/ConfigSupport.java @@ -0,0 +1,105 @@ +package org.redisson; + +import java.io.IOException; +import java.net.URI; +import java.util.List; + +import org.redisson.client.codec.Codec; +import org.redisson.connection.balancer.LoadBalancer; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ser.FilterProvider; +import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; +import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; + +public class ConfigSupport { + + @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "class") + @JsonFilter("classFilter") + public static class ClassMixIn { + + } + + public abstract static class SingleSeverConfigMixIn { + + @JsonProperty + List address; + + @JsonIgnore + abstract SingleServerConfig setAddress(String address); + + @JsonIgnore + abstract URI getAddress(); + + @JsonIgnore + abstract void setAddress(URI address); + + } + + public abstract static class MasterSlaveServersConfigMixIn { + + @JsonProperty + List masterAddress; + + @JsonIgnore + abstract MasterSlaveServersConfig setMasterAddress(String masterAddress); + + @JsonIgnore + abstract URI getMasterAddress(); + + @JsonIgnore + abstract void setMasterAddress(URI masterAddress); + + } + + @JsonIgnoreProperties("clusterConfig") + public static class ConfigMixIn { + + @JsonProperty + SentinelServersConfig sentinelServersConfig; + + @JsonProperty + MasterSlaveServersConfig masterSlaveServersConfig; + + @JsonProperty + SingleServerConfig singleServerConfig; + + @JsonProperty + ClusterServersConfig clusterServersConfig; + + @JsonProperty + ElasticacheServersConfig elasticacheServersConfig; + + } + + ObjectMapper mapper = createMapper(); + + public Config fromJSON(String content) throws IOException { + return mapper.readValue(content, Config.class); + } + + public String toJSON(Config config) throws IOException { + return mapper.writeValueAsString(config); + } + + private ObjectMapper createMapper() { + ObjectMapper mapper = new ObjectMapper(); + mapper.addMixIn(MasterSlaveServersConfig.class, MasterSlaveServersConfigMixIn.class); + mapper.addMixIn(SingleServerConfig.class, SingleSeverConfigMixIn.class); + mapper.addMixIn(Config.class, ConfigMixIn.class); + mapper.addMixIn(Codec.class, ClassMixIn.class); + mapper.addMixIn(LoadBalancer.class, ClassMixIn.class); + FilterProvider filterProvider = new SimpleFilterProvider() + .addFilter("classFilter", SimpleBeanPropertyFilter.filterOutAllExcept()); + mapper.setFilterProvider(filterProvider); + mapper.setSerializationInclusion(Include.NON_NULL); + return mapper; + } + +} diff --git a/src/main/java/org/redisson/MasterSlaveServersConfig.java b/src/main/java/org/redisson/MasterSlaveServersConfig.java index a567867d7..b1a68a522 100644 --- a/src/main/java/org/redisson/MasterSlaveServersConfig.java +++ b/src/main/java/org/redisson/MasterSlaveServersConfig.java @@ -16,7 +16,9 @@ package org.redisson; import java.net.URI; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.redisson.misc.URIBuilder; @@ -31,7 +33,7 @@ public class MasterSlaveServersConfig extends BaseMasterSlaveServersConfig masterAddress; public MasterSlaveServersConfig() { } @@ -49,14 +51,21 @@ public class MasterSlaveServersConfig extends BaseMasterSlaveServersConfig { * Redis server address * */ - private URI address; + private List address; /** * Minimum idle subscription connection amount @@ -112,14 +114,21 @@ public class SingleServerConfig extends BaseConfig { * @param address */ public SingleServerConfig setAddress(String address) { - this.address = URIBuilder.create(address); + if (address != null) { + this.address = Collections.singletonList(URIBuilder.create(address)); + } return this; } public URI getAddress() { - return address; + if (address != null) { + return address.get(0); + } + return null; } void setAddress(URI address) { - this.address = address; + if (address != null) { + this.address = Collections.singletonList(address); + } } /** diff --git a/src/test/java/org/redisson/RedissonTest.java b/src/test/java/org/redisson/RedissonTest.java index 81defdb76..c41abdde0 100644 --- a/src/test/java/org/redisson/RedissonTest.java +++ b/src/test/java/org/redisson/RedissonTest.java @@ -4,20 +4,43 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.InetSocketAddress; +import java.net.URI; import java.net.URL; +import java.util.Collections; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.junit.Assert; import org.junit.Test; +import org.redisson.client.RedisConnectionException; import org.redisson.client.WriteRedisConnectionException; +import org.redisson.client.codec.Codec; import org.redisson.codec.SerializationCodec; import org.redisson.connection.ConnectionListener; +import org.redisson.connection.balancer.LoadBalancer; import org.redisson.core.ClusterNode; import org.redisson.core.Node; import org.redisson.core.NodesGroup; +import org.redisson.misc.URIBuilder; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.SerializableString; +import com.fasterxml.jackson.core.io.CharacterEscapes; +import com.fasterxml.jackson.core.io.SerializedString; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ser.FilterProvider; +import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; +import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; + import static org.assertj.core.api.Assertions.*; import net.jodah.concurrentunit.Waiter; @@ -141,6 +164,36 @@ public class RedissonTest { Assert.assertTrue(nodes.pingAll()); } + @Test + public void testClusterConfig() throws IOException { + Config originalConfig = new Config(); + originalConfig.useClusterServers().addNodeAddress("123.123.1.23:1902", "9.3.1.0:1902"); + String t = originalConfig.toJSON(); + Config c = Config.fromJSON(t); + System.out.println(t); + assertThat(c.toJSON()).isEqualTo(t); + } + + @Test + public void testSingleConfig() throws IOException { + RedissonClient r = Redisson.create(); + String t = r.getConfig().toJSON(); + Config c = Config.fromJSON(t); + System.out.println(t); + assertThat(c.toJSON()).isEqualTo(t); + } + + @Test + public void testMasterSlaveConfig() throws IOException { + Config c2 = new Config(); + c2.useMasterSlaveServers().setMasterAddress("123.1.1.1:1231").addSlaveAddress("82.12.47.12:1028"); + + String t = c2.toJSON(); + Config c = Config.fromJSON(t); + System.out.println(t); + assertThat(c.toJSON()).isEqualTo(t); + } + @Test public void testCluster() { NodesGroup nodes = redisson.getClusterNodesGroup();