/*
 * 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.datasync.model;

import java.io.Serializable;
import javax.annotation.Generated;
import com.amazonaws.protocol.StructuredPojo;
import com.amazonaws.protocol.ProtocolMarshaller;

/**
 * <p>
 * Specifies the Server Message Block (SMB) protocol configuration that DataSync uses to access your Amazon FSx for
 * NetApp ONTAP file system. For more information, see <a href=
 * "https://docs.aws.amazon.com/datasync/latest/userguide/create-ontap-location.html#create-ontap-location-access"
 * >Accessing FSx for ONTAP file systems</a>.
 * </p>
 * 
 * @see <a href="http://docs.aws.amazon.com/goto/WebAPI/datasync-2018-11-09/FsxProtocolSmb" target="_top">AWS API
 *      Documentation</a>
 */
@Generated("com.amazonaws:aws-java-sdk-code-generator")
public class FsxProtocolSmb implements Serializable, Cloneable, StructuredPojo {

    /**
     * <p>
     * Specifies the fully qualified domain name (FQDN) of the Microsoft Active Directory that your storage virtual
     * machine (SVM) belongs to.
     * </p>
     */
    private String domain;

    private SmbMountOptions mountOptions;
    /**
     * <p>
     * Specifies the password of a user who has permission to access your SVM.
     * </p>
     */
    private String password;
    /**
     * <p>
     * Specifies a user name that can mount the location and access the files, folders, and metadata that you need in
     * the SVM.
     * </p>
     * <p>
     * If you provide a user in your Active Directory, note the following:
     * </p>
     * <ul>
     * <li>
     * <p>
     * If you're using Directory Service for Microsoft Active Directory, the user must be a member of the Amazon Web
     * Services Delegated FSx Administrators group.
     * </p>
     * </li>
     * <li>
     * <p>
     * If you're using a self-managed Active Directory, the user must be a member of either the Domain Admins group or a
     * custom group that you specified for file system administration when you created your file system.
     * </p>
     * </li>
     * </ul>
     * <p>
     * Make sure that the user has the permissions it needs to copy the data you want:
     * </p>
     * <ul>
     * <li>
     * <p>
     * <code>SE_TCB_NAME</code>: Required to set object ownership and file metadata. With this privilege, you also can
     * copy NTFS discretionary access lists (DACLs).
     * </p>
     * </li>
     * <li>
     * <p>
     * <code>SE_SECURITY_NAME</code>: May be needed to copy NTFS system access control lists (SACLs). This operation
     * specifically requires the Windows privilege, which is granted to members of the Domain Admins group. If you
     * configure your task to copy SACLs, make sure that the user has the required privileges. For information about
     * copying SACLs, see <a href=
     * "https://docs.aws.amazon.com/datasync/latest/userguide/create-task.html#configure-ownership-and-permissions"
     * >Ownership and permissions-related options</a>.
     * </p>
     * </li>
     * </ul>
     */
    private String user;

    /**
     * <p>
     * Specifies the fully qualified domain name (FQDN) of the Microsoft Active Directory that your storage virtual
     * machine (SVM) belongs to.
     * </p>
     * 
     * @param domain
     *        Specifies the fully qualified domain name (FQDN) of the Microsoft Active Directory that your storage
     *        virtual machine (SVM) belongs to.
     */

    public void setDomain(String domain) {
        this.domain = domain;
    }

    /**
     * <p>
     * Specifies the fully qualified domain name (FQDN) of the Microsoft Active Directory that your storage virtual
     * machine (SVM) belongs to.
     * </p>
     * 
     * @return Specifies the fully qualified domain name (FQDN) of the Microsoft Active Directory that your storage
     *         virtual machine (SVM) belongs to.
     */

    public String getDomain() {
        return this.domain;
    }

    /**
     * <p>
     * Specifies the fully qualified domain name (FQDN) of the Microsoft Active Directory that your storage virtual
     * machine (SVM) belongs to.
     * </p>
     * 
     * @param domain
     *        Specifies the fully qualified domain name (FQDN) of the Microsoft Active Directory that your storage
     *        virtual machine (SVM) belongs to.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public FsxProtocolSmb withDomain(String domain) {
        setDomain(domain);
        return this;
    }

    /**
     * @param mountOptions
     */

    public void setMountOptions(SmbMountOptions mountOptions) {
        this.mountOptions = mountOptions;
    }

    /**
     * @return
     */

    public SmbMountOptions getMountOptions() {
        return this.mountOptions;
    }

    /**
     * @param mountOptions
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public FsxProtocolSmb withMountOptions(SmbMountOptions mountOptions) {
        setMountOptions(mountOptions);
        return this;
    }

    /**
     * <p>
     * Specifies the password of a user who has permission to access your SVM.
     * </p>
     * 
     * @param password
     *        Specifies the password of a user who has permission to access your SVM.
     */

    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * <p>
     * Specifies the password of a user who has permission to access your SVM.
     * </p>
     * 
     * @return Specifies the password of a user who has permission to access your SVM.
     */

    public String getPassword() {
        return this.password;
    }

    /**
     * <p>
     * Specifies the password of a user who has permission to access your SVM.
     * </p>
     * 
     * @param password
     *        Specifies the password of a user who has permission to access your SVM.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public FsxProtocolSmb withPassword(String password) {
        setPassword(password);
        return this;
    }

    /**
     * <p>
     * Specifies a user name that can mount the location and access the files, folders, and metadata that you need in
     * the SVM.
     * </p>
     * <p>
     * If you provide a user in your Active Directory, note the following:
     * </p>
     * <ul>
     * <li>
     * <p>
     * If you're using Directory Service for Microsoft Active Directory, the user must be a member of the Amazon Web
     * Services Delegated FSx Administrators group.
     * </p>
     * </li>
     * <li>
     * <p>
     * If you're using a self-managed Active Directory, the user must be a member of either the Domain Admins group or a
     * custom group that you specified for file system administration when you created your file system.
     * </p>
     * </li>
     * </ul>
     * <p>
     * Make sure that the user has the permissions it needs to copy the data you want:
     * </p>
     * <ul>
     * <li>
     * <p>
     * <code>SE_TCB_NAME</code>: Required to set object ownership and file metadata. With this privilege, you also can
     * copy NTFS discretionary access lists (DACLs).
     * </p>
     * </li>
     * <li>
     * <p>
     * <code>SE_SECURITY_NAME</code>: May be needed to copy NTFS system access control lists (SACLs). This operation
     * specifically requires the Windows privilege, which is granted to members of the Domain Admins group. If you
     * configure your task to copy SACLs, make sure that the user has the required privileges. For information about
     * copying SACLs, see <a href=
     * "https://docs.aws.amazon.com/datasync/latest/userguide/create-task.html#configure-ownership-and-permissions"
     * >Ownership and permissions-related options</a>.
     * </p>
     * </li>
     * </ul>
     * 
     * @param user
     *        Specifies a user name that can mount the location and access the files, folders, and metadata that you
     *        need in the SVM.</p>
     *        <p>
     *        If you provide a user in your Active Directory, note the following:
     *        </p>
     *        <ul>
     *        <li>
     *        <p>
     *        If you're using Directory Service for Microsoft Active Directory, the user must be a member of the Amazon
     *        Web Services Delegated FSx Administrators group.
     *        </p>
     *        </li>
     *        <li>
     *        <p>
     *        If you're using a self-managed Active Directory, the user must be a member of either the Domain Admins
     *        group or a custom group that you specified for file system administration when you created your file
     *        system.
     *        </p>
     *        </li>
     *        </ul>
     *        <p>
     *        Make sure that the user has the permissions it needs to copy the data you want:
     *        </p>
     *        <ul>
     *        <li>
     *        <p>
     *        <code>SE_TCB_NAME</code>: Required to set object ownership and file metadata. With this privilege, you
     *        also can copy NTFS discretionary access lists (DACLs).
     *        </p>
     *        </li>
     *        <li>
     *        <p>
     *        <code>SE_SECURITY_NAME</code>: May be needed to copy NTFS system access control lists (SACLs). This
     *        operation specifically requires the Windows privilege, which is granted to members of the Domain Admins
     *        group. If you configure your task to copy SACLs, make sure that the user has the required privileges. For
     *        information about copying SACLs, see <a href=
     *        "https://docs.aws.amazon.com/datasync/latest/userguide/create-task.html#configure-ownership-and-permissions"
     *        >Ownership and permissions-related options</a>.
     *        </p>
     *        </li>
     */

    public void setUser(String user) {
        this.user = user;
    }

    /**
     * <p>
     * Specifies a user name that can mount the location and access the files, folders, and metadata that you need in
     * the SVM.
     * </p>
     * <p>
     * If you provide a user in your Active Directory, note the following:
     * </p>
     * <ul>
     * <li>
     * <p>
     * If you're using Directory Service for Microsoft Active Directory, the user must be a member of the Amazon Web
     * Services Delegated FSx Administrators group.
     * </p>
     * </li>
     * <li>
     * <p>
     * If you're using a self-managed Active Directory, the user must be a member of either the Domain Admins group or a
     * custom group that you specified for file system administration when you created your file system.
     * </p>
     * </li>
     * </ul>
     * <p>
     * Make sure that the user has the permissions it needs to copy the data you want:
     * </p>
     * <ul>
     * <li>
     * <p>
     * <code>SE_TCB_NAME</code>: Required to set object ownership and file metadata. With this privilege, you also can
     * copy NTFS discretionary access lists (DACLs).
     * </p>
     * </li>
     * <li>
     * <p>
     * <code>SE_SECURITY_NAME</code>: May be needed to copy NTFS system access control lists (SACLs). This operation
     * specifically requires the Windows privilege, which is granted to members of the Domain Admins group. If you
     * configure your task to copy SACLs, make sure that the user has the required privileges. For information about
     * copying SACLs, see <a href=
     * "https://docs.aws.amazon.com/datasync/latest/userguide/create-task.html#configure-ownership-and-permissions"
     * >Ownership and permissions-related options</a>.
     * </p>
     * </li>
     * </ul>
     * 
     * @return Specifies a user name that can mount the location and access the files, folders, and metadata that you
     *         need in the SVM.</p>
     *         <p>
     *         If you provide a user in your Active Directory, note the following:
     *         </p>
     *         <ul>
     *         <li>
     *         <p>
     *         If you're using Directory Service for Microsoft Active Directory, the user must be a member of the Amazon
     *         Web Services Delegated FSx Administrators group.
     *         </p>
     *         </li>
     *         <li>
     *         <p>
     *         If you're using a self-managed Active Directory, the user must be a member of either the Domain Admins
     *         group or a custom group that you specified for file system administration when you created your file
     *         system.
     *         </p>
     *         </li>
     *         </ul>
     *         <p>
     *         Make sure that the user has the permissions it needs to copy the data you want:
     *         </p>
     *         <ul>
     *         <li>
     *         <p>
     *         <code>SE_TCB_NAME</code>: Required to set object ownership and file metadata. With this privilege, you
     *         also can copy NTFS discretionary access lists (DACLs).
     *         </p>
     *         </li>
     *         <li>
     *         <p>
     *         <code>SE_SECURITY_NAME</code>: May be needed to copy NTFS system access control lists (SACLs). This
     *         operation specifically requires the Windows privilege, which is granted to members of the Domain Admins
     *         group. If you configure your task to copy SACLs, make sure that the user has the required privileges. For
     *         information about copying SACLs, see <a href=
     *         "https://docs.aws.amazon.com/datasync/latest/userguide/create-task.html#configure-ownership-and-permissions"
     *         >Ownership and permissions-related options</a>.
     *         </p>
     *         </li>
     */

    public String getUser() {
        return this.user;
    }

    /**
     * <p>
     * Specifies a user name that can mount the location and access the files, folders, and metadata that you need in
     * the SVM.
     * </p>
     * <p>
     * If you provide a user in your Active Directory, note the following:
     * </p>
     * <ul>
     * <li>
     * <p>
     * If you're using Directory Service for Microsoft Active Directory, the user must be a member of the Amazon Web
     * Services Delegated FSx Administrators group.
     * </p>
     * </li>
     * <li>
     * <p>
     * If you're using a self-managed Active Directory, the user must be a member of either the Domain Admins group or a
     * custom group that you specified for file system administration when you created your file system.
     * </p>
     * </li>
     * </ul>
     * <p>
     * Make sure that the user has the permissions it needs to copy the data you want:
     * </p>
     * <ul>
     * <li>
     * <p>
     * <code>SE_TCB_NAME</code>: Required to set object ownership and file metadata. With this privilege, you also can
     * copy NTFS discretionary access lists (DACLs).
     * </p>
     * </li>
     * <li>
     * <p>
     * <code>SE_SECURITY_NAME</code>: May be needed to copy NTFS system access control lists (SACLs). This operation
     * specifically requires the Windows privilege, which is granted to members of the Domain Admins group. If you
     * configure your task to copy SACLs, make sure that the user has the required privileges. For information about
     * copying SACLs, see <a href=
     * "https://docs.aws.amazon.com/datasync/latest/userguide/create-task.html#configure-ownership-and-permissions"
     * >Ownership and permissions-related options</a>.
     * </p>
     * </li>
     * </ul>
     * 
     * @param user
     *        Specifies a user name that can mount the location and access the files, folders, and metadata that you
     *        need in the SVM.</p>
     *        <p>
     *        If you provide a user in your Active Directory, note the following:
     *        </p>
     *        <ul>
     *        <li>
     *        <p>
     *        If you're using Directory Service for Microsoft Active Directory, the user must be a member of the Amazon
     *        Web Services Delegated FSx Administrators group.
     *        </p>
     *        </li>
     *        <li>
     *        <p>
     *        If you're using a self-managed Active Directory, the user must be a member of either the Domain Admins
     *        group or a custom group that you specified for file system administration when you created your file
     *        system.
     *        </p>
     *        </li>
     *        </ul>
     *        <p>
     *        Make sure that the user has the permissions it needs to copy the data you want:
     *        </p>
     *        <ul>
     *        <li>
     *        <p>
     *        <code>SE_TCB_NAME</code>: Required to set object ownership and file metadata. With this privilege, you
     *        also can copy NTFS discretionary access lists (DACLs).
     *        </p>
     *        </li>
     *        <li>
     *        <p>
     *        <code>SE_SECURITY_NAME</code>: May be needed to copy NTFS system access control lists (SACLs). This
     *        operation specifically requires the Windows privilege, which is granted to members of the Domain Admins
     *        group. If you configure your task to copy SACLs, make sure that the user has the required privileges. For
     *        information about copying SACLs, see <a href=
     *        "https://docs.aws.amazon.com/datasync/latest/userguide/create-task.html#configure-ownership-and-permissions"
     *        >Ownership and permissions-related options</a>.
     *        </p>
     *        </li>
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public FsxProtocolSmb withUser(String user) {
        setUser(user);
        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 (getDomain() != null)
            sb.append("Domain: ").append(getDomain()).append(",");
        if (getMountOptions() != null)
            sb.append("MountOptions: ").append(getMountOptions()).append(",");
        if (getPassword() != null)
            sb.append("Password: ").append("***Sensitive Data Redacted***").append(",");
        if (getUser() != null)
            sb.append("User: ").append(getUser());
        sb.append("}");
        return sb.toString();
    }

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

        if (obj instanceof FsxProtocolSmb == false)
            return false;
        FsxProtocolSmb other = (FsxProtocolSmb) obj;
        if (other.getDomain() == null ^ this.getDomain() == null)
            return false;
        if (other.getDomain() != null && other.getDomain().equals(this.getDomain()) == false)
            return false;
        if (other.getMountOptions() == null ^ this.getMountOptions() == null)
            return false;
        if (other.getMountOptions() != null && other.getMountOptions().equals(this.getMountOptions()) == false)
            return false;
        if (other.getPassword() == null ^ this.getPassword() == null)
            return false;
        if (other.getPassword() != null && other.getPassword().equals(this.getPassword()) == false)
            return false;
        if (other.getUser() == null ^ this.getUser() == null)
            return false;
        if (other.getUser() != null && other.getUser().equals(this.getUser()) == false)
            return false;
        return true;
    }

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

        hashCode = prime * hashCode + ((getDomain() == null) ? 0 : getDomain().hashCode());
        hashCode = prime * hashCode + ((getMountOptions() == null) ? 0 : getMountOptions().hashCode());
        hashCode = prime * hashCode + ((getPassword() == null) ? 0 : getPassword().hashCode());
        hashCode = prime * hashCode + ((getUser() == null) ? 0 : getUser().hashCode());
        return hashCode;
    }

    @Override
    public FsxProtocolSmb clone() {
        try {
            return (FsxProtocolSmb) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new IllegalStateException("Got a CloneNotSupportedException from Object.clone() " + "even though we're Cloneable!", e);
        }
    }

    @com.amazonaws.annotation.SdkInternalApi
    @Override
    public void marshall(ProtocolMarshaller protocolMarshaller) {
        com.amazonaws.services.datasync.model.transform.FsxProtocolSmbMarshaller.getInstance().marshall(this, protocolMarshaller);
    }
}