25
25
import com .squareup .javapoet .CodeBlock ;
26
26
import com .squareup .javapoet .FieldSpec ;
27
27
import com .squareup .javapoet .MethodSpec ;
28
+ import com .squareup .javapoet .ParameterizedTypeName ;
28
29
import com .squareup .javapoet .TypeSpec ;
30
+ import java .util .EnumMap ;
29
31
import java .util .HashMap ;
30
32
import java .util .Locale ;
31
33
import java .util .Map ;
41
43
*/
42
44
public class DefaultsModeConfigurationGenerator implements PoetClass {
43
45
46
+ private static final String DEFAULT_CONFIG_BY_MODE_ENUM_MAP = "DEFAULT_CONFIG_BY_MODE" ;
47
+ private static final String DEFAULT_HTTP_CONFIG_BY_MODE_ENUM_MAP = "DEFAULT_HTTP_CONFIG_BY_MODE" ;
48
+ private static final String DEFAULTS_VAR_SUFFIX = "_DEFAULTS" ;
49
+ private static final String HTTP_DEFAULTS_VAR_SUFFIX = "_HTTP_DEFAULTS" ;
50
+ private static final Map <String , OptionMetadata > CONFIGURATION_MAPPING = new HashMap <>();
51
+ private static final Map <String , OptionMetadata > HTTP_CONFIGURATION_MAPPING = new HashMap <>();
44
52
private final String basePackage ;
45
53
private final String defaultsModeBase ;
46
54
private final DefaultConfiguration configuration ;
47
55
48
- private static final Map <String , OptionMetadata > CONFIGURATION_MAPPING = new HashMap <>();
49
-
50
- private static final Map <String , OptionMetadata > HTTP_CONFIGURATION_MAPPING = new HashMap <>();
51
-
52
56
static {
53
57
HTTP_CONFIGURATION_MAPPING .put ("connectTimeoutInMillis" ,
54
58
new OptionMetadata (ClassName .get ("java.time" , "Duration" ),
55
59
ClassName .get ("software.amazon.awssdk.http" ,
56
60
"SdkHttpConfigurationOption" , "CONNECTION_TIMEOUT" )));
57
61
CONFIGURATION_MAPPING .put ("retryMode" , new OptionMetadata (ClassName .get ("software.amazon.awssdk.core.retry" , "RetryMode"
58
- ), ClassName .get ("software.amazon.awssdk.core.client.config" ,"SdkClientOption" , "DEFAULT_RETRY_MODE" )));
62
+ ), ClassName .get ("software.amazon.awssdk.core.client.config" , "SdkClientOption" , "DEFAULT_RETRY_MODE" )));
59
63
}
60
64
61
65
public DefaultsModeConfigurationGenerator (String basePackage , String defaultsModeBase , DefaultConfiguration configuration ) {
@@ -75,8 +79,9 @@ public TypeSpec poetClass() {
75
79
"$S" ,
76
80
"software.amazon.awssdk:codegen" )
77
81
.build ())
78
- .addMethod (defaultHttpConfigMethod (configuration .modeDefaults ().keySet ()))
79
- .addMethod (defaultSdkConfigMethod (configuration .modeDefaults ().keySet ()))
82
+ .addMethod (defaultConfigMethod (DEFAULT_CONFIG_BY_MODE_ENUM_MAP , "defaultConfig" ))
83
+ .addMethod (defaultConfigMethod (DEFAULT_HTTP_CONFIG_BY_MODE_ENUM_MAP ,
84
+ "defaultHttpConfig" ))
80
85
.addMethod (createConstructor ());
81
86
82
87
@@ -87,18 +92,52 @@ public TypeSpec poetClass() {
87
92
88
93
addDefaultsFieldForLegacy (builder , "LEGACY_DEFAULTS" );
89
94
addDefaultsFieldForLegacy (builder , "LEGACY_HTTP_DEFAULTS" );
95
+
96
+ addEnumMapField (builder , DEFAULT_CONFIG_BY_MODE_ENUM_MAP );
97
+ addEnumMapField (builder , DEFAULT_HTTP_CONFIG_BY_MODE_ENUM_MAP );
98
+
99
+ addStaticEnumMapBlock (builder );
90
100
return builder .build ();
91
101
}
92
102
103
+ private void addStaticEnumMapBlock (TypeSpec .Builder builder ) {
104
+ CodeBlock .Builder staticCodeBlock = CodeBlock .builder ();
105
+
106
+ putItemsToEnumMap (staticCodeBlock , configuration .modeDefaults ().keySet (), DEFAULTS_VAR_SUFFIX ,
107
+ DEFAULT_CONFIG_BY_MODE_ENUM_MAP );
108
+ putItemsToEnumMap (staticCodeBlock , configuration .modeDefaults ().keySet (), HTTP_DEFAULTS_VAR_SUFFIX ,
109
+ DEFAULT_HTTP_CONFIG_BY_MODE_ENUM_MAP );
110
+
111
+ builder .addStaticBlock (staticCodeBlock .build ());
112
+ }
113
+
114
+ private void addEnumMapField (TypeSpec .Builder builder , String name ) {
115
+ ParameterizedTypeName map = ParameterizedTypeName .get (ClassName .get (Map .class ),
116
+ defaultsModeClassName (),
117
+ ClassName .get (AttributeMap .class ));
118
+ FieldSpec field = FieldSpec .builder (map , name , PRIVATE , STATIC , FINAL )
119
+ .initializer ("new $T<>(DefaultsMode.class)" , EnumMap .class ).build ();
120
+ builder .addField (field );
121
+ }
122
+
123
+ private void putItemsToEnumMap (CodeBlock .Builder codeBlock , Set <String > modes , String suffix , String mapName ) {
124
+ modes .forEach (m -> {
125
+ String mode = sanitizeMode (m );
126
+ codeBlock .addStatement ("$N.put(DefaultsMode.$N, $N)" , mapName , mode , mode + suffix );
127
+ });
128
+
129
+ // Add LEGACY since LEGACY is not in the modes set
130
+ codeBlock .addStatement ("$N.put(DefaultsMode.LEGACY, LEGACY$N)" , mapName , suffix );
131
+ }
132
+
93
133
@ Override
94
134
public ClassName className () {
95
135
return ClassName .get (basePackage , "DefaultsModeConfiguration" );
96
136
}
97
137
98
138
private FieldSpec addDefaultsFieldForMode (Map .Entry <String , Map <String , String >> modeEntry ) {
99
139
String mode = modeEntry .getKey ();
100
- String fieldName = sanitizeMode (mode ) + "_DEFAULTS" ;
101
-
140
+ String fieldName = sanitizeMode (mode ) + DEFAULTS_VAR_SUFFIX ;
102
141
103
142
CodeBlock .Builder attributeBuilder = CodeBlock .builder ()
104
143
.add ("$T.builder()" , AttributeMap .class );
@@ -129,7 +168,8 @@ private void attributeMapBuilder(String option, String value, CodeBlock.Builder
129
168
OptionMetadata optionMetadata = CONFIGURATION_MAPPING .get (option );
130
169
switch (option ) {
131
170
case "retryMode" :
132
- attributeBuilder .add (".put($T, $T.$N)" , optionMetadata .attribute , optionMetadata .type , value .toUpperCase (Locale .US ));
171
+ attributeBuilder .add (".put($T, $T.$N)" , optionMetadata .attribute , optionMetadata .type ,
172
+ value .toUpperCase (Locale .US ));
133
173
break ;
134
174
default :
135
175
throw new IllegalStateException ("Unsupported option " + option );
@@ -149,7 +189,7 @@ private void httpAttributeMapBuilder(String option, String value, CodeBlock.Buil
149
189
150
190
private FieldSpec addHttpDefaultsFieldForMode (Map .Entry <String , Map <String , String >> modeEntry ) {
151
191
String mode = modeEntry .getKey ();
152
- String fieldName = sanitizeMode (mode ) + "_HTTP_DEFAULTS" ;
192
+ String fieldName = sanitizeMode (mode ) + HTTP_DEFAULTS_VAR_SUFFIX ;
153
193
154
194
CodeBlock .Builder attributeBuilder = CodeBlock .builder ()
155
195
.add ("$T.builder()" , AttributeMap .class );
@@ -180,59 +220,17 @@ private CodeBlock documentation() {
180
220
return builder .build ();
181
221
}
182
222
183
-
184
- private MethodSpec defaultHttpConfigMethod (Set <String > modes ) {
185
- String nameSuffix = "_HTTP_DEFAULTS" ;
186
- MethodSpec .Builder methodBuilder = MethodSpec .methodBuilder ("defaultHttpConfig" )
223
+ private MethodSpec defaultConfigMethod (String enumMap , String methodName ) {
224
+ MethodSpec .Builder methodBuilder = MethodSpec .methodBuilder (methodName )
187
225
.returns (AttributeMap .class )
188
226
.addModifiers (PUBLIC , STATIC )
189
- .addJavadoc ("Return the default HTTP config options for a given defaults "
227
+ .addJavadoc ("Return the default config options for a given defaults "
190
228
+ "mode" )
191
229
.addParameter (defaultsModeClassName (), "mode" )
192
- .beginControlFlow ("switch (mode)" );
193
-
194
-
195
- addSwitchCaseForEachMode (modes , nameSuffix , methodBuilder );
196
-
197
- addLegacyCase (methodBuilder , "LEGACY" + nameSuffix );
198
-
199
- return methodBuilder
200
- .addStatement ("default: throw new IllegalArgumentException($S + $N)" , "Unsupported mode: " , "mode" )
201
- .endControlFlow ()
202
- .build ();
203
- }
204
-
205
- private void addSwitchCaseForEachMode (Set <String > modes , String nameSuffix , MethodSpec .Builder methodBuilder ) {
206
- modes .forEach (m -> {
207
- String mode = sanitizeMode (m );
208
- methodBuilder .addCode ("case $N:" , mode );
209
- methodBuilder .addStatement ("return $N" , mode + nameSuffix );
210
- });
211
- }
212
-
213
- private MethodSpec defaultSdkConfigMethod (Set <String > modes ) {
214
- String nameSuffix = "_DEFAULTS" ;
215
- MethodSpec .Builder methodBuilder = MethodSpec .methodBuilder ("defaultConfig" )
216
- .returns (AttributeMap .class )
217
- .addModifiers (PUBLIC , STATIC )
218
- .addJavadoc ("Return the default SDK config options for a given defaults "
219
- + "mode" )
220
- .addParameter (defaultsModeClassName (), "mode" )
221
- .beginControlFlow ("switch (mode)" );
222
-
223
-
224
- addSwitchCaseForEachMode (modes , nameSuffix , methodBuilder );
225
- addLegacyCase (methodBuilder , "LEGACY" + nameSuffix );
226
-
227
- return methodBuilder
228
- .addStatement ("default: throw new IllegalArgumentException($S + $N)" , "Unsupported mode: " , "mode" )
229
- .endControlFlow ()
230
- .build ();
231
- }
230
+ .addStatement ("return $N.getOrDefault(mode, $T.empty())" ,
231
+ enumMap , AttributeMap .class );
232
232
233
- private void addLegacyCase (MethodSpec .Builder methodBuilder , String name ) {
234
- methodBuilder .addCode ("case LEGACY:" );
235
- methodBuilder .addStatement ("return $N" , name );
233
+ return methodBuilder .build ();
236
234
}
237
235
238
236
private ClassName defaultsModeClassName () {
@@ -249,7 +247,7 @@ private static final class OptionMetadata {
249
247
private final ClassName type ;
250
248
private final ClassName attribute ;
251
249
252
- public OptionMetadata (ClassName type , ClassName attribute ) {
250
+ OptionMetadata (ClassName type , ClassName attribute ) {
253
251
this .type = type ;
254
252
this .attribute = attribute ;
255
253
}
0 commit comments