7070import software .amazon .cloudformation .resource .Validator ;
7171import software .amazon .cloudformation .resource .exceptions .ValidationException ;
7272
73- public abstract class AbstractWrapper <ResourceT , CallbackT > {
73+ public abstract class AbstractWrapper <ResourceT , CallbackT , ConfigurationT > {
7474
7575 public static final SdkHttpClient HTTP_CLIENT = ApacheHttpClient .builder ().build ();
7676
@@ -90,7 +90,7 @@ public abstract class AbstractWrapper<ResourceT, CallbackT> {
9090 protected final CloudWatchProvider providerCloudWatchProvider ;
9191 protected final CloudWatchLogsProvider cloudWatchLogsProvider ;
9292 protected final SchemaValidator validator ;
93- protected final TypeReference <HandlerRequest <ResourceT , CallbackT >> typeReference ;
93+ protected final TypeReference <HandlerRequest <ResourceT , CallbackT , ConfigurationT >> typeReference ;
9494
9595 protected MetricsPublisher providerMetricsPublisher ;
9696
@@ -179,7 +179,7 @@ public void processRequest(final InputStream inputStream, final OutputStream out
179179 TerminalException {
180180
181181 ProgressEvent <ResourceT , CallbackT > handlerResponse = null ;
182- HandlerRequest <ResourceT , CallbackT > request = null ;
182+ HandlerRequest <ResourceT , CallbackT , ConfigurationT > request = null ;
183183 scrubFiles ();
184184 try {
185185 if (inputStream == null ) {
@@ -239,7 +239,8 @@ public void processRequest(final InputStream inputStream, final OutputStream out
239239 }
240240
241241 private ProgressEvent <ResourceT , CallbackT >
242- processInvocation (final JSONObject rawRequest , final HandlerRequest <ResourceT , CallbackT > request ) throws IOException ,
242+ processInvocation (final JSONObject rawRequest , final HandlerRequest <ResourceT , CallbackT , ConfigurationT > request )
243+ throws IOException ,
243244 TerminalException {
244245 assert request != null : "Invalid request object received" ;
245246
@@ -260,6 +261,7 @@ public void processRequest(final InputStream inputStream, final OutputStream out
260261
261262 // transform the request object to pass to caller
262263 ResourceHandlerRequest <ResourceT > resourceHandlerRequest = transform (request );
264+ ConfigurationT typeConfiguration = request .getRequestData ().getTypeConfiguration ();
263265
264266 if (resourceHandlerRequest != null ) {
265267 resourceHandlerRequest .setPreviousResourceTags (getPreviousResourceTags (request ));
@@ -325,7 +327,7 @@ public void processRequest(final InputStream inputStream, final OutputStream out
325327 }
326328
327329 ProgressEvent <ResourceT , CallbackT > handlerResponse = wrapInvocationAndHandleErrors (awsClientProxy ,
328- resourceHandlerRequest , request , callbackContext );
330+ resourceHandlerRequest , request , callbackContext , typeConfiguration );
329331
330332 if (handlerResponse .getStatus () == OperationStatus .IN_PROGRESS && !isMutatingAction ) {
331333 throw new TerminalException ("READ and LIST handlers must return synchronously." );
@@ -334,8 +336,9 @@ public void processRequest(final InputStream inputStream, final OutputStream out
334336 return handlerResponse ;
335337 }
336338
337- private void
338- logUnhandledError (final String errorDescription , final HandlerRequest <ResourceT , CallbackT > request , final Throwable e ) {
339+ private void logUnhandledError (final String errorDescription ,
340+ final HandlerRequest <ResourceT , CallbackT , ConfigurationT > request ,
341+ final Throwable e ) {
339342 log (String .format ("%s in a %s action on a %s: %s%n%s" , errorDescription , request .getAction (), request .getResourceType (),
340343 e .toString (), ExceptionUtils .getStackTrace (e )));
341344 }
@@ -349,13 +352,14 @@ public void processRequest(final InputStream inputStream, final OutputStream out
349352 private ProgressEvent <ResourceT , CallbackT >
350353 wrapInvocationAndHandleErrors (final AmazonWebServicesClientProxy awsClientProxy ,
351354 final ResourceHandlerRequest <ResourceT > resourceHandlerRequest ,
352- final HandlerRequest <ResourceT , CallbackT > request ,
353- final CallbackT callbackContext ) {
355+ final HandlerRequest <ResourceT , CallbackT , ConfigurationT > request ,
356+ final CallbackT callbackContext ,
357+ final ConfigurationT typeConfiguration ) {
354358
355359 Date startTime = Date .from (Instant .now ());
356360 try {
357361 ProgressEvent <ResourceT , CallbackT > handlerResponse = invokeHandler (awsClientProxy , resourceHandlerRequest ,
358- request .getAction (), callbackContext );
362+ request .getAction (), callbackContext , typeConfiguration );
359363 if (handlerResponse != null ) {
360364 this .log (String .format ("Handler returned %s" , handlerResponse .getStatus ()));
361365 } else {
@@ -384,7 +388,8 @@ public void processRequest(final InputStream inputStream, final OutputStream out
384388
385389 }
386390
387- protected void writeResponse (final OutputStream outputStream , final ProgressEvent <ResourceT , CallbackT > response )
391+ protected void writeResponse (final OutputStream outputStream ,
392+ final ProgressEvent <ResourceT , CallbackT > response )
388393 throws IOException {
389394 if (response .getResourceModel () != null ) {
390395 // strip write only properties on final results, we will need the intact model
@@ -437,7 +442,7 @@ private void validateModel(final JSONObject modelObject) throws ValidationExcept
437442 * and is not needed by the handler implementations
438443 * @return A converted ResourceHandlerRequest model
439444 */
440- protected abstract ResourceHandlerRequest <ResourceT > transform (HandlerRequest <ResourceT , CallbackT > request )
445+ protected abstract ResourceHandlerRequest <ResourceT > transform (HandlerRequest <ResourceT , CallbackT , ConfigurationT > request )
441446 throws IOException ;
442447
443448 /**
@@ -465,14 +470,16 @@ protected abstract ResourceHandlerRequest<ResourceT> transform(HandlerRequest<Re
465470 * {@link Action#DELETE}, {@link Action#READ} {@link Action#LIST} or
466471 * {@link Action#UPDATE}
467472 * @param callbackContext the callback context to handle reentrant calls
473+ * @param typeConfiguration the configuration for the type set by type consumer
468474 * @return progress event indicating success, in progress with delay callback or
469475 * failed state
470476 * @throws Exception propagate any unexpected errors
471477 */
472478 public abstract ProgressEvent <ResourceT , CallbackT > invokeHandler (AmazonWebServicesClientProxy proxy ,
473479 ResourceHandlerRequest <ResourceT > request ,
474480 Action action ,
475- CallbackT callbackContext )
481+ CallbackT callbackContext ,
482+ ConfigurationT typeConfiguration )
476483 throws Exception ;
477484
478485 /*
@@ -512,7 +519,7 @@ private void log(final String message) {
512519 }
513520 }
514521
515- protected abstract TypeReference <HandlerRequest <ResourceT , CallbackT >> getTypeReference ();
522+ protected abstract TypeReference <HandlerRequest <ResourceT , CallbackT , ConfigurationT >> getTypeReference ();
516523
517524 protected abstract TypeReference <ResourceT > getModelTypeReference ();
518525
@@ -536,7 +543,7 @@ protected void scrubFiles() {
536543 * @return a Map of Tag names to Tag values
537544 */
538545 @ VisibleForTesting
539- protected Map <String , String > getDesiredResourceTags (final HandlerRequest <ResourceT , CallbackT > request ) {
546+ protected Map <String , String > getDesiredResourceTags (final HandlerRequest <ResourceT , CallbackT , ConfigurationT > request ) {
540547 Map <String , String > desiredResourceTags = new HashMap <>();
541548 JSONObject object ;
542549
@@ -559,7 +566,7 @@ protected Map<String, String> getDesiredResourceTags(final HandlerRequest<Resour
559566 * @return a Map of Tag names to Tag values
560567 */
561568 @ VisibleForTesting
562- protected Map <String , String > getPreviousResourceTags (final HandlerRequest <ResourceT , CallbackT > request ) {
569+ protected Map <String , String > getPreviousResourceTags (final HandlerRequest <ResourceT , CallbackT , ConfigurationT > request ) {
563570 Map <String , String > previousResourceTags = new HashMap <>();
564571
565572 if (request != null && request .getRequestData () != null ) {
@@ -574,7 +581,7 @@ protected Map<String, String> getPreviousResourceTags(final HandlerRequest<Resou
574581 }
575582
576583 @ VisibleForTesting
577- protected String getStackId (final HandlerRequest <ResourceT , CallbackT > request ) {
584+ protected String getStackId (final HandlerRequest <ResourceT , CallbackT , ConfigurationT > request ) {
578585 if (request != null ) {
579586 return request .getStackId ();
580587 }
0 commit comments