Code review comment: add endpoint or region check, either should be non-empty but not both empty.

Code under review:
public void validateStorageVolumeConfig() throws InvalidConfException {
        switch (Config.cloud_native_storage_type.toLowerCase()) {
            case "s3":
                String[] bucketAndPrefix = getBucketAndPrefix();
                String bucket = bucketAndPrefix[0];
                if (bucket.isEmpty()) {
                    throw new InvalidConfException(
                            String.format("The configuration item \"aws_s3_path = %s\" is invalid, s3 bucket is empty.",
                                    Config.aws_s3_path));
                }
                String credentialType = getAwsCredentialType();
                if (credentialType == null) {
                    throw new InvalidConfException("Invalid aws credential configuration.");
                }
                break;
            case "hdfs":
                if (Config.cloud_native_hdfs_url.isEmpty()) {
                    throw new InvalidConfException("The configuration item \"cloud_native_hdfs_url\" is empty.");
                }
                break;
            case "azblob":
                if (Config.azure_blob_endpoint.isEmpty()) {
                    throw new InvalidConfException("The configuration item \"azure_blob_endpoint\" is empty.");
                }
                if (Config.azure_blob_path.isEmpty()) {
                    throw new InvalidConfException("The configuration item \"azure_blob_path\" is empty.");
                }
                break;
            default:
                throw new InvalidConfException(String.format(
                        "The configuration item \"cloud_native_storage_type = %s\" is invalid, must be HDFS or S3 or AZBLOB.",
                        Config.cloud_native_storage_type));
        }
    }

Line commented on: case "hdfs":

Revised code:
public void validateStorageVolumeConfig() throws InvalidConfException {
        switch (Config.cloud_native_storage_type.toLowerCase()) {
            case "s3":
                String[] bucketAndPrefix = getBucketAndPrefix();
                String bucket = bucketAndPrefix[0];
                if (bucket.isEmpty()) {
                    throw new InvalidConfException(
                            String.format("The configuration item \"aws_s3_path = %s\" is invalid, s3 bucket is empty.",
                                    Config.aws_s3_path));
                }
                if (Config.aws_s3_region.isEmpty() && Config.aws_s3_endpoint.isEmpty()) {
                    throw new InvalidConfException(
                            "Both configuration item \"aws_s3_region\" and \"aws_s3_endpoint\" are empty");
                }
                String credentialType = getAwsCredentialType();
                if (credentialType == null) {
                    throw new InvalidConfException("Invalid aws credential configuration.");
                }
                break;
            case "hdfs":
                if (Config.cloud_native_hdfs_url.isEmpty()) {
                    throw new InvalidConfException("The configuration item \"cloud_native_hdfs_url\" is empty.");
                }
                break;
            case "azblob":
                if (Config.azure_blob_endpoint.isEmpty()) {
                    throw new InvalidConfException("The configuration item \"azure_blob_endpoint\" is empty.");
                }
                if (Config.azure_blob_path.isEmpty()) {
                    throw new InvalidConfException("The configuration item \"azure_blob_path\" is empty.");
                }
                break;
            default:
                throw new InvalidConfException(String.format(
                        "The configuration item \"cloud_native_storage_type = %s\" is invalid, must be HDFS or S3 or AZBLOB.",
                        Config.cloud_native_storage_type));
        }
    }