Skip to content

Commit f779b47

Browse files
authored
Merge pull request mybatis#1614 from kazuki43zoo/immutable-on-providersqlsource
Improve the ProvderSqlSource to immutable object
2 parents 35b423a + ecd5682 commit f779b47

File tree

1 file changed

+27
-20
lines changed

1 file changed

+27
-20
lines changed

src/main/java/org/apache/ibatis/builder/annotation/ProviderSqlSource.java

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ public class ProviderSqlSource implements SqlSource {
3939
private final Class<?> providerType;
4040
private final LanguageDriver languageDriver;
4141
private final Method mapperMethod;
42-
private Method providerMethod;
43-
private String[] providerMethodArgumentNames;
44-
private Class<?>[] providerMethodParameterTypes;
45-
private ProviderContext providerContext;
46-
private Integer providerContextIndex;
42+
private final Method providerMethod;
43+
private final String[] providerMethodArgumentNames;
44+
private final Class<?>[] providerMethodParameterTypes;
45+
private final ProviderContext providerContext;
46+
private final Integer providerContextIndex;
4747

4848
/**
4949
* @deprecated Since 3.5.3, Please use the {@link #ProviderSqlSource(Configuration, Annotation, Class, Method)} instead of this.
@@ -68,29 +68,30 @@ public ProviderSqlSource(Configuration configuration, Object provider, Class<?>
6868
* @since 3.5.3
6969
*/
7070
public ProviderSqlSource(Configuration configuration, Annotation provider, Class<?> mapperType, Method mapperMethod) {
71-
String providerMethodName;
71+
String candidateProviderMethodName;
72+
Method candidateProviderMethod = null;
7273
try {
7374
this.configuration = configuration;
7475
this.mapperMethod = mapperMethod;
7576
Lang lang = mapperMethod == null ? null : mapperMethod.getAnnotation(Lang.class);
7677
this.languageDriver = configuration.getLanguageDriver(lang == null ? null : lang.value());
7778
this.providerType = getProviderType(provider, mapperMethod);
78-
providerMethodName = (String) provider.annotationType().getMethod("method").invoke(provider);
79+
candidateProviderMethodName = (String) provider.annotationType().getMethod("method").invoke(provider);
7980

80-
if (providerMethodName.length() == 0 && ProviderMethodResolver.class.isAssignableFrom(this.providerType)) {
81-
this.providerMethod = ((ProviderMethodResolver) this.providerType.getDeclaredConstructor().newInstance())
81+
if (candidateProviderMethodName.length() == 0 && ProviderMethodResolver.class.isAssignableFrom(this.providerType)) {
82+
candidateProviderMethod = ((ProviderMethodResolver) this.providerType.getDeclaredConstructor().newInstance())
8283
.resolveMethod(new ProviderContext(mapperType, mapperMethod, configuration.getDatabaseId()));
8384
}
84-
if (this.providerMethod == null) {
85-
providerMethodName = providerMethodName.length() == 0 ? "provideSql" : providerMethodName;
85+
if (candidateProviderMethod == null) {
86+
candidateProviderMethodName = candidateProviderMethodName.length() == 0 ? "provideSql" : candidateProviderMethodName;
8687
for (Method m : this.providerType.getMethods()) {
87-
if (providerMethodName.equals(m.getName()) && CharSequence.class.isAssignableFrom(m.getReturnType())) {
88-
if (this.providerMethod != null) {
88+
if (candidateProviderMethodName.equals(m.getName()) && CharSequence.class.isAssignableFrom(m.getReturnType())) {
89+
if (candidateProviderMethod != null) {
8990
throw new BuilderException("Error creating SqlSource for SqlProvider. Method '"
90-
+ providerMethodName + "' is found multiple in SqlProvider '" + this.providerType.getName()
91+
+ candidateProviderMethodName + "' is found multiple in SqlProvider '" + this.providerType.getName()
9192
+ "'. Sql provider method can not overload.");
9293
}
93-
this.providerMethod = m;
94+
candidateProviderMethod = m;
9495
}
9596
}
9697
}
@@ -99,24 +100,30 @@ public ProviderSqlSource(Configuration configuration, Annotation provider, Class
99100
} catch (Exception e) {
100101
throw new BuilderException("Error creating SqlSource for SqlProvider. Cause: " + e, e);
101102
}
102-
if (this.providerMethod == null) {
103+
if (candidateProviderMethod == null) {
103104
throw new BuilderException("Error creating SqlSource for SqlProvider. Method '"
104-
+ providerMethodName + "' not found in SqlProvider '" + this.providerType.getName() + "'.");
105+
+ candidateProviderMethodName + "' not found in SqlProvider '" + this.providerType.getName() + "'.");
105106
}
107+
this.providerMethod = candidateProviderMethod;
106108
this.providerMethodArgumentNames = new ParamNameResolver(configuration, this.providerMethod).getNames();
107109
this.providerMethodParameterTypes = this.providerMethod.getParameterTypes();
110+
111+
ProviderContext candidateProviderContext = null;
112+
Integer candidateProviderContextIndex = null;
108113
for (int i = 0; i < this.providerMethodParameterTypes.length; i++) {
109114
Class<?> parameterType = this.providerMethodParameterTypes[i];
110115
if (parameterType == ProviderContext.class) {
111-
if (this.providerContext != null) {
116+
if (candidateProviderContext != null) {
112117
throw new BuilderException("Error creating SqlSource for SqlProvider. ProviderContext found multiple in SqlProvider method ("
113118
+ this.providerType.getName() + "." + providerMethod.getName()
114119
+ "). ProviderContext can not define multiple in SqlProvider method argument.");
115120
}
116-
this.providerContext = new ProviderContext(mapperType, mapperMethod, configuration.getDatabaseId());
117-
this.providerContextIndex = i;
121+
candidateProviderContext = new ProviderContext(mapperType, mapperMethod, configuration.getDatabaseId());
122+
candidateProviderContextIndex = i;
118123
}
119124
}
125+
this.providerContext = candidateProviderContext;
126+
this.providerContextIndex = candidateProviderContextIndex;
120127
}
121128

122129
@Override

0 commit comments

Comments
 (0)