/**
* Copyright (C) 2008 10gen 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 java.net.UnknownHostException;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;
/**
* Represents a <a href="http://www.mongodb.org/display/DOCS/Connections">URI</a>
* which can be used to create a Mongo instance. The URI describes the hosts to
* be used and options.
*
* The Java driver supports the following options (case insensitive):<br />
*
* <ul>
* <li>maxpoolsize</li>
* <li>waitqueuemultiple</li>
* <li>waitqueuetimeoutms</li>
* <li>connecttimeoutms</li>
* <li>sockettimeoutms</li>
* <li>autoconnectretry</li>
* <li>slaveok</li>
* <li>safe</li>
* <li>w</li>
* <li>wtimeout</li>
* <li>fsync</li>
* </ul>
*/
public class MongoURI {
public static final String MONGODB_PREFIX = "mongodb://";
/**
* Creates a MongoURI described by a String.
* examples
* mongodb://127.0.0.1
* mongodb://fred:foobar@127.0.0.1/
* @param uri the URI
* @dochub connections
*/
public MongoURI( String uri ){
_uri = uri;
if ( ! uri.startsWith( MONGODB_PREFIX ) )
throw new IllegalArgumentException( "uri needs to start with " + MONGODB_PREFIX );
uri = uri.substring(MONGODB_PREFIX.length());
String serverPart;
String nsPart;
String optionsPart;
{
int idx = uri.lastIndexOf( "/" );
if ( idx < 0 ){
serverPart = uri;
nsPart = null;
optionsPart = null;
}
else {
serverPart = uri.substring( 0 , idx );
nsPart = uri.substring( idx + 1 );
idx = nsPart.indexOf( "?" );
if ( idx >= 0 ){
optionsPart = nsPart.substring( idx + 1 );
nsPart = nsPart.substring( 0 , idx );
}
else {
optionsPart = null;
}
}
}
{ // _username,_password,_hosts
List<String> all = new LinkedList<String>();
int idx = serverPart.indexOf( "@" );
if ( idx > 0 ){
String authPart = serverPart.substring( 0 , idx );
serverPart = serverPart.substring( idx + 1 );
idx = authPart.indexOf( ":" );
_username = authPart.substring( 0, idx );
_password = authPart.substring( idx + 1 ).toCharArray();
}
else {
_username = null;
_password = null;
}
for ( String s : serverPart.split( "," ) )
all.add( s );
_hosts = Collections.unmodifiableList( all );
}
if ( nsPart != null ){ // _database,_collection
int 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;
}
if ( optionsPart != null && optionsPart.length() > 0 ) parseOptions( optionsPart );
}
@SuppressWarnings("deprecation")
private void parseOptions( String optionsPart ){
for ( String _part : optionsPart.split( "&|;" ) ){
int idx = _part.indexOf( "=" );
if ( idx >= 0 ){
String key = _part.substring( 0, idx ).toLowerCase();
String value = _part.substring( idx + 1 );
if ( key.equals( "maxpoolsize" ) ) _options.connectionsPerHost = Integer.parseInt( value );
else if ( key.equals( "minpoolsize" ) )
LOGGER.warning( "Currently No support in Java driver for Min Pool Size." );
else if ( key.equals( "waitqueuemultiple" ) )
_options.threadsAllowedToBlockForConnectionMultiplier = Integer.parseInt( value );
else if ( key.equals( "waitqueuetimeoutms" ) ) _options.maxWaitTime = Integer.parseInt( value );
else if ( key.equals( "connecttimeoutms" ) ) _options.connectTimeout = Integer.parseInt( value );
else if ( key.equals( "sockettimeoutms" ) ) _options.socketTimeout = Integer.parseInt( value );
else if ( key.equals( "autoconnectretry" ) ) _options.autoConnectRetry = _parseBoolean( value );
else if ( key.equals( "slaveok" ) ) _options.slaveOk = _parseBoolean( value );
else if ( key.equals( "safe" ) ) _options.safe = _parseBoolean( value );
else if ( key.equals( "w" ) ) _options.w = Integer.parseInt( value );
else if ( key.equals( "wtimeout" ) ) _options.wtimeout = Integer.parseInt( value );
else if ( key.equals( "fsync" ) ) _options.fsync = _parseBoolean( value );
else LOGGER.warning( "Unknown or Unsupported Option '" + value + "'" );
}
}
}
boolean _parseBoolean( String _in ){
String in = _in.trim();
if ( in != null && in.length() > 0 && ( in.equals( "1" ) || in.toLowerCase().equals( "true" ) || in.toLowerCase()
.equals( "yes" ) ) )
return true;
else return false;
}
// ---------------------------------
/**
* Gets the username
* @return
*/
public String getUsername(){
return _username;
}
/**
* Gets the password
* @return
*/
public char[] getPassword(){
return _password;
}
/**
* Gets the list of hosts
* @return
*/
public List<String> getHosts(){
return _hosts;
}
/**
* Gets the database name
* @return
*/
public String getDatabase(){
return _database;
}
/**
* Gets the collection name
* @return
*/
public String getCollection(){
return _collection;
}
/**
* Gets the options
* @return
*/
public MongoOptions getOptions(){
return _options;
}
/**
* creates a Mongo instance based on the URI
* @return
* @throws MongoException
* @throws UnknownHostException
*/
public Mongo connect()
throws MongoException , UnknownHostException {
// TODO caching?
return new Mongo( this );
}
/**
* returns the DB object from a newly created Mongo instance based on this URI
* @return
* @throws MongoException
* @throws UnknownHostException
*/
public DB connectDB()
throws MongoException , UnknownHostException {
// TODO auth
return connect().getDB( _database );
}
/**
* returns the URI's DB object from a given Mongo instance
* @param m
* @return
*/
public DB connectDB( Mongo m ){
// TODO auth
return m.getDB( _database );
}
/**
* returns the URI's Collection from a given DB object
* @param db
* @return
*/
public DBCollection connectCollection( DB db ){
return db.getCollection( _collection );
}
/**
* returns the URI's Collection from a given Mongo instance
* @param m
* @return
*/
public DBCollection connectCollection( Mongo m ){
return connectDB( m ).getCollection( _collection );
}
// ---------------------------------
final String _username;
final char[] _password;
final List<String> _hosts;
final String _database;
final String _collection;
final MongoOptions _options = new MongoOptions();
final String _uri;
static final Logger LOGGER = Logger.getLogger( "com.mongodb.MongoURI" );
@Override
public String toString() {
return _uri;
}
}