in src/main/java/com/azure/servicebus/jms/ConnectionStringBuilder.java [390:508]
private void parseConnectionString(String connectionString) {
// TODO: Trace and throw
if (StringUtil.isNullOrWhiteSpace(connectionString)) {
throw new IllegalConnectionStringFormatException(String.format("connectionString cannot be empty"));
}
String connection = KEY_VALUE_PAIR_DELIMITER + connectionString;
Pattern keyValuePattern = Pattern.compile(KEYS_WITH_DELIMITERS_REGEX, Pattern.CASE_INSENSITIVE);
String[] values = keyValuePattern.split(connection);
Matcher keys = keyValuePattern.matcher(connection);
if (values == null || values.length <= 1 || keys.groupCount() == 0) {
throw new IllegalConnectionStringFormatException("Connection String cannot be parsed.");
}
if (!StringUtil.isNullOrWhiteSpace((values[0]))) {
throw new IllegalConnectionStringFormatException(
String.format(Locale.US, "Cannot parse part of ConnectionString: %s", values[0]));
}
int valueIndex = 0;
while (keys.find()) {
valueIndex++;
String key = keys.group();
key = key.substring(1, key.length() - 1);
if (values.length < valueIndex + 1) {
throw new IllegalConnectionStringFormatException(
String.format(Locale.US, "Value for the connection string parameter name: %s, not found", key));
}
if (key.equalsIgnoreCase(ENDPOINT_CONFIG_NAME)) {
if (this.endpoint != null) {
// we have parsed the endpoint once, which means we have multiple config which is not allowed
throw new IllegalConnectionStringFormatException(
String.format(Locale.US, "Multiple %s and/or %s detected. Make sure only one is defined", ENDPOINT_CONFIG_NAME, HOSTNAME_CONFIG_NAME));
}
try {
this.endpoint = new URI(values[valueIndex]);
} catch (URISyntaxException exception) {
throw new IllegalConnectionStringFormatException(
String.format(Locale.US, "%s should be in format scheme://fullyQualifiedServiceBusNamespaceEndpointName", ENDPOINT_CONFIG_NAME),
exception);
}
} else if (key.equalsIgnoreCase(HOSTNAME_CONFIG_NAME)) {
if (this.endpoint != null) {
// we have parsed the endpoint once, which means we have multiple config which is not allowed
throw new IllegalConnectionStringFormatException(
String.format(Locale.US, "Multiple %s and/or %s detected. Make sure only one is defined", ENDPOINT_CONFIG_NAME, HOSTNAME_CONFIG_NAME));
}
try {
this.endpoint = new URI(String.format(Locale.US, END_POINT_RAW_FORMAT, values[valueIndex]));
} catch (URISyntaxException exception) {
throw new IllegalConnectionStringFormatException(
String.format(Locale.US, "%s should be a fully quantified host name address", HOSTNAME_CONFIG_NAME),
exception);
}
} else if (key.equalsIgnoreCase(SHARED_ACCESS_KEY_NAME_CONFIG_NAME)) {
if (this.authentication != null) {
throw new IllegalConnectionStringFormatException(
String.format("Cannot have values specified for properties '%s' and '%s' at the same time",
SHARED_ACCESS_KEY_NAME_CONFIG_NAME, AUTHENTICATION_CONFIG_NAME));
}
this.sharedAccessKeyName = values[valueIndex];
} else if (key.equalsIgnoreCase(SHARED_ACCESS_KEY_CONFIG_NAME)) {
if (this.authentication != null) {
throw new IllegalConnectionStringFormatException(
String.format("Cannot have values specified for properties '%s' and '%s' at the same time",
SHARED_ACCESS_KEY_CONFIG_NAME, AUTHENTICATION_CONFIG_NAME));
}
this.sharedAccessKey = values[valueIndex];
} else if (key.equalsIgnoreCase(SHARED_ACCESS_SIGNATURE_TOKEN_CONFIG_NAME)) {
if (this.authentication != null) {
throw new IllegalConnectionStringFormatException(
String.format("Cannot have values specified for properties '%s' and '%s' at the same time",
SHARED_ACCESS_SIGNATURE_TOKEN_CONFIG_NAME, AUTHENTICATION_CONFIG_NAME));
}
this.sharedAccessSignatureToken = values[valueIndex];
this.sharedAccessSignatureTokenKeyName = SHARED_ACCESS_SIGNATURE_TOKEN_CONFIG_NAME;
} else if (key.equalsIgnoreCase(ALTERNATE_SHARED_ACCESS_SIGNATURE_TOKEN_CONFIG_NAME)) {
if (this.authentication != null) {
throw new IllegalConnectionStringFormatException(
String.format("Cannot have values specified for properties '%s' and '%s' at the same time",
ALTERNATE_SHARED_ACCESS_SIGNATURE_TOKEN_CONFIG_NAME, AUTHENTICATION_CONFIG_NAME));
}
this.sharedAccessSignatureToken = values[valueIndex];
this.sharedAccessSignatureTokenKeyName = ALTERNATE_SHARED_ACCESS_SIGNATURE_TOKEN_CONFIG_NAME;
} else if (key.equalsIgnoreCase(ENTITY_PATH_CONFIG_NAME)) {
this.entityPath = values[valueIndex];
} else if (key.equalsIgnoreCase(OPERATION_TIMEOUT_CONFIG_NAME)) {
try {
this.operationTimeout = Duration.parse(values[valueIndex]);
} catch (DateTimeParseException exception) {
throw new IllegalConnectionStringFormatException("Invalid value specified for property 'Duration' in the ConnectionString.", exception);
}
} else if (key.equalsIgnoreCase(TRANSPORT_TYPE_CONFIG_NAME)) {
try {
this.transportType = TransportType.fromString(values[valueIndex]);
} catch (IllegalArgumentException exception) {
throw new IllegalConnectionStringFormatException(
String.format("Invalid value specified for property '%s' in the ConnectionString.", TRANSPORT_TYPE_CONFIG_NAME),
exception);
}
} else if (key.equalsIgnoreCase(AUTHENTICATION_CONFIG_NAME)) {
if (this.sharedAccessKeyName != null || this.sharedAccessKey != null || this.sharedAccessSignatureToken != null) {
throw new IllegalConnectionStringFormatException(
String.format("Cannot have values specified for properties '%s' and Shared Access Token at the same time", AUTHENTICATION_CONFIG_NAME));
}
this.authentication = values[valueIndex];
} else {
throw new IllegalConnectionStringFormatException(
String.format(Locale.US, "Illegal connection string parameter name: %s", key));
}
}
}