Skip to content

Commit d51ac8f

Browse files
committed
Revise KeySpaceResolver support to primary KeySpace detector source.
A configured KeySpaceResolver is now used primarily to detect the KeySpace to allow further customization of the KeySpace detection strategy. The concept of a fallback resolver is now deprecated. Closes #461
1 parent b05bfc6 commit d51ac8f

File tree

6 files changed

+72
-32
lines changed

6 files changed

+72
-32
lines changed

src/main/java/org/springframework/data/keyvalue/core/mapping/BasicKeyValuePersistentEntity.java

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import org.springframework.util.StringUtils;
2626

2727
/**
28-
* {@link KeyValuePersistentEntity} implementation that adds specific meta-data such as the {@literal keySpace}..
28+
* {@link KeyValuePersistentEntity} implementation that adds specific meta-data such as the {@literal keySpace}.
2929
*
3030
* @author Christoph Strobl
3131
* @author Oliver Gierke
@@ -37,31 +37,47 @@ public class BasicKeyValuePersistentEntity<T, P extends KeyValuePersistentProper
3737

3838
private static final SpelExpressionParser PARSER = new SpelExpressionParser();
3939

40-
private static final KeySpaceResolver DEFAULT_FALLBACK_RESOLVER = ClassNameKeySpaceResolver.INSTANCE;
41-
4240
private final @Nullable Expression keyspaceExpression;
4341
private final @Nullable String keyspace;
4442

4543
/**
4644
* @param information must not be {@literal null}.
47-
* @param fallbackKeySpaceResolver can be {@literal null}.
45+
* @since 3.1
4846
*/
49-
public BasicKeyValuePersistentEntity(TypeInformation<T> information,
50-
@Nullable KeySpaceResolver fallbackKeySpaceResolver) {
47+
public BasicKeyValuePersistentEntity(TypeInformation<T> information) {
48+
this(information, (String) null);
49+
}
5150

52-
super(information);
51+
/**
52+
* @param information must not be {@literal null}.
53+
* @param keySpaceResolver can be {@literal null}.
54+
*/
55+
public BasicKeyValuePersistentEntity(TypeInformation<T> information, @Nullable KeySpaceResolver keySpaceResolver) {
56+
this(information, keySpaceResolver != null ? keySpaceResolver.resolveKeySpace(information.getType()) : null);
57+
}
5358

54-
Class<T> type = information.getType();
55-
String keySpace = AnnotationBasedKeySpaceResolver.INSTANCE.resolveKeySpace(type);
59+
private BasicKeyValuePersistentEntity(TypeInformation<T> information, @Nullable String keyspace) {
5660

57-
if (StringUtils.hasText(keySpace)) {
61+
super(information);
5862

59-
this.keyspace = keySpace;
60-
this.keyspaceExpression = detectExpression(keySpace);
61-
} else {
63+
if (StringUtils.hasText(keyspace)) {
6264

63-
this.keyspace = resolveKeyspace(fallbackKeySpaceResolver, type);
65+
this.keyspace = keyspace;
6466
this.keyspaceExpression = null;
67+
} else {
68+
69+
Class<T> type = information.getType();
70+
String detectedKeyspace = AnnotationBasedKeySpaceResolver.INSTANCE.resolveKeySpace(type);
71+
72+
if (StringUtils.hasText(detectedKeyspace)) {
73+
74+
this.keyspace = detectedKeyspace;
75+
this.keyspaceExpression = detectExpression(detectedKeyspace);
76+
} else {
77+
78+
this.keyspace = ClassNameKeySpaceResolver.INSTANCE.resolveKeySpace(type);
79+
this.keyspaceExpression = null;
80+
}
6581
}
6682
}
6783

@@ -79,12 +95,6 @@ private static Expression detectExpression(String potentialExpression) {
7995
return expression instanceof LiteralExpression ? null : expression;
8096
}
8197

82-
@Nullable
83-
private static String resolveKeyspace(@Nullable KeySpaceResolver fallbackKeySpaceResolver, Class<?> type) {
84-
return (fallbackKeySpaceResolver == null ? DEFAULT_FALLBACK_RESOLVER : fallbackKeySpaceResolver)
85-
.resolveKeySpace(type);
86-
}
87-
8898
@Override
8999
public String getKeySpace() {
90100
return keyspaceExpression == null //

src/main/java/org/springframework/data/keyvalue/core/mapping/ClassNameKeySpaceResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
* @author Christoph Strobl
2525
* @author Oliver Gierke
2626
*/
27-
enum ClassNameKeySpaceResolver implements KeySpaceResolver {
27+
public enum ClassNameKeySpaceResolver implements KeySpaceResolver {
2828

2929
INSTANCE;
3030

src/main/java/org/springframework/data/keyvalue/core/mapping/KeySpaceResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
/**
2121
* {@link KeySpaceResolver} determines the {@literal keyspace} a given type is assigned to. A keyspace in this context
22-
* is a specific region/collection/grouping of elements sharing a common keyrange. <br />
22+
* is a specific region/collection/grouping of elements sharing a common keyrange.
2323
*
2424
* @author Christoph Strobl
2525
* @author Mark Paluch

src/main/java/org/springframework/data/keyvalue/core/mapping/PrefixKeyspaceResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
* delegate {@link KeySpaceResolver}.
2323
*
2424
* @author Mark Paluch
25-
* @since 3.0
25+
* @since 3.1
2626
*/
2727
public class PrefixKeyspaceResolver implements KeySpaceResolver {
2828

src/main/java/org/springframework/data/keyvalue/core/mapping/context/KeyValueMappingContext.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
public class KeyValueMappingContext<E extends KeyValuePersistentEntity<?, P>, P extends KeyValuePersistentProperty<P>>
4040
extends AbstractMappingContext<E, P> {
4141

42-
private @Nullable KeySpaceResolver fallbackKeySpaceResolver;
42+
private @Nullable KeySpaceResolver keySpaceResolver;
4343

4444
public KeyValueMappingContext() {
4545
setSimpleTypeHolder(new KeyValueSimpleTypeHolder());
@@ -49,24 +49,37 @@ public KeyValueMappingContext() {
4949
* Configures the {@link KeySpaceResolver} to be used if not explicit key space is annotated to the domain type.
5050
*
5151
* @param fallbackKeySpaceResolver can be {@literal null}.
52+
* @deprecated since 3.1, use {@link KeySpaceResolver} instead.
5253
*/
54+
@Deprecated(since = "3.1")
5355
public void setFallbackKeySpaceResolver(KeySpaceResolver fallbackKeySpaceResolver) {
54-
this.fallbackKeySpaceResolver = fallbackKeySpaceResolver;
56+
setKeySpaceResolver(fallbackKeySpaceResolver);
5557
}
5658

5759
/**
58-
* @return the current fallback KeySpaceResolver. Can be {@literal null}.
59-
* @since 3.0
60+
* Configures the {@link KeySpaceResolver} to be used. Configuring a {@link KeySpaceResolver} disables SpEL evaluation
61+
* abilities.
62+
*
63+
* @param keySpaceResolver can be {@literal null}.
64+
* @since 3.1
65+
*/
66+
public void setKeySpaceResolver(KeySpaceResolver keySpaceResolver) {
67+
this.keySpaceResolver = keySpaceResolver;
68+
}
69+
70+
/**
71+
* @return the current {@link KeySpaceResolver}. Can be {@literal null}.
72+
* @since 3.1
6073
*/
6174
@Nullable
62-
public KeySpaceResolver getFallbackKeySpaceResolver() {
63-
return fallbackKeySpaceResolver;
75+
public KeySpaceResolver getKeySpaceResolver() {
76+
return keySpaceResolver;
6477
}
6578

6679
@Override
6780
@SuppressWarnings("unchecked")
6881
protected <T> E createPersistentEntity(TypeInformation<T> typeInformation) {
69-
return (E) new BasicKeyValuePersistentEntity<T, P>(typeInformation, getFallbackKeySpaceResolver());
82+
return (E) new BasicKeyValuePersistentEntity<T, P>(typeInformation, getKeySpaceResolver());
7083
}
7184

7285
@Override

src/test/java/org/springframework/data/keyvalue/core/mapping/BasicKeyValuePersistentEntityUnitTests.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.junit.jupiter.api.Test;
2525
import org.springframework.data.keyvalue.annotation.KeySpace;
2626
import org.springframework.data.keyvalue.core.mapping.context.KeyValueMappingContext;
27-
import org.springframework.data.mapping.context.MappingContext;
2827
import org.springframework.data.spel.ExtensionAwareEvaluationContextProvider;
2928
import org.springframework.data.spel.spi.EvaluationContextExtension;
3029

@@ -35,7 +34,7 @@
3534
*/
3635
class BasicKeyValuePersistentEntityUnitTests {
3736

38-
private MappingContext<? extends KeyValuePersistentEntity<?, ?>, ? extends KeyValuePersistentProperty<?>> mappingContext = new KeyValueMappingContext<>();
37+
private KeyValueMappingContext<? extends KeyValuePersistentEntity<?, ?>, ? extends KeyValuePersistentProperty<?>> mappingContext = new KeyValueMappingContext<>();
3938

4039
@Test // DATAKV-268
4140
void shouldDeriveKeyspaceFromClassName() {
@@ -64,6 +63,24 @@ void shouldEvaluateEntityWithoutKeyspace() {
6463
assertThat(persistentEntity.getKeySpace()).isEqualTo(NoKeyspaceEntity.class.getName());
6564
}
6665

66+
@Test // GH-461
67+
void shouldApplyKeySpaceResolver() {
68+
69+
mappingContext.setKeySpaceResolver(new PrefixKeyspaceResolver("foo", ClassNameKeySpaceResolver.INSTANCE));
70+
KeyValuePersistentEntity<?, ?> persistentEntity = mappingContext.getPersistentEntity(NoKeyspaceEntity.class);
71+
72+
assertThat(persistentEntity.getKeySpace()).isEqualTo("foo" + NoKeyspaceEntity.class.getName());
73+
}
74+
75+
@Test // GH-461
76+
void shouldFallBackToDefaultsIfKeySpaceResolverReturnsNull() {
77+
78+
mappingContext.setKeySpaceResolver(it -> null);
79+
KeyValuePersistentEntity<?, ?> persistentEntity = mappingContext.getPersistentEntity(NoKeyspaceEntity.class);
80+
81+
assertThat(persistentEntity.getKeySpace()).isEqualTo(NoKeyspaceEntity.class.getName());
82+
}
83+
6784
@KeySpace("#{myProperty}")
6885
private static class ExpressionEntity {}
6986

0 commit comments

Comments
 (0)