Package org.skyway.spring.util.dao.call

Source Code of org.skyway.spring.util.dao.call.VendorTypeHandlerFactory

/**
* 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$
    }
  }

}
TOP

Related Classes of org.skyway.spring.util.dao.call.VendorTypeHandlerFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.