From 76f1ca4188c192d5cbf65ef441ae0685a5088092 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 30 Jul 2015 02:49:50 -0500 Subject: [PATCH] Add Couchbase support Closes gh-3498 --- spring-boot-actuator/pom.xml | 5 + .../HealthIndicatorAutoConfiguration.java | 25 ++- .../health/CouchbaseHealthIndicator.java | 47 ++++++ ...HealthIndicatorAutoConfigurationTests.java | 27 +++ spring-boot-autoconfigure/pom.xml | 11 ++ .../couchbase/CouchbaseAutoConfiguration.java | 77 +++++++++ .../couchbase/CouchbaseProperties.java | 69 ++++++++ .../autoconfigure/couchbase/package-info.java | 20 +++ ...ouchbaseRepositoriesAutoConfiguration.java | 44 +++++ .../CouchbaseRepositoriesRegistrar.java | 56 +++++++ .../data/couchbase/package-info.java | 20 +++ .../main/resources/META-INF/spring.factories | 2 + .../CouchbaseAutoConfigurationTests.java | 62 +++++++ .../couchbase/CityCouchbaseRepository.java | 26 +++ ...aseRepositoriesAutoConfigurationTests.java | 157 ++++++++++++++++++ .../data/couchbase/city/City.java | 33 ++++ .../data/couchbase/city/CityRepository.java | 23 +++ spring-boot-dependencies/pom.xml | 18 +- .../appendix-application-properties.adoc | 5 + spring-boot-samples/README.adoc | 2 + spring-boot-samples/pom.xml | 1 + .../spring-boot-sample-data-couchbase/pom.xml | 54 ++++++ .../couchbase/SampleCouchbaseApplication.java | 49 ++++++ .../main/java/sample/data/couchbase/User.java | 68 ++++++++ .../sample/data/couchbase/UserRepository.java | 23 +++ .../SampleCouchbaseApplicationTests.java | 47 ++++++ .../src/test/resources/application.properties | 3 + spring-boot-starters/pom.xml | 1 + .../pom.xml | 32 ++++ .../main/resources/META-INF/spring.provides | 1 + 30 files changed, 1006 insertions(+), 2 deletions(-) create mode 100644 spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/CouchbaseHealthIndicator.java create mode 100644 spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfiguration.java create mode 100644 spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseProperties.java create mode 100644 spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/package-info.java create mode 100644 spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseRepositoriesAutoConfiguration.java create mode 100644 spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseRepositoriesRegistrar.java create mode 100644 spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/package-info.java create mode 100644 spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfigurationTests.java create mode 100644 spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/couchbase/CityCouchbaseRepository.java create mode 100644 spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseRepositoriesAutoConfigurationTests.java create mode 100644 spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/city/City.java create mode 100644 spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/city/CityRepository.java create mode 100644 spring-boot-samples/spring-boot-sample-data-couchbase/pom.xml create mode 100644 spring-boot-samples/spring-boot-sample-data-couchbase/src/main/java/sample/data/couchbase/SampleCouchbaseApplication.java create mode 100644 spring-boot-samples/spring-boot-sample-data-couchbase/src/main/java/sample/data/couchbase/User.java create mode 100644 spring-boot-samples/spring-boot-sample-data-couchbase/src/main/java/sample/data/couchbase/UserRepository.java create mode 100644 spring-boot-samples/spring-boot-sample-data-couchbase/src/test/java/sample/data/couchbase/SampleCouchbaseApplicationTests.java create mode 100644 spring-boot-samples/spring-boot-sample-data-couchbase/src/test/resources/application.properties create mode 100644 spring-boot-starters/spring-boot-starter-data-couchbase/pom.xml create mode 100644 spring-boot-starters/spring-boot-starter-data-couchbase/src/main/resources/META-INF/spring.provides diff --git a/spring-boot-actuator/pom.xml b/spring-boot-actuator/pom.xml index 2f387986ce..b3020634f6 100644 --- a/spring-boot-actuator/pom.xml +++ b/spring-boot-actuator/pom.xml @@ -151,6 +151,11 @@ spring-data-cassandra true + + org.springframework.data + spring-data-couchbase + true + org.springframework.data spring-data-mongodb diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/HealthIndicatorAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/HealthIndicatorAutoConfiguration.java index 5b638a515c..6d9a482f58 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/HealthIndicatorAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/HealthIndicatorAutoConfiguration.java @@ -22,6 +22,7 @@ import java.util.Map; import javax.jms.ConnectionFactory; import javax.sql.DataSource; +import com.couchbase.client.java.Bucket; import com.datastax.driver.core.Cluster; import org.apache.solr.client.solrj.SolrClient; import org.elasticsearch.client.Client; @@ -32,6 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.health.ApplicationHealthIndicator; import org.springframework.boot.actuate.health.CassandraHealthIndicator; import org.springframework.boot.actuate.health.CompositeHealthIndicator; +import org.springframework.boot.actuate.health.CouchbaseHealthIndicator; import org.springframework.boot.actuate.health.DataSourceHealthIndicator; import org.springframework.boot.actuate.health.DiskSpaceHealthIndicator; import org.springframework.boot.actuate.health.DiskSpaceHealthIndicatorProperties; @@ -54,6 +56,7 @@ import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfigurati import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration; import org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration; import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration; import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; @@ -71,6 +74,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.ResolvableType; import org.springframework.data.cassandra.core.CassandraOperations; +import org.springframework.data.couchbase.core.CouchbaseOperations; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.jdbc.core.JdbcTemplate; @@ -84,11 +88,12 @@ import org.springframework.mail.javamail.JavaMailSenderImpl; * @author Stephane Nicoll * @author Phillip Webb * @author Tommy Ludwig + * @author Eddú Meléndez * @since 1.1.0 */ @Configuration @AutoConfigureBefore({ EndpointAutoConfiguration.class }) -@AutoConfigureAfter({ CassandraAutoConfiguration.class, +@AutoConfigureAfter({ CouchbaseAutoConfiguration.class, CassandraAutoConfiguration.class, CassandraDataAutoConfiguration.class, DataSourceAutoConfiguration.class, MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, RedisAutoConfiguration.class, RabbitAutoConfiguration.class, @@ -176,6 +181,24 @@ public class HealthIndicatorAutoConfiguration { } + @Configuration + @ConditionalOnClass({ CouchbaseOperations.class, Bucket.class}) + @ConditionalOnBean(CouchbaseOperations.class) + @ConditionalOnEnabledHealthIndicator("couchbase") + public static class CouchbaseHealthIndicatorConfiguration extends + CompositeHealthIndicatorConfiguration { + + @Autowired + private Map couchbaseOperations; + + @Bean + @ConditionalOnMissingBean(name = "couchbaseHealthIndicator") + public HealthIndicator couchbaseHealthIndicator() { + return createHealthIndicator(this.couchbaseOperations); + } + + } + @Configuration @ConditionalOnClass(JdbcTemplate.class) @ConditionalOnBean(DataSource.class) diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/CouchbaseHealthIndicator.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/CouchbaseHealthIndicator.java new file mode 100644 index 0000000000..fbff1aa80f --- /dev/null +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/CouchbaseHealthIndicator.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.health; + +import java.util.List; + +import com.couchbase.client.java.util.features.Version; + +import org.springframework.data.couchbase.core.CouchbaseOperations; +import org.springframework.util.Assert; + +/** + * {@link HealthIndicator} for Couchbase. + * + * @author Eddú Meléndez + * @since 1.4.0 + */ +public class CouchbaseHealthIndicator extends AbstractHealthIndicator { + + private CouchbaseOperations couchbaseOperations; + + public CouchbaseHealthIndicator(CouchbaseOperations couchbaseOperations) { + Assert.notNull(couchbaseOperations, "CouchbaseOperations must not be null"); + this.couchbaseOperations = couchbaseOperations; + } + + @Override + protected void doHealthCheck(Health.Builder builder) throws Exception { + List versions = this.couchbaseOperations.getCouchbaseClusterInfo().getAllVersions(); + builder.up().withDetail("version", versions.get(0).toString()); + } + +} diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/HealthIndicatorAutoConfigurationTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/HealthIndicatorAutoConfigurationTests.java index d5dbcd4d5b..bb082b07f8 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/HealthIndicatorAutoConfigurationTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/HealthIndicatorAutoConfigurationTests.java @@ -25,6 +25,7 @@ import org.junit.Test; import org.springframework.boot.actuate.health.ApplicationHealthIndicator; import org.springframework.boot.actuate.health.CassandraHealthIndicator; +import org.springframework.boot.actuate.health.CouchbaseHealthIndicator; import org.springframework.boot.actuate.health.DataSourceHealthIndicator; import org.springframework.boot.actuate.health.DiskSpaceHealthIndicator; import org.springframework.boot.actuate.health.ElasticsearchHealthIndicator; @@ -56,6 +57,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.cassandra.core.CassandraOperations; +import org.springframework.data.couchbase.core.CouchbaseOperations; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -66,6 +68,7 @@ import static org.mockito.Mockito.mock; * @author Christian Dupuis * @author Stephane Nicoll * @author Andy Wilkinson + * @author Eddú Meléndez */ public class HealthIndicatorAutoConfigurationTests { @@ -436,6 +439,19 @@ public class HealthIndicatorAutoConfigurationTests { .isEqualTo(CassandraHealthIndicator.class); } + @Test + public void couchbaseHealthIndicator() throws Exception { + EnvironmentTestUtils.addEnvironment(this.context, + "management.health.diskspace.enabled:false"); + this.context.register(CouchbaseConfiguration.class, + ManagementServerProperties.class, HealthIndicatorAutoConfiguration.class); + this.context.refresh(); + Map beans = this.context + .getBeansOfType(HealthIndicator.class); + assertThat(beans.size()).isEqualTo(1); + assertThat(beans.values().iterator().next().getClass()).isEqualTo(CouchbaseHealthIndicator.class); + } + @Configuration @EnableConfigurationProperties protected static class DataSourceConfig { @@ -476,4 +492,15 @@ public class HealthIndicatorAutoConfigurationTests { } + @Configuration + protected static class CouchbaseConfiguration { + + @Bean + public CouchbaseOperations couchbaseOperations() { + CouchbaseOperations operations = mock(CouchbaseOperations.class); + return operations; + } + + } + } diff --git a/spring-boot-autoconfigure/pom.xml b/spring-boot-autoconfigure/pom.xml index 4500ac787c..95a8622bef 100755 --- a/spring-boot-autoconfigure/pom.xml +++ b/spring-boot-autoconfigure/pom.xml @@ -325,6 +325,17 @@ spring-batch-core true + + org.springframework.data + spring-data-couchbase + true + + + org.slf4j + jcl-over-slf4j + + + org.springframework.data spring-data-jpa diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfiguration.java new file mode 100644 index 0000000000..3825d74647 --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfiguration.java @@ -0,0 +1,77 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.couchbase; + +import java.util.Arrays; +import java.util.List; + +import javax.validation.Validator; + +import com.couchbase.client.java.CouchbaseBucket; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration; +import org.springframework.data.couchbase.config.CouchbaseBucketFactoryBean; +import org.springframework.data.couchbase.core.mapping.event.ValidatingCouchbaseEventListener; + +/** + * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration + * Auto-Configuration} for Couchbase. + * + * @author Eddú Meléndez + * @since 1.4.0 + */ +@Configuration +@ConditionalOnClass({ CouchbaseBucket.class, CouchbaseBucketFactoryBean.class }) +@EnableConfigurationProperties(CouchbaseProperties.class) +public class CouchbaseAutoConfiguration { + + @Bean + @ConditionalOnBean(Validator.class) + public ValidatingCouchbaseEventListener validationEventListener(Validator validator) { + return new ValidatingCouchbaseEventListener(validator); + } + + @Configuration + static class CouchbaseConfiguration extends AbstractCouchbaseConfiguration { + + @Autowired + private CouchbaseProperties properties; + + @Override + protected List getBootstrapHosts() { + return Arrays.asList(this.properties.getHosts()); + } + + @Override + protected String getBucketName() { + return this.properties.getBucketName(); + } + + @Override + protected String getBucketPassword() { + return this.properties.getBucketPassword(); + } + + } + +} diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseProperties.java new file mode 100644 index 0000000000..96e8d310dd --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseProperties.java @@ -0,0 +1,69 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.couchbase; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * Configuration properties for Couchbase. + * + * @author Eddú Meléndez + * @since 1.4.0 + */ +@ConfigurationProperties(prefix = "spring.data.couchbase") +public class CouchbaseProperties { + + /** + * Couchabase server hosts. + */ + private String[] hosts; + + /** + * Couchbase bucket name. + */ + private String bucketName; + + /** + * Couchbase bucket password. + */ + private String bucketPassword; + + public String[] getHosts() { + return this.hosts; + } + + public void setHosts(String[] hosts) { + this.hosts = hosts; + } + + public String getBucketName() { + return this.bucketName; + } + + public void setBucketName(String bucketName) { + this.bucketName = bucketName; + } + + public String getBucketPassword() { + return this.bucketPassword; + } + + public void setBucketPassword(String bucketPassword) { + this.bucketPassword = bucketPassword; + } + +} diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/package-info.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/package-info.java new file mode 100644 index 0000000000..8d930f10d5 --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Auto-configuration for Couchbase. + */ +package org.springframework.boot.autoconfigure.couchbase; diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseRepositoriesAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseRepositoriesAutoConfiguration.java new file mode 100644 index 0000000000..f13a5d606c --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseRepositoriesAutoConfiguration.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.couchbase; + +import com.couchbase.client.java.Bucket; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.data.couchbase.repository.CouchbaseRepository; +import org.springframework.data.couchbase.repository.support.CouchbaseRepositoryFactoryBean; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for Spring Data's Couchbase + * Repositories. + * + * @author Eddú Meléndez + * @since 1.4.0 + */ +@Configuration +@ConditionalOnClass({ Bucket.class, CouchbaseRepository.class }) +@ConditionalOnProperty(prefix = "spring.data.couchbase.repositories", name = "enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnMissingBean(CouchbaseRepositoryFactoryBean.class) +@Import(CouchbaseRepositoriesRegistrar.class) +public class CouchbaseRepositoriesAutoConfiguration { + +} diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseRepositoriesRegistrar.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseRepositoriesRegistrar.java new file mode 100644 index 0000000000..bd52fcbf26 --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseRepositoriesRegistrar.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.couchbase; + +import java.lang.annotation.Annotation; + +import org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport; +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; +import org.springframework.data.couchbase.repository.config.CouchbaseRepositoryConfigurationExtension; +import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories; +import org.springframework.data.repository.config.RepositoryConfigurationExtension; + +/** + * {@link ImportBeanDefinitionRegistrar} used to auto-configure Spring Data Couchbase + * Repositories. + * + * @author Eddú Meléndez + * @since 1.4.0 + */ +public class CouchbaseRepositoriesRegistrar extends AbstractRepositoryConfigurationSourceSupport { + + @Override + protected Class getAnnotation() { + return EnableCouchbaseRepositories.class; + } + + @Override + protected Class getConfiguration() { + return EnableCouchbaseRepositoriesConfiguration.class; + } + + @Override + protected RepositoryConfigurationExtension getRepositoryConfigurationExtension() { + return new CouchbaseRepositoryConfigurationExtension(); + } + + @EnableCouchbaseRepositories + private static class EnableCouchbaseRepositoriesConfiguration { + + } + +} diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/package-info.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/package-info.java new file mode 100644 index 0000000000..bba40726b5 --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Auto-configuration for Spring Data Couchbase. + */ +package org.springframework.boot.autoconfigure.data.couchbase; diff --git a/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories index 3ca9810ebe..da4b6b5eb7 100644 --- a/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories @@ -19,9 +19,11 @@ org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\ org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\ org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\ org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\ +org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\ org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\ +org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\ diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfigurationTests.java new file mode 100644 index 0000000000..73b5d82340 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfigurationTests.java @@ -0,0 +1,62 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.couchbase; + +import org.junit.After; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.test.EnvironmentTestUtils; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +/** + * Tests for {@link CouchbaseAutoConfiguration} + * + * @author Eddú Meléndez + */ +public class CouchbaseAutoConfigurationTests { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + private AnnotationConfigApplicationContext context; + + @After + public void close() { + if (this.context != null) { + this.context.close(); + } + } + + @Test + public void validateProperties() { + this.context = new AnnotationConfigApplicationContext(); + EnvironmentTestUtils.addEnvironment(this.context, + "spring.data.couchbase.hosts=localhost", + "spring.data.couchbase.bucket-name=test", + "spring.data.couchbase.bucket-password=test"); + this.context.register(PropertyPlaceholderAutoConfiguration.class, + CouchbaseAutoConfiguration.class); + this.thrown.expect(BeanCreationException.class); + this.thrown.expectMessage("Connection refused"); + this.context.refresh(); + } + +} diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/couchbase/CityCouchbaseRepository.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/couchbase/CityCouchbaseRepository.java new file mode 100644 index 0000000000..5abd9020c9 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/couchbase/CityCouchbaseRepository.java @@ -0,0 +1,26 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.alt.couchbase; + +import org.springframework.boot.autoconfigure.data.couchbase.city.City; +import org.springframework.data.repository.Repository; + +/** + * @author Eddú Meléndez + */ +public interface CityCouchbaseRepository extends Repository { +} diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseRepositoriesAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseRepositoriesAutoConfigurationTests.java new file mode 100644 index 0000000000..b8c1281053 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseRepositoriesAutoConfigurationTests.java @@ -0,0 +1,157 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.couchbase; + +import java.util.Collections; +import java.util.List; + +import com.couchbase.client.java.Bucket; +import com.couchbase.client.java.Cluster; +import com.couchbase.client.java.CouchbaseBucket; +import com.couchbase.client.java.CouchbaseCluster; +import com.couchbase.client.java.cluster.ClusterInfo; + +import org.junit.After; +import org.junit.Test; + +import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage; +import org.springframework.boot.autoconfigure.data.couchbase.city.City; +import org.springframework.boot.autoconfigure.data.couchbase.city.CityRepository; +import org.springframework.boot.autoconfigure.data.empty.EmptyDataPackage; +import org.springframework.boot.test.EnvironmentTestUtils; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration; +import org.springframework.data.couchbase.core.CouchbaseTemplate; +import org.springframework.data.couchbase.core.WriteResultChecking; +import org.springframework.data.couchbase.core.query.Consistency; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +/** + * @author Eddú Meléndez + */ +public class CouchbaseRepositoriesAutoConfigurationTests { + + private AnnotationConfigApplicationContext context; + + @After + public void close() { + this.context.close(); + } + + @Test + public void testDefaultRepositoryConfiguration() throws Exception { + this.context = new AnnotationConfigApplicationContext(); + addCouchbaseProperties(this.context); + this.context.register(TestConfiguration.class, + PropertyPlaceholderAutoConfiguration.class); + this.context.refresh(); + assertThat(this.context.getBean(CityRepository.class)).isNotNull(); + assertThat(this.context.getBean(Bucket.class)).isNotNull(); + } + + @Test + public void testNoRepositoryConfiguration() throws Exception { + this.context = new AnnotationConfigApplicationContext(); + addCouchbaseProperties(this.context); + this.context.register(EmptyConfiguration.class, TestConfiguration.class, + PropertyPlaceholderAutoConfiguration.class); + this.context.refresh(); + assertThat(this.context.getBean(Bucket.class)).isNotNull(); + } + + @Test + public void templateExists() { + this.context = new AnnotationConfigApplicationContext(); + EnvironmentTestUtils.addEnvironment(this.context, + "spring.data.couchbase.hosts=localhost", + "spring.data.couchbase.bucket-name=test", + "spring.data.couchbase.bucket-password=test"); + this.context.register(PropertyPlaceholderAutoConfiguration.class, + TestConfiguration.class); + this.context.refresh(); + assertThat(this.context.getBeanNamesForType(CouchbaseTemplate.class).length).isEqualTo(1); + } + + private void addCouchbaseProperties(AnnotationConfigApplicationContext context) { + EnvironmentTestUtils.addEnvironment(context, + "spring.data.couchbase.hosts=localhost", + "spring.data.couchbase.bucket-name=test", + "spring.data.couchbase.bucket-password=test"); + } + + @Configuration + @TestAutoConfigurationPackage(City.class) + @Import(CouchbaseRepositoriesRegistrar.class) + static class TestConfiguration extends AbstractCouchbaseConfiguration { + + @Override + protected List getBootstrapHosts() { + return Collections.singletonList("192.1.2.3"); + } + + @Override + protected String getBucketName() { + return "someBucket"; + } + + @Override + protected String getBucketPassword() { + return "someBucketPassword"; + } + + @Override + public Cluster couchbaseCluster() throws Exception { + return mock(CouchbaseCluster.class); + } + + @Bean + public ClusterInfo couchbaseClusterInfo() { + return mock(ClusterInfo.class); + } + + @Override + public Bucket couchbaseClient() throws Exception { + return mock(CouchbaseBucket.class); + } + + @Override + public CouchbaseTemplate couchbaseTemplate() throws Exception { + CouchbaseTemplate template = super.couchbaseTemplate(); + template.setWriteResultChecking(WriteResultChecking.LOG); + return template; + } + + @Override + protected Consistency getDefaultConsistency() { + return Consistency.READ_YOUR_OWN_WRITES; + } + + } + + @Configuration + @TestAutoConfigurationPackage(EmptyDataPackage.class) + protected static class EmptyConfiguration { + + } + +} diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/city/City.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/city/City.java new file mode 100644 index 0000000000..0b0659a114 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/city/City.java @@ -0,0 +1,33 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.couchbase.city; + +import com.couchbase.client.java.repository.annotation.Field; +import com.couchbase.client.java.repository.annotation.Id; + +import org.springframework.data.couchbase.core.mapping.Document; + +@Document +public class City { + + @Id + private String id; + + @Field + private String name; + +} diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/city/CityRepository.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/city/CityRepository.java new file mode 100644 index 0000000000..d3d36ef701 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/city/CityRepository.java @@ -0,0 +1,23 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.couchbase.city; + +import org.springframework.data.repository.Repository; + +public interface CityRepository extends Repository { + +} diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml index aba773bd98..1a16b61bed 100644 --- a/spring-boot-dependencies/pom.xml +++ b/spring-boot-dependencies/pom.xml @@ -271,6 +271,11 @@ spring-boot-starter-data-cassandra 1.4.0.BUILD-SNAPSHOT + + org.springframework.boot + spring-boot-starter-data-couchbase + 1.4.0.BUILD-SNAPSHOT + org.springframework.boot spring-boot-starter-data-elasticsearch @@ -1790,12 +1795,23 @@ + + org.springframework.data + spring-data-couchbase + ${spring-data-couchbase.version} + org.springframework.data spring-data-releasetrain ${spring-data-releasetrain.version} import pom + + + org.springframework.data + spring-data-couchbase + + org.springframework.hateoas @@ -2239,4 +2255,4 @@ integration-test - \ No newline at end of file + diff --git a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index 9284eb8d00..2c1d35f9c2 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -488,6 +488,11 @@ content into your application; rather pick only the properties that you need. spring.data.cassandra.ssl=false # Enable SSL support. spring.data.cassandra.username= # Login user of the server. + # COUCHBASE ({sc-spring-boot-autoconfigure}/couchbase/CouchbaseProperties.{sc-ext}[CouchbaseProperties]) + spring.data.couchbase.hosts= # the db host + spring.data.couchbase.bucket-name= # the bucket name + spring.data.couchbase.bucket-password= # the bucket password + # ELASTICSEARCH ({sc-spring-boot-autoconfigure}/elasticsearch/ElasticsearchProperties.{sc-ext}[ElasticsearchProperties]) spring.data.elasticsearch.cluster-name=elasticsearch # Elasticsearch cluster name. spring.data.elasticsearch.cluster-nodes= # Comma-separated list of cluster node addresses. If not specified, starts a client node. diff --git a/spring-boot-samples/README.adoc b/spring-boot-samples/README.adoc index 469eedb13e..551b825283 100644 --- a/spring-boot-samples/README.adoc +++ b/spring-boot-samples/README.adoc @@ -60,6 +60,8 @@ -- Example showing message-oriented application using HornetQ * link:spring-boot-sample-batch[spring-boot-sample-batch] -- Define and run a Batch job in a few lines of code +* link:spring-boot-sample-data-couchbase[spring-boot-sample-data-couchbase] + -- Spring Data Couchbase repositories * link:spring-boot-sample-data-jpa[spring-boot-sample-data-jpa] -- Spring Data JPA + Hibernate + HSQLDB * link:spring-boot-sample-data-mongodb[spring-boot-sample-data-mongodb] diff --git a/spring-boot-samples/pom.xml b/spring-boot-samples/pom.xml index 4e7446eb03..3fb2f76fa2 100644 --- a/spring-boot-samples/pom.xml +++ b/spring-boot-samples/pom.xml @@ -33,6 +33,7 @@ spring-boot-sample-batch spring-boot-sample-cache spring-boot-sample-data-cassandra + spring-boot-sample-data-couchbase spring-boot-sample-data-elasticsearch spring-boot-sample-data-gemfire spring-boot-sample-data-jpa diff --git a/spring-boot-samples/spring-boot-sample-data-couchbase/pom.xml b/spring-boot-samples/spring-boot-sample-data-couchbase/pom.xml new file mode 100644 index 0000000000..32c98431e9 --- /dev/null +++ b/spring-boot-samples/spring-boot-sample-data-couchbase/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + spring-boot-samples + org.springframework.boot + 1.4.0.BUILD-SNAPSHOT + + spring-boot-sample-data-couchbase + Spring Boot Data Couchbase Sample + Spring Boot Data Couchbase Sample + http://projects.spring.io/spring-boot/ + + Pivotal Software, Inc. + http://www.spring.io + + + ${basedir}/../.. + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-data-couchbase + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-actuator + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-boot-samples/spring-boot-sample-data-couchbase/src/main/java/sample/data/couchbase/SampleCouchbaseApplication.java b/spring-boot-samples/spring-boot-sample-data-couchbase/src/main/java/sample/data/couchbase/SampleCouchbaseApplication.java new file mode 100644 index 0000000000..dcd32062fa --- /dev/null +++ b/spring-boot-samples/spring-boot-sample-data-couchbase/src/main/java/sample/data/couchbase/SampleCouchbaseApplication.java @@ -0,0 +1,49 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sample.data.couchbase; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SampleCouchbaseApplication implements CommandLineRunner { + + @Autowired + private UserRepository userRepository; + + public static void main(String[] args) { + SpringApplication.run(SampleCouchbaseApplication.class); + } + + @Override + public void run(String... args) throws Exception { + saveUsers(); + + System.out.println(this.userRepository.findAll()); + } + + private void saveUsers() { + User user = new User(); + user.setFirstname("Alice"); + user.setLastname("Smith"); + + this.userRepository.save(user); + } + +} diff --git a/spring-boot-samples/spring-boot-sample-data-couchbase/src/main/java/sample/data/couchbase/User.java b/spring-boot-samples/spring-boot-sample-data-couchbase/src/main/java/sample/data/couchbase/User.java new file mode 100644 index 0000000000..5895000d74 --- /dev/null +++ b/spring-boot-samples/spring-boot-sample-data-couchbase/src/main/java/sample/data/couchbase/User.java @@ -0,0 +1,68 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sample.data.couchbase; + + +import com.couchbase.client.java.repository.annotation.Field; +import com.couchbase.client.java.repository.annotation.Id; +import org.springframework.data.couchbase.core.mapping.Document; + +@Document +public class User { + + @Id + private String id; + + @Field + private String firstname; + + @Field + private String lastname; + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getFirstname() { + return this.firstname; + } + + public void setFirstname(String firstname) { + this.firstname = firstname; + } + + public String getLastname() { + return this.lastname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } + + @Override + public String toString() { + return "User{" + + "id='" + this.id + '\'' + + ", firstname='" + this.firstname + '\'' + + ", lastname='" + this.lastname + '\'' + + '}'; + } +} diff --git a/spring-boot-samples/spring-boot-sample-data-couchbase/src/main/java/sample/data/couchbase/UserRepository.java b/spring-boot-samples/spring-boot-sample-data-couchbase/src/main/java/sample/data/couchbase/UserRepository.java new file mode 100644 index 0000000000..1e2deab5bc --- /dev/null +++ b/spring-boot-samples/spring-boot-sample-data-couchbase/src/main/java/sample/data/couchbase/UserRepository.java @@ -0,0 +1,23 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sample.data.couchbase; + +import org.springframework.data.couchbase.repository.CouchbaseRepository; + +public interface UserRepository extends CouchbaseRepository { + +} diff --git a/spring-boot-samples/spring-boot-sample-data-couchbase/src/test/java/sample/data/couchbase/SampleCouchbaseApplicationTests.java b/spring-boot-samples/spring-boot-sample-data-couchbase/src/test/java/sample/data/couchbase/SampleCouchbaseApplicationTests.java new file mode 100644 index 0000000000..7063a439b8 --- /dev/null +++ b/spring-boot-samples/spring-boot-sample-data-couchbase/src/test/java/sample/data/couchbase/SampleCouchbaseApplicationTests.java @@ -0,0 +1,47 @@ +package sample.data.couchbase; + +import java.net.ConnectException; + +import org.junit.Rule; +import org.junit.Test; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.test.OutputCapture; +import org.springframework.core.NestedCheckedException; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SampleCouchbaseApplicationTests { + + @Rule + public OutputCapture outputCapture = new OutputCapture(); + + @Test + public void testDefaultSettings() throws Exception { + try { + new SpringApplicationBuilder(SampleCouchbaseApplication.class) + .run(); + } + catch (RuntimeException ex) { + if (serverNotRunning(ex)) { + return; + } + } + String output = this.outputCapture.toString(); + assertThat(output).contains("firstname='Alice', lastname='Smith'"); + } + + private boolean serverNotRunning(RuntimeException ex) { + @SuppressWarnings("serial") + NestedCheckedException nested = new NestedCheckedException("failed", ex) { + }; + if (nested.contains(ConnectException.class)) { + Throwable root = nested.getRootCause(); + if (root.getMessage().contains("Connection refused")) { + return true; + } + } + return false; + } + +} diff --git a/spring-boot-samples/spring-boot-sample-data-couchbase/src/test/resources/application.properties b/spring-boot-samples/spring-boot-sample-data-couchbase/src/test/resources/application.properties new file mode 100644 index 0000000000..d8adb02adf --- /dev/null +++ b/spring-boot-samples/spring-boot-sample-data-couchbase/src/test/resources/application.properties @@ -0,0 +1,3 @@ +spring.data.couchbase.bucket-name=mybucket +spring.data.couchbase.bucket-password=couchbase +spring.data.couchbase.hosts[0]=127.0.0.1 diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml index c755242332..e5667e3c3a 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -28,6 +28,7 @@ spring-boot-starter-cache spring-boot-starter-cloud-connectors spring-boot-starter-data-cassandra + spring-boot-starter-data-couchbase spring-boot-starter-data-elasticsearch spring-boot-starter-data-gemfire spring-boot-starter-data-jpa diff --git a/spring-boot-starters/spring-boot-starter-data-couchbase/pom.xml b/spring-boot-starters/spring-boot-starter-data-couchbase/pom.xml new file mode 100644 index 0000000000..938e7e5e23 --- /dev/null +++ b/spring-boot-starters/spring-boot-starter-data-couchbase/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + spring-boot-starters + org.springframework.boot + 1.4.0.BUILD-SNAPSHOT + + spring-boot-starter-data-couchbase + Spring Boot Data Couchbase Starter + Spring Boot Data Couchbase Starter + http://projects.spring.io/spring-boot/ + + Pivotal Software, Inc. + http://www.spring.io + + + ${basedir}/../.. + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.data + spring-data-couchbase + + + diff --git a/spring-boot-starters/spring-boot-starter-data-couchbase/src/main/resources/META-INF/spring.provides b/spring-boot-starters/spring-boot-starter-data-couchbase/src/main/resources/META-INF/spring.provides new file mode 100644 index 0000000000..7eb2d6ff97 --- /dev/null +++ b/spring-boot-starters/spring-boot-starter-data-couchbase/src/main/resources/META-INF/spring.provides @@ -0,0 +1 @@ +provides: spring-data-couchbase