diff --git a/src/main/java/org/springframework/data/keyvalue/repository/config/KeyValueRepositoryConfigurationExtension.java b/src/main/java/org/springframework/data/keyvalue/repository/config/KeyValueRepositoryConfigurationExtension.java index f143190..2ca7be6 100644 --- a/src/main/java/org/springframework/data/keyvalue/repository/config/KeyValueRepositoryConfigurationExtension.java +++ b/src/main/java/org/springframework/data/keyvalue/repository/config/KeyValueRepositoryConfigurationExtension.java @@ -32,7 +32,6 @@ import org.springframework.data.repository.config.AnnotationRepositoryConfigurat import org.springframework.data.repository.config.RepositoryConfigurationExtension; import org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport; import org.springframework.data.repository.config.RepositoryConfigurationSource; -import org.springframework.util.ObjectUtils; /** * {@link RepositoryConfigurationExtension} for {@link KeyValueRepository}. @@ -40,11 +39,10 @@ import org.springframework.util.ObjectUtils; * @author Christoph Strobl * @author Oliver Gierke */ -public class KeyValueRepositoryConfigurationExtension extends RepositoryConfigurationExtensionSupport { +public abstract class KeyValueRepositoryConfigurationExtension extends RepositoryConfigurationExtensionSupport { protected static final String MAPPING_CONTEXT_BEAN_NAME = "keyValueMappingContext"; - protected static final String KEY_VALUE_TEMPLATE_BEAN_NAME = "keyValueTemplate"; - protected static final String Key_VALUE_TEMPLATE_BEAN_NAME_CONFIG_ATTRIBUTE = KEY_VALUE_TEMPLATE_BEAN_NAME + "Ref"; + protected static final String KEY_VALUE_TEMPLATE_BEAN_REF_ATTRIBUTE = "keyValueTemplateRef"; /* * (non-Javadoc) @@ -91,8 +89,7 @@ public class KeyValueRepositoryConfigurationExtension extends RepositoryConfigur AnnotationAttributes attributes = config.getAttributes(); - builder.addPropertyReference("keyValueOperations", - attributes.getString(Key_VALUE_TEMPLATE_BEAN_NAME_CONFIG_ATTRIBUTE)); + builder.addPropertyReference("keyValueOperations", attributes.getString(KEY_VALUE_TEMPLATE_BEAN_REF_ATTRIBUTE)); builder.addPropertyValue("queryCreator", getQueryCreatorType(config)); builder.addPropertyReference("mappingContext", MAPPING_CONTEXT_BEAN_NAME); } @@ -127,33 +124,22 @@ public class KeyValueRepositoryConfigurationExtension extends RepositoryConfigur super.registerBeansForRoot(registry, configurationSource); - potentiallyRegisterMappingContext(registry, configurationSource); - potentiallyRegisterKeyValueTemplate(registry, configurationSource); - } - - private void potentiallyRegisterKeyValueTemplate(BeanDefinitionRegistry registry, - RepositoryConfigurationSource configurationSource) { - - if (ObjectUtils.nullSafeEquals(configurationSource.getAttribute(Key_VALUE_TEMPLATE_BEAN_NAME_CONFIG_ATTRIBUTE), - KEY_VALUE_TEMPLATE_BEAN_NAME)) { - - RootBeanDefinition defaultKeyValueTemplateBeanDefinition = getDefaultKeyValueTemplateBeanDefinition(); - - if (defaultKeyValueTemplateBeanDefinition != null) { - registerIfNotAlreadyRegistered(defaultKeyValueTemplateBeanDefinition, registry, KEY_VALUE_TEMPLATE_BEAN_NAME, - configurationSource); - } - } - } - - private void potentiallyRegisterMappingContext(BeanDefinitionRegistry registry, - RepositoryConfigurationSource configurationSource) { - RootBeanDefinition mappingContextDefinition = new RootBeanDefinition(KeyValueMappingContext.class); mappingContextDefinition.setSource(configurationSource.getSource()); - registry.registerBeanDefinition(MAPPING_CONTEXT_BEAN_NAME, mappingContextDefinition); registerIfNotAlreadyRegistered(mappingContextDefinition, registry, MAPPING_CONTEXT_BEAN_NAME, configurationSource); + + String keyValueTemplateName = configurationSource.getAttribute(KEY_VALUE_TEMPLATE_BEAN_REF_ATTRIBUTE); + + // No custom template reference configured + if (getDefaultKeyValueTemplateRef().equals(keyValueTemplateName)) { + + RootBeanDefinition beanDefinition = getDefaultKeyValueTemplateBeanDefinition(); + + if (beanDefinition != null) { + registerIfNotAlreadyRegistered(beanDefinition, registry, keyValueTemplateName, configurationSource.getSource()); + } + } } /** @@ -164,4 +150,6 @@ public class KeyValueRepositoryConfigurationExtension extends RepositoryConfigur protected RootBeanDefinition getDefaultKeyValueTemplateBeanDefinition() { return null; } + + protected abstract String getDefaultKeyValueTemplateRef(); } diff --git a/src/main/java/org/springframework/data/keyvalue/repository/config/RepositoryNameSpaceHandler.java b/src/main/java/org/springframework/data/keyvalue/repository/config/RepositoryNameSpaceHandler.java deleted file mode 100644 index 6efd4a5..0000000 --- a/src/main/java/org/springframework/data/keyvalue/repository/config/RepositoryNameSpaceHandler.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2012 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.data.keyvalue.repository.config; - -import org.springframework.beans.factory.xml.BeanDefinitionParser; -import org.springframework.beans.factory.xml.NamespaceHandler; -import org.springframework.beans.factory.xml.NamespaceHandlerSupport; -import org.springframework.data.repository.config.RepositoryBeanDefinitionParser; - -/** - * {@link NamespaceHandler} to register {@link BeanDefinitionParser}s for key-value repositories. - * - * @author Oliver Gierke - * @author Christoph Strobl - * @since 1.4 - */ -public class RepositoryNameSpaceHandler extends NamespaceHandlerSupport { - - /* - * (non-Javadoc) - * @see org.springframework.beans.factory.xml.NamespaceHandler#init() - */ - public void init() { - - KeyValueRepositoryConfigurationExtension extension = new KeyValueRepositoryConfigurationExtension(); - RepositoryBeanDefinitionParser repositoryBeanDefinitionParser = new RepositoryBeanDefinitionParser(extension); - registerBeanDefinitionParser("repositories", repositoryBeanDefinitionParser); - } -} diff --git a/src/main/java/org/springframework/data/map/repository/config/EnableMapRepositories.java b/src/main/java/org/springframework/data/map/repository/config/EnableMapRepositories.java index 7ef80b8..1975dc6 100644 --- a/src/main/java/org/springframework/data/map/repository/config/EnableMapRepositories.java +++ b/src/main/java/org/springframework/data/map/repository/config/EnableMapRepositories.java @@ -114,7 +114,7 @@ public @interface EnableMapRepositories { * * @return */ - String keyValueTemplateRef() default "keyValueTemplate"; + String keyValueTemplateRef() default "mapKeyValueTemplate"; /** * Configures whether nested repository-interfaces (e.g. defined as inner classes) should be discovered by the diff --git a/src/main/java/org/springframework/data/map/repository/config/MapRepositoryConfigurationExtension.java b/src/main/java/org/springframework/data/map/repository/config/MapRepositoryConfigurationExtension.java index 3b68076..fde3760 100644 --- a/src/main/java/org/springframework/data/map/repository/config/MapRepositoryConfigurationExtension.java +++ b/src/main/java/org/springframework/data/map/repository/config/MapRepositoryConfigurationExtension.java @@ -44,6 +44,15 @@ public class MapRepositoryConfigurationExtension extends KeyValueRepositoryConfi return "map"; } + /* + * (non-Javadoc) + * @see org.springframework.data.keyvalue.repository.config.KeyValueRepositoryConfigurationExtension#getDefaultKeyValueTemplateRef() + */ + @Override + protected String getDefaultKeyValueTemplateRef() { + return "mapKeyValueTemplate"; + } + /* * (non-Javadoc) * @see org.springframework.data.keyvalue.repository.config.KeyValueRepositoryConfigurationExtension#getDefaultKeyValueTemplateBeanDefinition() diff --git a/src/test/java/org/springframework/data/map/repository/config/MapRepositoriesConfigurationExtensionIntegrationTests.java b/src/test/java/org/springframework/data/map/repository/config/MapRepositoriesConfigurationExtensionIntegrationTests.java new file mode 100644 index 0000000..1a66972 --- /dev/null +++ b/src/test/java/org/springframework/data/map/repository/config/MapRepositoriesConfigurationExtensionIntegrationTests.java @@ -0,0 +1,69 @@ +/* + * Copyright 2014 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.data.map.repository.config; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +import java.util.Arrays; + +import org.junit.Test; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Configuration; + +/** + * Integration tests for {@link MapRepositoryConfigurationExtension}. + * + * @author Oliver Gierke + */ +public class MapRepositoriesConfigurationExtensionIntegrationTests { + + /** + * @see DATAKV-86 + */ + @Test + public void registersDefaultTemplateIfReferenceNotCustomized() { + + ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(Config.class); + + assertThat(Arrays.asList(context.getBeanDefinitionNames()), hasItem("mapKeyValueTemplate")); + + context.close(); + } + + /** + * @see DATAKV-86 + */ + @Test + public void doesNotRegisterDefaulttemplateIfReferenceIsCustomized() { + + ConfigurableApplicationContext context = new AnnotationConfigApplicationContext( + ConfigWithCustomTemplateReference.class); + + assertThat(Arrays.asList(context.getBeanDefinitionNames()), not(hasItem("mapKeyValueTemplate"))); + + context.close(); + } + + @Configuration + @EnableMapRepositories + static class Config {} + + @Configuration + @EnableMapRepositories(keyValueTemplateRef = "foo") + static class ConfigWithCustomTemplateReference {} +} diff --git a/src/test/java/org/springframework/data/map/repository/config/MapRepositoryRegistrarWithFullDefaultingIntegrationTests.java b/src/test/java/org/springframework/data/map/repository/config/MapRepositoryRegistrarWithFullDefaultingIntegrationTests.java index 1ad837c..f205e02 100644 --- a/src/test/java/org/springframework/data/map/repository/config/MapRepositoryRegistrarWithFullDefaultingIntegrationTests.java +++ b/src/test/java/org/springframework/data/map/repository/config/MapRepositoryRegistrarWithFullDefaultingIntegrationTests.java @@ -80,6 +80,5 @@ public class MapRepositoryRegistrarWithFullDefaultingIntegrationTests { static interface PersonRepository extends CrudRepository { List findByFirstname(String firstname); - } }