private void reportDeleteErrors(CifsShareACLUpdateParams param) {

    String opName = ShareACLOperationType.DELETE.name();
    // Report Add ACL Errors
    ShareACLs shareAcls = param.getAclsToDelete();
    if (shareAcls == null || shareAcls.getShareACLs().size() == 0) return;

    List<ShareACL> shareAclList = shareAcls.getShareACLs();
    for (ShareACL acl : shareAclList) {
      if (!acl.canProceedToNextStep()) {
        ShareACLOperationErrorType error = acl.getErrorType();

        switch (error) {

            /*
             * case SNAPSHOT_EXPORT_SHOULD_BE_READ_ONLY: { throw
             * APIException.badRequests.snapshotExportPermissionReadOnly();
             * }
             */

          case USER_AND_GROUP_PROVIDED:
            {
              throw APIException.badRequests.bothUserAndGroupInACLFound(
                  acl.getUser(), acl.getGroup());
            }

          case USER_OR_GROUP_NOT_PROVIDED:
            {
              throw APIException.badRequests.missingUserOrGroupInACE(opName);
            }

          case MULTIPLE_ACES_WITH_SAME_USER_OR_GROUP:
            {
              String userOrGroup = acl.getUser() == null ? acl.getGroup() : acl.getUser();

              throw APIException.badRequests.multipleACLsWithUserOrGroupFound(opName, userOrGroup);
            }

          case MULTIPLE_DOMAINS_FOUND:
            {
              String domain1 = acl.getDomain();
              String userOrGroup = acl.getUser() == null ? acl.getGroup() : acl.getUser();
              String domain2 = userOrGroup.substring(0, userOrGroup.indexOf("\\"));
              throw APIException.badRequests.multipleDomainsFound(opName, domain1, domain2);
            }

          case ACL_NOT_FOUND:
            {
              throw APIException.badRequests.shareACLNotFoundFound(opName, acl.toString());
            }

          default:
            break;
        }
      }
    }
  }
  public void verifyShareACLs(CifsShareACLUpdateParams param) {

    ShareACLs shareAcls = null;

    // Add Payload
    shareAcls = param.getAclsToAdd();
    validateShareACLs(shareAcls, ShareACLOperationType.ADD);
    reportErrors(param, ShareACLOperationType.ADD);

    // Modify Payload
    shareAcls = param.getAclsToModify();
    validateShareACLs(shareAcls, ShareACLOperationType.MODIFY);
    reportErrors(param, ShareACLOperationType.MODIFY);

    // Delete Payload
    shareAcls = param.getAclsToDelete();
    validateShareACLs(shareAcls, ShareACLOperationType.DELETE);
    reportErrors(param, ShareACLOperationType.DELETE);
  }
  public void setAllShareAcls(CifsShareACLUpdateParams param) {

    cifsShareACLUpdateParams = param;

    if (param.getAclsToAdd() != null && param.getAclsToAdd().getShareACLs() != null) {
      this.shareAclsToAdd = param.getAclsToAdd().getShareACLs();
    }

    if (param.getAclsToModify() != null && param.getAclsToModify().getShareACLs() != null) {
      this.shareAclsToModify = param.getAclsToModify().getShareACLs();
    }

    if (param.getAclsToDelete() != null && param.getAclsToDelete().getShareACLs() != null) {
      this.shareAclsToDelete = param.getAclsToDelete().getShareACLs();
    }
  }
  private void reportAddErrors(CifsShareACLUpdateParams param) {

    String opName = ShareACLOperationType.ADD.name();
    // Report Add ACL Errors
    ShareACLs shareAcls = param.getAclsToAdd();
    if (shareAcls == null || shareAcls.getShareACLs().size() == 0) return;

    List<ShareACL> shareAclList = shareAcls.getShareACLs();
    for (ShareACL acl : shareAclList) {
      if (!acl.canProceedToNextStep()) {
        ShareACLOperationErrorType error = acl.getErrorType();

        switch (error) {
          case SNAPSHOT_SHARE_SHOULD_BE_READ_ONLY:
            {
              throw APIException.badRequests.snapshotSMBSharePermissionReadOnly();
            }

          case INVALID_PERMISSION:
            {
              if (acl.getPermission() != null) {
                throw APIException.badRequests.invalidPermissionForACL(acl.getPermission());
              } else {
                throw APIException.badRequests.missingValueInACE(opName, REQUEST_PARAM_PERMISSION);
              }
            }

          case USER_AND_GROUP_PROVIDED:
            {
              throw APIException.badRequests.bothUserAndGroupInACLFound(
                  acl.getUser(), acl.getGroup());
            }

          case USER_OR_GROUP_NOT_PROVIDED:
            {
              throw APIException.badRequests.missingUserOrGroupInACE(opName);
            }

          case MULTIPLE_ACES_WITH_SAME_USER_OR_GROUP:
            {
              String userOrGroup = acl.getUser() == null ? acl.getGroup() : acl.getUser();

              throw APIException.badRequests.multipleACLsWithUserOrGroupFound(opName, userOrGroup);
            }

          case MULTIPLE_DOMAINS_FOUND:
            {
              String domain1 = acl.getDomain();
              String userOrGroup = acl.getUser() == null ? acl.getGroup() : acl.getUser();
              String domain2 = userOrGroup.substring(0, userOrGroup.indexOf("\\"));
              throw APIException.badRequests.multipleDomainsFound(opName, domain1, domain2);
            }

          case ACL_EXISTS:
            {
              throw APIException.badRequests.shareACLAlreadyExists(opName, acl.toString());
            }
            // case ACL_NOT_FOUND:
          default:
            break;
        }
      }
    }
  }