From 75387bb8ae7dc7a25cf4edd995235b7551ec57ac Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Mon, 20 Jun 2022 17:05:54 +0200 Subject: [PATCH] Add RepositoryConfiurationExtension.getModuleIdentifier(). We're now unifying the lookup of a unique identifier for a Spring Data module in the RepositoryConfigurationExtension interface. Previous users of getModulePrefix() in subclasses of RCE should rather call getModuleIdentifier(). Implementations of RCE that previously implemented getModulePrefix() directly should rather switch to implementing getModuleName() and additionally getModuleIdentifier() in case the default implementations derivation of the identifier from the name doesn't produce the results intended. RepositoryConfigurationExtensionSupport.getDefaultNamedQueryLocation() was changed to rather use the identifier to calculate the name of the named query location instead of the prefix. Fixes #2644. --- .../config/RepositoryConfigurationExtension.java | 14 ++++++++++++++ .../RepositoryConfigurationExtensionSupport.java | 6 +++++- 2 files changed, 19 insertions(+), 1 deletion(-) 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 4efd38e09..07aacda25 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtension.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtension.java @@ -16,6 +16,7 @@ package org.springframework.data.repository.config; import java.util.Collection; +import java.util.Locale; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; @@ -31,6 +32,19 @@ import org.springframework.core.io.ResourceLoader; */ public interface RepositoryConfigurationExtension { + /** + * A {@link String} uniquely identifying the module within all Spring Data modules. Must not contain any spaces. + * + * @return will never be {@literal null}. + * @since 3.0 + */ + default String getModuleIdentifier() { + + return getModuleName() + .toLowerCase(Locale.ENGLISH) + .replace(' ', '-'); + } + /** * Returns the descriptive name of the module. * 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 567bbc8db..d89304a6c 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupport.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupport.java @@ -103,7 +103,7 @@ public abstract class RepositoryConfigurationExtensionSupport implements Reposit } public String getDefaultNamedQueryLocation() { - return String.format("classpath*:META-INF/%s-named-queries.properties", getModulePrefix()); + return String.format("classpath*:META-INF/%s-named-queries.properties", getModuleIdentifier()); } public void registerBeansForRoot(BeanDefinitionRegistry registry, @@ -113,7 +113,11 @@ public abstract class RepositoryConfigurationExtensionSupport implements Reposit * Returns the prefix of the module to be used to create the default location for Spring Data named queries. * * @return must not be {@literal null}. + * @deprecated since 3.0, refer to {@link #getModuleIdentifier()} instead and implement either + * {@link #getModuleName()} directly or both methods if the default translation from name to identifier as + * defined in {@link RepositoryConfigurationExtension#getModuleIdentifier()} doesn't suit you. */ + @Deprecated protected abstract String getModulePrefix(); public void postProcess(BeanDefinitionBuilder builder, RepositoryConfigurationSource source) {}