![JAR search and dependency download from the Maven repository](/logo.png)
com.mongodb.ConnectionString Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of mongo-java-driver Show documentation
Show all versions of mongo-java-driver Show documentation
The MongoDB Java Driver uber-artifact, containing mongodb-driver, mongodb-driver-core, and bson
The newest version!
/*
* Copyright (c) 2008-2014 MongoDB, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License 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.mongodb;
import com.mongodb.diagnostics.logging.Logger;
import com.mongodb.diagnostics.logging.Loggers;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.mongodb.AuthenticationMechanism.GSSAPI;
import static com.mongodb.AuthenticationMechanism.MONGODB_CR;
import static com.mongodb.AuthenticationMechanism.MONGODB_X509;
import static com.mongodb.AuthenticationMechanism.PLAIN;
import static com.mongodb.AuthenticationMechanism.SCRAM_SHA_1;
import static java.lang.String.format;
import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
/**
* Represents a Connection String. The Connection String describes the
* hosts to be used and options.
*
* The format of the Connection String is:
*
* mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
*
*
* - {@code mongodb://} is a required prefix to identify that this is a string in the standard connection format.
* - {@code username:password@} are optional. If given, the driver will attempt to login to a database after
* connecting to a database server. For some authentication mechanisms, only the username is specified and the password is not,
* in which case the ":" after the username is left off as well
* - {@code host1} is the only required part of the connection string. It identifies a server address to connect to.
* - {@code :portX} is optional and defaults to :27017 if not provided.
* - {@code /database} is the name of the database to login to and thus is only relevant if the
* {@code username:password@} syntax is used. If not specified the "admin" database will be used by default.
* - {@code ?options} are connection options. Note that if {@code database} is absent there is still a {@code /}
* required between the last host and the {@code ?} introducing the options. Options are name=value pairs and the pairs
* are separated by "&". For backwards compatibility, ";" is accepted as a separator in addition to "&",
* but should be considered as deprecated.
*
*
* The following options are supported (case insensitive):
*
* Replica set configuration:
*
* - {@code replicaSet=name}: Implies that the hosts given are a seed list, and the driver will attempt to find
* all members of the set.
*
* Connection Configuration:
*
* - {@code ssl=true|false}: Whether to connect using SSL.
* - {@code connectTimeoutMS=ms}: How long a connection can take to be opened before timing out.
* - {@code socketTimeoutMS=ms}: How long a send or receive on a socket can take before timing out.
* - {@code maxIdleTimeMS=ms}: Maximum idle time of a pooled connection. A connection that exceeds this limit will be closed
* - {@code maxLifeTimeMS=ms}: Maximum life time of a pooled connection. A connection that exceeds this limit will be closed
*
* Connection pool configuration:
*
* - {@code maxPoolSize=n}: The maximum number of connections in the connection pool.
* - {@code waitQueueMultiple=n} : this multiplier, multiplied with the maxPoolSize setting, gives the maximum number of
* threads that may be waiting for a connection to become available from the pool. All further threads will get an
* exception right away.
* - {@code waitQueueTimeoutMS=ms}: The maximum wait time in milliseconds that a thread may wait for a connection to
* become available.
*
* Write concern configuration:
*
* - {@code safe=true|false}
*
* - {@code true}: the driver sends a getLastError command after every update to ensure that the update succeeded
* (see also {@code w} and {@code wtimeoutMS}).
* - {@code false}: the driver does not send a getLastError command after every update.
*
*
* - {@code journal=true|false}
*
* - {@code true}: the driver waits for the server to group commit to the journal file on disk.
* - {@code false}: the driver does not wait for the server to group commit to the journal file on disk.
*
*
* - {@code w=wValue}
*
* - The driver adds { w : wValue } to the getLastError command. Implies {@code safe=true}.
* - wValue is typically a number, but can be any string in order to allow for specifications like
* {@code "majority"}
*
*
* - {@code wtimeoutMS=ms}
*
* - The driver adds { wtimeout : ms } to the getlasterror command. Implies {@code safe=true}.
* - Used in combination with {@code w}
*
*
*
* Read preference configuration:
*
* - {@code readPreference=enum}: The read preference for this connection.
*
* - Enumerated values:
*
* - {@code primary}
* - {@code primaryPreferred}
* - {@code secondary}
* - {@code secondaryPreferred}
* - {@code nearest}
*
*
*
*
* - {@code readPreferenceTags=string}. A representation of a tag set as a comma-separated list of colon-separated
* key-value pairs, e.g. {@code "dc:ny,rack:1}". Spaces are stripped from beginning and end of all keys and values.
* To specify a list of tag sets, using multiple readPreferenceTags,
* e.g. {@code readPreferenceTags=dc:ny,rack:1;readPreferenceTags=dc:ny;readPreferenceTags=}
*
* - Note the empty value for the last one, which means match any secondary as a last resort.
* - Order matters when using multiple readPreferenceTags.
*
*
*
* Authentication configuration:
*
* - {@code authMechanism=MONGO-CR|GSSAPI|PLAIN|MONGODB-X509}: The authentication mechanism to use if a credential was supplied.
* The default is unspecified, in which case the client will pick the most secure mechanism available based on the sever version. For the
* GSSAPI and MONGODB-X509 mechanisms, no password is accepted, only the username.
*
* - {@code authSource=string}: The source of the authentication credentials. This is typically the database that
* the credentials have been created. The value defaults to the database specified in the path portion of the connection string.
* If the database is specified in neither place, the default value is "admin". This option is only respected when using the MONGO-CR
* mechanism (the default).
*
* - {@code authMechanismProperties=PROPERTY_NAME:PROPERTY_VALUE,PROPERTY_NAME2:PROPERTY_VALUE2}: This option allows authentication
* mechanism properties to be set on the connection string.
*
* - {@code gssapiServiceName=string}: This option only applies to the GSSAPI mechanism and is used to alter the service name.
* Deprecated, please use {@code authMechanismProperties=SERVICE_NAME:string} instead.
*
*
*
* @mongodb.driver.manual reference/connection-string Connection String Format
* @since 3.0.0
*/
public class ConnectionString {
private static final String PREFIX = "mongodb://";
private static final String UTF_8 = "UTF-8";
private static final Logger LOGGER = Loggers.getLogger("uri");
private final MongoCredential credentials;
private final List hosts;
private final String database;
private final String collection;
private final String connectionString;
private ReadPreference readPreference;
private WriteConcern writeConcern;
private Integer minConnectionPoolSize;
private Integer maxConnectionPoolSize;
private Integer threadsAllowedToBlockForConnectionMultiplier;
private Integer maxWaitTime;
private Integer maxConnectionIdleTime;
private Integer maxConnectionLifeTime;
private Integer connectTimeout;
private Integer socketTimeout;
private Boolean sslEnabled;
private String requiredReplicaSetName;
/**
* Creates a ConnectionString from the given string.
*
* @param connectionString the connection string
* @since 3.0
*/
public ConnectionString(final String connectionString) {
this.connectionString = connectionString;
if (!connectionString.startsWith(PREFIX)) {
throw new IllegalArgumentException(format("The connection string is invalid. "
+ "Connection strings must start with '%s'", PREFIX));
}
String unprocessedConnectionString = connectionString.substring(PREFIX.length());
// Split out the user and host information
String userAndHostInformation = null;
int idx = unprocessedConnectionString.lastIndexOf("/");
if (idx == -1) {
if (unprocessedConnectionString.contains("?")) {
throw new IllegalArgumentException("The connection string contains options without trailing slash");
}
userAndHostInformation = unprocessedConnectionString;
unprocessedConnectionString = "";
} else {
userAndHostInformation = unprocessedConnectionString.substring(0, idx);
unprocessedConnectionString = unprocessedConnectionString.substring(idx + 1);
}
// Split the user and host information
String userInfo = null;
String hostIdentifier = null;
String userName = null;
char[] password = null;
idx = userAndHostInformation.lastIndexOf("@");
if (idx > 0) {
userInfo = userAndHostInformation.substring(0, idx);
hostIdentifier = userAndHostInformation.substring(idx + 1);
int colonCount = countOccurrences(userInfo, ":");
if (userInfo.contains("@") || colonCount > 1) {
throw new IllegalArgumentException("The connection string contains invalid user information. "
+ "If the username or password contains a colon (:) or an at-sign (@) then it must be urlencoded");
}
if (colonCount == 0) {
userName = urldecode(userInfo);
} else {
idx = userInfo.indexOf(":");
userName = urldecode(userInfo.substring(0, idx));
password = urldecode(userInfo.substring(idx + 1), true).toCharArray();
}
} else {
hostIdentifier = userAndHostInformation;
}
// Validate the hosts
hosts = Collections.unmodifiableList(parseHosts(asList(hostIdentifier.split(","))));
// Process the authDB section
String nsPart = null;
idx = unprocessedConnectionString.indexOf("?");
if (idx == -1) {
nsPart = unprocessedConnectionString;
unprocessedConnectionString = "";
} else {
nsPart = unprocessedConnectionString.substring(0, idx);
unprocessedConnectionString = unprocessedConnectionString.substring(idx + 1);
}
if (nsPart.length() > 0) {
nsPart = urldecode(nsPart);
idx = nsPart.indexOf(".");
if (idx < 0) {
database = nsPart;
collection = null;
} else {
database = nsPart.substring(0, idx);
collection = nsPart.substring(idx + 1);
}
} else {
database = null;
collection = null;
}
Map> optionsMap = parseOptions(unprocessedConnectionString);
translateOptions(optionsMap);
credentials = createCredentials(optionsMap, userName, password);
warnOnUnsupportedOptions(optionsMap);
}
private static final Set GENERAL_OPTIONS_KEYS = new HashSet();
private static final Set AUTH_KEYS = new HashSet();
private static final Set READ_PREFERENCE_KEYS = new HashSet();
private static final Set WRITE_CONCERN_KEYS = new HashSet();
private static final Set ALL_KEYS = new HashSet();
static {
GENERAL_OPTIONS_KEYS.add("minpoolsize");
GENERAL_OPTIONS_KEYS.add("maxpoolsize");
GENERAL_OPTIONS_KEYS.add("waitqueuemultiple");
GENERAL_OPTIONS_KEYS.add("waitqueuetimeoutms");
GENERAL_OPTIONS_KEYS.add("connecttimeoutms");
GENERAL_OPTIONS_KEYS.add("maxidletimems");
GENERAL_OPTIONS_KEYS.add("maxlifetimems");
GENERAL_OPTIONS_KEYS.add("sockettimeoutms");
GENERAL_OPTIONS_KEYS.add("sockettimeoutms");
GENERAL_OPTIONS_KEYS.add("ssl");
GENERAL_OPTIONS_KEYS.add("replicaset");
READ_PREFERENCE_KEYS.add("readpreference");
READ_PREFERENCE_KEYS.add("readpreferencetags");
WRITE_CONCERN_KEYS.add("safe");
WRITE_CONCERN_KEYS.add("w");
WRITE_CONCERN_KEYS.add("wtimeoutms");
WRITE_CONCERN_KEYS.add("fsync");
WRITE_CONCERN_KEYS.add("journal");
AUTH_KEYS.add("authmechanism");
AUTH_KEYS.add("authsource");
AUTH_KEYS.add("gssapiservicename");
AUTH_KEYS.add("authmechanismproperties");
ALL_KEYS.addAll(GENERAL_OPTIONS_KEYS);
ALL_KEYS.addAll(AUTH_KEYS);
ALL_KEYS.addAll(READ_PREFERENCE_KEYS);
ALL_KEYS.addAll(WRITE_CONCERN_KEYS);
}
private void warnOnUnsupportedOptions(final Map> optionsMap) {
for (final String key : optionsMap.keySet()) {
if (!ALL_KEYS.contains(key)) {
if (LOGGER.isWarnEnabled()) {
LOGGER.warn(format("Unsupported option '%s' in the connection string '%s'.", key, connectionString));
}
}
}
}
private void translateOptions(final Map> optionsMap) {
for (final String key : GENERAL_OPTIONS_KEYS) {
String value = getLastValue(optionsMap, key);
if (value == null) {
continue;
}
if (key.equals("maxpoolsize")) {
maxConnectionPoolSize = parseInteger(value, "maxpoolsize");
} else if (key.equals("minpoolsize")) {
minConnectionPoolSize = parseInteger(value, "minpoolsize");
} else if (key.equals("maxidletimems")) {
maxConnectionIdleTime = parseInteger(value, "maxidletimems");
} else if (key.equals("maxlifetimems")) {
maxConnectionLifeTime = parseInteger(value, "maxlifetimems");
} else if (key.equals("waitqueuemultiple")) {
threadsAllowedToBlockForConnectionMultiplier = parseInteger(value, "waitqueuemultiple");
} else if (key.equals("waitqueuetimeoutms")) {
maxWaitTime = parseInteger(value, "waitqueuetimeoutms");
} else if (key.equals("connecttimeoutms")) {
connectTimeout = parseInteger(value, "connecttimeoutms");
} else if (key.equals("sockettimeoutms")) {
socketTimeout = parseInteger(value, "sockettimeoutms");
} else if (key.equals("ssl") && parseBoolean(value, "ssl")) {
sslEnabled = true;
} else if (key.equals("replicaset")) {
requiredReplicaSetName = value;
}
}
writeConcern = createWriteConcern(optionsMap);
readPreference = createReadPreference(optionsMap);
}
private WriteConcern createWriteConcern(final Map> optionsMap) {
Boolean safe = null;
String w = null;
int wTimeout = 0;
boolean fsync = false;
boolean journal = false;
for (final String key : WRITE_CONCERN_KEYS) {
String value = getLastValue(optionsMap, key);
if (value == null) {
continue;
}
if (key.equals("safe")) {
safe = parseBoolean(value, "safe");
} else if (key.equals("w")) {
w = value;
} else if (key.equals("wtimeoutms")) {
wTimeout = Integer.parseInt(value);
} else if (key.equals("fsync")) {
fsync = parseBoolean(value, "fsync");
} else if (key.equals("journal")) {
journal = parseBoolean(value, "journal");
}
}
return buildWriteConcern(safe, w, wTimeout, fsync, journal);
}
private ReadPreference createReadPreference(final Map> optionsMap) {
String readPreferenceType = null;
List tagSetList = new ArrayList();
for (final String key : READ_PREFERENCE_KEYS) {
String value = getLastValue(optionsMap, key);
if (value == null) {
continue;
}
if (key.equals("readpreference")) {
readPreferenceType = value;
} else if (key.equals("readpreferencetags")) {
for (final String cur : optionsMap.get(key)) {
TagSet tagSet = getTags(cur.trim());
tagSetList.add(tagSet);
}
}
}
return buildReadPreference(readPreferenceType, tagSetList);
}
private MongoCredential createCredentials(final Map> optionsMap, final String userName,
final char[] password) {
if (userName == null) {
return null;
}
AuthenticationMechanism mechanism = null;
String authSource = (database == null) ? "admin" : database;
String gssapiServiceName = null;
String authMechanismProperties = null;
for (final String key : AUTH_KEYS) {
String value = getLastValue(optionsMap, key);
if (value == null) {
continue;
}
if (key.equals("authmechanism")) {
mechanism = AuthenticationMechanism.fromMechanismName(value);
} else if (key.equals("authsource")) {
authSource = value;
} else if (key.equals("gssapiservicename")) {
gssapiServiceName = value;
} else if (key.endsWith("authmechanismproperties")) {
authMechanismProperties = value;
}
}
MongoCredential credential;
if (mechanism == GSSAPI) {
credential = MongoCredential.createGSSAPICredential(userName);
if (gssapiServiceName != null) {
credential = credential.withMechanismProperty("SERVICE_NAME", gssapiServiceName);
}
} else if (mechanism == PLAIN) {
credential = MongoCredential.createPlainCredential(userName, authSource, password);
} else if (mechanism == MONGODB_CR) {
credential = MongoCredential.createMongoCRCredential(userName, authSource, password);
} else if (mechanism == MONGODB_X509) {
credential = MongoCredential.createMongoX509Credential(userName);
} else if (mechanism == SCRAM_SHA_1) {
credential = MongoCredential.createScramSha1Credential(userName, authSource, password);
} else if (mechanism == null) {
credential = MongoCredential.createCredential(userName, authSource, password);
} else {
throw new UnsupportedOperationException(format("The connection string contains an invalid authentication mechanism'. "
+ "'%s' is not a supported authentication mechanism", mechanism));
}
if (authMechanismProperties != null) {
for (String part : authMechanismProperties.split(",")) {
String[] mechanismPropertyKeyValue = part.split(":");
if (mechanismPropertyKeyValue.length != 2) {
throw new IllegalArgumentException(format("The connection string contains invalid authentication properties. "
+ "'%s' is not a key value pair", part));
}
String key = mechanismPropertyKeyValue[0].trim().toLowerCase();
String value = mechanismPropertyKeyValue[1].trim();
if (key.equals("canonicalize_host_name")) {
credential = credential.withMechanismProperty(key, Boolean.valueOf(value));
} else {
credential = credential.withMechanismProperty(key, value);
}
}
}
return credential;
}
private String getLastValue(final Map> optionsMap, final String key) {
List valueList = optionsMap.get(key);
if (valueList == null) {
return null;
}
return valueList.get(valueList.size() - 1);
}
private Map> parseOptions(final String optionsPart) {
Map> optionsMap = new HashMap>();
if (optionsPart.length() == 0) {
return optionsMap;
}
for (final String part : optionsPart.split("&|;")) {
if (part.length() == 0) {
continue;
}
int idx = part.indexOf("=");
if (idx >= 0) {
String key = part.substring(0, idx).toLowerCase();
String value = part.substring(idx + 1);
List valueList = optionsMap.get(key);
if (valueList == null) {
valueList = new ArrayList(1);
}
valueList.add(urldecode(value));
optionsMap.put(key, valueList);
} else {
throw new IllegalArgumentException(format("The connection string contains an invalid option '%s'. "
+ "'%s' is missing the value delimiter eg '%s=value'", optionsPart, part, part));
}
}
// handle legacy wtimeout settings
if (optionsMap.containsKey("wtimeout") && !optionsMap.containsKey("wtimeoutms")) {
optionsMap.put("wtimeoutms", optionsMap.remove("wtimeout"));
if (LOGGER.isWarnEnabled()) {
LOGGER.warn("Uri option 'wtimeout' has been deprecated, use 'wtimeoutms' instead.");
}
}
// handle legacy slaveok settings
if (optionsMap.containsKey("slaveok") && !optionsMap.containsKey("readpreference")) {
optionsMap.put("readpreference", singletonList("secondaryPreferred"));
if (LOGGER.isWarnEnabled()) {
LOGGER.warn("Uri option 'slaveok' has been deprecated, use 'readpreference' instead.");
}
}
// handle legacy j settings
if (optionsMap.containsKey("j") && !optionsMap.containsKey("journal")) {
optionsMap.put("journal", optionsMap.remove("j"));
if (LOGGER.isWarnEnabled()) {
LOGGER.warn("Uri option 'j' has been deprecated, use 'journal' instead.");
}
}
return optionsMap;
}
private ReadPreference buildReadPreference(final String readPreferenceType,
final List tagSetList) {
if (readPreferenceType != null) {
if (tagSetList.isEmpty()) {
return ReadPreference.valueOf(readPreferenceType);
}
return ReadPreference.valueOf(readPreferenceType, tagSetList);
}
return null;
}
private WriteConcern buildWriteConcern(final Boolean safe, final String w,
final int wTimeout, final boolean fsync, final boolean journal) {
if (w != null || wTimeout != 0 || fsync || journal) {
if (w == null) {
return new WriteConcern(1, wTimeout, fsync, journal);
} else {
try {
return new WriteConcern(Integer.parseInt(w), wTimeout, fsync, journal);
} catch (NumberFormatException e) {
return new WriteConcern(w, wTimeout, fsync, journal);
}
}
} else if (safe != null) {
if (safe) {
return WriteConcern.ACKNOWLEDGED;
} else {
return WriteConcern.UNACKNOWLEDGED;
}
}
return null;
}
private TagSet getTags(final String tagSetString) {
List tagList = new ArrayList();
if (tagSetString.length() > 0) {
for (final String tag : tagSetString.split(",")) {
String[] tagKeyValuePair = tag.split(":");
if (tagKeyValuePair.length != 2) {
throw new IllegalArgumentException(format("The connection string contains an invalid read preference tag. "
+ "'%s' is not a key value pair", tagSetString));
}
tagList.add(new Tag(tagKeyValuePair[0].trim(), tagKeyValuePair[1].trim()));
}
}
return new TagSet(tagList);
}
private boolean parseBoolean(final String input, final String key) {
String trimmedInput = input.trim();
boolean isTrue = trimmedInput.length() > 0 && (trimmedInput.equals("1") || trimmedInput.toLowerCase().equals("true")
|| trimmedInput.toLowerCase().equals("yes"));
if ((!input.equals("true") && !input.equals("false")) && LOGGER.isWarnEnabled()) {
LOGGER.warn(format("Deprecated boolean value ('%s') in the connection string for '%s', please update to %s=%s",
input, key, key, isTrue));
}
return isTrue;
}
private int parseInteger(final String input, final String key) {
try {
return Integer.parseInt(input);
} catch (NumberFormatException e) {
throw new IllegalArgumentException(format("The connection string contains an invalid value for '%s'. "
+ "'%s' is not a valid integer", key, input));
}
}
private List parseHosts(final List rawHosts) {
if (rawHosts.size() == 0){
throw new IllegalArgumentException("The connection string must contain at least one host");
}
List hosts = new ArrayList();
for (String host : rawHosts) {
if (host.length() == 0) {
throw new IllegalArgumentException(format("The connection string contains an empty host '%s'. ", rawHosts));
} else if (host.endsWith(".sock")) {
throw new IllegalArgumentException(format("The connection string contains an invalid host '%s'. "
+ "Unix Domain Socket which is not supported by the Java driver", host));
} else if (host.startsWith("[")) {
if (!host.contains("]")) {
throw new IllegalArgumentException(format("The connection string contains an invalid host '%s'. "
+ "IPv6 address literals must be enclosed in '[' and ']' according to RFC 2732", host));
}
int idx = host.indexOf("]:");
if (idx != -1) {
validatePort(host, host.substring(idx + 2));
}
} else {
int colonCount = countOccurrences(host, ":");
if (colonCount > 1) {
throw new IllegalArgumentException(format("The connection string contains an invalid host '%s'. "
+ "Reserved characters such as ':' must be escaped according RFC 2396. "
+ "Any IPv6 address literal must be enclosed in '[' and ']' according to RFC 2732.", host));
} else if (colonCount == 1) {
validatePort(host, host.substring(host.indexOf(":") + 1));
}
}
hosts.add(host);
}
Collections.sort(hosts);
return hosts;
}
private void validatePort(final String host, final String port) {
boolean invalidPort = false;
try {
int portInt = Integer.parseInt(port);
if (portInt <= 0 || portInt > 65535) {
invalidPort = true;
}
} catch (NumberFormatException e) {
invalidPort = true;
}
if (invalidPort) {
throw new IllegalArgumentException(format("The connection string contains an invalid host '%s'. "
+ "The port '%s' is not a valid, it must be an integer between 0 and 65535", host, port));
}
}
private int countOccurrences(final String haystack, final String needle) {
return haystack.length() - haystack.replace(needle, "").length();
}
private String urldecode(final String input) {
return urldecode(input, false);
}
private String urldecode(final String input, final boolean password) {
try {
return URLDecoder.decode(input, UTF_8);
} catch (UnsupportedEncodingException e) {
if (password) {
throw new IllegalArgumentException("The connection string contained unsupported characters in the password.");
} else {
throw new IllegalArgumentException(format("The connection string contained unsupported characters: '%s'."
+ "Decoding produced the following error: %s", input, e.getMessage()));
}
}
}
// ---------------------------------
/**
* Gets the username
*
* @return the username
*/
public String getUsername() {
return credentials != null ? credentials.getUserName() : null;
}
/**
* Gets the password
*
* @return the password
*/
public char[] getPassword() {
return credentials != null ? credentials.getPassword() : null;
}
/**
* Gets the list of hosts
*
* @return the host list
*/
public List getHosts() {
return hosts;
}
/**
* Gets the database name
*
* @return the database name
*/
public String getDatabase() {
return database;
}
/**
* Gets the collection name
*
* @return the collection name
*/
public String getCollection() {
return collection;
}
/**
* Get the unparsed connection string.
*
* @return the connection string
* deprecated use {@link #getConnectionString()}
*/
@Deprecated
public String getURI() {
return getConnectionString();
}
/**
* Get the unparsed connection string.
*
* @return the connection string
* @since 3.1
*/
public String getConnectionString() {
return connectionString;
}
/**
* Gets the credentials.
*
* @return the credentials
*/
public List getCredentialList() {
return credentials != null ? asList(credentials) : new ArrayList();
}
/**
* Gets the read preference specified in the connection string.
* @return the read preference
*/
public ReadPreference getReadPreference() {
return readPreference;
}
/**
* Gets the write concern specified in the connection string.
* @return the write concern
*/
public WriteConcern getWriteConcern() {
return writeConcern;
}
/**
* Gets the minimum connection pool size specified in the connection string.
* @return the minimum connection pool size
*/
public Integer getMinConnectionPoolSize() {
return minConnectionPoolSize;
}
/**
* Gets the maximum connection pool size specified in the connection string.
* @return the maximum connection pool size
*/
public Integer getMaxConnectionPoolSize() {
return maxConnectionPoolSize;
}
/**
* Gets the multiplier for the number of threads allowed to block waiting for a connection specified in the connection string.
* @return the multiplier for the number of threads allowed to block waiting for a connection
*/
public Integer getThreadsAllowedToBlockForConnectionMultiplier() {
return threadsAllowedToBlockForConnectionMultiplier;
}
/**
* Gets the maximum wait time of a thread waiting for a connection specified in the connection string.
* @return the maximum wait time of a thread waiting for a connection
*/
public Integer getMaxWaitTime() {
return maxWaitTime;
}
/**
* Gets the maximum connection idle time specified in the connection string.
* @return the maximum connection idle time
*/
public Integer getMaxConnectionIdleTime() {
return maxConnectionIdleTime;
}
/**
* Gets the maximum connection life time specified in the connection string.
* @return the maximum connection life time
*/
public Integer getMaxConnectionLifeTime() {
return maxConnectionLifeTime;
}
/**
* Gets the socket connect timeout specified in the connection string.
* @return the socket connect timeout
*/
public Integer getConnectTimeout() {
return connectTimeout;
}
/**
* Gets the socket timeout specified in the connection string.
* @return the socket timeout
*/
public Integer getSocketTimeout() {
return socketTimeout;
}
/**
* Gets the SSL enabled value specified in the connection string.
* @return the SSL enabled value
*/
public Boolean getSslEnabled() {
return sslEnabled;
}
/**
* Gets the required replica set name specified in the connection string.
* @return the required replica set name
*/
public String getRequiredReplicaSetName() {
return requiredReplicaSetName;
}
@Override
public String toString() {
return connectionString;
}
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ConnectionString)) {
return false;
}
ConnectionString that = (ConnectionString) o;
if (collection != null ? !collection.equals(that.collection) : that.collection != null) {
return false;
}
if (connectTimeout != null ? !connectTimeout.equals(that.connectTimeout) : that.connectTimeout != null) {
return false;
}
if (credentials != null ? !credentials.equals(that.credentials) : that.credentials != null) {
return false;
}
if (database != null ? !database.equals(that.database) : that.database != null) {
return false;
}
if (!hosts.equals(that.hosts)) {
return false;
}
if (maxConnectionIdleTime != null ? !maxConnectionIdleTime.equals(that.maxConnectionIdleTime)
: that.maxConnectionIdleTime != null) {
return false;
}
if (maxConnectionLifeTime != null ? !maxConnectionLifeTime.equals(that.maxConnectionLifeTime)
: that.maxConnectionLifeTime != null) {
return false;
}
if (maxConnectionPoolSize != null ? !maxConnectionPoolSize.equals(that.maxConnectionPoolSize)
: that.maxConnectionPoolSize != null) {
return false;
}
if (maxWaitTime != null ? !maxWaitTime.equals(that.maxWaitTime) : that.maxWaitTime != null) {
return false;
}
if (minConnectionPoolSize != null ? !minConnectionPoolSize.equals(that.minConnectionPoolSize)
: that.minConnectionPoolSize != null) {
return false;
}
if (readPreference != null ? !readPreference.equals(that.readPreference) : that.readPreference != null) {
return false;
}
if (requiredReplicaSetName != null ? !requiredReplicaSetName.equals(that.requiredReplicaSetName)
: that.requiredReplicaSetName != null) {
return false;
}
if (socketTimeout != null ? !socketTimeout.equals(that.socketTimeout) : that.socketTimeout != null) {
return false;
}
if (sslEnabled != null ? !sslEnabled.equals(that.sslEnabled) : that.sslEnabled != null) {
return false;
}
if (threadsAllowedToBlockForConnectionMultiplier != null
? !threadsAllowedToBlockForConnectionMultiplier.equals(that.threadsAllowedToBlockForConnectionMultiplier)
: that.threadsAllowedToBlockForConnectionMultiplier != null) {
return false;
}
if (writeConcern != null ? !writeConcern.equals(that.writeConcern) : that.writeConcern != null) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result = credentials != null ? credentials.hashCode() : 0;
result = 31 * result + hosts.hashCode();
result = 31 * result + (database != null ? database.hashCode() : 0);
result = 31 * result + (collection != null ? collection.hashCode() : 0);
result = 31 * result + (readPreference != null ? readPreference.hashCode() : 0);
result = 31 * result + (writeConcern != null ? writeConcern.hashCode() : 0);
result = 31 * result + (minConnectionPoolSize != null ? minConnectionPoolSize.hashCode() : 0);
result = 31 * result + (maxConnectionPoolSize != null ? maxConnectionPoolSize.hashCode() : 0);
result = 31 * result + (threadsAllowedToBlockForConnectionMultiplier != null
? threadsAllowedToBlockForConnectionMultiplier.hashCode()
: 0);
result = 31 * result + (maxWaitTime != null ? maxWaitTime.hashCode() : 0);
result = 31 * result + (maxConnectionIdleTime != null ? maxConnectionIdleTime.hashCode() : 0);
result = 31 * result + (maxConnectionLifeTime != null ? maxConnectionLifeTime.hashCode() : 0);
result = 31 * result + (connectTimeout != null ? connectTimeout.hashCode() : 0);
result = 31 * result + (socketTimeout != null ? socketTimeout.hashCode() : 0);
result = 31 * result + (sslEnabled != null ? sslEnabled.hashCode() : 0);
result = 31 * result + (requiredReplicaSetName != null ? requiredReplicaSetName.hashCode() : 0);
return result;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy