/**
* 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();
}
}