blob: a43925ee66d49a94da03c8faac22450db881a594 [file] [log] [blame]
package org.apache.ddlutils;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.ddlutils.platform.axion.AxionPlatform;
import org.apache.ddlutils.platform.cloudscape.CloudscapePlatform;
import org.apache.ddlutils.platform.db2.Db2Platform;
import org.apache.ddlutils.platform.db2.Db2v8Platform;
import org.apache.ddlutils.platform.derby.DerbyPlatform;
import org.apache.ddlutils.platform.firebird.FirebirdPlatform;
import org.apache.ddlutils.platform.hsqldb.HsqlDbPlatform;
import org.apache.ddlutils.platform.interbase.InterbasePlatform;
import org.apache.ddlutils.platform.maxdb.MaxDbPlatform;
import org.apache.ddlutils.platform.mckoi.MckoiPlatform;
import org.apache.ddlutils.platform.mssql.MSSqlPlatform;
import org.apache.ddlutils.platform.mysql.MySqlPlatform;
import org.apache.ddlutils.platform.mysql.MySql50Platform;
import org.apache.ddlutils.platform.oracle.Oracle10Platform;
import org.apache.ddlutils.platform.oracle.Oracle8Platform;
import org.apache.ddlutils.platform.oracle.Oracle9Platform;
import org.apache.ddlutils.platform.postgresql.PostgreSqlPlatform;
import org.apache.ddlutils.platform.sapdb.SapDbPlatform;
import org.apache.ddlutils.platform.sybase.SybaseASE15Platform;
import org.apache.ddlutils.platform.sybase.SybasePlatform;
/**
* A factory of {@link org.apache.ddlutils.Platform} instances based on a case
* insensitive database name. Note that this is a convenience class as the platforms
* can also simply be created via their constructors.
*
* @version $Revision: 209952 $
*/
public class PlatformFactory
{
/** The database name -> platform map. */
private static Map _platforms = null;
/**
* Returns the platform map.
*
* @return The platform list
*/
private static synchronized Map getPlatforms()
{
if (_platforms == null)
{
// lazy initialization
_platforms = new HashMap();
registerPlatforms();
}
return _platforms;
}
/**
* Creates a new platform for the given (case insensitive) database name
* or returns null if the database is not recognized.
*
* @param databaseName The name of the database (case is not important)
* @return The platform or <code>null</code> if the database is not supported
*/
public static synchronized Platform createNewPlatformInstance(String databaseName) throws DdlUtilsException
{
Class platformClass = (Class)getPlatforms().get(databaseName.toLowerCase());
try
{
return platformClass != null ? (Platform)platformClass.newInstance() : null;
}
catch (Exception ex)
{
throw new DdlUtilsException("Could not create platform for database "+databaseName, ex);
}
}
/**
* Creates a new platform for the specified database. This is a shortcut method that uses
* {@link PlatformUtils#determineDatabaseType(String, String)} to determine the parameter
* for {@link #createNewPlatformInstance(String)}. Note that no database connection is
* established when using this method.
*
* @param jdbcDriver The jdbc driver
* @param jdbcConnectionUrl The connection url
* @return The platform or <code>null</code> if the database is not supported
*/
public static synchronized Platform createNewPlatformInstance(String jdbcDriver, String jdbcConnectionUrl) throws DdlUtilsException
{
return createNewPlatformInstance(new PlatformUtils().determineDatabaseType(jdbcDriver, jdbcConnectionUrl));
}
/**
* Creates a new platform for the specified database. This is a shortcut method that uses
* {@link PlatformUtils#determineDatabaseType(DataSource)} to determine the parameter
* for {@link #createNewPlatformInstance(String)}. Note that this method sets the data source
* at the returned platform instance (method {@link Platform#setDataSource(DataSource)}).
*
* @param dataSource The data source for the database
* @return The platform or <code>null</code> if the database is not supported
*/
public static synchronized Platform createNewPlatformInstance(DataSource dataSource) throws DdlUtilsException
{
Platform platform = createNewPlatformInstance(new PlatformUtils().determineDatabaseType(dataSource));
platform.setDataSource(dataSource);
return platform;
}
/**
* Creates a new platform for the specified database. This is a shortcut method that uses
* {@link PlatformUtils#determineDatabaseType(DataSource)} to determine the parameter
* for {@link #createNewPlatformInstance(String)}. Note that this method sets the data source
* at the returned platform instance (method {@link Platform#setDataSource(DataSource)}).
*
* @param dataSource The data source for the database
* @param username The user name to use for connecting to the database
* @param password The password to use for connecting to the database
* @return The platform or <code>null</code> if the database is not supported
*/
public static synchronized Platform createNewPlatformInstance(DataSource dataSource, String username, String password) throws DdlUtilsException
{
Platform platform = createNewPlatformInstance(new PlatformUtils().determineDatabaseType(dataSource, username, password));
platform.setDataSource(dataSource);
platform.setUsername(username);
platform.setPassword(password);
return platform;
}
/**
* Returns a list of all supported platforms.
*
* @return The names of the currently registered platforms
*/
public static synchronized String[] getSupportedPlatforms()
{
return (String[])getPlatforms().keySet().toArray(new String[0]);
}
/**
* Determines whether the indicated platform is supported.
*
* @param platformName The name of the platform
* @return <code>true</code> if the platform is supported
*/
public static boolean isPlatformSupported(String platformName)
{
return getPlatforms().containsKey(platformName.toLowerCase());
}
/**
* Registers a new platform.
*
* @param platformName The platform name
* @param platformClass The platform class which must implement the {@link Platform} interface
*/
public static synchronized void registerPlatform(String platformName, Class platformClass)
{
addPlatform(getPlatforms(), platformName, platformClass);
}
/**
* Registers the known platforms.
*/
private static void registerPlatforms()
{
addPlatform(_platforms, AxionPlatform.DATABASENAME, AxionPlatform.class);
addPlatform(_platforms, CloudscapePlatform.DATABASENAME, CloudscapePlatform.class);
addPlatform(_platforms, Db2Platform.DATABASENAME, Db2Platform.class);
addPlatform(_platforms, Db2v8Platform.DATABASENAME, Db2v8Platform.class);
addPlatform(_platforms, DerbyPlatform.DATABASENAME, DerbyPlatform.class);
addPlatform(_platforms, FirebirdPlatform.DATABASENAME, FirebirdPlatform.class);
addPlatform(_platforms, HsqlDbPlatform.DATABASENAME, HsqlDbPlatform.class);
addPlatform(_platforms, InterbasePlatform.DATABASENAME, InterbasePlatform.class);
addPlatform(_platforms, MaxDbPlatform.DATABASENAME, MaxDbPlatform.class);
addPlatform(_platforms, MckoiPlatform.DATABASENAME, MckoiPlatform.class);
addPlatform(_platforms, MSSqlPlatform.DATABASENAME, MSSqlPlatform.class);
addPlatform(_platforms, MySqlPlatform.DATABASENAME, MySqlPlatform.class);
addPlatform(_platforms, MySql50Platform.DATABASENAME, MySql50Platform.class);
addPlatform(_platforms, Oracle8Platform.DATABASENAME, Oracle8Platform.class);
addPlatform(_platforms, Oracle9Platform.DATABASENAME, Oracle9Platform.class);
addPlatform(_platforms, Oracle10Platform.DATABASENAME, Oracle10Platform.class);
addPlatform(_platforms, PostgreSqlPlatform.DATABASENAME, PostgreSqlPlatform.class);
addPlatform(_platforms, SapDbPlatform.DATABASENAME, SapDbPlatform.class);
addPlatform(_platforms, SybasePlatform.DATABASENAME, SybasePlatform.class);
addPlatform(_platforms, SybaseASE15Platform.DATABASENAME, SybaseASE15Platform.class);
}
/**
* Registers a new platform.
*
* @param platformMap The map to add the platform info to
* @param platformName The platform name
* @param platformClass The platform class which must implement the {@link Platform} interface
*/
private static synchronized void addPlatform(Map platformMap, String platformName, Class platformClass)
{
if (!Platform.class.isAssignableFrom(platformClass))
{
throw new IllegalArgumentException("Cannot register class "+platformClass.getName()+" because it does not implement the "+Platform.class.getName()+" interface");
}
platformMap.put(platformName.toLowerCase(), platformClass);
}
}