diff --git a/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java b/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java index 6407af551..d1d8b2e83 100644 --- a/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java +++ b/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java @@ -257,6 +257,17 @@ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigura return attributes.containsKey(CONSIDER_NESTED_REPOSITORIES) && attributes.getBoolean(CONSIDER_NESTED_REPOSITORIES); } + /* + * (non-Javadoc) + * @see org.springframework.data.repository.config.RepositoryConfigurationSource#getAttribute(java.lang.String) + */ + @Override + public String getAttribute(String name) { + + String attribute = attributes.getString(name); + return StringUtils.hasText(attribute) ? attribute : null; + } + /** * Safely reads the {@code pattern} attribute from the given {@link AnnotationAttributes} and returns an empty list if * the attribute is not present. diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java index 6097a91da..9014fc568 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java @@ -90,6 +90,8 @@ public class RepositoryConfigurationDelegate { BeanDefinitionBuilder definitionBuilder = builder.build(configuration); + extension.postProcess(definitionBuilder, configurationSource); + if (isXml) { extension.postProcess(definitionBuilder, (XmlRepositoryConfigurationSource) configurationSource); } else { diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtension.java b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtension.java index c0d1a8872..b1c505805 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtension.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtension.java @@ -64,6 +64,14 @@ public interface RepositoryConfigurationExtension { */ void registerBeansForRoot(BeanDefinitionRegistry registry, RepositoryConfigurationSource configurationSource); + /** + * Callback to post process the {@link BeanDefinition} and tweak the configuration if necessary. + * + * @param builder will never be {@literal null}. + * @param config will never be {@literal null}. + */ + void postProcess(BeanDefinitionBuilder builder, RepositoryConfigurationSource config); + /** * Callback to post process the {@link BeanDefinition} built from annotations and tweak the configuration if * necessary. diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupport.java b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupport.java index 0c70c3cf4..b22833c4e 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupport.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupport.java @@ -84,6 +84,14 @@ public abstract class RepositoryConfigurationExtensionSupport implements Reposit */ protected abstract String getModulePrefix(); + /* + * (non-Javadoc) + * @see org.springframework.data.repository.config.RepositoryConfigurationExtension#postProcess(org.springframework.beans.factory.support.BeanDefinitionBuilder, org.springframework.data.repository.config.RepositoryConfigurationSource) + */ + public void postProcess(BeanDefinitionBuilder builder, RepositoryConfigurationSource source) { + + } + /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfigurationExtension#postProcess(org.springframework.beans.factory.support.BeanDefinitionBuilder, org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource) diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSource.java b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSource.java index e8e5a4e4b..82b9ad2b1 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSource.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSource.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2013 the original author or authors. + * Copyright 2012-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. @@ -78,4 +78,14 @@ public interface RepositoryConfigurationSource { * @return */ Collection getCandidates(ResourceLoader loader); + + /** + * Returns the value for the {@link String} attribute with the given name. The name is expected to be handed in + * camel-case. + * + * @param name must not be {@literal null} or empty. + * @return the attribute with the given name or {@literal null} if not configured or empty. + * @since 1.8 + */ + String getAttribute(String name); } diff --git a/src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java b/src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java index 5240dfe01..e873f8082 100644 --- a/src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java +++ b/src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2013 the original author or authors. + * Copyright 2012-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. @@ -16,6 +16,8 @@ package org.springframework.data.repository.config; import java.util.Arrays; +import java.util.List; +import java.util.regex.Pattern; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.core.env.Environment; @@ -42,6 +44,8 @@ public class XmlRepositoryConfigurationSource extends RepositoryConfigurationSou private static final String REPOSITORY_FACTORY_BEAN_CLASS_NAME = "factory-class"; private static final String CONSIDER_NESTED_REPOSITORIES = "consider-nested-repositories"; + private static final Pattern CAMEL_CASE_PARTS = Pattern.compile("(? parts = Arrays.asList(CAMEL_CASE_PARTS.split(name)); + String xmlAttributeName = StringUtils.collectionToDelimitedString(parts, "-"); + String attribute = element.getAttribute(xmlAttributeName); + + return StringUtils.hasText(attribute) ? attribute : null; + } } diff --git a/src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java b/src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java index fd692a577..e10fead16 100644 --- a/src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java @@ -52,6 +52,9 @@ public class AnnotationRepositoryConfigurationSourceUnitTests { environment); } + /** + * @see DATACMNS-47 + */ @Test public void findsBasePackagesForClasses() { @@ -59,6 +62,9 @@ public class AnnotationRepositoryConfigurationSourceUnitTests { assertThat(basePackages, hasItem(AnnotationRepositoryConfigurationSourceUnitTests.class.getPackage().getName())); } + /** + * @see DATACMNS-47 + */ @Test public void evaluatesExcludeFiltersCorrectly() { @@ -69,26 +75,28 @@ public class AnnotationRepositoryConfigurationSourceUnitTests { assertThat(candidate.getBeanClassName(), is(MyRepository.class.getName())); } + /** + * @see DATACMNS-47 + */ @Test public void defaultsToPackageOfAnnotatedClass() { - AnnotationMetadata metadata = new StandardAnnotationMetadata(DefaultConfiguration.class); - AnnotationRepositoryConfigurationSource source = new AnnotationRepositoryConfigurationSource(metadata, - EnableRepositories.class, resourceLoader, environment); - + AnnotationRepositoryConfigurationSource source = getConfigSource(DefaultConfiguration.class); Iterable packages = source.getBasePackages(); + assertThat(packages, hasItem(DefaultConfiguration.class.getPackage().getName())); assertThat(source.shouldConsiderNestedRepositories(), is(false)); } + /** + * @see DATACMNS-47 + */ @Test public void returnsConfiguredBasePackage() { - AnnotationMetadata metadata = new StandardAnnotationMetadata(DefaultConfigurationWithBasePackage.class); - AnnotationRepositoryConfigurationSource source = new AnnotationRepositoryConfigurationSource(metadata, - EnableRepositories.class, resourceLoader, environment); - + AnnotationRepositoryConfigurationSource source = getConfigSource(DefaultConfigurationWithBasePackage.class); Iterable packages = source.getBasePackages(); + assertThat(packages, hasItem("foo")); } @@ -98,19 +106,32 @@ public class AnnotationRepositoryConfigurationSourceUnitTests { @Test public void returnsConsiderNestedRepositories() { - AnnotationMetadata metadata = new StandardAnnotationMetadata(DefaultConfigurationWithNestedRepositories.class); - AnnotationRepositoryConfigurationSource source = new AnnotationRepositoryConfigurationSource(metadata, - EnableRepositories.class, resourceLoader, environment); - + AnnotationRepositoryConfigurationSource source = getConfigSource(DefaultConfigurationWithNestedRepositories.class); assertThat(source.shouldConsiderNestedRepositories(), is(true)); } + /** + * @see DATACMNS-456 + */ + @Test + public void findsStringAttributeByName() { + + RepositoryConfigurationSource source = getConfigSource(DefaultConfigurationWithBasePackage.class); + assertThat(source.getAttribute("namedQueriesLocation"), is("bar")); + } + + private AnnotationRepositoryConfigurationSource getConfigSource(Class type) { + + AnnotationMetadata metadata = new StandardAnnotationMetadata(type); + return new AnnotationRepositoryConfigurationSource(metadata, EnableRepositories.class, resourceLoader, environment); + } + public static class Person {} @EnableRepositories static class DefaultConfiguration {} - @EnableRepositories(basePackages = "foo") + @EnableRepositories(basePackages = "foo", namedQueriesLocation = "bar") static class DefaultConfigurationWithBasePackage {} @EnableRepositories(considerNestedRepositories = true)