@@ -244,6 +244,19 @@ public boolean isNamedBinding() {
244244 }
245245
246246
247+ /**
248+ * Initialize this class with metadata from the database.
249+ * @param dataSource the DataSource used to retrieve metadata
250+ */
251+ public void initializeMetaData (DataSource dataSource ) {
252+ this .metaDataProvider = CallMetaDataProviderFactory .createMetaDataProvider (dataSource , this );
253+ }
254+
255+ private CallMetaDataProvider obtainMetaDataProvider () {
256+ Assert .state (this .metaDataProvider != null , "No CallMetaDataProvider - call initializeMetaData first" );
257+ return this .metaDataProvider ;
258+ }
259+
247260 /**
248261 * Create a ReturnResultSetParameter/SqlOutParameter depending on the support provided
249262 * by the JDBC driver used for the database in use.
@@ -252,13 +265,13 @@ public boolean isNamedBinding() {
252265 * @return the appropriate SqlParameter
253266 */
254267 public SqlParameter createReturnResultSetParameter (String parameterName , RowMapper <?> rowMapper ) {
255- Assert . state ( this . metaDataProvider != null , "No CallMetaDataProvider available" );
256- if (this . metaDataProvider .isReturnResultSetSupported ()) {
268+ CallMetaDataProvider provider = obtainMetaDataProvider ( );
269+ if (provider .isReturnResultSetSupported ()) {
257270 return new SqlReturnResultSet (parameterName , rowMapper );
258271 }
259272 else {
260- if (this . metaDataProvider .isRefCursorSupported ()) {
261- return new SqlOutParameter (parameterName , this . metaDataProvider .getRefCursorSqlType (), rowMapper );
273+ if (provider .isRefCursorSupported ()) {
274+ return new SqlOutParameter (parameterName , provider .getRefCursorSqlType (), rowMapper );
262275 }
263276 else {
264277 throw new InvalidDataAccessApiUsageException ("Return of a ResultSet from a stored procedure is not supported." );
@@ -290,14 +303,6 @@ public List<SqlParameter> getCallParameters() {
290303 return this .callParameters ;
291304 }
292305
293- /**
294- * Initialize this class with metadata from the database.
295- * @param dataSource the DataSource used to retrieve metadata
296- */
297- public void initializeMetaData (DataSource dataSource ) {
298- this .metaDataProvider = CallMetaDataProviderFactory .createMetaDataProvider (dataSource , this );
299- }
300-
301306 /**
302307 * Process the list of parameters provided, and if procedure column metadata is used,
303308 * the parameters will be matched against the metadata information and any missing
@@ -312,7 +317,7 @@ public void processParameters(List<SqlParameter> parameters) {
312317 * Reconcile the provided parameters with available metadata and add new ones where appropriate.
313318 */
314319 protected List <SqlParameter > reconcileParameters (List <SqlParameter > parameters ) {
315- Assert . state ( this . metaDataProvider != null , "No CallMetaDataProvider available" );
320+ CallMetaDataProvider provider = obtainMetaDataProvider ( );
316321
317322 final List <SqlParameter > declaredReturnParams = new ArrayList <>();
318323 final Map <String , SqlParameter > declaredParams = new LinkedHashMap <>();
@@ -321,7 +326,7 @@ protected List<SqlParameter> reconcileParameters(List<SqlParameter> parameters)
321326 List <String > metaDataParamNames = new ArrayList <>();
322327
323328 // Get the names of the meta data parameters
324- for (CallParameterMetaData meta : this . metaDataProvider .getCallParameterMetaData ()) {
329+ for (CallParameterMetaData meta : provider .getCallParameterMetaData ()) {
325330 if (meta .getParameterType () != DatabaseMetaData .procedureColumnReturn ) {
326331 metaDataParamNames .add (lowerCase (meta .getParameterName ()));
327332 }
@@ -338,7 +343,7 @@ protected List<SqlParameter> reconcileParameters(List<SqlParameter> parameters)
338343 throw new IllegalArgumentException ("Anonymous parameters not supported for calls - " +
339344 "please specify a name for the parameter of SQL type " + param .getSqlType ());
340345 }
341- String paramNameToMatch = lowerCase (this . metaDataProvider .parameterNameToUse (paramName ));
346+ String paramNameToMatch = lowerCase (provider .parameterNameToUse (paramName ));
342347 declaredParams .put (paramNameToMatch , param );
343348 if (param instanceof SqlOutParameter ) {
344349 outParamNames .add (paramName );
@@ -360,24 +365,23 @@ protected List<SqlParameter> reconcileParameters(List<SqlParameter> parameters)
360365 List <SqlParameter > workParams = new ArrayList <>();
361366 workParams .addAll (declaredReturnParams );
362367
363- if (!this . metaDataProvider .isProcedureColumnMetaDataUsed ()) {
368+ if (!provider .isProcedureColumnMetaDataUsed ()) {
364369 workParams .addAll (declaredParams .values ());
365370 return workParams ;
366371 }
367372
368373 Map <String , String > limitedInParamNamesMap = new HashMap <>(this .limitedInParameterNames .size ());
369374 for (String limitedParamName : this .limitedInParameterNames ) {
370- limitedInParamNamesMap .put (
371- lowerCase (this .metaDataProvider .parameterNameToUse (limitedParamName )), limitedParamName );
375+ limitedInParamNamesMap .put (lowerCase (provider .parameterNameToUse (limitedParamName )), limitedParamName );
372376 }
373377
374- for (CallParameterMetaData meta : this . metaDataProvider .getCallParameterMetaData ()) {
378+ for (CallParameterMetaData meta : provider .getCallParameterMetaData ()) {
375379 String paramName = meta .getParameterName ();
376380 String paramNameToCheck = null ;
377381 if (paramName != null ) {
378- paramNameToCheck = lowerCase (this . metaDataProvider .parameterNameToUse (paramName ));
382+ paramNameToCheck = lowerCase (provider .parameterNameToUse (paramName ));
379383 }
380- String paramNameToUse = this . metaDataProvider .parameterNameToUse (paramName );
384+ String paramNameToUse = provider .parameterNameToUse (paramName );
381385 if (declaredParams .containsKey (paramNameToCheck ) ||
382386 (meta .getParameterType () == DatabaseMetaData .procedureColumnReturn && returnDeclared )) {
383387 SqlParameter param ;
@@ -409,15 +413,15 @@ else if (paramName != null) {
409413 else {
410414 if (meta .getParameterType () == DatabaseMetaData .procedureColumnReturn ) {
411415 if (!isFunction () && !isReturnValueRequired () && paramName != null &&
412- this . metaDataProvider .byPassReturnParameter (paramName )) {
416+ provider .byPassReturnParameter (paramName )) {
413417 if (logger .isDebugEnabled ()) {
414418 logger .debug ("Bypassing metadata return parameter for '" + paramName + "'" );
415419 }
416420 }
417421 else {
418422 String returnNameToUse =
419423 (StringUtils .hasLength (paramNameToUse ) ? paramNameToUse : getFunctionReturnName ());
420- workParams .add (this . metaDataProvider .createDefaultOutParameter (returnNameToUse , meta ));
424+ workParams .add (provider .createDefaultOutParameter (returnNameToUse , meta ));
421425 if (isFunction ()) {
422426 setFunctionReturnName (returnNameToUse );
423427 outParamNames .add (returnNameToUse );
@@ -432,14 +436,14 @@ else if (paramName != null) {
432436 paramNameToUse = "" ;
433437 }
434438 if (meta .getParameterType () == DatabaseMetaData .procedureColumnOut ) {
435- workParams .add (this . metaDataProvider .createDefaultOutParameter (paramNameToUse , meta ));
439+ workParams .add (provider .createDefaultOutParameter (paramNameToUse , meta ));
436440 outParamNames .add (paramNameToUse );
437441 if (logger .isDebugEnabled ()) {
438442 logger .debug ("Added metadata out parameter for '" + paramNameToUse + "'" );
439443 }
440444 }
441445 else if (meta .getParameterType () == DatabaseMetaData .procedureColumnInOut ) {
442- workParams .add (this . metaDataProvider .createDefaultInOutParameter (paramNameToUse , meta ));
446+ workParams .add (provider .createDefaultInOutParameter (paramNameToUse , meta ));
443447 outParamNames .add (paramNameToUse );
444448 if (logger .isDebugEnabled ()) {
445449 logger .debug ("Added metadata in out parameter for '" + paramNameToUse + "'" );
@@ -448,7 +452,7 @@ else if (meta.getParameterType() == DatabaseMetaData.procedureColumnInOut) {
448452 else {
449453 if (this .limitedInParameterNames .isEmpty () ||
450454 limitedInParamNamesMap .containsKey (lowerCase (paramNameToUse ))) {
451- workParams .add (this . metaDataProvider .createDefaultInParameter (paramNameToUse , meta ));
455+ workParams .add (provider .createDefaultInParameter (paramNameToUse , meta ));
452456 if (logger .isDebugEnabled ()) {
453457 logger .debug ("Added metadata in parameter for '" + paramNameToUse + "'" );
454458 }
@@ -473,8 +477,6 @@ else if (meta.getParameterType() == DatabaseMetaData.procedureColumnInOut) {
473477 * @return a Map containing the matched parameter names with the value taken from the input
474478 */
475479 public Map <String , Object > matchInParameterValuesWithCallParameters (SqlParameterSource parameterSource ) {
476- Assert .state (this .metaDataProvider != null , "No CallMetaDataProvider available" );
477-
478480 // For parameter source lookups we need to provide case-insensitive lookup support
479481 // since the database metadata is not necessarily providing case sensitive parameter names.
480482 Map <String , String > caseInsensitiveParameterNames =
@@ -485,7 +487,7 @@ public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameter
485487 for (SqlParameter parameter : this .callParameters ) {
486488 if (parameter .isInputValueProvided ()) {
487489 String parameterName = parameter .getName ();
488- String parameterNameToMatch = this . metaDataProvider .parameterNameToUse (parameterName );
490+ String parameterNameToMatch = obtainMetaDataProvider () .parameterNameToUse (parameterName );
489491 if (parameterNameToMatch != null ) {
490492 callParameterNames .put (parameterNameToMatch .toLowerCase (), parameterName );
491493 }
@@ -538,16 +540,16 @@ public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameter
538540 * @return a Map containing the matched parameter names with the value taken from the input
539541 */
540542 public Map <String , ?> matchInParameterValuesWithCallParameters (Map <String , ?> inParameters ) {
541- Assert . state ( this . metaDataProvider != null , "No CallMetaDataProvider available" );
542- if (!this . metaDataProvider .isProcedureColumnMetaDataUsed ()) {
543+ CallMetaDataProvider provider = obtainMetaDataProvider ( );
544+ if (!provider .isProcedureColumnMetaDataUsed ()) {
543545 return inParameters ;
544546 }
545547
546548 Map <String , String > callParameterNames = new HashMap <>(this .callParameters .size ());
547549 for (SqlParameter parameter : this .callParameters ) {
548550 if (parameter .isInputValueProvided ()) {
549551 String parameterName = parameter .getName ();
550- String parameterNameToMatch = this . metaDataProvider .parameterNameToUse (parameterName );
552+ String parameterNameToMatch = provider .parameterNameToUse (parameterName );
551553 if (parameterNameToMatch != null ) {
552554 callParameterNames .put (parameterNameToMatch .toLowerCase (), parameterName );
553555 }
@@ -556,7 +558,7 @@ public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameter
556558
557559 Map <String , Object > matchedParameters = new HashMap <>(inParameters .size ());
558560 for (String parameterName : inParameters .keySet ()) {
559- String parameterNameToMatch = this . metaDataProvider .parameterNameToUse (parameterName );
561+ String parameterNameToMatch = provider .parameterNameToUse (parameterName );
560562 String callParameterName = callParameterNames .get (lowerCase (parameterNameToMatch ));
561563 if (callParameterName == null ) {
562564 if (logger .isDebugEnabled ()) {
@@ -577,7 +579,7 @@ public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameter
577579
578580 if (matchedParameters .size () < callParameterNames .size ()) {
579581 for (String parameterName : callParameterNames .keySet ()) {
580- String parameterNameToMatch = this . metaDataProvider .parameterNameToUse (parameterName );
582+ String parameterNameToMatch = provider .parameterNameToUse (parameterName );
581583 String callParameterName = callParameterNames .get (lowerCase (parameterNameToMatch ));
582584 if (!matchedParameters .containsKey (callParameterName )) {
583585 logger .warn ("Unable to locate the corresponding parameter value for '" + parameterName +
0 commit comments