diff --git a/spring-boot-autoconfigure/pom.xml b/spring-boot-autoconfigure/pom.xml index 18eb347285..83397088da 100644 --- a/spring-boot-autoconfigure/pom.xml +++ b/spring-boot-autoconfigure/pom.xml @@ -136,6 +136,11 @@ spring-data-mongodb true + + org.springframework.data + spring-data-couchbase + true + org.springframework.data spring-data-redis diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/CouchbaseRepositoriesAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/CouchbaseRepositoriesAutoConfiguration.java new file mode 100644 index 0000000000..2852561617 --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/CouchbaseRepositoriesAutoConfiguration.java @@ -0,0 +1,114 @@ +/* + * Copyright 2012-2013 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; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Arrays; + +import javax.annotation.PreDestroy; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.data.couchbase.core.CouchbaseTemplate; +import org.springframework.data.couchbase.repository.CouchbaseRepository; +import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories; + +import com.couchbase.client.CouchbaseClient; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for Spring Data's Couchbase + * Repositories. + * + * @author Michael Nitschinger + * @see EnableCouchbaseRepositories + */ +@Configuration +@ConditionalOnClass({ CouchbaseClient.class, CouchbaseRepository.class }) +public class CouchbaseRepositoriesAutoConfiguration { + + @Import(CouchbaseRepositoriesAutoConfigureRegistrar.class) + @Configuration + @EnableConfigurationProperties(CouchbaseProperties.class) + protected static class CouchbaseRepositoriesConfiguration { + + @Autowired + private CouchbaseProperties config; + + @PreDestroy + public void close() throws URISyntaxException, IOException { + couchbaseClient().shutdown(); + } + + @Bean + @ConditionalOnMissingBean(CouchbaseClient.class) + CouchbaseClient couchbaseClient() throws URISyntaxException, IOException { + return this.config.couchbaseClient(); + } + + @Bean + @ConditionalOnMissingBean(CouchbaseTemplate.class) + CouchbaseTemplate couchbaseTemplate(CouchbaseClient couchbaseClient) { + return new CouchbaseTemplate(couchbaseClient); + } + } + + @ConfigurationProperties(prefix = "spring.data.couchbase") + public static class CouchbaseProperties { + + private String host = "127.0.0.1"; + private String bucket = "default"; + private String password = ""; + + public CouchbaseClient couchbaseClient() throws URISyntaxException, IOException { + return new CouchbaseClient(Arrays.asList(new URI("http://" + getHost() + + ":8091/pools")), getBucket(), getPassword()); + } + + public String getHost() { + return this.host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getBucket() { + return this.bucket; + } + + public void setBucket(String bucket) { + this.bucket = bucket; + } + + public String getPassword() { + return this.password; + } + + public void setPassword(String password) { + this.password = password; + } + } +} diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/CouchbaseRepositoriesAutoConfigureRegistrar.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/CouchbaseRepositoriesAutoConfigureRegistrar.java new file mode 100644 index 0000000000..336d2f5f7d --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/CouchbaseRepositoriesAutoConfigureRegistrar.java @@ -0,0 +1,55 @@ +/* + * Copyright 2012-2013 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; + +import org.springframework.data.couchbase.repository.config.CouchbaseRepositoryConfigurationExtension; +import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories; +import org.springframework.data.repository.config.RepositoryConfigurationExtension; + +import java.lang.annotation.Annotation; + +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; + +/** + * {@link ImportBeanDefinitionRegistrar} used to auto-configure Spring Data Couchbase + * Repositories. + * + * @author Michael Nitschinger + */ +class CouchbaseRepositoriesAutoConfigureRegistrar 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/resources/META-INF/spring.factories b/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories index feed488f05..8b9d75b67c 100644 --- a/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories @@ -13,6 +13,7 @@ org.springframework.boot.autoconfigure.data.JpaRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.MongoRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\ org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\ +org.springframework.boot.autoconfigure.data.CouchbaseRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\ diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/CouchbaseRepositoriesAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/CouchbaseRepositoriesAutoConfigurationTests.java new file mode 100644 index 0000000000..efea2bc3b3 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/CouchbaseRepositoriesAutoConfigurationTests.java @@ -0,0 +1,81 @@ +/* + * Copyright 2012-2013 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; + +import org.junit.Test; +import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage; +import org.springframework.boot.autoconfigure.data.couchbase.City; +import org.springframework.boot.autoconfigure.data.couchbase.CityRepository; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.couchbase.client.CouchbaseClient; + +import static org.junit.Assert.assertNotNull; +import static org.mockito.Mockito.mock; + +/** + * Tests for {@link CouchbaseRepositoriesAutoConfiguration}. + * + * @author Michael Nitschinger + */ +public class CouchbaseRepositoriesAutoConfigurationTests { + + private AnnotationConfigApplicationContext context; + + @Test + public void testDefaultRepositoryConfiguration() throws Exception { + this.context = new AnnotationConfigApplicationContext(); + this.context.register(TestConfiguration.class, + CouchbaseRepositoriesAutoConfiguration.class, + PropertyPlaceholderAutoConfiguration.class); + this.context.refresh(); + assertNotNull(this.context.getBean(CityRepository.class)); + assertNotNull(this.context.getBean(CouchbaseClient.class)); + } + + @Test + public void testNoRepositoryConfiguration() throws Exception { + this.context = new AnnotationConfigApplicationContext(); + this.context.register(EmptyConfiguration.class, + CouchbaseRepositoriesAutoConfiguration.class, + PropertyPlaceholderAutoConfiguration.class); + this.context.refresh(); + assertNotNull(this.context.getBean(CouchbaseClient.class)); + } + + @Configuration + @TestAutoConfigurationPackage(City.class) + protected static class TestConfiguration { + @Bean + public CouchbaseClient clientMock() { + return mock(CouchbaseClient.class); + } + } + + @Configuration + @TestAutoConfigurationPackage(CouchbaseRepositoriesAutoConfigurationTests.class) + protected static class EmptyConfiguration { + @Bean + public CouchbaseClient clientMock() { + return mock(CouchbaseClient.class); + } + } + +} diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/City.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/City.java new file mode 100644 index 0000000000..f1d9e18707 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/City.java @@ -0,0 +1,83 @@ +/* + * Copyright 2012-2013 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 org.springframework.data.annotation.Id; +import org.springframework.data.couchbase.core.mapping.Document; + +import java.io.Serializable; + +/** + * @author Michael Nitschinger + */ +@Document +public class City implements Serializable { + + @Id + private String id; + + private String name; + private String state; + private String country; + private String map; + + public City(String id, String name, String country) { + this.id = id; + this.name = name; + this.country = country; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } +} diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CityRepository.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CityRepository.java new file mode 100644 index 0000000000..f06acc3cca --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CityRepository.java @@ -0,0 +1,25 @@ +/* + * Copyright 2012-2013 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 org.springframework.data.couchbase.repository.CouchbaseRepository; + +/** + * @author Michael Nitschinger + */ +public interface CityRepository extends CouchbaseRepository { +} diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml index ea9efbd0db..1f171d7d00 100644 --- a/spring-boot-dependencies/pom.xml +++ b/spring-boot-dependencies/pom.xml @@ -83,6 +83,7 @@ 4.0.3.RELEASE 3.0.2.RELEASE 2.2.6.RELEASE + 1.0.0.RELEASE 1.1.1.RELEASE Codd-SR2 0.9.0.RELEASE @@ -518,6 +519,11 @@ pom import + + org.springframework.data + spring-data-couchbase + ${spring-data-couchbase.version} + org.springframework.data spring-data-redis diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml index 7a7756a061..415e372c1e 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -24,6 +24,7 @@ spring-boot-starter-amqp spring-boot-starter-aop spring-boot-starter-batch + spring-boot-starter-data-couchbase spring-boot-starter-data-jpa spring-boot-starter-data-mongodb spring-boot-starter-integration diff --git a/spring-boot-starters/spring-boot-starter-data-couchbase/.gitignore b/spring-boot-starters/spring-boot-starter-data-couchbase/.gitignore new file mode 100644 index 0000000000..ea8c4bf7f3 --- /dev/null +++ b/spring-boot-starters/spring-boot-starter-data-couchbase/.gitignore @@ -0,0 +1 @@ +/target 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..6cf377e59e --- /dev/null +++ b/spring-boot-starters/spring-boot-starter-data-couchbase/pom.xml @@ -0,0 +1,21 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starters + 0.5.0.BUILD-SNAPSHOT + + spring-boot-starter-data-couchbase + jar + + ${basedir}/../.. + + + + org.springframework.data + spring-data-couchbase + + + diff --git a/spring-boot-starters/spring-boot-starter-parent/pom.xml b/spring-boot-starters/spring-boot-starter-parent/pom.xml index c7f4db598d..26d9000524 100644 --- a/spring-boot-starters/spring-boot-starter-parent/pom.xml +++ b/spring-boot-starters/spring-boot-starter-parent/pom.xml @@ -86,6 +86,11 @@ spring-boot-starter-data-rest ${spring-boot.version} + + org.springframework.boot + spring-boot-starter-data-couchbase + 0.5.0.BUILD-SNAPSHOT + org.springframework.boot spring-boot-starter-integration