/*
 * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with
 * the License. A copy of the License is located at
 * 
 * http://aws.amazon.com/apache2.0
 * 
 * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 * CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
 * and limitations under the License.
 */
package com.amazonaws.services.elasticache.model;

import java.io.Serializable;
import javax.annotation.Generated;

import com.amazonaws.AmazonWebServiceRequest;

/**
 * <p>
 * Represents the input for a <code>ModifyReplicationGroupShardConfiguration</code> operation.
 * </p>
 * 
 * @see <a href="http://docs.aws.amazon.com/goto/WebAPI/elasticache-2015-02-02/ModifyReplicationGroupShardConfiguration"
 *      target="_top">AWS API Documentation</a>
 */
@Generated("com.amazonaws:aws-java-sdk-code-generator")
public class ModifyReplicationGroupShardConfigurationRequest extends com.amazonaws.AmazonWebServiceRequest implements Serializable, Cloneable {

    /**
     * <p>
     * The name of the Redis (cluster mode enabled) cluster (replication group) on which the shards are to be
     * configured.
     * </p>
     */
    private String replicationGroupId;
    /**
     * <p>
     * The number of node groups (shards) that results from the modification of the shard configuration.
     * </p>
     */
    private Integer nodeGroupCount;
    /**
     * <p>
     * Indicates that the shard reconfiguration process begins immediately. At present, the only permitted value for
     * this parameter is <code>true</code>.
     * </p>
     * <p>
     * Value: true
     * </p>
     */
    private Boolean applyImmediately;
    /**
     * <p>
     * Specifies the preferred availability zones for each node group in the cluster. If the value of
     * <code>NodeGroupCount</code> is greater than the current number of node groups (shards), you can use this
     * parameter to specify the preferred availability zones of the cluster's shards. If you omit this parameter
     * ElastiCache selects availability zones for you.
     * </p>
     * <p>
     * You can specify this parameter only if the value of <code>NodeGroupCount</code> is greater than the current
     * number of node groups (shards).
     * </p>
     */
    private com.amazonaws.internal.SdkInternalList<ReshardingConfiguration> reshardingConfiguration;
    /**
     * <p>
     * If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then either
     * <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required. <code>NodeGroupsToRemove</code>
     * is a list of <code>NodeGroupId</code>s to remove from the cluster.
     * </p>
     * <p>
     * ElastiCache for Redis will attempt to remove all node groups listed by <code>NodeGroupsToRemove</code> from the
     * cluster.
     * </p>
     */
    private com.amazonaws.internal.SdkInternalList<String> nodeGroupsToRemove;
    /**
     * <p>
     * If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then either
     * <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required. <code>NodeGroupsToRetain</code>
     * is a list of <code>NodeGroupId</code>s to retain in the cluster.
     * </p>
     * <p>
     * ElastiCache for Redis will attempt to remove all node groups except those listed by
     * <code>NodeGroupsToRetain</code> from the cluster.
     * </p>
     */
    private com.amazonaws.internal.SdkInternalList<String> nodeGroupsToRetain;

    /**
     * <p>
     * The name of the Redis (cluster mode enabled) cluster (replication group) on which the shards are to be
     * configured.
     * </p>
     * 
     * @param replicationGroupId
     *        The name of the Redis (cluster mode enabled) cluster (replication group) on which the shards are to be
     *        configured.
     */

    public void setReplicationGroupId(String replicationGroupId) {
        this.replicationGroupId = replicationGroupId;
    }

    /**
     * <p>
     * The name of the Redis (cluster mode enabled) cluster (replication group) on which the shards are to be
     * configured.
     * </p>
     * 
     * @return The name of the Redis (cluster mode enabled) cluster (replication group) on which the shards are to be
     *         configured.
     */

    public String getReplicationGroupId() {
        return this.replicationGroupId;
    }

    /**
     * <p>
     * The name of the Redis (cluster mode enabled) cluster (replication group) on which the shards are to be
     * configured.
     * </p>
     * 
     * @param replicationGroupId
     *        The name of the Redis (cluster mode enabled) cluster (replication group) on which the shards are to be
     *        configured.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public ModifyReplicationGroupShardConfigurationRequest withReplicationGroupId(String replicationGroupId) {
        setReplicationGroupId(replicationGroupId);
        return this;
    }

    /**
     * <p>
     * The number of node groups (shards) that results from the modification of the shard configuration.
     * </p>
     * 
     * @param nodeGroupCount
     *        The number of node groups (shards) that results from the modification of the shard configuration.
     */

    public void setNodeGroupCount(Integer nodeGroupCount) {
        this.nodeGroupCount = nodeGroupCount;
    }

    /**
     * <p>
     * The number of node groups (shards) that results from the modification of the shard configuration.
     * </p>
     * 
     * @return The number of node groups (shards) that results from the modification of the shard configuration.
     */

    public Integer getNodeGroupCount() {
        return this.nodeGroupCount;
    }

    /**
     * <p>
     * The number of node groups (shards) that results from the modification of the shard configuration.
     * </p>
     * 
     * @param nodeGroupCount
     *        The number of node groups (shards) that results from the modification of the shard configuration.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public ModifyReplicationGroupShardConfigurationRequest withNodeGroupCount(Integer nodeGroupCount) {
        setNodeGroupCount(nodeGroupCount);
        return this;
    }

    /**
     * <p>
     * Indicates that the shard reconfiguration process begins immediately. At present, the only permitted value for
     * this parameter is <code>true</code>.
     * </p>
     * <p>
     * Value: true
     * </p>
     * 
     * @param applyImmediately
     *        Indicates that the shard reconfiguration process begins immediately. At present, the only permitted value
     *        for this parameter is <code>true</code>.</p>
     *        <p>
     *        Value: true
     */

    public void setApplyImmediately(Boolean applyImmediately) {
        this.applyImmediately = applyImmediately;
    }

    /**
     * <p>
     * Indicates that the shard reconfiguration process begins immediately. At present, the only permitted value for
     * this parameter is <code>true</code>.
     * </p>
     * <p>
     * Value: true
     * </p>
     * 
     * @return Indicates that the shard reconfiguration process begins immediately. At present, the only permitted value
     *         for this parameter is <code>true</code>.</p>
     *         <p>
     *         Value: true
     */

    public Boolean getApplyImmediately() {
        return this.applyImmediately;
    }

    /**
     * <p>
     * Indicates that the shard reconfiguration process begins immediately. At present, the only permitted value for
     * this parameter is <code>true</code>.
     * </p>
     * <p>
     * Value: true
     * </p>
     * 
     * @param applyImmediately
     *        Indicates that the shard reconfiguration process begins immediately. At present, the only permitted value
     *        for this parameter is <code>true</code>.</p>
     *        <p>
     *        Value: true
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public ModifyReplicationGroupShardConfigurationRequest withApplyImmediately(Boolean applyImmediately) {
        setApplyImmediately(applyImmediately);
        return this;
    }

    /**
     * <p>
     * Indicates that the shard reconfiguration process begins immediately. At present, the only permitted value for
     * this parameter is <code>true</code>.
     * </p>
     * <p>
     * Value: true
     * </p>
     * 
     * @return Indicates that the shard reconfiguration process begins immediately. At present, the only permitted value
     *         for this parameter is <code>true</code>.</p>
     *         <p>
     *         Value: true
     */

    public Boolean isApplyImmediately() {
        return this.applyImmediately;
    }

    /**
     * <p>
     * Specifies the preferred availability zones for each node group in the cluster. If the value of
     * <code>NodeGroupCount</code> is greater than the current number of node groups (shards), you can use this
     * parameter to specify the preferred availability zones of the cluster's shards. If you omit this parameter
     * ElastiCache selects availability zones for you.
     * </p>
     * <p>
     * You can specify this parameter only if the value of <code>NodeGroupCount</code> is greater than the current
     * number of node groups (shards).
     * </p>
     * 
     * @return Specifies the preferred availability zones for each node group in the cluster. If the value of
     *         <code>NodeGroupCount</code> is greater than the current number of node groups (shards), you can use this
     *         parameter to specify the preferred availability zones of the cluster's shards. If you omit this parameter
     *         ElastiCache selects availability zones for you.</p>
     *         <p>
     *         You can specify this parameter only if the value of <code>NodeGroupCount</code> is greater than the
     *         current number of node groups (shards).
     */

    public java.util.List<ReshardingConfiguration> getReshardingConfiguration() {
        if (reshardingConfiguration == null) {
            reshardingConfiguration = new com.amazonaws.internal.SdkInternalList<ReshardingConfiguration>();
        }
        return reshardingConfiguration;
    }

    /**
     * <p>
     * Specifies the preferred availability zones for each node group in the cluster. If the value of
     * <code>NodeGroupCount</code> is greater than the current number of node groups (shards), you can use this
     * parameter to specify the preferred availability zones of the cluster's shards. If you omit this parameter
     * ElastiCache selects availability zones for you.
     * </p>
     * <p>
     * You can specify this parameter only if the value of <code>NodeGroupCount</code> is greater than the current
     * number of node groups (shards).
     * </p>
     * 
     * @param reshardingConfiguration
     *        Specifies the preferred availability zones for each node group in the cluster. If the value of
     *        <code>NodeGroupCount</code> is greater than the current number of node groups (shards), you can use this
     *        parameter to specify the preferred availability zones of the cluster's shards. If you omit this parameter
     *        ElastiCache selects availability zones for you.</p>
     *        <p>
     *        You can specify this parameter only if the value of <code>NodeGroupCount</code> is greater than the
     *        current number of node groups (shards).
     */

    public void setReshardingConfiguration(java.util.Collection<ReshardingConfiguration> reshardingConfiguration) {
        if (reshardingConfiguration == null) {
            this.reshardingConfiguration = null;
            return;
        }

        this.reshardingConfiguration = new com.amazonaws.internal.SdkInternalList<ReshardingConfiguration>(reshardingConfiguration);
    }

    /**
     * <p>
     * Specifies the preferred availability zones for each node group in the cluster. If the value of
     * <code>NodeGroupCount</code> is greater than the current number of node groups (shards), you can use this
     * parameter to specify the preferred availability zones of the cluster's shards. If you omit this parameter
     * ElastiCache selects availability zones for you.
     * </p>
     * <p>
     * You can specify this parameter only if the value of <code>NodeGroupCount</code> is greater than the current
     * number of node groups (shards).
     * </p>
     * <p>
     * <b>NOTE:</b> This method appends the values to the existing list (if any). Use
     * {@link #setReshardingConfiguration(java.util.Collection)} or
     * {@link #withReshardingConfiguration(java.util.Collection)} if you want to override the existing values.
     * </p>
     * 
     * @param reshardingConfiguration
     *        Specifies the preferred availability zones for each node group in the cluster. If the value of
     *        <code>NodeGroupCount</code> is greater than the current number of node groups (shards), you can use this
     *        parameter to specify the preferred availability zones of the cluster's shards. If you omit this parameter
     *        ElastiCache selects availability zones for you.</p>
     *        <p>
     *        You can specify this parameter only if the value of <code>NodeGroupCount</code> is greater than the
     *        current number of node groups (shards).
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public ModifyReplicationGroupShardConfigurationRequest withReshardingConfiguration(ReshardingConfiguration... reshardingConfiguration) {
        if (this.reshardingConfiguration == null) {
            setReshardingConfiguration(new com.amazonaws.internal.SdkInternalList<ReshardingConfiguration>(reshardingConfiguration.length));
        }
        for (ReshardingConfiguration ele : reshardingConfiguration) {
            this.reshardingConfiguration.add(ele);
        }
        return this;
    }

    /**
     * <p>
     * Specifies the preferred availability zones for each node group in the cluster. If the value of
     * <code>NodeGroupCount</code> is greater than the current number of node groups (shards), you can use this
     * parameter to specify the preferred availability zones of the cluster's shards. If you omit this parameter
     * ElastiCache selects availability zones for you.
     * </p>
     * <p>
     * You can specify this parameter only if the value of <code>NodeGroupCount</code> is greater than the current
     * number of node groups (shards).
     * </p>
     * 
     * @param reshardingConfiguration
     *        Specifies the preferred availability zones for each node group in the cluster. If the value of
     *        <code>NodeGroupCount</code> is greater than the current number of node groups (shards), you can use this
     *        parameter to specify the preferred availability zones of the cluster's shards. If you omit this parameter
     *        ElastiCache selects availability zones for you.</p>
     *        <p>
     *        You can specify this parameter only if the value of <code>NodeGroupCount</code> is greater than the
     *        current number of node groups (shards).
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public ModifyReplicationGroupShardConfigurationRequest withReshardingConfiguration(java.util.Collection<ReshardingConfiguration> reshardingConfiguration) {
        setReshardingConfiguration(reshardingConfiguration);
        return this;
    }

    /**
     * <p>
     * If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then either
     * <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required. <code>NodeGroupsToRemove</code>
     * is a list of <code>NodeGroupId</code>s to remove from the cluster.
     * </p>
     * <p>
     * ElastiCache for Redis will attempt to remove all node groups listed by <code>NodeGroupsToRemove</code> from the
     * cluster.
     * </p>
     * 
     * @return If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then
     *         either <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required.
     *         <code>NodeGroupsToRemove</code> is a list of <code>NodeGroupId</code>s to remove from the cluster.</p>
     *         <p>
     *         ElastiCache for Redis will attempt to remove all node groups listed by <code>NodeGroupsToRemove</code>
     *         from the cluster.
     */

    public java.util.List<String> getNodeGroupsToRemove() {
        if (nodeGroupsToRemove == null) {
            nodeGroupsToRemove = new com.amazonaws.internal.SdkInternalList<String>();
        }
        return nodeGroupsToRemove;
    }

    /**
     * <p>
     * If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then either
     * <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required. <code>NodeGroupsToRemove</code>
     * is a list of <code>NodeGroupId</code>s to remove from the cluster.
     * </p>
     * <p>
     * ElastiCache for Redis will attempt to remove all node groups listed by <code>NodeGroupsToRemove</code> from the
     * cluster.
     * </p>
     * 
     * @param nodeGroupsToRemove
     *        If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then
     *        either <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required.
     *        <code>NodeGroupsToRemove</code> is a list of <code>NodeGroupId</code>s to remove from the cluster.</p>
     *        <p>
     *        ElastiCache for Redis will attempt to remove all node groups listed by <code>NodeGroupsToRemove</code>
     *        from the cluster.
     */

    public void setNodeGroupsToRemove(java.util.Collection<String> nodeGroupsToRemove) {
        if (nodeGroupsToRemove == null) {
            this.nodeGroupsToRemove = null;
            return;
        }

        this.nodeGroupsToRemove = new com.amazonaws.internal.SdkInternalList<String>(nodeGroupsToRemove);
    }

    /**
     * <p>
     * If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then either
     * <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required. <code>NodeGroupsToRemove</code>
     * is a list of <code>NodeGroupId</code>s to remove from the cluster.
     * </p>
     * <p>
     * ElastiCache for Redis will attempt to remove all node groups listed by <code>NodeGroupsToRemove</code> from the
     * cluster.
     * </p>
     * <p>
     * <b>NOTE:</b> This method appends the values to the existing list (if any). Use
     * {@link #setNodeGroupsToRemove(java.util.Collection)} or {@link #withNodeGroupsToRemove(java.util.Collection)} if
     * you want to override the existing values.
     * </p>
     * 
     * @param nodeGroupsToRemove
     *        If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then
     *        either <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required.
     *        <code>NodeGroupsToRemove</code> is a list of <code>NodeGroupId</code>s to remove from the cluster.</p>
     *        <p>
     *        ElastiCache for Redis will attempt to remove all node groups listed by <code>NodeGroupsToRemove</code>
     *        from the cluster.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public ModifyReplicationGroupShardConfigurationRequest withNodeGroupsToRemove(String... nodeGroupsToRemove) {
        if (this.nodeGroupsToRemove == null) {
            setNodeGroupsToRemove(new com.amazonaws.internal.SdkInternalList<String>(nodeGroupsToRemove.length));
        }
        for (String ele : nodeGroupsToRemove) {
            this.nodeGroupsToRemove.add(ele);
        }
        return this;
    }

    /**
     * <p>
     * If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then either
     * <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required. <code>NodeGroupsToRemove</code>
     * is a list of <code>NodeGroupId</code>s to remove from the cluster.
     * </p>
     * <p>
     * ElastiCache for Redis will attempt to remove all node groups listed by <code>NodeGroupsToRemove</code> from the
     * cluster.
     * </p>
     * 
     * @param nodeGroupsToRemove
     *        If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then
     *        either <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required.
     *        <code>NodeGroupsToRemove</code> is a list of <code>NodeGroupId</code>s to remove from the cluster.</p>
     *        <p>
     *        ElastiCache for Redis will attempt to remove all node groups listed by <code>NodeGroupsToRemove</code>
     *        from the cluster.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public ModifyReplicationGroupShardConfigurationRequest withNodeGroupsToRemove(java.util.Collection<String> nodeGroupsToRemove) {
        setNodeGroupsToRemove(nodeGroupsToRemove);
        return this;
    }

    /**
     * <p>
     * If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then either
     * <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required. <code>NodeGroupsToRetain</code>
     * is a list of <code>NodeGroupId</code>s to retain in the cluster.
     * </p>
     * <p>
     * ElastiCache for Redis will attempt to remove all node groups except those listed by
     * <code>NodeGroupsToRetain</code> from the cluster.
     * </p>
     * 
     * @return If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then
     *         either <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required.
     *         <code>NodeGroupsToRetain</code> is a list of <code>NodeGroupId</code>s to retain in the cluster.</p>
     *         <p>
     *         ElastiCache for Redis will attempt to remove all node groups except those listed by
     *         <code>NodeGroupsToRetain</code> from the cluster.
     */

    public java.util.List<String> getNodeGroupsToRetain() {
        if (nodeGroupsToRetain == null) {
            nodeGroupsToRetain = new com.amazonaws.internal.SdkInternalList<String>();
        }
        return nodeGroupsToRetain;
    }

    /**
     * <p>
     * If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then either
     * <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required. <code>NodeGroupsToRetain</code>
     * is a list of <code>NodeGroupId</code>s to retain in the cluster.
     * </p>
     * <p>
     * ElastiCache for Redis will attempt to remove all node groups except those listed by
     * <code>NodeGroupsToRetain</code> from the cluster.
     * </p>
     * 
     * @param nodeGroupsToRetain
     *        If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then
     *        either <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required.
     *        <code>NodeGroupsToRetain</code> is a list of <code>NodeGroupId</code>s to retain in the cluster.</p>
     *        <p>
     *        ElastiCache for Redis will attempt to remove all node groups except those listed by
     *        <code>NodeGroupsToRetain</code> from the cluster.
     */

    public void setNodeGroupsToRetain(java.util.Collection<String> nodeGroupsToRetain) {
        if (nodeGroupsToRetain == null) {
            this.nodeGroupsToRetain = null;
            return;
        }

        this.nodeGroupsToRetain = new com.amazonaws.internal.SdkInternalList<String>(nodeGroupsToRetain);
    }

    /**
     * <p>
     * If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then either
     * <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required. <code>NodeGroupsToRetain</code>
     * is a list of <code>NodeGroupId</code>s to retain in the cluster.
     * </p>
     * <p>
     * ElastiCache for Redis will attempt to remove all node groups except those listed by
     * <code>NodeGroupsToRetain</code> from the cluster.
     * </p>
     * <p>
     * <b>NOTE:</b> This method appends the values to the existing list (if any). Use
     * {@link #setNodeGroupsToRetain(java.util.Collection)} or {@link #withNodeGroupsToRetain(java.util.Collection)} if
     * you want to override the existing values.
     * </p>
     * 
     * @param nodeGroupsToRetain
     *        If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then
     *        either <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required.
     *        <code>NodeGroupsToRetain</code> is a list of <code>NodeGroupId</code>s to retain in the cluster.</p>
     *        <p>
     *        ElastiCache for Redis will attempt to remove all node groups except those listed by
     *        <code>NodeGroupsToRetain</code> from the cluster.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public ModifyReplicationGroupShardConfigurationRequest withNodeGroupsToRetain(String... nodeGroupsToRetain) {
        if (this.nodeGroupsToRetain == null) {
            setNodeGroupsToRetain(new com.amazonaws.internal.SdkInternalList<String>(nodeGroupsToRetain.length));
        }
        for (String ele : nodeGroupsToRetain) {
            this.nodeGroupsToRetain.add(ele);
        }
        return this;
    }

    /**
     * <p>
     * If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then either
     * <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required. <code>NodeGroupsToRetain</code>
     * is a list of <code>NodeGroupId</code>s to retain in the cluster.
     * </p>
     * <p>
     * ElastiCache for Redis will attempt to remove all node groups except those listed by
     * <code>NodeGroupsToRetain</code> from the cluster.
     * </p>
     * 
     * @param nodeGroupsToRetain
     *        If the value of <code>NodeGroupCount</code> is less than the current number of node groups (shards), then
     *        either <code>NodeGroupsToRemove</code> or <code>NodeGroupsToRetain</code> is required.
     *        <code>NodeGroupsToRetain</code> is a list of <code>NodeGroupId</code>s to retain in the cluster.</p>
     *        <p>
     *        ElastiCache for Redis will attempt to remove all node groups except those listed by
     *        <code>NodeGroupsToRetain</code> from the cluster.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public ModifyReplicationGroupShardConfigurationRequest withNodeGroupsToRetain(java.util.Collection<String> nodeGroupsToRetain) {
        setNodeGroupsToRetain(nodeGroupsToRetain);
        return this;
    }

    /**
     * Returns a string representation of this object. This is useful for testing and debugging. Sensitive data will be
     * redacted from this string using a placeholder value.
     *
     * @return A string representation of this object.
     *
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("{");
        if (getReplicationGroupId() != null)
            sb.append("ReplicationGroupId: ").append(getReplicationGroupId()).append(",");
        if (getNodeGroupCount() != null)
            sb.append("NodeGroupCount: ").append(getNodeGroupCount()).append(",");
        if (getApplyImmediately() != null)
            sb.append("ApplyImmediately: ").append(getApplyImmediately()).append(",");
        if (getReshardingConfiguration() != null)
            sb.append("ReshardingConfiguration: ").append(getReshardingConfiguration()).append(",");
        if (getNodeGroupsToRemove() != null)
            sb.append("NodeGroupsToRemove: ").append(getNodeGroupsToRemove()).append(",");
        if (getNodeGroupsToRetain() != null)
            sb.append("NodeGroupsToRetain: ").append(getNodeGroupsToRetain());
        sb.append("}");
        return sb.toString();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;

        if (obj instanceof ModifyReplicationGroupShardConfigurationRequest == false)
            return false;
        ModifyReplicationGroupShardConfigurationRequest other = (ModifyReplicationGroupShardConfigurationRequest) obj;
        if (other.getReplicationGroupId() == null ^ this.getReplicationGroupId() == null)
            return false;
        if (other.getReplicationGroupId() != null && other.getReplicationGroupId().equals(this.getReplicationGroupId()) == false)
            return false;
        if (other.getNodeGroupCount() == null ^ this.getNodeGroupCount() == null)
            return false;
        if (other.getNodeGroupCount() != null && other.getNodeGroupCount().equals(this.getNodeGroupCount()) == false)
            return false;
        if (other.getApplyImmediately() == null ^ this.getApplyImmediately() == null)
            return false;
        if (other.getApplyImmediately() != null && other.getApplyImmediately().equals(this.getApplyImmediately()) == false)
            return false;
        if (other.getReshardingConfiguration() == null ^ this.getReshardingConfiguration() == null)
            return false;
        if (other.getReshardingConfiguration() != null && other.getReshardingConfiguration().equals(this.getReshardingConfiguration()) == false)
            return false;
        if (other.getNodeGroupsToRemove() == null ^ this.getNodeGroupsToRemove() == null)
            return false;
        if (other.getNodeGroupsToRemove() != null && other.getNodeGroupsToRemove().equals(this.getNodeGroupsToRemove()) == false)
            return false;
        if (other.getNodeGroupsToRetain() == null ^ this.getNodeGroupsToRetain() == null)
            return false;
        if (other.getNodeGroupsToRetain() != null && other.getNodeGroupsToRetain().equals(this.getNodeGroupsToRetain()) == false)
            return false;
        return true;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int hashCode = 1;

        hashCode = prime * hashCode + ((getReplicationGroupId() == null) ? 0 : getReplicationGroupId().hashCode());
        hashCode = prime * hashCode + ((getNodeGroupCount() == null) ? 0 : getNodeGroupCount().hashCode());
        hashCode = prime * hashCode + ((getApplyImmediately() == null) ? 0 : getApplyImmediately().hashCode());
        hashCode = prime * hashCode + ((getReshardingConfiguration() == null) ? 0 : getReshardingConfiguration().hashCode());
        hashCode = prime * hashCode + ((getNodeGroupsToRemove() == null) ? 0 : getNodeGroupsToRemove().hashCode());
        hashCode = prime * hashCode + ((getNodeGroupsToRetain() == null) ? 0 : getNodeGroupsToRetain().hashCode());
        return hashCode;
    }

    @Override
    public ModifyReplicationGroupShardConfigurationRequest clone() {
        return (ModifyReplicationGroupShardConfigurationRequest) super.clone();
    }

}