1313import org .slf4j .LoggerFactory ;
1414import software .amazon .awssdk .annotations .Generated ;
1515import software .amazon .awssdk .annotations .SdkInternalApi ;
16+ import software .amazon .awssdk .awscore .client .config .AwsClientOption ;
1617import software .amazon .awssdk .awscore .client .handler .AwsAsyncClientHandler ;
1718import software .amazon .awssdk .awscore .exception .AwsServiceException ;
1819import software .amazon .awssdk .awscore .internal .AwsProtocolMetadata ;
2930import software .amazon .awssdk .core .http .HttpResponseHandler ;
3031import software .amazon .awssdk .core .metrics .CoreMetric ;
3132import software .amazon .awssdk .core .retry .RetryMode ;
33+ import software .amazon .awssdk .http .auth .spi .scheme .AuthSchemeOption ;
3234import software .amazon .awssdk .metrics .MetricCollector ;
3335import software .amazon .awssdk .metrics .MetricPublisher ;
3436import software .amazon .awssdk .metrics .NoOpMetricCollector ;
3840import software .amazon .awssdk .protocols .json .BaseAwsJsonProtocolFactory ;
3941import software .amazon .awssdk .protocols .json .JsonOperationMetadata ;
4042import software .amazon .awssdk .retries .api .RetryStrategy ;
43+ import software .amazon .awssdk .services .foobar .auth .scheme .FooBarAuthSchemeParams ;
44+ import software .amazon .awssdk .services .foobar .auth .scheme .FooBarAuthSchemeProvider ;
4145import software .amazon .awssdk .services .foobar .endpoints .FooBarClientContextParams ;
4246import software .amazon .awssdk .services .foobar .internal .FooBarServiceClientConfigurationBuilder ;
4347import software .amazon .awssdk .services .foobar .internal .ServiceVersionInfo ;
@@ -60,7 +64,7 @@ final class DefaultFooBarAsyncClient implements FooBarAsyncClient {
6064 private static final Logger log = LoggerFactory .getLogger (DefaultFooBarAsyncClient .class );
6165
6266 private static final AwsProtocolMetadata protocolMetadata = AwsProtocolMetadata .builder ()
63- .serviceProtocol (AwsServiceProtocol .REST_JSON ).build ();
67+ .serviceProtocol (AwsServiceProtocol .REST_JSON ).build ();
6468
6569 private final AsyncClientHandler clientHandler ;
6670
@@ -71,7 +75,7 @@ final class DefaultFooBarAsyncClient implements FooBarAsyncClient {
7175 protected DefaultFooBarAsyncClient (SdkClientConfiguration clientConfiguration ) {
7276 this .clientHandler = new AwsAsyncClientHandler (clientConfiguration );
7377 this .clientConfiguration = clientConfiguration .toBuilder ().option (SdkClientOption .SDK_CLIENT , this )
74- .option (SdkClientOption .API_METADATA , "Foo_Bar" + "#" + ServiceVersionInfo .VERSION ).build ();
78+ .option (SdkClientOption .API_METADATA , "Foo_Bar" + "#" + ServiceVersionInfo .VERSION ).build ();
7579 this .protocolFactory = init (AwsJsonProtocolFactory .builder ()).build ();
7680 }
7781
@@ -100,38 +104,43 @@ protected DefaultFooBarAsyncClient(SdkClientConfiguration clientConfiguration) {
100104 @ Override
101105 public CompletableFuture <GetDatabaseVersionResponse > getDatabaseVersion (GetDatabaseVersionRequest getDatabaseVersionRequest ) {
102106 SdkClientConfiguration clientConfiguration = updateSdkClientConfiguration (getDatabaseVersionRequest ,
103- this .clientConfiguration );
107+ this .clientConfiguration );
104108 List <MetricPublisher > metricPublishers = resolveMetricPublishers (clientConfiguration , getDatabaseVersionRequest
105- .overrideConfiguration ().orElse (null ));
109+ .overrideConfiguration ().orElse (null ));
106110 MetricCollector apiCallMetricCollector = metricPublishers .isEmpty () ? NoOpMetricCollector .create () : MetricCollector
107- .create ("ApiCall" );
111+ .create ("ApiCall" );
108112 try {
109113 apiCallMetricCollector .reportMetric (CoreMetric .SERVICE_ID , "Foo Bar" );
110114 apiCallMetricCollector .reportMetric (CoreMetric .OPERATION_NAME , "GetDatabaseVersion" );
111115 JsonOperationMetadata operationMetadata = JsonOperationMetadata .builder ().hasStreamingSuccessResponse (false )
112- .isPayloadJson (true ).build ();
116+ .isPayloadJson (true ).build ();
113117
114118 HttpResponseHandler <GetDatabaseVersionResponse > responseHandler = protocolFactory .createResponseHandler (
115- operationMetadata , GetDatabaseVersionResponse ::builder );
119+ operationMetadata , GetDatabaseVersionResponse ::builder );
116120 Function <String , Optional <ExceptionMetadata >> exceptionMetadataMapper = errorCode -> {
117121 if (errorCode == null ) {
118122 return Optional .empty ();
119123 }
120124 switch (errorCode ) {
121- default :
122- return Optional .empty ();
125+ default :
126+ return Optional .empty ();
123127 }
124128 };
125129 HttpResponseHandler <AwsServiceException > errorResponseHandler = createErrorResponseHandler (protocolFactory ,
126- operationMetadata , exceptionMetadataMapper );
130+ operationMetadata , exceptionMetadataMapper );
127131
128132 CompletableFuture <GetDatabaseVersionResponse > executeFuture = clientHandler
129- .execute (new ClientExecutionParams <GetDatabaseVersionRequest , GetDatabaseVersionResponse >()
130- .withOperationName ("GetDatabaseVersion" ).withProtocolMetadata (protocolMetadata )
131- .withMarshaller (new GetDatabaseVersionRequestMarshaller (protocolFactory ))
132- .withResponseHandler (responseHandler ).withErrorResponseHandler (errorResponseHandler )
133- .withRequestConfiguration (clientConfiguration ).withMetricCollector (apiCallMetricCollector )
134- .withInput (getDatabaseVersionRequest ));
133+ .execute (new ClientExecutionParams <GetDatabaseVersionRequest , GetDatabaseVersionResponse >()
134+ .withOperationName ("GetDatabaseVersion" )
135+ .withProtocolMetadata (protocolMetadata )
136+ .withMarshaller (new GetDatabaseVersionRequestMarshaller (protocolFactory ))
137+ .withResponseHandler (responseHandler )
138+ .withErrorResponseHandler (errorResponseHandler )
139+ .withRequestConfiguration (clientConfiguration )
140+ .withMetricCollector (apiCallMetricCollector )
141+ .withAuthSchemeOptionsResolver (
142+ r -> resolveAuthSchemeOptions (r , "GetDatabaseVersion" , clientConfiguration ))
143+ .withInput (getDatabaseVersionRequest ));
135144 CompletableFuture <GetDatabaseVersionResponse > whenCompleted = executeFuture .whenComplete ((r , e ) -> {
136145 metricPublishers .forEach (p -> p .publish (apiCallMetricCollector .collect ()));
137146 });
@@ -155,11 +164,11 @@ public final String serviceName() {
155164
156165 private <T extends BaseAwsJsonProtocolFactory .Builder <T >> T init (T builder ) {
157166 return builder .clientConfiguration (clientConfiguration ).defaultServiceExceptionSupplier (FooBarException ::builder )
158- .protocol (AwsJsonProtocol .REST_JSON ).protocolVersion ("1.1" );
167+ .protocol (AwsJsonProtocol .REST_JSON ).protocolVersion ("1.1" );
159168 }
160169
161170 private static List <MetricPublisher > resolveMetricPublishers (SdkClientConfiguration clientConfiguration ,
162- RequestOverrideConfiguration requestOverrideConfiguration ) {
171+ RequestOverrideConfiguration requestOverrideConfiguration ) {
163172 List <MetricPublisher > publishers = null ;
164173 if (requestOverrideConfiguration != null ) {
165174 publishers = requestOverrideConfiguration .metricPublishers ();
@@ -173,6 +182,17 @@ private static List<MetricPublisher> resolveMetricPublishers(SdkClientConfigurat
173182 return publishers ;
174183 }
175184
185+ private List <AuthSchemeOption > resolveAuthSchemeOptions (SdkRequest request , String operationName ,
186+ SdkClientConfiguration clientConfiguration ) {
187+ FooBarAuthSchemeProvider authSchemeProvider = Validate .isInstanceOf (FooBarAuthSchemeProvider .class ,
188+ clientConfiguration .option (SdkClientOption .AUTH_SCHEME_PROVIDER ),
189+ "Expected an instance of FooBarAuthSchemeProvider" );
190+ FooBarAuthSchemeParams .Builder paramsBuilder = FooBarAuthSchemeParams .builder ().operation (operationName );
191+ paramsBuilder .region (clientConfiguration .option (AwsClientOption .AWS_REGION ));
192+ List <AuthSchemeOption > options = authSchemeProvider .resolveAuthScheme (paramsBuilder .build ());
193+ return options ;
194+ }
195+
176196 private void updateRetryStrategyClientConfiguration (SdkClientConfiguration .Builder configuration ) {
177197 ClientOverrideConfiguration .Builder builder = configuration .asOverrideConfigurationBuilder ();
178198 RetryMode retryMode = builder .retryMode ();
@@ -211,15 +231,15 @@ private SdkClientConfiguration updateSdkClientConfiguration(SdkRequest request,
211231 newContextParams = (newContextParams != null ) ? newContextParams : AttributeMap .empty ();
212232 originalContextParams = originalContextParams != null ? originalContextParams : AttributeMap .empty ();
213233 Validate .validState (
214- Objects .equals (originalContextParams .get (FooBarClientContextParams .CROSS_REGION_ACCESS_ENABLED ),
215- newContextParams .get (FooBarClientContextParams .CROSS_REGION_ACCESS_ENABLED )),
216- "CROSS_REGION_ACCESS_ENABLED cannot be modified by request level plugins" );
234+ Objects .equals (originalContextParams .get (FooBarClientContextParams .CROSS_REGION_ACCESS_ENABLED ),
235+ newContextParams .get (FooBarClientContextParams .CROSS_REGION_ACCESS_ENABLED )),
236+ "CROSS_REGION_ACCESS_ENABLED cannot be modified by request level plugins" );
217237 updateRetryStrategyClientConfiguration (configuration );
218238 return configuration .build ();
219239 }
220240
221241 private HttpResponseHandler <AwsServiceException > createErrorResponseHandler (BaseAwsJsonProtocolFactory protocolFactory ,
222- JsonOperationMetadata operationMetadata , Function <String , Optional <ExceptionMetadata >> exceptionMetadataMapper ) {
242+ JsonOperationMetadata operationMetadata , Function <String , Optional <ExceptionMetadata >> exceptionMetadataMapper ) {
223243 return protocolFactory .createErrorResponseHandler (operationMetadata , exceptionMetadataMapper );
224244 }
225245
0 commit comments