// BridgeDb,
// An abstraction layer for identifer mapping services, both local and online.
// Copyright 2006-2009 BridgeDb developers
//
// 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 org.bridgedb;

import java.util.HashMap;
import java.util.Map;

/**
 * Central access point for connecting to IDMappers.
 */
public final class BridgeDb
{
	private static Map<String, Driver> drivers = new HashMap<String, Driver>();
	
	/** Private, to prevent instantiation of Utility class. */
	private BridgeDb() {}
	
	/**
	 * Finds the correct implementation of the {@link IDMapper} interface and instantiates it.
	 * @param connectionString used to configure a mapping resource. The connectionString
	 *   has the form "protocol:location", where protocol can be e.g. "idmapper-text" or
	 *   "idmapper-pgdb", and location is for example an url or a file, depending
	 *   on the protocol.<BR>
	 *   Note that you need to load the driver that implements the protocol first by loading its
	 *   class with Class.forName(). E.g. for idmapper-pgdb, the class "org.bridgedb.rdb.IDMapperRdb" needs
	 *   to be loaded.
	 * @return the newly instantiated IDMapper
	 * @throws IDMapperException when the right IDMapper implementation could not
	 *   be instantiated 
	 */
	public static IDMapper connect(String connectionString) throws IDMapperException
	{
		int pos = connectionString.indexOf(":");
		if (pos < 0) throw new IllegalArgumentException("connection String must be of the form 'protocol:location'");
		String protocol = connectionString.substring(0, pos);
		String location = connectionString.substring(pos + 1);
		
		if (drivers.containsKey(protocol))
		{
			return drivers.get(protocol).connect(location);
		}
		else
		{
			throw new IDMapperException ("Unknown protocol: " + protocol);
		}
	}
	
	/**
	 * Used by {@link Driver} implementations to register themselves and make
	 * themselves available to the world.
	 * @param protocol The protocol (part before ":" in connection string) that this Driver is for.
	 * @param driver An instance of the Driver.
	 */
	public static void register(String protocol, Driver driver)
	{
		drivers.put(protocol, driver);
	}
}

// BridgeDb,
// An abstraction layer for identifer mapping services, both local and online.
// Copyright 2006-2009 BridgeDb developers
//
// 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 org.bridgedb;

import java.util.HashMap;
import java.util.Map;

/**
 * Central access point for connecting to IDMappers.
 */
public final class BridgeDb
{
	private static Map<String, Driver> drivers = new HashMap<String, Driver>();
	
	/** Private, to prevent instantiation of Utility class. */
	private BridgeDb() {}
	
	/**
	 * Finds the correct implementation of the {@link IDMapper} interface and instantiates it.
	 * @param connectionString used to configure a mapping resource. The connectionString
	 *   has the form "protocol:location", where protocol can be e.g. "idmapper-text" or
	 *   "idmapper-pgdb", and location is for example an url or a file, depending
	 *   on the protocol.<BR>
	 *   Note that you need to load the driver that implements the protocol first by loading its
	 *   class with Class.forName(). E.g. for idmapper-pgdb, the class "org.bridgedb.rdb.IDMapperRdb" needs
	 *   to be loaded.
	 * @return the newly instantiated IDMapper
	 * @throws IDMapperException when the right IDMapper implementation could not
	 *   be instantiated, or when the connection string is not formatted correctly
	 */
	public static IDMapper connect(String connectionString) throws IDMapperException
	{
		int pos = connectionString.indexOf(":");
		if (pos < 0) throw new IDMapperException("connection String must be of the form 'protocol:location'");
		String protocol = connectionString.substring(0, pos);
		String location = connectionString.substring(pos + 1);
		
		if (drivers.containsKey(protocol))
		{
			return drivers.get(protocol).connect(location);
		}
		else
		{
			throw new IDMapperException ("Unknown protocol: " + protocol);
		}
	}
	
	/**
	 * Used by {@link Driver} implementations to register themselves and make
	 * themselves available to the world.
	 * @param protocol The protocol (part before ":" in connection string) that this Driver is for.
	 * @param driver An instance of the Driver.
	 */
	public static void register(String protocol, Driver driver)
	{
		drivers.put(protocol, driver);
	}
}

Throw checked exception with faulty connection string