@@ -244,6 +244,19 @@ public boolean isNamedBinding() {
244
244
}
245
245
246
246
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
+
247
260
/**
248
261
* Create a ReturnResultSetParameter/SqlOutParameter depending on the support provided
249
262
* by the JDBC driver used for the database in use.
@@ -252,13 +265,13 @@ public boolean isNamedBinding() {
252
265
* @return the appropriate SqlParameter
253
266
*/
254
267
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 ()) {
257
270
return new SqlReturnResultSet (parameterName , rowMapper );
258
271
}
259
272
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 );
262
275
}
263
276
else {
264
277
throw new InvalidDataAccessApiUsageException ("Return of a ResultSet from a stored procedure is not supported." );
@@ -290,14 +303,6 @@ public List<SqlParameter> getCallParameters() {
290
303
return this .callParameters ;
291
304
}
292
305
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
-
301
306
/**
302
307
* Process the list of parameters provided, and if procedure column metadata is used,
303
308
* the parameters will be matched against the metadata information and any missing
@@ -312,7 +317,7 @@ public void processParameters(List<SqlParameter> parameters) {
312
317
* Reconcile the provided parameters with available metadata and add new ones where appropriate.
313
318
*/
314
319
protected List <SqlParameter > reconcileParameters (List <SqlParameter > parameters ) {
315
- Assert . state ( this . metaDataProvider != null , "No CallMetaDataProvider available" );
320
+ CallMetaDataProvider provider = obtainMetaDataProvider ( );
316
321
317
322
final List <SqlParameter > declaredReturnParams = new ArrayList <>();
318
323
final Map <String , SqlParameter > declaredParams = new LinkedHashMap <>();
@@ -321,7 +326,7 @@ protected List<SqlParameter> reconcileParameters(List<SqlParameter> parameters)
321
326
List <String > metaDataParamNames = new ArrayList <>();
322
327
323
328
// Get the names of the meta data parameters
324
- for (CallParameterMetaData meta : this . metaDataProvider .getCallParameterMetaData ()) {
329
+ for (CallParameterMetaData meta : provider .getCallParameterMetaData ()) {
325
330
if (meta .getParameterType () != DatabaseMetaData .procedureColumnReturn ) {
326
331
metaDataParamNames .add (lowerCase (meta .getParameterName ()));
327
332
}
@@ -338,7 +343,7 @@ protected List<SqlParameter> reconcileParameters(List<SqlParameter> parameters)
338
343
throw new IllegalArgumentException ("Anonymous parameters not supported for calls - " +
339
344
"please specify a name for the parameter of SQL type " + param .getSqlType ());
340
345
}
341
- String paramNameToMatch = lowerCase (this . metaDataProvider .parameterNameToUse (paramName ));
346
+ String paramNameToMatch = lowerCase (provider .parameterNameToUse (paramName ));
342
347
declaredParams .put (paramNameToMatch , param );
343
348
if (param instanceof SqlOutParameter ) {
344
349
outParamNames .add (paramName );
@@ -360,24 +365,23 @@ protected List<SqlParameter> reconcileParameters(List<SqlParameter> parameters)
360
365
List <SqlParameter > workParams = new ArrayList <>();
361
366
workParams .addAll (declaredReturnParams );
362
367
363
- if (!this . metaDataProvider .isProcedureColumnMetaDataUsed ()) {
368
+ if (!provider .isProcedureColumnMetaDataUsed ()) {
364
369
workParams .addAll (declaredParams .values ());
365
370
return workParams ;
366
371
}
367
372
368
373
Map <String , String > limitedInParamNamesMap = new HashMap <>(this .limitedInParameterNames .size ());
369
374
for (String limitedParamName : this .limitedInParameterNames ) {
370
- limitedInParamNamesMap .put (
371
- lowerCase (this .metaDataProvider .parameterNameToUse (limitedParamName )), limitedParamName );
375
+ limitedInParamNamesMap .put (lowerCase (provider .parameterNameToUse (limitedParamName )), limitedParamName );
372
376
}
373
377
374
- for (CallParameterMetaData meta : this . metaDataProvider .getCallParameterMetaData ()) {
378
+ for (CallParameterMetaData meta : provider .getCallParameterMetaData ()) {
375
379
String paramName = meta .getParameterName ();
376
380
String paramNameToCheck = null ;
377
381
if (paramName != null ) {
378
- paramNameToCheck = lowerCase (this . metaDataProvider .parameterNameToUse (paramName ));
382
+ paramNameToCheck = lowerCase (provider .parameterNameToUse (paramName ));
379
383
}
380
- String paramNameToUse = this . metaDataProvider .parameterNameToUse (paramName );
384
+ String paramNameToUse = provider .parameterNameToUse (paramName );
381
385
if (declaredParams .containsKey (paramNameToCheck ) ||
382
386
(meta .getParameterType () == DatabaseMetaData .procedureColumnReturn && returnDeclared )) {
383
387
SqlParameter param ;
@@ -409,15 +413,15 @@ else if (paramName != null) {
409
413
else {
410
414
if (meta .getParameterType () == DatabaseMetaData .procedureColumnReturn ) {
411
415
if (!isFunction () && !isReturnValueRequired () && paramName != null &&
412
- this . metaDataProvider .byPassReturnParameter (paramName )) {
416
+ provider .byPassReturnParameter (paramName )) {
413
417
if (logger .isDebugEnabled ()) {
414
418
logger .debug ("Bypassing metadata return parameter for '" + paramName + "'" );
415
419
}
416
420
}
417
421
else {
418
422
String returnNameToUse =
419
423
(StringUtils .hasLength (paramNameToUse ) ? paramNameToUse : getFunctionReturnName ());
420
- workParams .add (this . metaDataProvider .createDefaultOutParameter (returnNameToUse , meta ));
424
+ workParams .add (provider .createDefaultOutParameter (returnNameToUse , meta ));
421
425
if (isFunction ()) {
422
426
setFunctionReturnName (returnNameToUse );
423
427
outParamNames .add (returnNameToUse );
@@ -432,14 +436,14 @@ else if (paramName != null) {
432
436
paramNameToUse = "" ;
433
437
}
434
438
if (meta .getParameterType () == DatabaseMetaData .procedureColumnOut ) {
435
- workParams .add (this . metaDataProvider .createDefaultOutParameter (paramNameToUse , meta ));
439
+ workParams .add (provider .createDefaultOutParameter (paramNameToUse , meta ));
436
440
outParamNames .add (paramNameToUse );
437
441
if (logger .isDebugEnabled ()) {
438
442
logger .debug ("Added metadata out parameter for '" + paramNameToUse + "'" );
439
443
}
440
444
}
441
445
else if (meta .getParameterType () == DatabaseMetaData .procedureColumnInOut ) {
442
- workParams .add (this . metaDataProvider .createDefaultInOutParameter (paramNameToUse , meta ));
446
+ workParams .add (provider .createDefaultInOutParameter (paramNameToUse , meta ));
443
447
outParamNames .add (paramNameToUse );
444
448
if (logger .isDebugEnabled ()) {
445
449
logger .debug ("Added metadata in out parameter for '" + paramNameToUse + "'" );
@@ -448,7 +452,7 @@ else if (meta.getParameterType() == DatabaseMetaData.procedureColumnInOut) {
448
452
else {
449
453
if (this .limitedInParameterNames .isEmpty () ||
450
454
limitedInParamNamesMap .containsKey (lowerCase (paramNameToUse ))) {
451
- workParams .add (this . metaDataProvider .createDefaultInParameter (paramNameToUse , meta ));
455
+ workParams .add (provider .createDefaultInParameter (paramNameToUse , meta ));
452
456
if (logger .isDebugEnabled ()) {
453
457
logger .debug ("Added metadata in parameter for '" + paramNameToUse + "'" );
454
458
}
@@ -473,8 +477,6 @@ else if (meta.getParameterType() == DatabaseMetaData.procedureColumnInOut) {
473
477
* @return a Map containing the matched parameter names with the value taken from the input
474
478
*/
475
479
public Map <String , Object > matchInParameterValuesWithCallParameters (SqlParameterSource parameterSource ) {
476
- Assert .state (this .metaDataProvider != null , "No CallMetaDataProvider available" );
477
-
478
480
// For parameter source lookups we need to provide case-insensitive lookup support
479
481
// since the database metadata is not necessarily providing case sensitive parameter names.
480
482
Map <String , String > caseInsensitiveParameterNames =
@@ -485,7 +487,7 @@ public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameter
485
487
for (SqlParameter parameter : this .callParameters ) {
486
488
if (parameter .isInputValueProvided ()) {
487
489
String parameterName = parameter .getName ();
488
- String parameterNameToMatch = this . metaDataProvider .parameterNameToUse (parameterName );
490
+ String parameterNameToMatch = obtainMetaDataProvider () .parameterNameToUse (parameterName );
489
491
if (parameterNameToMatch != null ) {
490
492
callParameterNames .put (parameterNameToMatch .toLowerCase (), parameterName );
491
493
}
@@ -538,16 +540,16 @@ public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameter
538
540
* @return a Map containing the matched parameter names with the value taken from the input
539
541
*/
540
542
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 ()) {
543
545
return inParameters ;
544
546
}
545
547
546
548
Map <String , String > callParameterNames = new HashMap <>(this .callParameters .size ());
547
549
for (SqlParameter parameter : this .callParameters ) {
548
550
if (parameter .isInputValueProvided ()) {
549
551
String parameterName = parameter .getName ();
550
- String parameterNameToMatch = this . metaDataProvider .parameterNameToUse (parameterName );
552
+ String parameterNameToMatch = provider .parameterNameToUse (parameterName );
551
553
if (parameterNameToMatch != null ) {
552
554
callParameterNames .put (parameterNameToMatch .toLowerCase (), parameterName );
553
555
}
@@ -556,7 +558,7 @@ public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameter
556
558
557
559
Map <String , Object > matchedParameters = new HashMap <>(inParameters .size ());
558
560
for (String parameterName : inParameters .keySet ()) {
559
- String parameterNameToMatch = this . metaDataProvider .parameterNameToUse (parameterName );
561
+ String parameterNameToMatch = provider .parameterNameToUse (parameterName );
560
562
String callParameterName = callParameterNames .get (lowerCase (parameterNameToMatch ));
561
563
if (callParameterName == null ) {
562
564
if (logger .isDebugEnabled ()) {
@@ -577,7 +579,7 @@ public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameter
577
579
578
580
if (matchedParameters .size () < callParameterNames .size ()) {
579
581
for (String parameterName : callParameterNames .keySet ()) {
580
- String parameterNameToMatch = this . metaDataProvider .parameterNameToUse (parameterName );
582
+ String parameterNameToMatch = provider .parameterNameToUse (parameterName );
581
583
String callParameterName = callParameterNames .get (lowerCase (parameterNameToMatch ));
582
584
if (!matchedParameters .containsKey (callParameterName )) {
583
585
logger .warn ("Unable to locate the corresponding parameter value for '" + parameterName +
0 commit comments