/**
* Copyright 2007 - 2011 Skyway Software, Inc.
*/
package org.skyway.spring.util.dao.call;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import javax.sql.DataSource;
import org.skyway.spring.util.dao.call.oracle.OracleTypeHandler;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.jdbc.core.metadata.CallMetaDataContext;
import org.springframework.jdbc.core.metadata.CallMetaDataProvider;
import org.springframework.jdbc.core.metadata.CallMetaDataProviderFactory;
import org.springframework.jdbc.support.DatabaseMetaDataCallback;
import org.springframework.jdbc.support.JdbcUtils;
import org.springframework.jdbc.support.MetaDataAccessException;
public class VendorTypeHandlerFactory {
/** List of supported database products for procedure calls */
public static final List<String> supportedDatabaseProductsForProcedures = Arrays.asList(
"Apache Derby", //$NON-NLS-1$
"DB2", //$NON-NLS-1$
"MySQL", //$NON-NLS-1$
"Microsoft SQL Server", //$NON-NLS-1$
"Oracle", //$NON-NLS-1$
"PostgreSQL", //$NON-NLS-1$
"Sybase" //$NON-NLS-1$
);
/** List of supported database products for function calls */
public static final List<String> supportedDatabaseProductsForFunctions = Arrays.asList(
"MySQL", //$NON-NLS-1$
"Microsoft SQL Server", //$NON-NLS-1$
"Oracle", //$NON-NLS-1$
"PostgreSQL" //$NON-NLS-1$
);
/**
* Create a CallMetaDataProvider based on the database metedata
* @param dataSource used to retrieve metedata
* @param context the class that holds configuration and metedata
* @return instance of the CallMetaDataProvider implementation to be used
*/
static public CallMetaDataProvider createMetaDataProvider(final DataSource dataSource, final CallMetaDataContext context) {
try {
CallMetaDataProvider provider = (CallMetaDataProvider) JdbcUtils.extractDatabaseMetaData(dataSource, new DatabaseMetaDataCallback() {
public Object processMetaData(DatabaseMetaData databaseMetaData) throws SQLException, MetaDataAccessException {
String databaseProductName = JdbcUtils.commonDatabaseName(databaseMetaData.getDatabaseProductName());
boolean accessProcedureColumnMetaData = context.isAccessCallParameterMetaData();
if (context.isFunction()) {
if (!supportedDatabaseProductsForFunctions.contains(databaseProductName)) {
if (accessProcedureColumnMetaData) {
accessProcedureColumnMetaData = false;
}
}
}
else {
if (!supportedDatabaseProductsForProcedures.contains(databaseProductName)) {
if (accessProcedureColumnMetaData) {
accessProcedureColumnMetaData = false;
}
}
}
CallMetaDataProvider provider = null;
if ("Oracle".equals(databaseProductName)) { //$NON-NLS-1$
provider = new OracleTypeHandler(databaseMetaData);
}
if (provider != null){
provider.initializeWithMetaData(databaseMetaData);
if (accessProcedureColumnMetaData) {
provider.initializeWithProcedureColumnMetaData(
databaseMetaData, context.getCatalogName(), context.getSchemaName(), context.getProcedureName());
}
}
return provider;
}
});
if (provider == null){
provider = CallMetaDataProviderFactory.createMetaDataProvider(dataSource, context);
}
return provider;
}catch (MetaDataAccessException ex) {
throw new DataAccessResourceFailureException("Error retreiving database metadata", ex); //$NON-NLS-1$
}
}
}