protected ProgressEvent handleRequest()

in aws-rds-optiongroup/src/main/java/software/amazon/rds/optiongroup/UpdateHandler.java [35:91]


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

        final ResourceModel previousModel = request.getPreviousResourceState();
        final ResourceModel desiredModel = request.getDesiredResourceState();

        final Collection<OptionConfiguration> previousOptions = Optional
                .ofNullable(previousModel.getOptionConfigurations())
                .orElse(Collections.emptyList());
        final Collection<OptionConfiguration> desiredOptions = Optional
                .ofNullable(desiredModel.getOptionConfigurations())
                .orElse(Collections.emptyList());

        final Collection<OptionConfiguration> optionsToInclude = getOptionsToInclude(previousOptions, desiredOptions);
        final Collection<OptionConfiguration> optionsToRemove = getOptionsToRemove(previousOptions, desiredOptions);

        final Map<String, String> previousTags = mergeMaps(
                request.getPreviousSystemTags(),
                request.getPreviousResourceTags()
        );
        final Map<String, String> desiredTags = mergeMaps(
                request.getSystemTags(),
                request.getDesiredResourceTags()
        );

        // Here we explicitly use some immutability properties of an OptionGroup resource.
        // In fact, ModifyOptionGroupRequest only passes optionConfigurations, the rest is immutable.
        // Therefore it is sufficient to check if there are any items in optionConfiguration include/remove lists.
        final boolean shouldUpdateCoreResource = !(optionsToInclude.isEmpty() && optionsToRemove.isEmpty());

        return ProgressEvent.progress(request.getDesiredResourceState(), callbackContext)
                .then(progress -> {
                    // Skip the step if the core resource was not changed: tags-only change
                    if (!shouldUpdateCoreResource) {
                        return progress;
                    }
                    return proxy.initiate("rds::update-option-group", proxyClient, progress.getResourceModel(), progress.getCallbackContext())
                            .translateToServiceRequest(model -> Translator.modifyOptionGroupRequest(model, optionsToInclude, optionsToRemove))
                            .backoffDelay(config.getBackoff())
                            .makeServiceCall((modifyRequest, proxyInvocation) -> proxyInvocation.injectCredentialsAndInvokeV2(
                                    modifyRequest,
                                    proxyInvocation.client()::modifyOptionGroup
                            ))
                            .handleError((modifyRequest, exception, client, resourceModel, ctx) -> Commons.handleException(
                                    ProgressEvent.progress(resourceModel, ctx),
                                    exception,
                                    DEFAULT_OPTION_GROUP_ERROR_RULE_SET
                            ))
                            .progress();
                })
                .then(progress -> updateTags(proxy, proxyClient, progress, previousTags, desiredTags))
                .then(progress -> new ReadHandler().handleRequest(proxy, request, callbackContext, proxyClient, logger));
    }