Skip to content

Commit 0f92482

Browse files
committed
revised OracleTableMetaDataProvider for reliable Oracle Connection detection; autodetect JdbcTemplate's NativeJdbcExtractor (SPR-7611)
1 parent 1f1577e commit 0f92482

File tree

5 files changed

+249
-238
lines changed

5 files changed

+249
-238
lines changed

org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericTableMetaDataProvider.java

Lines changed: 91 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2007 the original author or authors.
2+
* Copyright 2002-2010 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -33,8 +33,8 @@
3333
import org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor;
3434

3535
/**
36-
* A generic implementation of the {@link TableMetaDataProvider} that should provide enough features for all supported
37-
* databases.
36+
* A generic implementation of the {@link TableMetaDataProvider} that should provide
37+
* enough features for all supported databases.
3838
*
3939
* @author Thomas Risberg
4040
* @since 2.5
@@ -67,30 +67,23 @@ public class GenericTableMetaDataProvider implements TableMetaDataProvider {
6767

6868
/** database products we know not supporting the use of a String[] for generated keys */
6969
private List productsNotSupportingGeneratedKeysColumnNameArray =
70-
Arrays.asList(new String[] {"Apache Derby", "HSQL Database Engine"});
70+
Arrays.asList("Apache Derby", "HSQL Database Engine");
7171

7272
/** Collection of TableParameterMetaData objects */
7373
private List<TableParameterMetaData> insertParameterMetaData = new ArrayList<TableParameterMetaData>();
7474

7575
/** NativeJdbcExtractor that can be used to retrieve the native connection */
76-
protected NativeJdbcExtractor nativeJdbcExtractor = null;
76+
private NativeJdbcExtractor nativeJdbcExtractor;
7777

7878

7979
/**
8080
* Constructor used to initialize with provided database meta data.
8181
* @param databaseMetaData meta data to be used
82-
* @throws SQLException
8382
*/
8483
protected GenericTableMetaDataProvider(DatabaseMetaData databaseMetaData) throws SQLException {
85-
userName = databaseMetaData.getUserName();
84+
this.userName = databaseMetaData.getUserName();
8685
}
8786

88-
/**
89-
* Get whether identifiers use upper case
90-
*/
91-
public boolean isStoresUpperCaseIdentifiers() {
92-
return storesUpperCaseIdentifiers;
93-
}
9487

9588
/**
9689
* Specify whether identifiers use upper case
@@ -100,29 +93,36 @@ public void setStoresUpperCaseIdentifiers(boolean storesUpperCaseIdentifiers) {
10093
}
10194

10295
/**
103-
* Get whether identifiers use lower case
96+
* Get whether identifiers use upper case
10497
*/
105-
public boolean isStoresLowerCaseIdentifiers() {
106-
return storesLowerCaseIdentifiers;
98+
public boolean isStoresUpperCaseIdentifiers() {
99+
return this.storesUpperCaseIdentifiers;
107100
}
108101

109102
/**
110-
* Specify whether identifiers use lower case
103+
* Specify whether identifiers use lower case.
111104
*/
112105
public void setStoresLowerCaseIdentifiers(boolean storesLowerCaseIdentifiers) {
113106
this.storesLowerCaseIdentifiers = storesLowerCaseIdentifiers;
114107
}
115108

109+
/**
110+
* Get whether identifiers use lower case
111+
*/
112+
public boolean isStoresLowerCaseIdentifiers() {
113+
return this.storesLowerCaseIdentifiers;
114+
}
115+
116116
public boolean isTableColumnMetaDataUsed() {
117-
return tableColumnMetaDataUsed;
117+
return this.tableColumnMetaDataUsed;
118118
}
119119

120120
public List<TableParameterMetaData> getTableParameterMetaData() {
121-
return insertParameterMetaData;
121+
return this.insertParameterMetaData;
122122
}
123123

124124
public boolean isGetGeneratedKeysSupported() {
125-
return getGeneratedKeysSupported;
125+
return this.getGeneratedKeysSupported;
126126
}
127127

128128
public boolean isGetGeneratedKeysSimulated(){
@@ -140,23 +140,27 @@ public void setGetGeneratedKeysSupported(boolean getGeneratedKeysSupported) {
140140
this.getGeneratedKeysSupported = getGeneratedKeysSupported;
141141
}
142142

143-
public boolean isGeneratedKeysColumnNameArraySupported() {
144-
return generatedKeysColumnNameArraySupported;
145-
}
146-
147143
/**
148144
* Specify whether a column name array is supported for generated keys
149145
*/
150146
public void setGeneratedKeysColumnNameArraySupported(boolean generatedKeysColumnNameArraySupported) {
151147
this.generatedKeysColumnNameArraySupported = generatedKeysColumnNameArraySupported;
152148
}
153149

150+
public boolean isGeneratedKeysColumnNameArraySupported() {
151+
return this.generatedKeysColumnNameArraySupported;
152+
}
153+
154154
public void setNativeJdbcExtractor(NativeJdbcExtractor nativeJdbcExtractor) {
155155
this.nativeJdbcExtractor = nativeJdbcExtractor;
156156
}
157157

158-
public void initializeWithMetaData(DatabaseMetaData databaseMetaData) throws SQLException {
158+
protected NativeJdbcExtractor getNativeJdbcExtractor() {
159+
return this.nativeJdbcExtractor;
160+
}
159161

162+
163+
public void initializeWithMetaData(DatabaseMetaData databaseMetaData) throws SQLException {
160164
try {
161165
if (databaseMetaData.supportsGetGeneratedKeys()) {
162166
logger.debug("GetGeneratedKeys is supported");
@@ -172,7 +176,7 @@ public void initializeWithMetaData(DatabaseMetaData databaseMetaData) throws SQL
172176
}
173177
try {
174178
String databaseProductName = databaseMetaData.getDatabaseProductName();
175-
if (productsNotSupportingGeneratedKeysColumnNameArray.contains(databaseProductName)) {
179+
if (this.productsNotSupportingGeneratedKeysColumnNameArray.contains(databaseProductName)) {
176180
logger.debug("GeneratedKeysColumnNameArray is not supported for " + databaseProductName);
177181
setGeneratedKeysColumnNameArraySupported(false);
178182
}
@@ -185,7 +189,7 @@ public void initializeWithMetaData(DatabaseMetaData databaseMetaData) throws SQL
185189
logger.warn("Error retrieving 'DatabaseMetaData.getDatabaseProductName' - " + se.getMessage());
186190
}
187191
try {
188-
databaseVersion = databaseMetaData.getDatabaseProductVersion();
192+
this.databaseVersion = databaseMetaData.getDatabaseProductVersion();
189193
}
190194
catch (SQLException se) {
191195
logger.warn("Error retrieving 'DatabaseMetaData.getDatabaseProductVersion' - " + se.getMessage());
@@ -205,47 +209,56 @@ public void initializeWithMetaData(DatabaseMetaData databaseMetaData) throws SQL
205209

206210
}
207211

208-
public void initializeWithTableColumnMetaData(DatabaseMetaData databaseMetaData, String catalogName, String schemaName, String tableName)
209-
throws SQLException {
210-
211-
tableColumnMetaDataUsed = true;
212+
public void initializeWithTableColumnMetaData(DatabaseMetaData databaseMetaData, String catalogName,
213+
String schemaName, String tableName) throws SQLException {
212214

215+
this.tableColumnMetaDataUsed = true;
213216
locateTableAndProcessMetaData(databaseMetaData, catalogName, schemaName, tableName);
214-
215-
216217
}
217218

218219
public String tableNameToUse(String tableName) {
219-
if (tableName == null)
220+
if (tableName == null) {
220221
return null;
221-
else if (isStoresUpperCaseIdentifiers())
222+
}
223+
else if (isStoresUpperCaseIdentifiers()) {
222224
return tableName.toUpperCase();
223-
else if(isStoresLowerCaseIdentifiers())
225+
}
226+
else if(isStoresLowerCaseIdentifiers()) {
224227
return tableName.toLowerCase();
225-
else
228+
}
229+
else {
226230
return tableName;
231+
}
227232
}
228233

229234
public String catalogNameToUse(String catalogName) {
230-
if (catalogName == null)
235+
if (catalogName == null) {
231236
return null;
232-
else if (isStoresUpperCaseIdentifiers())
237+
}
238+
else if (isStoresUpperCaseIdentifiers()) {
233239
return catalogName.toUpperCase();
234-
else if(isStoresLowerCaseIdentifiers())
240+
}
241+
else if(isStoresLowerCaseIdentifiers()) {
235242
return catalogName.toLowerCase();
236-
else
237-
return catalogName;
243+
}
244+
else {
245+
return catalogName;
246+
}
238247
}
239248

240249
public String schemaNameToUse(String schemaName) {
241-
if (schemaName == null)
250+
if (schemaName == null) {
242251
return null;
243-
else if (isStoresUpperCaseIdentifiers())
252+
}
253+
else if (isStoresUpperCaseIdentifiers()) {
244254
return schemaName.toUpperCase();
245-
else if(isStoresLowerCaseIdentifiers())
255+
}
256+
else if(isStoresLowerCaseIdentifiers()) {
246257
return schemaName.toLowerCase();
247-
else
248-
return schemaName;
258+
}
259+
else {
260+
return schemaName;
261+
}
249262
}
250263

251264
public String metaDataCatalogNameToUse(String catalogName) {
@@ -261,19 +274,20 @@ public String metaDataSchemaNameToUse(String schemaName) {
261274

262275

263276
/**
264-
* Provide access to version info for subclasses
277+
* Provide access to version info for subclasses.
265278
*/
266279
protected String getDatabaseVersion() {
267-
return databaseVersion;
280+
return this.databaseVersion;
268281
}
269282

270283
/**
271-
* Method supporting the metedata processing for a table
284+
* Method supporting the metedata processing for a table.
272285
*/
273-
private void locateTableAndProcessMetaData(DatabaseMetaData databaseMetaData, String catalogName, String schemaName, String tableName) {
286+
private void locateTableAndProcessMetaData(DatabaseMetaData databaseMetaData, String catalogName,
287+
String schemaName, String tableName) {
288+
274289
Map<String, TableMetaData> tableMeta = new HashMap<String, TableMetaData>();
275290
ResultSet tables = null;
276-
277291
try {
278292
tables = databaseMetaData.getTables(
279293
catalogNameToUse(catalogName),
@@ -311,7 +325,7 @@ private void locateTableAndProcessMetaData(DatabaseMetaData databaseMetaData, St
311325
logger.warn("Unable to locate table meta data for '" + tableName +"' -- column names must be provided");
312326
}
313327
else {
314-
TableMetaData tmd = null;
328+
TableMetaData tmd;
315329
if (schemaName == null) {
316330
tmd = tableMeta.get(userName.toUpperCase());
317331
if (tmd == null) {
@@ -320,14 +334,16 @@ private void locateTableAndProcessMetaData(DatabaseMetaData databaseMetaData, St
320334
tmd = tableMeta.get("DBO");
321335
}
322336
if (tmd == null) {
323-
throw new DataAccessResourceFailureException("Unable to locate table meta data for '" + tableName + "' in the default schema");
337+
throw new DataAccessResourceFailureException("Unable to locate table meta data for '" +
338+
tableName + "' in the default schema");
324339
}
325340
}
326341
}
327342
else {
328343
tmd = tableMeta.get(schemaName.toUpperCase());
329344
if (tmd == null) {
330-
throw new DataAccessResourceFailureException("Unable to locate table meta data for '" + tableName + "' in the '" + schemaName + "' schema");
345+
throw new DataAccessResourceFailureException("Unable to locate table meta data for '" +
346+
tableName + "' in the '" + schemaName + "' schema");
331347
}
332348
}
333349

@@ -378,7 +394,7 @@ private void processTableColumns(DatabaseMetaData databaseMetaData, TableMetaDat
378394
dataType,
379395
nullable
380396
);
381-
insertParameterMetaData.add(meta);
397+
this.insertParameterMetaData.add(meta);
382398
if (logger.isDebugEnabled()) {
383399
logger.debug("Retrieved metadata: "
384400
+ meta.getParameterName() +
@@ -389,61 +405,65 @@ private void processTableColumns(DatabaseMetaData databaseMetaData, TableMetaDat
389405
}
390406
}
391407
catch (SQLException se) {
392-
logger.warn("Error while retreiving metadata for table columns: " + se.getMessage());
408+
logger.warn("Error while retrieving metadata for table columns: " + se.getMessage());
393409
}
394410
finally {
395411
try {
396412
if (tableColumns != null)
397413
tableColumns.close();
398414
}
399415
catch (SQLException se) {
400-
logger.warn("Problem closing resultset for table column metadata " + se.getMessage());
416+
logger.warn("Problem closing ResultSet for table column metadata " + se.getMessage());
401417
}
402418
}
403419

404420
}
405421

406422

407423
/**
408-
* Class representing table meta data
424+
* Inner class representing table meta data.
409425
*/
410-
private class TableMetaData {
426+
private static class TableMetaData {
427+
411428
private String catalogName;
429+
412430
private String schemaName;
413-
private String tableName;
414-
private String type;
415431

432+
private String tableName;
416433

417-
public String getCatalogName() {
418-
return catalogName;
419-
}
434+
private String type;
420435

421436
public void setCatalogName(String catalogName) {
422437
this.catalogName = catalogName;
423438
}
424439

425-
public String getSchemaName() {
426-
return schemaName;
440+
public String getCatalogName() {
441+
return this.catalogName;
427442
}
428443

429444
public void setSchemaName(String schemaName) {
430445
this.schemaName = schemaName;
431446
}
432447

433-
public String getTableName() {
434-
return tableName;
448+
public String getSchemaName() {
449+
return this.schemaName;
435450
}
436451

437452
public void setTableName(String tableName) {
438453
this.tableName = tableName;
439454
}
440455

441-
public String getType() {
442-
return type;
456+
public String getTableName() {
457+
return this.tableName;
443458
}
444459

445460
public void setType(String type) {
446461
this.type = type;
447462
}
463+
464+
public String getType() {
465+
return this.type;
466+
}
448467
}
468+
449469
}

0 commit comments

Comments
 (0)