Skip to content

Commit

Permalink
Extend CLIENT SETINFO support
Browse files Browse the repository at this point in the history
  • Loading branch information
sazzad16 committed Aug 21, 2023
1 parent 71204c5 commit 10e1833
Show file tree
Hide file tree
Showing 5 changed files with 158 additions and 18 deletions.
34 changes: 24 additions & 10 deletions src/main/java/redis/clients/jedis/Connection.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import java.util.List;
import java.util.function.Supplier;

import redis.clients.jedis.JedisClientConfig.ClientSetInfoConfig;
import redis.clients.jedis.Protocol.Command;
import redis.clients.jedis.Protocol.Keyword;
import redis.clients.jedis.args.ClientAttributeOption;
Expand Down Expand Up @@ -388,7 +389,7 @@ private static boolean validateClientInfo(String info) {
return true;
}

private void initializeFromClientConfig(JedisClientConfig config) {
private void initializeFromClientConfig(final JedisClientConfig config) {
try {
connect();

Expand All @@ -415,16 +416,29 @@ private void initializeFromClientConfig(JedisClientConfig config) {
fireAndForgetMsg.add(new CommandArguments(Command.CLIENT).add(Keyword.SETNAME).add(clientName));
}

String libName = JedisMetaInfo.getArtifactId();
if (libName != null && validateClientInfo(libName)) {
fireAndForgetMsg.add(new CommandArguments(Command.CLIENT).add(Keyword.SETINFO)
.add(ClientAttributeOption.LIB_NAME.getRaw()).add(libName));
}
ClientSetInfoConfig setInfoConfig = config.getClientSetInfoConfig();
if (setInfoConfig == null) setInfoConfig = new ClientSetInfoConfig() { };

if (!setInfoConfig.disable()) {
String libName = JedisMetaInfo.getArtifactId();
if (libName != null && validateClientInfo(libName)) {
String libNameSuffix = setInfoConfig.libNameSuffix();
if (libNameSuffix != null && validateClientInfo(libNameSuffix)) {
libName = libName + libNameSuffix;
}
fireAndForgetMsg.add(new CommandArguments(Command.CLIENT).add(Keyword.SETINFO)
.add(ClientAttributeOption.LIB_NAME.getRaw()).add(libName));
}

String libVersion = JedisMetaInfo.getVersion();
if (libVersion != null && validateClientInfo(libVersion)) {
fireAndForgetMsg.add(new CommandArguments(Command.CLIENT).add(Keyword.SETINFO)
.add(ClientAttributeOption.LIB_VER.getRaw()).add(libVersion));
String libVersion = JedisMetaInfo.getVersion();
if (libVersion != null && validateClientInfo(libVersion)) {
String libVerSuffix = setInfoConfig.libVerSuffix();
if (libVerSuffix != null && validateClientInfo(libVerSuffix)) {
libVersion = libVersion + libVerSuffix;
}
fireAndForgetMsg.add(new CommandArguments(Command.CLIENT).add(Keyword.SETINFO)
.add(ClientAttributeOption.LIB_VER.getRaw()).add(libVersion));
}
}

for (CommandArguments arg : fireAndForgetMsg) {
Expand Down
75 changes: 71 additions & 4 deletions src/main/java/redis/clients/jedis/DefaultJedisClientConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocketFactory;
import redis.clients.jedis.JedisClientConfig.ClientSetInfoConfig;

public final class DefaultJedisClientConfig implements JedisClientConfig {

Expand All @@ -24,10 +25,13 @@ public final class DefaultJedisClientConfig implements JedisClientConfig {

private final HostAndPortMapper hostAndPortMapper;

private final ClientSetInfoConfig clientSetInfoConfig;

private DefaultJedisClientConfig(RedisProtocol protocol, int connectionTimeoutMillis, int soTimeoutMillis,
int blockingSocketTimeoutMillis, Supplier<RedisCredentials> credentialsProvider, int database,
String clientName, boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
HostnameVerifier hostnameVerifier, HostAndPortMapper hostAndPortMapper) {
HostnameVerifier hostnameVerifier, HostAndPortMapper hostAndPortMapper,
ClientSetInfoConfig clientSetInfoConfig) {
this.redisProtocol = protocol;
this.connectionTimeoutMillis = connectionTimeoutMillis;
this.socketTimeoutMillis = soTimeoutMillis;
Expand All @@ -40,6 +44,7 @@ private DefaultJedisClientConfig(RedisProtocol protocol, int connectionTimeoutMi
this.sslParameters = sslParameters;
this.hostnameVerifier = hostnameVerifier;
this.hostAndPortMapper = hostAndPortMapper;
this.clientSetInfoConfig = clientSetInfoConfig;
}

@Override
Expand Down Expand Up @@ -113,6 +118,11 @@ public HostAndPortMapper getHostAndPortMapper() {
return hostAndPortMapper;
}

@Override
public ClientSetInfoConfig getClientSetInfoConfig() {
return clientSetInfoConfig;
}

public static Builder builder() {
return new Builder();
}
Expand All @@ -138,6 +148,8 @@ public static class Builder {

private HostAndPortMapper hostAndPortMapper = null;

private ClientSetInfoConfig clientSetInfoConfig = null;

private Builder() {
}

Expand All @@ -149,7 +161,7 @@ public DefaultJedisClientConfig build() {

return new DefaultJedisClientConfig(redisProtocol, connectionTimeoutMillis, socketTimeoutMillis,
blockingSocketTimeoutMillis, credentialsProvider, database, clientName, ssl,
sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMapper);
sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMapper, clientSetInfoConfig);
}

/**
Expand Down Expand Up @@ -239,6 +251,60 @@ public Builder hostAndPortMapper(HostAndPortMapper hostAndPortMapper) {
this.hostAndPortMapper = hostAndPortMapper;
return this;
}

public Builder clientSetInfoConfig(ClientSetInfoConfig setInfoConfig) {
this.clientSetInfoConfig = setInfoConfig;
return this;
}
}

public static SetInfoBuilder setInfoBuilder() {
return new SetInfoBuilder();
}

public static class SetInfoBuilder {

private boolean disable = false;
private String libNameSuffix = null;
private String libVerSuffix = null;

private SetInfoBuilder() {
}

public ClientSetInfoConfig build() {
return new ClientSetInfoConfig() {

@Override
public boolean disable() {
return disable;
}

@Override
public String libVerSuffix() {
return libNameSuffix;
}

@Override
public String libNameSuffix() {
return libVerSuffix;
}
};
}

public SetInfoBuilder disable() {
this.disable = true;
return this;
}

public SetInfoBuilder libNameSuffix(String suffix) {
this.libNameSuffix = suffix;
return this;
}

public SetInfoBuilder libVerSuffix(String suffix) {
this.libVerSuffix = suffix;
return this;
}
}

public static DefaultJedisClientConfig create(int connectionTimeoutMillis, int soTimeoutMillis,
Expand All @@ -248,14 +314,15 @@ public static DefaultJedisClientConfig create(int connectionTimeoutMillis, int s
return new DefaultJedisClientConfig(null,
connectionTimeoutMillis, soTimeoutMillis, blockingSocketTimeoutMillis,
new DefaultRedisCredentialsProvider(new DefaultRedisCredentials(user, password)), database,
clientName, ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMapper);
clientName, ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMapper, null);
}

public static DefaultJedisClientConfig copyConfig(JedisClientConfig copy) {
return new DefaultJedisClientConfig(copy.getRedisProtocol(),
copy.getConnectionTimeoutMillis(), copy.getSocketTimeoutMillis(),
copy.getBlockingSocketTimeoutMillis(), copy.getCredentialsProvider(),
copy.getDatabase(), copy.getClientName(), copy.isSsl(), copy.getSslSocketFactory(),
copy.getSslParameters(), copy.getHostnameVerifier(), copy.getHostAndPortMapper());
copy.getSslParameters(), copy.getHostnameVerifier(), copy.getHostAndPortMapper(),
copy.getClientSetInfoConfig());
}
}
18 changes: 18 additions & 0 deletions src/main/java/redis/clients/jedis/JedisClientConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -80,4 +80,22 @@ default HostAndPortMapper getHostAndPortMapper() {
return null;
}

public interface ClientSetInfoConfig {

default boolean disable() {
return false;
}

default String libNameSuffix() {
return null;
}

default String libVerSuffix() {
return null;
}
}

default ClientSetInfoConfig getClientSetInfoConfig() {
return null;
}
}
41 changes: 41 additions & 0 deletions src/test/java/redis/clients/jedis/JedisTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@

import org.junit.Test;

import redis.clients.jedis.JedisClientConfig.ClientSetInfoConfig;
import redis.clients.jedis.exceptions.InvalidURIException;
import redis.clients.jedis.exceptions.JedisConnectionException;
import redis.clients.jedis.exceptions.JedisException;
import redis.clients.jedis.commands.jedis.JedisCommandsTestBase;
import redis.clients.jedis.util.JedisMetaInfo;
import redis.clients.jedis.util.SafeEncoder;

public class JedisTest extends JedisCommandsTestBase {
Expand Down Expand Up @@ -288,4 +290,43 @@ public void checkDisconnectOnQuit() {
assertFalse(jedis.isConnected());
}

@Test
public void clientSetInfoDefault() {
try (Jedis jedis = new Jedis(hnp, DefaultJedisClientConfig.builder().password("foobared")
.build())) {
assertEquals("PONG", jedis.ping());
String info = jedis.clientInfo();
assertTrue(info.contains("lib-name=" + JedisMetaInfo.getArtifactId()));
assertTrue(info.contains("lib-ver=" + JedisMetaInfo.getVersion()));
}
}

@Test
public void clientSetInfoDisable() {
try (Jedis jedis = new Jedis(hnp, DefaultJedisClientConfig.builder().password("foobared")
.clientSetInfoConfig(new ClientSetInfoConfig() {
@Override public boolean disable() { return true; }
}).build())) {
assertEquals("PONG", jedis.ping());
String info = jedis.clientInfo();
assertFalse(info.contains("lib-name=" + JedisMetaInfo.getArtifactId()));
assertFalse(info.contains("lib-ver=" + JedisMetaInfo.getVersion()));
}
}

@Test
public void clientSetInfoCustom() {
final String libNameSuffix = "-for-redis";
final String libVerSuffix = "-custom";
ClientSetInfoConfig setInfoConfig = DefaultJedisClientConfig.setInfoBuilder()
.libNameSuffix(libNameSuffix).libVerSuffix(libVerSuffix).build();
try (Jedis jedis = new Jedis(hnp, DefaultJedisClientConfig.builder().password("foobared")
.clientSetInfoConfig(setInfoConfig).build())) {
assertEquals("PONG", jedis.ping());
String info = jedis.clientInfo();
assertFalse(info.contains("lib-name=" + JedisMetaInfo.getArtifactId() + libNameSuffix));
assertFalse(info.contains("lib-ver=" + JedisMetaInfo.getVersion() + libVerSuffix));
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,14 @@ public void nameBinary() {
}

@Test
public void clientSetInfoDefault() {
String libName = "jedis";
public void clientSetInfoCommand() {
String libName = "Jedis::A-Redis-Java-library";
String libVersion = "999.999.999";
assertEquals("OK", client.clientSetInfo(ClientAttributeOption.LIB_NAME, libName));
assertEquals("OK", client.clientSetInfo(ClientAttributeOption.LIB_VER, libVersion));
String info = client.clientInfo();
assertTrue(info.contains("lib-name=jedis"));
assertTrue(info.contains("lib-ver=999.999.999"));
assertTrue(info.contains("lib-name=" + libName));
assertTrue(info.contains("lib-ver=" + libVersion));
}

@Test
Expand Down

0 comments on commit 10e1833

Please sign in to comment.