public ProgressEvent handleRequest()

in aws-nimblestudio-studio/src/main/java/software/amazon/nimblestudio/studio/UpdateHandler.java [26:110]


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

        this.logger = logger;

        return ProgressEvent.progress(request.getDesiredResourceState(), callbackContext)
            .then(progress -> proxy
                .initiate(
                    "AWS-NimbleStudio-Studio::Update",
                    proxyClient,
                    progress.getResourceModel(),
                    progress.getCallbackContext())
                .translateToServiceRequest(model -> {
                    final UpdateStudioRequest.Builder updateStudioBuilder = UpdateStudioRequest.builder()
                        .clientToken(request.getClientRequestToken())
                        .studioId(model.getStudioId());

                    if (!StringUtils.isEmpty(model.getDisplayName())) {
                        updateStudioBuilder.displayName(model.getDisplayName());
                    }

                    if (!StringUtils.isEmpty(model.getAdminRoleArn())) {
                        updateStudioBuilder.adminRoleArn(model.getAdminRoleArn());
                    }

                    if (!StringUtils.isEmpty(model.getUserRoleArn())) {
                        updateStudioBuilder.userRoleArn(model.getUserRoleArn());
                    }

                    return updateStudioBuilder.build();
                })
                .makeServiceCall((awsRequest, client) -> {
                    final NimbleClient studioClient = client.client();
                    final String studioId = awsRequest.studioId();

                    final StudioState studioState = getStudio(client, studioId).state();
                    if (StudioState.DELETED.equals(studioState) || StudioState.CREATE_FAILED.equals(studioState)) {
                        logger.log(String.format("%s [%s] is in state %s, update failed", ResourceModel.TYPE_NAME,
                            studioId, studioState));
                        throw new CfnNotFoundException(ResourceModel.TYPE_NAME, studioId);
                    }

                    try {
                        final UpdateStudioResponse updateStudioResponse = client
                            .injectCredentialsAndInvokeV2(awsRequest, studioClient::updateStudio);

                        logger.log(String.format("%s [%s] update requested successfully", ResourceModel.TYPE_NAME, studioId));

                        return updateStudioResponse;
                    } catch (final NimbleException e) {
                        logger.log(String.format("%s [%s] exception during update", ResourceModel.TYPE_NAME, studioId));
                        throw Translator.translateToCfnException(e);
                    }

                })
                .stabilize((awsRequest, awsResponse, client, updateModel, context) -> {
                    final String studioId = request.getDesiredResourceState().getStudioId();
                    final Studio studio = getStudio(proxyClient, studioId);

                    if (StudioState.READY.equals(studio.state())) {
                        logger.log(String.format("%s [%s] is in state READY, update succeeded", ResourceModel.TYPE_NAME, studioId));
                        return true;
                    }
                    if (StudioState.UPDATE_IN_PROGRESS.equals(studio.state())) {
                        logger.log(String.format("%s [%s] is in state UPDATING, update pending", ResourceModel.TYPE_NAME,
                            studioId));
                        return false;
                    }

                    logger.log(String.format("%s [%s] is in state %s, update failed", ResourceModel.TYPE_NAME, studioId,
                        studio.state()));
                    throw new CfnGeneralServiceException(String.format("Unexpected state %s: %s - %s",
                        studio.stateAsString(),
                        studio.statusCodeAsString(),
                        studio.statusMessage()));

                })
                .progress()
        )
        .then((r) -> new ReadHandler().handleRequest(proxy, request, callbackContext, proxyClient, logger));
    }