00001
00025
package org.objectweb.cjdbc.controller.backend;
00026
00027
import java.net.ConnectException;
00028
import java.sql.Connection;
00029
import java.sql.DatabaseMetaData;
00030
import java.sql.ResultSet;
00031
import java.sql.Statement;
00032
00033
import org.objectweb.cjdbc.common.i18n.Translate;
00034
import org.objectweb.cjdbc.common.log.Trace;
00035
import org.objectweb.cjdbc.controller.connection.DriverManager;
00036
00044 public class DriverCompliance
00045 {
00046 private boolean isCompliant =
false;
00047 private boolean hasBeenTested =
false;
00048 private boolean supportSetQueryTimeout =
false;
00049 private boolean supportGetGeneratedKeys =
false;
00050 private boolean supportGetColumnCount =
false;
00051 private boolean supportGetColumnClassName =
false;
00052 private boolean supportGetColumnTypeName =
false;
00053 private boolean supportGetColumnType =
false;
00054 private boolean supportGetColumnDisplaySize =
false;
00055 private boolean supportGetTableName =
false;
00056 private boolean supportSetCursorName =
false;
00057 private boolean supportSetFetchSize =
false;
00058 private boolean supportSetMaxRows =
false;
00059
00060 private Trace
logger;
00061
00062 private static final int TIMEOUT_VALUE = 1000;
00063 private static final String
DEFAULT_TEST_STATEMENT =
"select 1";
00064 private String
databaseProductName =
"C-JDBC";
00065
00071 public DriverCompliance(Trace logger)
00072 {
00073
this.logger = logger;
00074 }
00075
00089 public boolean complianceTest(String backendUrl, String login,
00090 String password, String driverPath, String driverClassName,
00091 String connectionTestStatement)
throws ConnectException
00092 {
00093
if (
hasBeenTested)
00094
return isCompliant;
00095
00096
isCompliant =
false;
00097
00098 Connection c = null;
00099
try
00100 {
00101 c =
DriverManager.getConnection(backendUrl, login, password, driverPath,
00102 driverClassName);
00103 }
00104
catch (Exception e)
00105 {
00106
logger.error(
Translate.get(
"backend.driver.test.connection.failed", e));
00107
throw new ConnectException(e.getMessage());
00108 }
00109
if (
logger.isDebugEnabled())
00110
logger.debug(
Translate.get(
"backend.driver.test.connection.ok"));
00111
00112 DatabaseMetaData connectionMetaData;
00113
try
00114 {
00115 connectionMetaData = c.getMetaData();
00116 }
00117
catch (Exception e)
00118 {
00119
logger.error(
Translate.get(
"backend.driver.test.metadata.failed", e));
00120
return isCompliant;
00121 }
00122
if (
logger.isDebugEnabled())
00123
logger.debug(
Translate.get(
"backend.driver.test.metadata.ok"));
00124
00125
try
00126 {
00127
this.databaseProductName = connectionMetaData.getDatabaseProductName();
00128
logger.info(
Translate
00129 .get(
"backend.detected.as",
this.
databaseProductName));
00130 }
00131
catch (Exception e)
00132 {
00133
logger.warn(
Translate.get(
00134
"backend.driver.test.database.productname.failed", e));
00135 }
00136
00137
Statement s;
00138
try
00139 {
00140 s = c.createStatement();
00141 }
00142
catch (Exception e)
00143 {
00144
logger.error(
Translate.get(
"backend.driver.test.statement.failed", e));
00145
return isCompliant;
00146 }
00147
00148
try
00149 {
00150
if (connectionTestStatement == null)
00151 {
00152
if (
logger.isDebugEnabled())
00153
logger.debug(
Translate.get(
"backend.driver.using.default.statement",
00154
DEFAULT_TEST_STATEMENT));
00155 connectionTestStatement =
DEFAULT_TEST_STATEMENT;
00156 }
00157 s.
execute(connectionTestStatement);
00158 }
00159
catch (Exception e)
00160 {
00161
logger.error(
Translate.get(
"backend.driver.test.statement.invalid",
00162 connectionTestStatement));
00163
return isCompliant;
00164 }
00165
if (
logger.isDebugEnabled())
00166
logger.debug(
Translate.get(
"backend.driver.test.statement.ok"));
00167
00168
try
00169 {
00170 s.
setCursorName(
"testcursor");
00171
supportSetCursorName =
true;
00172
if (
logger.isDebugEnabled())
00173
logger
00174 .debug(
Translate.get(
"backend.driver.statement.setCursorName.ok"));
00175 }
00176
catch (Exception e1)
00177 {
00178
logger.warn(
Translate
00179 .get(
"backend.driver.statement.setCursorName.failed"));
00180
supportSetMaxRows =
false;
00181 }
00182
00183
try
00184 {
00185 s.
setFetchSize(25);
00186
supportSetFetchSize =
true;
00187
if (
logger.isDebugEnabled())
00188
logger.debug(
Translate.get(
"backend.driver.statement.setFetchSize.ok"));
00189 }
00190
catch (Exception e1)
00191 {
00192
logger
00193 .warn(
Translate.get(
"backend.driver.statement.setFetchSize.failed"));
00194
supportSetMaxRows =
false;
00195 }
00196
00197
try
00198 {
00199 s.
setMaxRows(5);
00200
supportSetMaxRows =
true;
00201
if (
logger.isDebugEnabled())
00202
logger.debug(
Translate.get(
"backend.driver.statement.setMaxRows.ok"));
00203 }
00204
catch (Exception e1)
00205 {
00206
logger.warn(
Translate.get(
"backend.driver.statement.setMaxRows.failed"));
00207
supportSetMaxRows =
false;
00208 }
00209
00210
try
00211 {
00212 s.
getGeneratedKeys();
00213
supportGetGeneratedKeys =
true;
00214
if (
logger.isDebugEnabled())
00215
logger.debug(
Translate
00216 .get(
"backend.driver.statement.getGeneratedKeys.ok"));
00217 }
00218
catch (Exception e1)
00219 {
00220
logger.warn(
Translate
00221 .get(
"backend.driver.statement.getGeneratedKeys.failed"));
00222
supportGetGeneratedKeys =
false;
00223 }
00224
catch (AbstractMethodError e1)
00225 {
00226
logger.warn(
Translate
00227 .get(
"backend.driver.statement.getGeneratedKeys.failed"));
00228
supportGetGeneratedKeys =
false;
00229 }
00230
catch (java.lang.NoSuchMethodError e1)
00231 {
00232
logger.warn(
Translate
00233 .get(
"backend.driver.statement.getGeneratedKeys.failed"));
00234
supportGetGeneratedKeys =
false;
00235 }
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
try
00257 {
00258 s.
setQueryTimeout(
TIMEOUT_VALUE);
00259
supportSetQueryTimeout =
true;
00260 }
00261
catch (Exception e)
00262 {
00263
logger.warn(
Translate.get(
"backend.driver.setQueryTimeout.failed", e));
00264 }
00265
if (
supportSetQueryTimeout &&
logger.isDebugEnabled())
00266
logger.warn(
Translate.get(
"backend.driver.setQueryTimeout.ok"));
00267
00268 ResultSet rs;
00269
try
00270 {
00271 String[] types = {
"TABLE",
"VIEW"};
00272 rs = connectionMetaData.getTables(null, null,
"%", types);
00273 }
00274
catch (Exception e)
00275 {
00276
logger
00277 .error(
Translate.get(
"backend.driver.metadata.getTables.failed", e));
00278
return isCompliant;
00279 }
00280
if (
logger.isDebugEnabled())
00281
logger.debug(
Translate.get(
"backend.driver.metadata.getTables.ok"));
00282
00283 java.sql.ResultSetMetaData rsMetaData;
00284
try
00285 {
00286 rsMetaData = rs.getMetaData();
00287 }
00288
catch (Exception e)
00289 {
00290
logger.error(
Translate.get(
"backend.driver.resultset.getMetaData.failed",
00291 e));
00292
return isCompliant;
00293 }
00294
if (
logger.isDebugEnabled())
00295
logger.debug(
Translate.get(
"backend.driver.resultset.getMetaData.ok"));
00296
00297
try
00298 {
00299
if (rs.next())
00300 {
00301 rs.getObject(1);
00302 }
00303
else
00304
logger.warn(
Translate.get(
"backend.driver.resultset.getObject.unable"));
00305 }
00306
catch (Exception e)
00307 {
00308
logger.error(
Translate
00309 .get(
"backend.driver.resultset.getObject.failed", e));
00310
return isCompliant;
00311 }
00312
if (
logger.isDebugEnabled())
00313
logger.debug(
Translate.get(
"backend.driver.resultset.getObject.ok"));
00314
00315
try
00316 {
00317 rsMetaData.getColumnCount();
00318
supportGetColumnCount =
true;
00319 }
00320
catch (Exception e)
00321 {
00322
logger.error(
Translate
00323 .get(
"backend.driver.metadata.getColumnCount.failed"));
00324
return isCompliant;
00325 }
00326
if (
supportGetColumnCount &&
logger.isDebugEnabled())
00327
logger.debug(
Translate.get(
"backend.driver.metadata.getColumnCount.ok"));
00328
00329
try
00330 {
00331 rsMetaData.getColumnName(1);
00332 }
00333
catch (Exception e)
00334 {
00335
logger.error(
Translate
00336 .get(
"backend.driver.metadata.getColumnName.failed"));
00337
return isCompliant;
00338 }
00339
if (
logger.isDebugEnabled())
00340
logger.debug(
Translate.get(
"backend.driver.metadata.getColumnName.ok"));
00341
00342
try
00343 {
00344 rsMetaData.getTableName(1);
00345
supportGetTableName =
true;
00346 }
00347
catch (Exception e)
00348 {
00349
logger.warn(
Translate.get(
"backend.driver.metadata.getTableName.failed",
00350 e));
00351 }
00352
00353
if (
supportGetTableName &&
logger.isDebugEnabled())
00354
logger.debug(
Translate.get(
"backend.driver.metadata.getTableName.ok"));
00355
00356
try
00357 {
00358 rsMetaData.getColumnDisplaySize(1);
00359
supportGetColumnDisplaySize =
true;
00360 }
00361
catch (Exception e)
00362 {
00363
logger.warn(
Translate.get(
00364
"backend.driver.metadata.getColumnDisplaySize.failed", e));
00365 }
00366
if (
supportGetColumnDisplaySize &&
logger.isDebugEnabled())
00367
logger.debug(
Translate
00368 .get(
"backend.driver.metadata.getColumnDisplaySize.ok"));
00369
00370
try
00371 {
00372 rsMetaData.getColumnType(1);
00373
supportGetColumnType =
true;
00374 }
00375
catch (Exception e)
00376 {
00377
logger.warn(
Translate.get(
"backend.driver.metadata.getColumnType.failed",
00378 e));
00379 }
00380
if (
supportGetColumnType &&
logger.isDebugEnabled())
00381
logger.debug(
Translate.get(
"backend.driver.metadata.getColumnType.ok"));
00382
00383
try
00384 {
00385 rsMetaData.getColumnTypeName(1);
00386
supportGetColumnTypeName =
true;
00387 }
00388
catch (Exception e)
00389 {
00390
logger.warn(
Translate.get(
00391
"backend.driver.metadata.getColumnTypeName.failed", e));
00392 }
00393
if (
supportGetColumnTypeName &&
logger.isDebugEnabled())
00394
logger.debug(
Translate
00395 .get(
"backend.driver.metadata.getColumnTypeName.ok"));
00396
00397
try
00398 {
00399 rsMetaData.getColumnClassName(1);
00400
supportGetColumnClassName =
true;
00401 }
00402
catch (Exception e)
00403 {
00404
logger.warn(
Translate.get(
00405
"backend.driver.metadata.getColumnClassName.failed", e));
00406 }
00407
if (
supportGetColumnClassName &&
logger.isDebugEnabled())
00408
logger.debug(
Translate
00409 .get(
"backend.driver.metadata.getColumnClassName.ok"));
00410
00411
isCompliant =
true;
00412
hasBeenTested =
true;
00413
return isCompliant;
00414 }
00415
00419 public boolean isCompliant()
00420 {
00421
return isCompliant;
00422 }
00423
00427 public boolean supportGetGeneratedKeys()
00428 {
00429
return supportGetGeneratedKeys;
00430 }
00431
00435 public boolean supportGetColumnClassName()
00436 {
00437
return supportGetColumnClassName;
00438 }
00439
00443 public boolean supportGetColumnCount()
00444 {
00445
return supportGetColumnCount;
00446 }
00447
00451 public boolean supportGetColumnDisplaySize()
00452 {
00453
return supportGetColumnDisplaySize;
00454 }
00455
00459 public boolean supportGetColumnType()
00460 {
00461
return supportGetColumnType;
00462 }
00463
00467 public boolean supportGetColumnTypeName()
00468 {
00469
return supportGetColumnTypeName;
00470 }
00471
00475 public boolean supportGetTableName()
00476 {
00477
return supportGetTableName;
00478 }
00479
00483 public boolean supportSetQueryTimeout()
00484 {
00485
return supportSetQueryTimeout;
00486 }
00487
00491 public boolean supportSetMaxRows()
00492 {
00493
return supportSetMaxRows;
00494 }
00495
00501 public boolean supportSetCursorName()
00502 {
00503
return supportSetCursorName;
00504 }
00505
00511 public boolean supportSetFetchSize()
00512 {
00513
return supportSetFetchSize;
00514 }
00515
00521 public String
getDatabaseProductName()
00522 {
00523
return this.databaseProductName;
00524 }
00525 }