Skip to content

Commit 7b5f476

Browse files
Reduce visibility & add documentation (well a little at least)
1 parent cb93ce2 commit 7b5f476

File tree

3 files changed

+48
-19
lines changed

3 files changed

+48
-19
lines changed

src/main/java/org/springframework/data/repository/aot/generate/LocalVariableNameFactory.java

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
import org.springframework.util.MultiValueMap;
2222

2323
/**
24-
* {@link VariableNameFactory} implementation keeping track of defined names resolving name clashes using internal
25-
* counter appending {@code _%d} to a suggested name in case of a clash.
24+
* Non thread safe {@link VariableNameFactory} implementation keeping track of defined names resolving name clashes
25+
* using internal counters appending {@code _%d} to a suggested name in case of a clash.
2626
*
2727
* @author Christoph Strobl
2828
* @since 4.0
@@ -31,36 +31,43 @@ class LocalVariableNameFactory implements VariableNameFactory {
3131

3232
private final MultiValueMap<String, String> variables;
3333

34+
/**
35+
* Create a new {@link LocalVariableNameFactory} considering available {@link MethodMetadata#getMethodArguments()
36+
* method arguments}.
37+
*
38+
* @param methodMetadata source metadata
39+
* @return new instance of {@link LocalVariableNameFactory}.
40+
*/
3441
static LocalVariableNameFactory forMethod(MethodMetadata methodMetadata) {
3542
return of(methodMetadata.getMethodArguments().keySet());
3643
}
3744

38-
static LocalVariableNameFactory empty() {
39-
return of(Set.of());
40-
}
41-
42-
static LocalVariableNameFactory of(Set<String> variables) {
43-
return new LocalVariableNameFactory(variables);
45+
/**
46+
* Create a new {@link LocalVariableNameFactory} with a predefined set of initial variable names.
47+
*
48+
* @param predefinedVariables variables already known to be used in the given context.
49+
* @return new instance of {@link LocalVariableNameFactory}.
50+
*/
51+
static LocalVariableNameFactory of(Set<String> predefinedVariables) {
52+
return new LocalVariableNameFactory(predefinedVariables);
4453
}
4554

4655
LocalVariableNameFactory(Iterable<String> predefinedVariableNames) {
4756

4857
variables = new LinkedMultiValueMap<>();
49-
for (String parameterName : predefinedVariableNames) {
50-
variables.add(parameterName, parameterName);
51-
}
58+
predefinedVariableNames.forEach(varName -> variables.add(varName, varName));
5259
}
5360

5461
@Override
55-
public String generateName(String suggestedName) {
62+
public String generateName(String intendedVariableName) {
5663

57-
if (!variables.containsKey(suggestedName)) {
58-
variables.add(suggestedName, suggestedName);
59-
return suggestedName;
64+
if (!variables.containsKey(intendedVariableName)) {
65+
variables.add(intendedVariableName, intendedVariableName);
66+
return intendedVariableName;
6067
}
6168

62-
String targetName = suggestTargetName(suggestedName);
63-
variables.add(suggestedName, targetName);
69+
String targetName = suggestTargetName(intendedVariableName);
70+
variables.add(intendedVariableName, targetName);
6471
variables.add(targetName, targetName);
6572
return targetName;
6673
}

src/main/java/org/springframework/data/repository/aot/generate/VariableNameFactory.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,24 @@
1515
*/
1616
package org.springframework.data.repository.aot.generate;
1717

18+
import org.springframework.lang.CheckReturnValue;
19+
1820
/**
21+
* Name factory for generating clash free variable names checking an intended name against predefined and already used
22+
* ones.
23+
*
1924
* @author Christoph Strobl
2025
* @since 4.0
2126
*/
22-
public interface VariableNameFactory {
27+
interface VariableNameFactory {
2328

24-
String generateName(String suggestedName);
29+
/**
30+
* Compare and potentially generate a new name for the given intended variable name.
31+
*
32+
* @param intendedVariableName must not be {@literal null}.
33+
* @return the {@literal intendedVariableName} if no naming clash detected or a clash free generated name.
34+
*/
35+
@CheckReturnValue
36+
String generateName(String intendedVariableName);
2537

2638
}

src/test/java/org/springframework/data/repository/aot/generate/LocalVariableNameFactoryUnitTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,16 @@ void resolvesNameClashesInNames() {
5050
assertThat(variableNameFactory.generateName("name4_1")).isEqualTo("name4_1_3");
5151
}
5252

53+
@Test // GH-3270
54+
void worksWithVariablesContainingUnderscores() {
55+
56+
assertThat(variableNameFactory.generateName("first_name")).isEqualTo("first_name");
57+
assertThat(variableNameFactory.generateName("first_name")).isEqualTo("first_name_1");
58+
assertThat(variableNameFactory.generateName("first_name")).isEqualTo("first_name_2");
59+
assertThat(variableNameFactory.generateName("first_name_3")).isEqualTo("first_name_3");
60+
assertThat(variableNameFactory.generateName("first_name")).isEqualTo("first_name_4");
61+
}
62+
5363
@Test // GH-3270
5464
void considersPredefinedNames() {
5565
assertThat(variableNameFactory.generateName("firstname")).isEqualTo("firstname_1");

0 commit comments

Comments
 (0)