All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mongodb.ConnectionString Maven / Gradle / Ivy

Go to download

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