StorageEmulatorConnectionString.java

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.azure.storage.common.implementation.connectionstring;

import com.azure.core.util.logging.ClientLogger;
import com.azure.storage.common.implementation.Constants;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * Type to parse a connection string and creates {@link StorageConnectionString} for emulator.
 */
final class StorageEmulatorConnectionString {
    /**
     * Try parsing the connection string and create {@link StorageConnectionString}
     * from it.
     *
     * @param settings the connection settings
     * @param logger the logger
     * @return the StorageConnectionString for emulator
     * @throws IllegalArgumentException If settings is invalid for emulator.
     */
    static StorageConnectionString tryCreate(final ConnectionSettings settings,
                                             final ClientLogger logger) {
        if (ConnectionSettingsFilter.matchesSpecification(settings,
                requireUseEmulatorFlag(),
                optionalProxyUri())) {
            if (!parseUseEmulatorFlag(settings)) {
                throw logger.logExceptionAsError(new IllegalArgumentException("Invalid connection string, "
                        + "the 'UseDevelopmentStorage' key must always have the value 'true'. "
                        + "Remove the flag entirely otherwise."));
            }
            String scheme;
            String host;
            if (settings.hasSetting(Constants.ConnectionStringConstants.EMULATOR_STORAGE_PROXY_URI_NAME)) {
                try {
                    URI devStoreProxyUri
                            = new URI(settings.getSettingValue(Constants
                            .ConnectionStringConstants
                            .EMULATOR_STORAGE_PROXY_URI_NAME));
                    scheme = devStoreProxyUri.getScheme();
                    host = devStoreProxyUri.getHost();
                } catch (URISyntaxException use) {
                    throw logger.logExceptionAsError(new RuntimeException(use));
                }
            } else {
                scheme = "http";
                host = "127.0.0.1";
            }

            StorageConnectionString storageConnectionString;
            try {
                URI blobPrimaryEndpoint =
                        new URI(String.format(Constants.ConnectionStringConstants.EMULATOR_PRIMARY_ENDPOINT_FORMAT,
                                scheme,
                                host,
                                "10000"));
                URI queuePrimaryEndpoint =
                        new URI(String.format(Constants.ConnectionStringConstants.EMULATOR_PRIMARY_ENDPOINT_FORMAT,
                                scheme,
                                host,
                                "10001"));
                URI tablePrimaryEndpoint =
                        new URI(String.format(Constants.ConnectionStringConstants.EMULATOR_PRIMARY_ENDPOINT_FORMAT,
                                scheme,
                                host,
                                "10002"));

                URI blobSecondaryEndpoint =
                        new URI(String.format(Constants.ConnectionStringConstants.EMULATOR_SECONDARY_ENDPOINT_FORMAT,
                                scheme,
                                host,
                                "10000"));
                URI queueSecondaryEndpoint =
                        new URI(String.format(Constants.ConnectionStringConstants.EMULATOR_SECONDARY_ENDPOINT_FORMAT,
                                scheme,
                                host,
                                "10001"));
                URI tableSecondaryEndpoint =
                        new URI(String.format(Constants.ConnectionStringConstants.EMULATOR_SECONDARY_ENDPOINT_FORMAT,
                                scheme,
                                host,
                                "10002"));

                storageConnectionString = new StorageConnectionString(StorageAuthenticationSettings.forEmulator(),
                        new StorageEndpoint(blobPrimaryEndpoint, blobSecondaryEndpoint),
                        new StorageEndpoint(queuePrimaryEndpoint, queueSecondaryEndpoint),
                        new StorageEndpoint(tablePrimaryEndpoint, tableSecondaryEndpoint),
                        null,
                        null);
            } catch (URISyntaxException use) {
                throw logger.logExceptionAsError(new RuntimeException(use));
            }
            return storageConnectionString;
        } else {
            return null;
        }
    }

    private static ConnectionSettingsFilter requireUseEmulatorFlag() {
        return ConnectionSettingsFilter.allRequired(Constants.ConnectionStringConstants.USE_EMULATOR_STORAGE_NAME);
    }

    private static ConnectionSettingsFilter optionalProxyUri() {
        return ConnectionSettingsFilter.optional(Constants.ConnectionStringConstants.EMULATOR_STORAGE_PROXY_URI_NAME);
    }

    private static Boolean parseUseEmulatorFlag(final ConnectionSettings settings) {
        return Boolean.parseBoolean(settings.getSettingValue(Constants
                .ConnectionStringConstants
                .USE_EMULATOR_STORAGE_NAME));
    }
}