From 7b6a3a98940a945d13e47c37bf1c7c69a7dd80f3 Mon Sep 17 00:00:00 2001 From: Michael Nitschinger Date: Thu, 23 Jan 2014 16:24:58 +0100 Subject: [PATCH] DATACOUCH-14 - Enable SLF4J as default logging. If the whole system is constructed through the AbstractCouchbaseConfiguration or the custom xml config, the logger is specified automatically. Please note that this also changes the java config a little bit, but it should also make it easier to construct it. --- .../AbstractCouchbaseConfiguration.java | 72 ++++++++++++++++++- .../couchbase/config/CouchbaseParser.java | 9 +++ .../couchbase/core/CouchbaseFactoryBean.java | 5 ++ .../data/couchbase/BucketCreator.java | 2 +- .../data/couchbase/TestApplicationConfig.java | 35 ++++----- .../AbstractCouchbaseConfigurationTests.java | 17 +++++ .../MappingCouchbaseConverterTests.java | 7 +- 7 files changed, 123 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java b/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java index b14038f6..6455d8f0 100644 --- a/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java +++ b/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java @@ -23,6 +23,7 @@ import org.springframework.context.annotation.ClassPathScanningCandidateComponen import org.springframework.context.annotation.Configuration; import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.data.annotation.Persistent; +import org.springframework.data.couchbase.core.CouchbaseFactoryBean; import org.springframework.data.couchbase.core.CouchbaseTemplate; import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; import org.springframework.data.couchbase.core.convert.translation.JacksonTranslationService; @@ -32,8 +33,9 @@ import org.springframework.data.couchbase.core.mapping.Document; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; -import java.util.HashSet; -import java.util.Set; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.*; /** * Base class for Spring Data Couchbase configuration using JavaConfig. @@ -43,13 +45,62 @@ import java.util.Set; @Configuration public abstract class AbstractCouchbaseConfiguration { + /** + * The list of hostnames (or IP addresses to bootstrap from). + * + * @return the list of bootstrap hosts. + */ + protected abstract List bootstrapHosts(); + + /** + * The name of the bucket to connect to. + * + * @return the name of the bucket. + */ + protected abstract String getBucketName(); + + /** + * The password of the bucket (can be an empty string). + * + * @return the password of the bucket. + */ + protected abstract String getBucketPassword(); + /** * Return the {@link CouchbaseClient} instance to connect to. * * @throws Exception on Bean construction failure. */ @Bean(destroyMethod = "shutdown") - public abstract CouchbaseClient couchbaseClient() throws Exception; + public CouchbaseClient couchbaseClient() throws Exception { + setLoggerProperty(couchbaseLogger()); + + return new CouchbaseClient( + bootstrapUris(bootstrapHosts()), + getBucketName(), + getBucketPassword() + ); + } + + /** + * Specifies the logger to use (defaults to SLF4J). + * + * @return the logger property string. + */ + protected String couchbaseLogger() { + return CouchbaseFactoryBean.DEFAULT_LOGGER_PROPERTY; + } + + /** + * Prepare the logging property before initializing couchbase. + * + * @param logger + */ + private void setLoggerProperty(String logger) { + Properties systemProperties = System.getProperties(); + systemProperties.put("net.spy.log.LoggerImpl", logger); + System.setProperties(systemProperties); + } /** * Creates a {@link CouchbaseTemplate}. @@ -130,4 +181,19 @@ public abstract class AbstractCouchbaseConfiguration { return getClass().getPackage().getName(); } + + /** + * Converts the given list of hostnames into parsable URIs. + * + * @param hosts the list of hosts to convert. + * @return the converted URIs. + */ + private List bootstrapUris(List hosts) throws URISyntaxException { + List uris = new ArrayList(); + for (String host : hosts) { + uris.add(new URI("http://" + host + ":8091/pools")); + } + return uris; + } + } diff --git a/src/main/java/org/springframework/data/couchbase/config/CouchbaseParser.java b/src/main/java/org/springframework/data/couchbase/config/CouchbaseParser.java index 487528be..3473f8fd 100644 --- a/src/main/java/org/springframework/data/couchbase/config/CouchbaseParser.java +++ b/src/main/java/org/springframework/data/couchbase/config/CouchbaseParser.java @@ -30,6 +30,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; +import java.util.Properties; /** * Parser for "" bean definitions. @@ -68,6 +69,14 @@ public class CouchbaseParser extends AbstractSingleBeanDefinitionParser { bean.addConstructorArgValue(StringUtils.hasText(password) ? password : CouchbaseFactoryBean.DEFAULT_PASSWORD); bean.setDestroyMethodName(CouchbaseFactoryBean.DEFAULT_DESTROY_METHOD); + + setLogger(); + } + + private void setLogger() { + Properties systemProperties = System.getProperties(); + systemProperties.put("net.spy.log.LoggerImpl", CouchbaseFactoryBean.DEFAULT_LOGGER_PROPERTY); + System.setProperties(systemProperties); } /** diff --git a/src/main/java/org/springframework/data/couchbase/core/CouchbaseFactoryBean.java b/src/main/java/org/springframework/data/couchbase/core/CouchbaseFactoryBean.java index 8addff4e..90b8fd40 100644 --- a/src/main/java/org/springframework/data/couchbase/core/CouchbaseFactoryBean.java +++ b/src/main/java/org/springframework/data/couchbase/core/CouchbaseFactoryBean.java @@ -64,6 +64,11 @@ public class CouchbaseFactoryBean implements FactoryBean, Initi */ public static final String DEFAULT_DESTROY_METHOD = "shutdown"; + /** + * Use SLF4J as the default logger if not instructed otherwise. + */ + public static final String DEFAULT_LOGGER_PROPERTY = "net.spy.memcached.compat.log.SLF4JLogger"; + /** * Holds the enclosed {@link CouchbaseClient}. */ diff --git a/src/test/java/org/springframework/data/couchbase/BucketCreator.java b/src/test/java/org/springframework/data/couchbase/BucketCreator.java index 7b07067d..8395b910 100644 --- a/src/test/java/org/springframework/data/couchbase/BucketCreator.java +++ b/src/test/java/org/springframework/data/couchbase/BucketCreator.java @@ -42,7 +42,7 @@ public class BucketCreator implements InitializingBean { RestTemplate template = new RestTemplate(rf); - String fullUri = hostUri + "/default/buckets/default"; + String fullUri = "http://" + hostUri + ":8091/pools/default/buckets/default"; ResponseEntity entity = null; try { diff --git a/src/test/java/org/springframework/data/couchbase/TestApplicationConfig.java b/src/test/java/org/springframework/data/couchbase/TestApplicationConfig.java index 68c16ace..773e8897 100644 --- a/src/test/java/org/springframework/data/couchbase/TestApplicationConfig.java +++ b/src/test/java/org/springframework/data/couchbase/TestApplicationConfig.java @@ -26,6 +26,7 @@ import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration; import java.net.URI; import java.util.Arrays; +import java.util.List; /** * @author Michael Nitschinger @@ -36,21 +37,6 @@ public class TestApplicationConfig extends AbstractCouchbaseConfiguration { @Autowired private Environment env; - @Bean - public String couchbaseHost() { - return env.getProperty("couchbase.host", "http://127.0.0.1:8091/pools"); - } - - @Bean - public String couchbaseBucket() { - return env.getProperty("couchbase.bucket", "default"); - } - - @Bean - public String couchbasePassword() { - return env.getProperty("couchbase.password", ""); - } - @Bean public String couchbaseAdminUser() { return env.getProperty("couchbase.adminUser", "Administrator"); @@ -61,16 +47,31 @@ public class TestApplicationConfig extends AbstractCouchbaseConfiguration { return env.getProperty("couchbase.adminUser", "password"); } + @Override + protected List bootstrapHosts() { + return Arrays.asList(env.getProperty("couchbase.host", "127.0.0.1")); + } + + @Override + protected String getBucketName() { + return env.getProperty("couchbase.bucket", "default"); + } + + @Override + protected String getBucketPassword() { + return env.getProperty("couchbase.password", ""); + } + @Bean public BucketCreator bucketCreator() throws Exception { - return new BucketCreator(couchbaseHost(), couchbaseAdminUser(), couchbaseAdminPassword()); + return new BucketCreator(bootstrapHosts().get(0), couchbaseAdminUser(), couchbaseAdminPassword()); } @Bean @Override @DependsOn("bucketCreator") public CouchbaseClient couchbaseClient() throws Exception { - return new CouchbaseClient(Arrays.asList(new URI(couchbaseHost())), couchbaseBucket(), couchbasePassword()); + return super.couchbaseClient(); } diff --git a/src/test/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfigurationTests.java b/src/test/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfigurationTests.java index 74404778..36fc876c 100644 --- a/src/test/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfigurationTests.java +++ b/src/test/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfigurationTests.java @@ -27,6 +27,8 @@ import org.springframework.data.couchbase.core.mapping.Document; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import java.util.List; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -55,6 +57,21 @@ public class AbstractCouchbaseConfigurationTests { class SampleCouchbaseConfiguration extends AbstractCouchbaseConfiguration { + @Override + protected List bootstrapHosts() { + return null; + } + + @Override + protected String getBucketName() { + return null; + } + + @Override + protected String getBucketPassword() { + return null; + } + @Bean @Override public CouchbaseClient couchbaseClient() throws Exception { diff --git a/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java b/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java index 086af59b..c61b02d2 100644 --- a/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java +++ b/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java @@ -295,9 +295,10 @@ public class MappingCouchbaseConverterTests { source.put("attr2", cattr2); ListEntity readConverted = converter.read(ListEntity.class, source); - System.out.println(readConverted.attr0); - System.out.println(readConverted.attr1); - System.out.println(readConverted.attr2); + assertEquals(2, readConverted.attr0.size()); + assertEquals(0, readConverted.attr1.size()); + assertEquals(1, readConverted.attr2.size()); + assertEquals(2, readConverted.attr2.get(0).size()); } @Test