19
19
import static javax .lang .model .element .Modifier .ABSTRACT ;
20
20
import static javax .lang .model .element .Modifier .FINAL ;
21
21
import static javax .lang .model .element .Modifier .PRIVATE ;
22
+ import static javax .lang .model .element .Modifier .PROTECTED ;
22
23
import static javax .lang .model .element .Modifier .PUBLIC ;
24
+ import static software .amazon .awssdk .codegen .poet .client .AsyncClientInterface .STREAMING_TYPE_VARIABLE ;
23
25
24
26
import com .squareup .javapoet .ClassName ;
25
27
import com .squareup .javapoet .FieldSpec ;
26
28
import com .squareup .javapoet .MethodSpec ;
29
+ import com .squareup .javapoet .ParameterSpec ;
30
+ import com .squareup .javapoet .ParameterizedTypeName ;
27
31
import com .squareup .javapoet .TypeSpec ;
32
+ import com .squareup .javapoet .TypeVariableName ;
33
+ import java .util .ArrayList ;
28
34
import java .util .List ;
35
+ import java .util .function .Function ;
29
36
import software .amazon .awssdk .annotations .SdkPublicApi ;
30
37
import software .amazon .awssdk .codegen .docs .SimpleMethodOverload ;
31
38
import software .amazon .awssdk .codegen .model .config .customization .UtilitiesMethod ;
@@ -89,14 +96,9 @@ protected void addConsumerMethod(List<MethodSpec> specs, MethodSpec spec, Simple
89
96
90
97
@ Override
91
98
protected void addAdditionalMethods (TypeSpec .Builder type ) {
92
- MethodSpec delegate = MethodSpec .methodBuilder ("delegate" )
93
- .addModifiers (PUBLIC )
94
- .addStatement ("return this.delegate" )
95
- .returns (SdkClient .class )
96
- .build ();
97
-
98
99
type .addMethod (nameMethod ())
99
- .addMethod (delegate );
100
+ .addMethod (delegateMethod ())
101
+ .addMethod (invokeMethod ());
100
102
}
101
103
102
104
@ Override
@@ -125,9 +127,19 @@ protected MethodSpec.Builder operationBody(MethodSpec.Builder builder, Operation
125
127
builder .addModifiers (PUBLIC )
126
128
.addAnnotation (Override .class );
127
129
128
- builder .addStatement ("return delegate.$N($L)" ,
130
+ if (builder .parameters .size () < 1 ) {
131
+ throw new IllegalStateException ("All client methods must have an argument" );
132
+ }
133
+
134
+ List <ParameterSpec > operationParameters = new ArrayList <>(builder .parameters );
135
+ String requestParameter = operationParameters .remove (0 ).name ;
136
+ String additionalParameters = String .format (", %s" , operationParameters .stream ().map (p -> p .name ).collect (joining (", " )));
137
+
138
+ builder .addStatement ("return invokeOperation($N, request -> delegate.$N(request$N))" ,
139
+ requestParameter ,
129
140
opModel .getMethodName (),
130
- builder .parameters .stream ().map (p -> p .name ).collect (joining (", " )));
141
+ operationParameters .isEmpty () ? "" : additionalParameters );
142
+
131
143
return builder ;
132
144
}
133
145
@@ -136,7 +148,9 @@ protected MethodSpec.Builder paginatedMethodBody(MethodSpec.Builder builder, Ope
136
148
String methodName = PaginatorUtils .getPaginatedMethodName (opModel .getMethodName ());
137
149
return builder .addModifiers (PUBLIC )
138
150
.addAnnotation (Override .class )
139
- .addStatement ("return delegate.$N($N)" , methodName , opModel .getInput ().getVariableName ());
151
+ .addStatement ("return invokeOperation($N, request -> delegate.$N(request))" ,
152
+ opModel .getInput ().getVariableName (),
153
+ methodName );
140
154
}
141
155
142
156
@ Override
@@ -167,6 +181,34 @@ private MethodSpec nameMethod() {
167
181
.build ();
168
182
}
169
183
184
+ private MethodSpec delegateMethod () {
185
+ return MethodSpec .methodBuilder ("delegate" )
186
+ .addModifiers (PUBLIC )
187
+ .addStatement ("return this.delegate" )
188
+ .returns (SdkClient .class )
189
+ .build ();
190
+ }
191
+
192
+ private MethodSpec invokeMethod () {
193
+ TypeVariableName requestTypeVariableName =
194
+ TypeVariableName .get ("T" , poetExtensions .getModelClass (model .getSdkRequestBaseClassName ()));
195
+
196
+ TypeVariableName responseTypeVariableName = STREAMING_TYPE_VARIABLE ;
197
+
198
+ ParameterizedTypeName functionTypeName = ParameterizedTypeName
199
+ .get (ClassName .get (Function .class ), requestTypeVariableName , responseTypeVariableName );
200
+
201
+ return MethodSpec .methodBuilder ("invokeOperation" )
202
+ .addModifiers (PROTECTED )
203
+ .addParameter (requestTypeVariableName , "request" )
204
+ .addParameter (functionTypeName , "operation" )
205
+ .addTypeVariable (requestTypeVariableName )
206
+ .addTypeVariable (responseTypeVariableName )
207
+ .returns (responseTypeVariableName )
208
+ .addStatement ("return operation.apply(request)" )
209
+ .build ();
210
+ }
211
+
170
212
@ Override
171
213
protected MethodSpec serviceClientConfigMethod () {
172
214
return MethodSpec .methodBuilder ("serviceClientConfiguration" )
0 commit comments