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

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

/**
* Copyright 2007 - 2011 Skyway Software, Inc.
*/
package org.skyway.spring.util.dao.call;

import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.sql.DataSource;

import org.springframework.jdbc.core.CallableStatementCreatorFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.metadata.CallMetaDataProvider;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;

public class AdvancedMetaDataJdbcCall extends MetaDataJdbcCall {
  /** context used to retrieve and manage database metadata */
  private AdvancedCallMetaDataContext callMetaDataContext = new AdvancedCallMetaDataContext();
  private String callString;
 
  /**
   * Object enabling us to create CallableStatementCreators
   * efficiently, based on this class's declared parameters.
   */
  private CallableStatementCreatorFactory callableStatementFactory;

  /**
   * Get the {@link CallableStatementCreatorFactory} being used
   */
  @Override
  protected CallableStatementCreatorFactory getCallableStatementFactory() {
    return this.callableStatementFactory;
  }
 
  /**
   * Instantiates a new meta data jdbc call.
   *
   * @param dataSource the data source
   */
  public AdvancedMetaDataJdbcCall(DataSource dataSource) {
    super(dataSource);
  }

  /**
   * Instantiates a new meta data jdbc call.
   *
   * @param jdbcTemplate the jdbc template
   */
  public AdvancedMetaDataJdbcCall(JdbcTemplate jdbcTemplate) {
    super(jdbcTemplate);
  }

  @Override
  public String getCallString() {
    return this.callString;
  }
 
  /**
   * Method to perform the actual compilation.  Subclasses can override this template method to perform
   * their own compilation.  Invoked after this base class's compilation is complete.
   */
  @Override
  protected void compileInternal() {
    this.callMetaDataContext.initializeMetaData(getJdbcTemplate().getDataSource());

    callMetaDataContext.processParameters(getCallParameters());

    this.callString = this.callMetaDataContext.createCallString();

    this.callableStatementFactory = new CallableStatementCreatorFactory(getCallString(), this.callMetaDataContext.getCallParameters());
    this.callableStatementFactory.setNativeJdbcExtractor(getJdbcTemplate().getNativeJdbcExtractor());

    onCompileInternal();
  }
 
  @Override
  public Object convertInputValue(SqlParameter sqlParameter, Object value){
    CallMetaDataProvider metaDataProvider = callMetaDataContext.getMetaDataProvider();

    if (metaDataProvider instanceof VendorTypeHandler){
      return ((VendorTypeHandler)callMetaDataContext.getMetaDataProvider()).transformInputValue(getJdbcTemplate(), sqlParameter, value);
    }
   
    return value;
  }
 
  @Override
  public Object convertOutputValue(SqlParameter sqlParameter, Object value){
    CallMetaDataProvider metaDataProvider = callMetaDataContext.getMetaDataProvider();
   
    if (metaDataProvider instanceof VendorTypeHandler){
      SqlParameter logicalParameter = getLogicalParameterByDbName(sqlParameter.getName());
   
      if (logicalParameter instanceof TypedSqlOutParameter){
        return ((VendorTypeHandler)callMetaDataContext.getMetaDataProvider()).transformOutputValue(getJdbcTemplate(), sqlParameter, value, ((TypedSqlOutParameter)logicalParameter).getType());
      }
    }

    return value;
  }
 
  /**
   * Set the name of the stored procedure.
   */
  @Override
  public void setProcedureName(String procedureName) {
    this.callMetaDataContext.setProcedureName(procedureName);
  }

  /**
   * Get the name of the stored procedure.
   */
  @Override
  public String getProcedureName() {
    return this.callMetaDataContext.getProcedureName();
  }

  /**
   * Set the names of in parameters to be used.
   */
  @Override
  public void setInParameterNames(Set<String> inParameterNames) {
    this.callMetaDataContext.setLimitedInParameterNames(inParameterNames);
  }

  /**
   * Get the names of in parameters to be used.
   */
  @Override
  public Set<String> getInParameterNames() {
    return this.callMetaDataContext.getLimitedInParameterNames();
  }

  /**
   * Set the catalog name to use.
   */
  @Override
  public void setCatalogName(String catalogName) {
    this.callMetaDataContext.setCatalogName(catalogName);
  }

  /**
   * Get the catalog name used.
   */
  @Override
  public String getCatalogName() {
    return this.callMetaDataContext.getCatalogName();
  }

  /**
   * Set the schema name to use,
   */
  @Override
  public void setSchemaName(String schemaName) {
    this.callMetaDataContext.setSchemaName(schemaName);
  }

  /**
   * Get the schema name used.
   */
  @Override
  public String getSchemaName() {
    return this.callMetaDataContext.getSchemaName();
  }

  /**
   * Specify whether this call is a function call.
   */
  @Override
  public void setFunction(boolean function) {
    this.callMetaDataContext.setFunction(function);
  }

  /**
   * Is this call a function call?
   */
  @Override
  public boolean isFunction() {
    return this.callMetaDataContext.isFunction();
  }

  /**
   * Specify whether the call requires a rerurn value.
   */
  @Override
  public void setReturnValueRequired(boolean b) {
    this.callMetaDataContext.setReturnValueRequired(b);
  }

  /**
   * Does the call require a return value?
   */
  @Override
  public boolean isReturnValueRequired() {
    return this.callMetaDataContext.isReturnValueRequired();
  }

  /**
   * Specify whether the parameter metadata for the call should be used.  The default is true.
   */
  @Override
  public void setAccessCallParameterMetaData(boolean accessCallParameterMetaData) {
    this.callMetaDataContext.setAccessCallParameterMetaData(accessCallParameterMetaData);
  }

  /**
   * Get the name of a single out parameter or return value.
   * Used for functions or procedures with one out parameter.
   */
  @Override
  protected String getScalarOutParameterName() {
    return this.callMetaDataContext.getScalarOutParameterName();
  }

  /**
   * Match the provided in parameter values with registered parameters and
   * parameters defined via metadata processing.
   * @param parameterSource the parameter vakues provided as a {@link SqlParameterSource}
   * @return Map with parameter names and values
   */
  @Override
  protected Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameterSource parameterSource) {
    return this.callMetaDataContext.matchInParameterValuesWithCallParameters(parameterSource);
  }

  /**
   * Match the provided in parameter values with registered parameters and
   * parameters defined via metadata processing.
   * @param args the parameter values provided in a Map
   * @return Map with parameter names and values
   */
  @Override
  protected Map<String, Object> matchInParameterValuesWithCallParameters(Map<String, Object> args) {
    args.putAll(getDbNameToValueMap());
   
    return this.callMetaDataContext.matchInParameterValuesWithCallParameters(args);
  }

  /**
   * Get a List of all the call parameters to be used for call. This includes any parameters added
   * based on meta data processing.
   */
  @Override
  protected List<SqlParameter> getCallParameters() {
    return this.callMetaDataContext.getCallParameters();
  }
}
TOP

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

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.