Skip to content

Commit

Permalink
Create platform with datasource and log reference.
Browse files Browse the repository at this point in the history
  • Loading branch information
chenson42 committed Dec 1, 2011
1 parent 0b7480a commit 3246ded
Show file tree
Hide file tree
Showing 23 changed files with 199 additions and 102 deletions.
Expand Up @@ -41,8 +41,10 @@
import org.jumpmind.db.platform.postgresql.PostgreSqlPlatform;
import org.jumpmind.db.platform.sqlite.SqLitePlatform;
import org.jumpmind.db.platform.sybase.SybasePlatform;
import org.jumpmind.symmetric.common.ParameterConstants;
import org.jumpmind.symmetric.common.logging.ILog;
import org.jumpmind.symmetric.common.logging.LogFactory;
import org.jumpmind.symmetric.service.IParameterService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.FactoryBean;
Expand All @@ -58,7 +60,9 @@
public class DbDialectFactory implements FactoryBean<IDbDialect>, BeanFactoryAware {

private static final ILog log = LogFactory.getLog(DbDialectFactory.class);


private IParameterService parameterService;

private String db2zSeriesProductVersion;

private JdbcTemplate jdbcTemplate;
Expand All @@ -74,8 +78,9 @@ public class DbDialectFactory implements FactoryBean<IDbDialect>, BeanFactoryAwa
public IDbDialect getObject() throws Exception {

waitForAvailableDatabase();

IDatabasePlatform pf = JdbcDatabasePlatformFactory.createNewPlatformInstance(jdbcTemplate.getDataSource());

IDatabasePlatform pf = JdbcDatabasePlatformFactory.createNewPlatformInstance(jdbcTemplate.getDataSource(),
org.jumpmind.util.LogFactory.getLog("org.jumpmind." + parameterService.getString(ParameterConstants.ENGINE_NAME)));

if (forceDelimitedIdentifierModeOn) {
pf.setDelimitedIdentifierModeOn(true);
Expand Down Expand Up @@ -191,5 +196,10 @@ public void setForceDelimitedIdentifierModeOn(boolean forceDelimitedIdentifierMo

public void setForceDelimitedIdentifierModeOff(boolean forceDelimitedIdentifierModeOff) {
this.forceDelimitedIdentifierModeOff = forceDelimitedIdentifierModeOff;
}
}

public void setParameterService(IParameterService parameterService) {
this.parameterService = parameterService;
}

}
Expand Down
Expand Up @@ -75,7 +75,8 @@
<property name="db2zSeriesProductVersion" value="$[sym.db2.zseries.version]" />
<property name="queryTimeout" value="$[sym.db.sql.query.timeout.seconds]"/>
<property name="forceDelimitedIdentifierModeOn" value="$[sym.db.force.delimited.identifier.mode.on]"/>
<property name="forceDelimitedIdentifierModeOff" value="$[sym.db.force.delimited.identifier.mode.off]"/>
<property name="forceDelimitedIdentifierModeOff" value="$[sym.db.force.delimited.identifier.mode.off]"/>
<property name="parameterService" ref="parameterService" />
</bean>

</beans>
Expand Up @@ -28,6 +28,7 @@
import org.jumpmind.db.model.Database;
import org.jumpmind.db.model.Table;
import org.jumpmind.db.model.TypeMap;
import org.jumpmind.db.sql.ISqlTemplate;
import org.jumpmind.db.sql.SqlScript;
import org.jumpmind.util.Log;
import org.jumpmind.util.LogFactory;
Expand Down Expand Up @@ -66,8 +67,11 @@ public abstract class AbstractDatabasePlatform implements IDatabasePlatform {
/* Whether read foreign keys shall be sorted alphabetically. */
protected boolean foreignKeysSorted;

public AbstractDatabasePlatform() {
public AbstractDatabasePlatform(Log log) {
this.log = log;
}

abstract public ISqlTemplate getSqlTemplate();

public void setLog(Log log) {
this.log = log;
Expand Down
Expand Up @@ -19,6 +19,7 @@
* under the License.
*/

import java.lang.reflect.Constructor;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
Expand All @@ -45,6 +46,7 @@
import org.jumpmind.db.platform.postgresql.PostgreSqlPlatform;
import org.jumpmind.db.platform.sqlite.SqLitePlatform;
import org.jumpmind.db.platform.sybase.SybasePlatform;
import org.jumpmind.util.Log;

/*
* A factory of {@link IDatabasePlatform} instances based on a case
Expand Down Expand Up @@ -105,18 +107,37 @@ public class JdbcDatabasePlatformFactory {
jdbcSubProtocolToPlatform.put(FirebirdPlatform.JDBC_SUBPROTOCOL,
FirebirdPlatform.DATABASENAME);
}

/*
* Creates a new platform for the given (case insensitive) database name or
* returns null if the database is not recognized.
* Creates a new platform for the specified database. Note that this method installs
* the data source in the returned platform instance.
*
* @param databaseName The name of the database (case is not important)
* @param dataSource The data source for the database
* @param log The logger that the platform should use
*
* @return The platform or <code>null</code> if the database is not
* supported
*/
public static synchronized IDatabasePlatform createNewPlatformInstance(String[] nameVersion)
public static synchronized IDatabasePlatform createNewPlatformInstance(DataSource dataSource, Log log)
throws DdlUtilsException {

// connects to the database and uses actual metadata info to get db name
// and version to determine platform
String[] nameVersion = determineDatabaseNameVersionSubprotocol(dataSource);

Class<? extends IDatabasePlatform> clazz = findPlatformClass(nameVersion);

try {
Constructor<? extends IDatabasePlatform> construtor = clazz.getConstructor(DataSource.class, Log.class);
return construtor.newInstance(dataSource, log);
} catch (Exception e) {
throw new DdlUtilsException("Could not create a platform of type " + nameVersion[0], e);
}
}


protected static synchronized Class<? extends IDatabasePlatform> findPlatformClass(
String[] nameVersion) throws DdlUtilsException {
Class<? extends IDatabasePlatform> platformClass = platforms.get(String.format("%s%s",
nameVersion[0], nameVersion[1]).toLowerCase());
if (platformClass == null) {
Expand All @@ -130,37 +151,15 @@ public static synchronized IDatabasePlatform createNewPlatformInstance(String[]
}
}

try {
return platformClass != null ? (IDatabasePlatform) platformClass.newInstance() : null;
} catch (Exception ex) {
throw new DdlUtilsException("Could not create platform for database " + nameVersion[0],
ex);
if (platformClass == null) {
throw new DdlUtilsException("Could not find platform for database " + nameVersion[0]);
} else {
return platformClass;
}
}

/*
* 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 IDatabasePlatform createNewPlatformInstance(DataSource dataSource)
throws DdlUtilsException {
// connects to the database and uses actual metadata info to get db name
// and version to determine platform
String[] nameVersion = determineDatabaseNameVersionSubprotocol(dataSource);

return createNewPlatformInstance(nameVersion);
}

public static String[] determineDatabaseNameVersionSubprotocol(DataSource dataSource)
protected static String[] determineDatabaseNameVersionSubprotocol(DataSource dataSource)
throws DatabaseOperationException {
Connection connection = null;
String[] nameVersion = new String[3];
Expand Down
@@ -0,0 +1,27 @@
package org.jumpmind.db.platform;

import javax.sql.DataSource;

import org.jumpmind.db.AbstractDatabasePlatform;
import org.jumpmind.db.sql.ISqlTemplate;
import org.jumpmind.db.sql.jdbc.JdbcSqlTemplate;
import org.jumpmind.util.Log;

abstract public class AbstractJdbcDatabasePlatform extends AbstractDatabasePlatform {

protected DataSource dataSource;

protected ISqlTemplate sqlTemplate;

public AbstractJdbcDatabasePlatform(DataSource dataSource, Log log) {
super(log);
this.dataSource = dataSource;
this.sqlTemplate = new JdbcSqlTemplate(dataSource);
}

@Override
public ISqlTemplate getSqlTemplate() {
return sqlTemplate;
}

}
Expand Up @@ -21,12 +21,15 @@

import java.sql.Types;

import org.jumpmind.db.AbstractDatabasePlatform;
import javax.sql.DataSource;

import org.jumpmind.db.platform.AbstractJdbcDatabasePlatform;
import org.jumpmind.util.Log;

/*
* The DB2 platform implementation.
*/
public class Db2Platform extends AbstractDatabasePlatform {
public class Db2Platform extends AbstractJdbcDatabasePlatform {

/* Database name of this platform. */
public static final String DATABASENAME = "DB2";
Expand All @@ -40,7 +43,8 @@ public class Db2Platform extends AbstractDatabasePlatform {
/*
* Creates a new platform instance.
*/
public Db2Platform() {
public Db2Platform(DataSource dataSource, Log log) {
super(dataSource, log);

// the BINARY types are also handled by Db2Builder.getSqlType(Column)
info.addNativeTypeMapping(Types.ARRAY, "BLOB", Types.BLOB);
Expand Down
Expand Up @@ -21,12 +21,15 @@

import java.sql.Types;

import org.jumpmind.db.AbstractDatabasePlatform;
import javax.sql.DataSource;

import org.jumpmind.db.platform.AbstractJdbcDatabasePlatform;
import org.jumpmind.util.Log;

/*
* The platform implementation for Derby.
*/
public class DerbyPlatform extends AbstractDatabasePlatform {
public class DerbyPlatform extends AbstractJdbcDatabasePlatform {

/* Database name of this platform. */
public static final String DATABASENAME = "Apache Derby";
Expand All @@ -43,7 +46,8 @@ public class DerbyPlatform extends AbstractDatabasePlatform {
/*
* Creates a new Derby platform instance.
*/
public DerbyPlatform() {
public DerbyPlatform(DataSource dataSource, Log log) {
super(dataSource, log);

info.setMaxIdentifierLength(128);
info.setSystemForeignKeyIndicesAlwaysNonUnique(true);
Expand Down
Expand Up @@ -21,14 +21,17 @@

import java.sql.Types;

import org.jumpmind.db.AbstractDatabasePlatform;
import javax.sql.DataSource;

import org.jumpmind.db.DatabasePlatformInfo;
import org.jumpmind.db.platform.AbstractJdbcDatabasePlatform;
import org.jumpmind.util.Log;

/*
* The platform implementation for the Firebird database.
* It is assumed that the database is configured with sql dialect 3!
*/
public class FirebirdPlatform extends AbstractDatabasePlatform {
public class FirebirdPlatform extends AbstractJdbcDatabasePlatform {
/* Database name of this platform. */
public static final String DATABASENAME = "Firebird";

Expand All @@ -41,7 +44,8 @@ public class FirebirdPlatform extends AbstractDatabasePlatform {
/*
* Creates a new Firebird platform instance.
*/
public FirebirdPlatform() {
public FirebirdPlatform(DataSource dataSource, Log log) {
super(dataSource, log);

DatabasePlatformInfo info = getPlatformInfo();

Expand Down
@@ -1,6 +1,9 @@
package org.jumpmind.db.platform.greenplum;

import javax.sql.DataSource;

import org.jumpmind.db.platform.postgresql.PostgreSqlPlatform;
import org.jumpmind.util.Log;

public class GreenplumPlatform extends PostgreSqlPlatform {

Expand All @@ -12,7 +15,8 @@ public class GreenplumPlatform extends PostgreSqlPlatform {
public static final String SQL_GET_GREENPLUM_NAME = "select gpname from gp_id";
public static final String SQL_GET_GREENPLUM_VERSION = "select productversion from gp_version_at_initdb";

public GreenplumPlatform() {
public GreenplumPlatform(DataSource dataSource, Log log) {
super(dataSource, log);
info.setTriggersSupported(false);
this.ddlReader = new GreenplumDdlReader(log, this);
}
Expand Down
Expand Up @@ -21,13 +21,16 @@

import java.sql.Types;

import org.jumpmind.db.AbstractDatabasePlatform;
import javax.sql.DataSource;

import org.jumpmind.db.IDatabasePlatform;
import org.jumpmind.db.platform.AbstractJdbcDatabasePlatform;
import org.jumpmind.util.Log;

/*
* The platform implementation for the H2 database.
*/
public class H2Platform extends AbstractDatabasePlatform implements IDatabasePlatform {
public class H2Platform extends AbstractJdbcDatabasePlatform implements IDatabasePlatform {

/* Database name of this platform. */
public static final String[] DATABASENAMES = { "H2", "H21" };
Expand All @@ -41,7 +44,8 @@ public class H2Platform extends AbstractDatabasePlatform implements IDatabasePla
/*
* Creates a new instance of the H2 platform.
*/
public H2Platform() {
public H2Platform(DataSource dataSource, Log log) {
super(dataSource, log);

info.setNonPKIdentityColumnsSupported(false);
info.setIdentityOverrideAllowed(false);
Expand Down
Expand Up @@ -21,14 +21,15 @@

import java.sql.Types;

import org.jumpmind.db.AbstractDatabasePlatform;
import javax.sql.DataSource;

import org.jumpmind.db.platform.AbstractJdbcDatabasePlatform;
import org.jumpmind.util.Log;

/*
* The platform implementation for the HsqlDb database.
*
* @version $Revision: 231306 $
*/
public class HsqlDbPlatform extends AbstractDatabasePlatform {
public class HsqlDbPlatform extends AbstractJdbcDatabasePlatform {
/* Database name of this platform. */
public static final String DATABASENAME = "HsqlDb";

Expand All @@ -41,7 +42,8 @@ public class HsqlDbPlatform extends AbstractDatabasePlatform {
/*
* Creates a new instance of the Hsqldb platform.
*/
public HsqlDbPlatform() {
public HsqlDbPlatform(DataSource dataSource, Log log) {
super(dataSource, log);


info.setNonPKIdentityColumnsSupported(false);
Expand Down

0 comments on commit 3246ded

Please sign in to comment.