public ProgressEvent handleRequest()

in aws-nimblestudio-studiocomponent/src/main/java/software/amazon/nimblestudio/studiocomponent/UpdateHandler.java [33:120]


    public ProgressEvent<ResourceModel, CallbackContext> handleRequest(
        final AmazonWebServicesClientProxy proxy,
        final ResourceHandlerRequest<ResourceModel> request,
        final CallbackContext callbackContext,
        final ProxyClient<NimbleClient> proxyClient,
        final Logger logger) {

        return ProgressEvent.progress(request.getDesiredResourceState(), callbackContext)
            .then(progress -> proxy
                .initiate(
                    "AWS-NimbleStudio-StudioComponent::Update",
                    proxyClient,
                    progress.getResourceModel(),
                    progress.getCallbackContext())
                .translateToServiceRequest(model -> fromResourceModel(model, request.getClientRequestToken()))
                .makeServiceCall((updateStudioComponentRequest, client) -> {
                    final String studioComponentId = updateStudioComponentRequest.studioComponentId();

                    try {
                        final GetStudioComponentRequest getStudioComponentRequest = GetStudioComponentRequest.builder()
                            .studioComponentId(studioComponentId)
                            .studioId(updateStudioComponentRequest.studioId())
                            .build();
                        final GetStudioComponentResponse getStudioComponentResponse = client
                            .injectCredentialsAndInvokeV2(getStudioComponentRequest, client.client()::getStudioComponent);
                        final StudioComponentState state = getStudioComponentResponse.studioComponent().state();

                        if (StudioComponentState.DELETED.equals(state) || StudioComponentState.CREATE_FAILED.equals(state)) {
                            logger.log(String.format("%s [%s] is in state %s, update failed",
                                ResourceModel.TYPE_NAME, studioComponentId, state.toString()));
                            throw new CfnNotFoundException(ResourceModel.TYPE_NAME, studioComponentId);
                        }

                        final UpdateStudioComponentResponse updateStudioComponentResponse = client
                            .injectCredentialsAndInvokeV2(updateStudioComponentRequest,
                                client.client()::updateStudioComponent);

                        logger.log(String.format("%s [%s] update in progress",
                            ResourceModel.TYPE_NAME,
                            updateStudioComponentRequest.studioComponentId()));

                        return updateStudioComponentResponse;
                    } catch (final NimbleException e) {
                        logger.log(String.format("%s [%s] exception during update", ResourceModel.TYPE_NAME,
                            updateStudioComponentRequest.studioComponentId()));
                        throw ExceptionTranslator.translateToCfnException(e);
                    }
                })
                .stabilize((awsRequest, awsResponse, client, model, context) -> {
                    final String studioComponentId = awsRequest.studioComponentId();

                    GetStudioComponentRequest getStudioComponentRequest = GetStudioComponentRequest.builder()
                        .studioId(awsRequest.studioId())
                        .studioComponentId(studioComponentId)
                        .build();
                    GetStudioComponentResponse getStudioComponentResponse;

                    try {
                        getStudioComponentResponse = client.injectCredentialsAndInvokeV2(
                            getStudioComponentRequest, client.client()::getStudioComponent);
                    } catch (final NimbleException e) {
                        logger.log(String.format("%s [%s] exception during update", ResourceModel.TYPE_NAME,
                            studioComponentId));
                        throw ExceptionTranslator.translateToCfnException(e);
                    }

                    if (StudioComponentState.UPDATE_IN_PROGRESS.equals(getStudioComponentResponse.studioComponent().state())) {
                        logger.log(String.format("%s [%s] is in state UPDATE_IN_PROGRESS, update in progress",
                            ResourceModel.TYPE_NAME, studioComponentId));
                        return false;
                    }
                    if (StudioComponentState.READY.equals(getStudioComponentResponse.studioComponent().state())) {
                        logger.log(String.format("%s [%s] is in state READY, update succeeded",
                            ResourceModel.TYPE_NAME, studioComponentId));
                        return true;
                    }

                    logger.log(String.format("%s [%s] is in error state %s, update failed", ResourceModel.TYPE_NAME,
                        studioComponentId, getStudioComponentResponse.studioComponent().state()));
                    throw new CfnGeneralServiceException(String.format("Unexpected state %s: %s - %s",
                        getStudioComponentResponse.studioComponent().stateAsString(),
                        getStudioComponentResponse.studioComponent().statusCodeAsString(),
                        getStudioComponentResponse.studioComponent().statusMessage()));
                })
                .progress()
            )
            .then((r) -> new ReadHandler().handleRequest(proxy, request, callbackContext, proxyClient, logger));
    }