Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Redis as ConfigurationSource #205

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
21 changes: 21 additions & 0 deletions cfg4j-redis/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
buildscript {

ext {
artifactName = "cfg4j-redis"
}
}

// ----------- External module dependencies -----------

dependencies {
compile project(":cfg4j-core")
compile group: 'redis.clients', name: 'jedis', version: '2.9.0'
}

// ----------- Task configurations -----------
jar {
baseName = "${artifactName}"
version = "${artifactVersion}"
}

archivesBaseName = "${artifactName}"
74 changes: 74 additions & 0 deletions cfg4j-redis/src/main/java/RedisConfigurationSource.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import org.cfg4j.source.ConfigurationSource;
import org.cfg4j.source.SourceCommunicationException;
import org.cfg4j.source.context.environment.Environment;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;

import java.util.Map;
import java.util.Properties;
import java.util.Set;

/**
* Created by sumeet
* on 13/2/17.
*/
public class RedisConfigurationSource implements ConfigurationSource {

private static final Logger LOG = LoggerFactory.getLogger(RedisConfigurationSource.class);
private static final String DEFAULT_REDIS_KEY = "CONFIGURATION_PROPERTIES";

private final String host;
private final int port;
private final int connectionTimeout;
private final int socketTimeout;
private Jedis jedis = null;

public RedisConfigurationSource(String host, int port, int connectionTimeout, int socketTimeout) {
this.host = host;
this.port = port;
this.connectionTimeout = connectionTimeout;
this.socketTimeout = socketTimeout;
}

private Properties getPropertiesFromRedis(String redisKey) {
LOG.trace("GETTING_PROPERTIES_FROM_REDIS");
Map<String, String> propertiesFromRedis = jedis.hgetAll(redisKey);

LOG.info(propertiesFromRedis.size() + "_PROPERTIES_FETCHED_FROM_REDIS");

Properties properties = new Properties();
Set<Map.Entry<String, String>> entries = propertiesFromRedis.entrySet();
for (Map.Entry<String, String> entry : entries) {
properties.setProperty(entry.getKey(), entry.getValue());
}
return properties;
}

@Override
public Properties getConfiguration(Environment environment) {

if (!Util.isSet(jedis)) {
throw new IllegalStateException("CONFIGURATION_SOURCE_UNINITIALISED");
}

String redisKey = environment.getName();
if (!Util.isStringSet(redisKey)) {
redisKey = DEFAULT_REDIS_KEY;
}

Properties properties = getPropertiesFromRedis(redisKey);
return properties;
}

@Override
public void init() {
LOG.info("ESTABLISHING_CONNECTION_TO_REDIS|" + host + "|" + port);
try {
jedis = new Jedis(host, port, connectionTimeout, socketTimeout);
LOG.info("CONNECTION_TO_REDIS_ESTABLISHED|" + host + "|" + port);
} catch (Exception e) {
throw new SourceCommunicationException("CANNOT_CONNECT_TO_REDIS|" + host + "|" + port, e);
}
}
}
42 changes: 42 additions & 0 deletions cfg4j-redis/src/main/java/RedisConfigurationSourceBuilder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/**
* Created by sumeet
* on 14/2/17.
*/
public class RedisConfigurationSourceBuilder {

private String host;
private int port;
private int connectionTimeout;
private int socketTimeout;

public RedisConfigurationSourceBuilder() {
host = "localhost";
port = 6379;
connectionTimeout = 2000;
socketTimeout = 2000;
}

public RedisConfigurationSourceBuilder withHost(String host) {
this.host = host;
return this;
}

public RedisConfigurationSourceBuilder withPort(int port) {
this.port = port;
return this;
}

public RedisConfigurationSourceBuilder withConnectionTimeout(int connectionTimeout) {
this.connectionTimeout = connectionTimeout;
return this;
}

public RedisConfigurationSourceBuilder withSocketTimeout(int socketTimeout) {
this.socketTimeout = socketTimeout;
return this;
}

public RedisConfigurationSource build() {
return new RedisConfigurationSource(host, port, connectionTimeout, socketTimeout);
}
}
15 changes: 15 additions & 0 deletions cfg4j-redis/src/main/java/Util.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/**
* Created by sumeet
* on 14/2/17.
*/
public class Util {

public static boolean isSet(Object object) {
return object != null;
}

public static boolean isStringSet(String string) {

return string != null && string.trim().length() > 0;
}
}
47 changes: 47 additions & 0 deletions cfg4j-redis/src/test/java/RedisConfigurationSourceTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import org.cfg4j.source.context.environment.ImmutableEnvironment;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;

import java.util.Properties;

import static org.assertj.core.api.Assertions.assertThat;

/**
* Created by sumeet
* on 14/2/17.
*/
@RunWith(MockitoJUnitRunner.class)
public class RedisConfigurationSourceTest {

@Rule
public ExpectedException expectedException = ExpectedException.none();

private RedisConfigurationSource source;
private Properties properties;

@Before
public void setUp() throws Exception {
source = new RedisConfigurationSourceBuilder()
.withHost("localhost")
.withPort(6379)
.withConnectionTimeout(1000)
.withSocketTimeout(1000).build();
source.init();

properties = new Properties() {{
put("test-property-1", "1");
put("test-property-2", "2");
put("test-property-3", "3");
}};
}

@Test
public void returnsSourceProperties() throws Exception {
assertThat(source.getConfiguration(new ImmutableEnvironment("TEST_PROPERTIES"))).isEqualTo(properties);
}

}
2 changes: 1 addition & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
include 'cfg4j-core', 'cfg4j-git', 'cfg4j-consul', 'cfg4j-s3'
include 'cfg4j-core', 'cfg4j-git', 'cfg4j-consul', 'cfg4j-s3', 'cfg4j-redis'