ReverseEngineeringGeneric.java
上传用户:cccombo
上传日期:2021-01-31
资源大小:16445k
文件大小:23k
源码类别:

MySQL数据库

开发平台:

SQL

  1. package com.mysql.grt.modules;
  2. import java.net.URLEncoder;
  3. import java.sql.*;
  4. import java.text.MessageFormat;
  5. import java.text.ParsePosition;
  6. import java.util.regex.*;
  7. import com.mysql.grt.*;
  8. import com.mysql.grt.db.*;
  9. import com.mysql.grt.db.mgmt.*;
  10. /**
  11.  * GRT Reverse Engineering Class using generic JDBC metadata functions
  12.  * 
  13.  * @author Mike
  14.  * @version 1.0, 11/26/04
  15.  * 
  16.  */
  17. public class ReverseEngineeringGeneric {
  18. /**
  19.  * Static function to return information about this class to the GRT
  20.  * environment
  21.  * 
  22.  * @return returns a GRT XML string containing the infos about this class
  23.  */
  24. public static String getModuleInfo() {
  25. return Grt.getModuleInfoXml(ReverseEngineeringGeneric.class, "");
  26. }
  27. public static String replace(String searchIn, String searchFor,
  28. String replaceWith) {
  29. if (searchIn == null) {
  30. return null;
  31. }
  32. if (searchFor == null || "".equals(searchFor)) {
  33. final String msg = "searchFor '" + searchFor + "' (searchIn = '"
  34. + searchIn + "') (replaceWith='" + replaceWith + "')";
  35. throw new IllegalArgumentException(msg);
  36. }
  37. StringBuffer buf = new StringBuffer(searchIn.length());
  38. final int searchForLength = searchFor.length();
  39. int begin = 0;
  40. int end = 0;
  41. while (true) {
  42. end = searchIn.indexOf(searchFor, begin);
  43. if (end == -1) {
  44. break;
  45. }
  46. buf.append(searchIn.substring(begin, end));
  47. buf.append(replaceWith);
  48. begin = end + searchForLength;
  49. }
  50. buf.append(searchIn.substring(begin));
  51. return buf.toString();
  52. }
  53. /**
  54.  * Protected function that establishes a connection to the database
  55.  * 
  56.  * @param dbConn
  57.  *            the Connection to connect to
  58.  * 
  59.  * @return returns a Connection on success
  60.  */
  61. protected static java.sql.Connection establishConnection(
  62. com.mysql.grt.db.mgmt.Connection dbConn) throws Exception {
  63. com.mysql.grt.db.mgmt.Driver driver = dbConn.getDriver();
  64. if (!JdbcDriver.class.isInstance(driver))
  65. throw new Exception("The submitted driver is not a JDBC driver.");
  66. Grt.getInstance().addMsg("Initializing JDBC driver ... ");
  67. Grt.getInstance().addMsgDetail("Driver class " + driver.getCaption());
  68. // get classname
  69. String driverClassName = ((JdbcDriver) driver).getClassName();
  70. // if there is no classname entry in the driver, take it from the params
  71. if (driverClassName.equals(""))
  72. driverClassName = dbConn.getParameterValues().get("classname");
  73. Class.forName(driverClassName).newInstance();
  74. // build connection string
  75. // first, check if the jdbcConnStr param is set
  76. String jdbcConnectionString = dbConn.getParameterValues().get(
  77. "jdbcConnStr");
  78. if ((jdbcConnectionString == null) || jdbcConnectionString.equals("")) {
  79. // if the param is not set, take build the connection string from
  80. // the template
  81. jdbcConnectionString = ((JdbcDriver) driver)
  82. .getConnectionStringTemplate();
  83. GrtStringHashMap paramValues = dbConn.getParameterValues();
  84. for (int i = 0; i < paramValues.getKeys().length; i++) {
  85. String key = paramValues.getKeys()[i];
  86. String value = paramValues.get(key);
  87. // if this is the MySQL JDBC driver, encode the value
  88. if (driverClassName.equals("com.mysql.jdbc.Driver"))
  89. value = URLEncoder.encode(value, "UTF-8");
  90. jdbcConnectionString = replace(jdbcConnectionString, "%"
  91. + key + "%", value);
  92. /*String value = paramValues.get(key).replaceAll("\\",
  93. "\\\\");
  94. if (!value.equals("")) {
  95. // if this is the MySQL JDBC driver, encode the value
  96. if (driverClassName.equals("com.mysql.jdbc.Driver"))
  97. value = URLEncoder.encode(value, "UTF-8");
  98. jdbcConnectionString = jdbcConnectionString.replaceAll("%"
  99. + key + "%", value);
  100. } else
  101. jdbcConnectionString = Grt.replace(jdbcConnectionString,
  102. "%" + key + "%", "");*/
  103. }
  104. }
  105. Grt.getInstance().addMsg("Opening connection ... ");
  106. Grt.getInstance().addMsgDetail("Connection " + jdbcConnectionString);
  107. Grt.getInstance().flushMessages();
  108. // get the connection
  109. java.sql.Connection conn = null;
  110. // if an explicit username is given, use it
  111. String explicitUsername = dbConn.getParameterValues().get(
  112. "explicit_username");
  113. String explicitPassword = dbConn.getParameterValues().get(
  114. "explicit_password");
  115. if (explicitUsername != null && !explicitUsername.equalsIgnoreCase("")) {
  116. conn = DriverManager.getConnection(jdbcConnectionString,
  117. explicitUsername, explicitPassword);
  118. } else
  119. conn = DriverManager.getConnection(jdbcConnectionString);
  120. return conn;
  121. }
  122. /**
  123.  * Get version info of the RDBMS
  124.  * 
  125.  * This function connects to the target database system and retrieves the
  126.  * version information
  127.  * 
  128.  * @param dbConn
  129.  *            a Connection
  130.  * @return returns the version information
  131.  */
  132. public static Version getVersion(com.mysql.grt.db.mgmt.Connection dbConn)
  133. throws Exception {
  134. // connect to the database
  135. java.sql.Connection conn = establishConnection(dbConn);
  136. Grt.getInstance().addMsg("Getting version information ... ");
  137. Version versionInfo = new Version(null);
  138. String skipVersionDetection = dbConn.getParameterValues().get(
  139. "skipVersionDetection");
  140. if ((skipVersionDetection == null) || !skipVersionDetection.equals("1")) {
  141. try {
  142. DatabaseMetaData metaData = conn.getMetaData();
  143. com.mysql.grt.db.mgmt.Driver driver = dbConn.getDriver();
  144. if (!JdbcDriver.class.isInstance(driver))
  145. throw new Exception(
  146. "The submitted driver is not a JDBC driver.");
  147. Grt.getInstance().addMsg("Initializing JDBC driver ... ");
  148. Grt.getInstance().addMsgDetail(
  149. "Driver class " + driver.getCaption());
  150. versionInfo.setName(metaData.getDatabaseProductVersion());
  151. versionInfo.setMajor(metaData.getDatabaseMajorVersion());
  152. versionInfo.setMinor(metaData.getDatabaseMinorVersion());
  153. // get the release number
  154. MessageFormat mf = new MessageFormat(
  155. "{0}.{0}.{0,number,integer}{1}");
  156. Object[] objs = mf.parse(metaData.getDatabaseProductVersion(),
  157. new ParsePosition(0));
  158. if (objs != null)
  159. versionInfo
  160. .setRelease(Integer.parseInt(objs[0].toString()));
  161. } catch (Throwable t) {
  162. // ignore exceptions if the driver does not support the version
  163. // functions and try to recover from getDatabaseProductVersion()
  164. // we found no other way to prevent the AbstractMethodError
  165. if (versionInfo.getName() != null
  166. && !versionInfo.getName().equalsIgnoreCase("")) {
  167. Pattern p = Pattern.compile(
  168. ".*?(\d+)\.(\d+)\.(\d+).*", Pattern.DOTALL);
  169. Matcher m = p.matcher(versionInfo.getName());
  170. if (m.matches()) {
  171. versionInfo.setMajor(Integer.parseInt(m.group(1)));
  172. versionInfo.setMinor(Integer.parseInt(m.group(2)));
  173. versionInfo.setRelease(Integer.parseInt(m.group(3)));
  174. }
  175. }
  176. }
  177. }
  178. return versionInfo;
  179. }
  180. /**
  181.  * Returns a list of all schemata from the given JDBC connection
  182.  * 
  183.  * @param jdbcDriver
  184.  *            the class name of the JDBC driver
  185.  * @param jdbcConnectionString
  186.  *            a JDBC connection string
  187.  * @return returns a GRT XML string containing a list of schemata names
  188.  */
  189. public static GrtStringList getSchemata(
  190. com.mysql.grt.db.mgmt.Connection dbConn) throws Exception {
  191. java.sql.Connection conn = establishConnection(dbConn);
  192. Grt.getInstance().addMsg("Fetching schemata list.");
  193. GrtStringList schemataList = new GrtStringList();
  194. ResultSet rset = conn.getMetaData().getSchemas();
  195. while (rset.next()) {
  196. String schemaName = rset.getString("TABLE_SCHEM");
  197. if (schemaName != null)
  198. schemataList.add(schemaName);
  199. }
  200. rset.close();
  201. conn.close();
  202. if (schemataList.size() == 0) {
  203. schemataList.add("DEFAULT");
  204. GrtHashMap dataBulkTransferParams = (GrtHashMap) Grt.getInstance()
  205. .getGrtGlobalAsObject("/migration/dataBulkTransferParams");
  206. dataBulkTransferParams.addObject("excludeSourceSchemaName", "yes");
  207. }
  208. Grt.getInstance().addMsg("Return schemata list.");
  209. return schemataList;
  210. }
  211. /**
  212.  * Does the reverse engineering of the given schematas over the JDBC
  213.  * connection and returns the GRT objects
  214.  * 
  215.  * @param jdbcDriver
  216.  *            the class name of the JDBC driver
  217.  * @param jdbcConnectionString
  218.  *            a JDBC connection string
  219.  * @param schemataList
  220.  *            list of schematas to be reverse engineered
  221.  * @return returns a GRT XML string containing a the reverse engineered
  222.  *         objects
  223.  */
  224. public static Catalog reverseEngineer(
  225. com.mysql.grt.db.mgmt.Connection dbConn, GrtStringList schemataList)
  226. throws Exception {
  227. boolean reverseEngineerOnlyTableObjects = (Grt.getInstance()
  228. .getGrtGlobalAsInt(
  229. "/migration/applicationData/"
  230. + "reverseEngineerOnlyTableObjects") == 1);
  231. ReverseEngineeringGeneric revEng = new ReverseEngineeringGeneric();
  232. java.sql.Connection conn = establishConnection(dbConn);
  233. Catalog catalog = new Catalog(null);
  234. catalog.setName("GenericCatalog");
  235. catalog.setVersion(getVersion(dbConn));
  236. Grt.getInstance().addMsg("Build simple datatypes.");
  237. revEng.buildSimpleDatatypes(conn, catalog);
  238. // If an empty list was given, use a list with an empty string instead
  239. if (schemataList.size() == 0)
  240. schemataList.add("");
  241. for (int i = 0; i < schemataList.size(); i++) {
  242. Schema schema = new Schema(catalog);
  243. schema.setName((String) (schemataList.get(i)));
  244. catalog.getSchemata().add(schema);
  245. // Get Tables
  246. revEng.reverseEngineerTables(conn, catalog, schema);
  247. if (!reverseEngineerOnlyTableObjects) {
  248. // Get Views
  249. revEng.reverseEngineerViews(conn, catalog, schema);
  250. // Get SPs
  251. revEng.reverseEngineerProcedures(conn, catalog, schema);
  252. }
  253. }
  254. // make sure the Fks use real references instead of
  255. // text names where possible
  256. revEng.reverseEngineerUpdateFkReferences(catalog);
  257. conn.close();
  258. return catalog;
  259. }
  260. protected void buildSimpleDatatypes(java.sql.Connection conn,
  261. Catalog catalog) throws Exception {
  262. GrtList simpleDatatypes = new GrtList(catalog);
  263. DatatypeGroup group = new DatatypeGroup(catalog);
  264. group.setName("Generic Datatype Group");
  265. group.setCaption("Generic Datatype Group");
  266. group
  267. .setDescription("A generic datatype group holding JDBC datatypes.");
  268. catalog.getCustomData().addObject("simpleDatatypes", simpleDatatypes);
  269. catalog.getCustomData().addObject("datatypeGroup", group);
  270. ResultSet rset = conn.getMetaData().getTypeInfo();
  271. while (rset.next()) {
  272. SimpleDatatype simpleType = new SimpleDatatype(catalog);
  273. simpleType.setGroup(group);
  274. catalog.getSimpleDatatypes().add(simpleType);
  275. simpleType.setName(rset.getString("TYPE_NAME"));
  276. long precision = rset.getLong("PRECISION");
  277. if (precision >= new Long("4294967296").longValue())
  278. precision = precision / 1000000 * -1;
  279. simpleType.setNumericPrecision(new Long(precision).intValue());
  280. simpleType.setNumericPrecisionRadix(rset.getInt("NUM_PREC_RADIX"));
  281. simpleType.setNumericScale(rset.getInt("MAXIMUM_SCALE"));
  282. simpleDatatypes.addObject(simpleType);
  283. }
  284. rset.close();
  285. }
  286. protected void reverseEngineerTables(java.sql.Connection conn,
  287. Catalog catalog, Schema schema) throws Exception {
  288. Grt.getInstance().addMsg("Fetch all tables of given schemata.");
  289. ResultSet rset = conn.getMetaData().getTables(null, schema.getName(),
  290. null, new String[] { "TABLE" });
  291. while (rset.next()) {
  292. // Create new table
  293. Table table = new Table(schema);
  294. schema.getTables().add(table);
  295. table.setName(rset.getString("TABLE_NAME"));
  296. reverseEngineerTableColumns(conn, catalog, schema, table);
  297. reverseEngineerTablePK(conn, catalog, schema, table);
  298. reverseEngineerTableIndices(conn, catalog, schema, table);
  299. reverseEngineerTableFKs(conn, catalog, schema, table);
  300. }
  301. rset.close();
  302. }
  303. protected void reverseEngineerTableColumns(java.sql.Connection conn,
  304. Catalog catalog, Schema schema, Table table) {
  305. try {
  306. Grt.getInstance().addMsg(
  307. "Fetching column information of table " + table.getName()
  308. + ".");
  309. ResultSet rset = conn.getMetaData().getColumns(null,
  310. schema.getName(), table.getName(), null);
  311. boolean hasDefaultValueColumn = false;
  312. ResultSetMetaData rsmd = rset.getMetaData();
  313. for (int i = 1; i <= rsmd.getColumnCount(); i++)
  314. if (rsmd.getColumnName(i).equalsIgnoreCase("COLUMN_DEF"))
  315. hasDefaultValueColumn = true;
  316. while (rset.next()) {
  317. // create new column
  318. Column column = new Column(table);
  319. table.getColumns().add(column);
  320. column.setName(rset.getString("COLUMN_NAME"));
  321. column.setDatatypeName(rset.getString("TYPE_NAME"));
  322. // Get Simple Type
  323. int datatypeIndex = catalog.getSimpleDatatypes()
  324. .getIndexOfName(column.getDatatypeName());
  325. if (datatypeIndex > -1)
  326. column.setSimpleType(catalog.getSimpleDatatypes().get(
  327. datatypeIndex));
  328. column.setLength(rset.getInt("COLUMN_SIZE"));
  329. column.setPrecision(column.getLength());
  330. column.setScale(rset.getInt("DECIMAL_DIGITS"));
  331. // make sure precision is greater than scale
  332. if (column.getPrecision() < column.getScale()) {
  333. column.setPrecision(16);
  334. if (column.getPrecision() < column.getScale())
  335. column.setPrecision(column.getScale() + 1);
  336. }
  337. if (rset.getInt("NULLABLE") == java.sql.DatabaseMetaData.columnNullable)
  338. column.setIsNullable(1);
  339. else
  340. column.setIsNullable(0);
  341. // prevent VARCHAR(0) columns
  342. if (column.getDatatypeName().equalsIgnoreCase("VARCHAR")
  343. && column.getLength() == 0)
  344. column.setLength(255);
  345. if (hasDefaultValueColumn)
  346. column.setDefaultValue(rset.getString("COLUMN_DEF"));
  347. else
  348. column.setDefaultValueIsNull(1);
  349. }
  350. rset.close();
  351. } catch (Exception e) {
  352. Grt.getInstance().addErr(e.getMessage());
  353. }
  354. }
  355. protected void reverseEngineerTablePK(java.sql.Connection conn,
  356. Catalog catalog, Schema schema, Table table) {
  357. // String sql;
  358. try {
  359. Grt.getInstance().addMsg("Fetching primary key information.");
  360. ResultSet rset = conn.getMetaData().getPrimaryKeys(null, null,
  361. table.getName());
  362. Index primaryKey = null;
  363. String primaryKeyName = null;
  364. while (rset.next()) {
  365. if (primaryKey == null) {
  366. primaryKey = new Index(table);
  367. primaryKey.setName("PRIMARY");
  368. primaryKey.setIsPrimary(1);
  369. // add PK to indices
  370. table.getIndices().add(primaryKey);
  371. table.setPrimaryKey(primaryKey);
  372. }
  373. primaryKeyName = rset.getString("PK_NAME");
  374. IndexColumn indexColumn = new IndexColumn(primaryKey);
  375. indexColumn.setName(rset.getString("COLUMN_NAME"));
  376. indexColumn.setColumnLength(0);
  377. // find reference table column
  378. for (int j = 0; j < table.getColumns().size(); j++) {
  379. Column column = (Column) (table.getColumns().get(j));
  380. if (column.getName().compareToIgnoreCase(
  381. indexColumn.getName()) == 0) {
  382. indexColumn.setReferedColumn(column);
  383. // text and blob have to have a index column length
  384. if ((indexColumn.getColumnLength() == 0)
  385. && (column.getSimpleType().getGroup().getName()
  386. .equals("text") || column
  387. .getSimpleType().getGroup().getName()
  388. .equals("blob")))
  389. indexColumn.setColumnLength(10);
  390. break;
  391. }
  392. }
  393. primaryKey.getColumns().add(indexColumn);
  394. }
  395. // remove primary key from list of indices
  396. if (primaryKeyName != null) {
  397. for (int i = 0; i < table.getIndices().size(); i++) {
  398. String indexName = table.getIndices().get(i).getName();
  399. if (primaryKeyName.compareToIgnoreCase(indexName) == 0) {
  400. table.getIndices().remove(i);
  401. break;
  402. }
  403. }
  404. }
  405. } catch (Exception e) {
  406. Grt.getInstance().addErr(e.getMessage());
  407. }
  408. }
  409. protected void reverseEngineerTableIndices(java.sql.Connection conn,
  410. Catalog catalog, Schema schema, Table table) {
  411. try {
  412. Grt.getInstance().addMsg(
  413. "Fetching index information of table " + table.getName()
  414. + ".");
  415. String indexName = "";
  416. Index index = null;
  417. ResultSet rset = conn.getMetaData().getIndexInfo(null, null,
  418. table.getName(), false, true);
  419. while (rset.next()) {
  420. String newIndexName = rset.getString("INDEX_NAME");
  421. if (newIndexName == null)
  422. continue;
  423. if (!indexName.equalsIgnoreCase(newIndexName)) {
  424. if (index != null)
  425. table.getIndices().add(index);
  426. indexName = newIndexName;
  427. index = new Index(table);
  428. index.setName(indexName);
  429. if (rset.getBoolean("NON_UNIQUE"))
  430. index.setUnique(0);
  431. else
  432. index.setUnique(1);
  433. }
  434. IndexColumn indexColumn = new IndexColumn(index);
  435. indexColumn.setName(rset.getString("COLUMN_NAME"));
  436. indexColumn.setColumnLength(0);
  437. if (rset.getString("ASC_OR_DESC").compareToIgnoreCase("D") == 0)
  438. indexColumn.setDescend(1);
  439. else
  440. indexColumn.setDescend(0);
  441. // find reference table column
  442. for (int j = 0; j < table.getColumns().size(); j++) {
  443. Column column = (Column) (table.getColumns().get(j));
  444. if (column.getName().compareToIgnoreCase(
  445. indexColumn.getName()) == 0) {
  446. indexColumn.setReferedColumn(column);
  447. // text and blob have to have a index column length
  448. if ((indexColumn.getColumnLength() == 0)
  449. && (column.getSimpleType() != null)
  450. && (column.getSimpleType().getGroup() != null)
  451. && (column.getSimpleType().getGroup().getName()
  452. .equals("text") || column
  453. .getSimpleType().getGroup().getName()
  454. .equals("blob")))
  455. indexColumn.setColumnLength(10);
  456. break;
  457. }
  458. }
  459. index.getColumns().add(indexColumn);
  460. }
  461. if (index != null)
  462. table.getIndices().add(index);
  463. } catch (Exception e) {
  464. Grt.getInstance().addErr(e.getMessage());
  465. }
  466. }
  467. protected void reverseEngineerTableFKs(java.sql.Connection conn,
  468. Catalog catalog, Schema schema, Table table) {
  469. try {
  470. Grt.getInstance().addMsg("Fetching FK information.");
  471. ResultSet rset = conn.getMetaData().getImportedKeys(null, null,
  472. table.getName());
  473. String fkName = "";
  474. ForeignKey foreignKey = null;
  475. while (rset.next()) {
  476. String newFkName = rset.getString("FK_NAME");
  477. if (fkName.compareToIgnoreCase(newFkName) != 0) {
  478. if (foreignKey != null)
  479. table.getForeignKeys().add(foreignKey);
  480. fkName = newFkName;
  481. foreignKey = new ForeignKey(table);
  482. foreignKey.setName(fkName);
  483. foreignKey.setDeferability(rset.getInt("DEFERRABILITY"));
  484. switch (rset.getShort("DELETE_RULE")) {
  485. case DatabaseMetaData.importedKeyCascade:
  486. foreignKey.setDeleteRule("CASCADE");
  487. break;
  488. case DatabaseMetaData.importedKeyRestrict:
  489. foreignKey.setDeleteRule("RESTRICT");
  490. break;
  491. case DatabaseMetaData.importedKeySetNull:
  492. foreignKey.setDeleteRule("SET NULL");
  493. break;
  494. default:
  495. foreignKey.setDeleteRule("NO ACTION");
  496. break;
  497. }
  498. switch (rset.getShort("UPDATE_RULE")) {
  499. case DatabaseMetaData.importedKeyCascade:
  500. foreignKey.setUpdateRule("CASCADE");
  501. break;
  502. case DatabaseMetaData.importedKeyRestrict:
  503. foreignKey.setUpdateRule("RESTRICT");
  504. break;
  505. case DatabaseMetaData.importedKeySetNull:
  506. foreignKey.setUpdateRule("SET NULL");
  507. break;
  508. default:
  509. foreignKey.setUpdateRule("NO ACTION");
  510. break;
  511. }
  512. String fkSchemaName = rset.getString("PKTABLE_SCHEM");
  513. if (rset.wasNull())
  514. foreignKey.setReferedTableSchemaName(schema.getName());
  515. else
  516. foreignKey.setReferedTableSchemaName(fkSchemaName);
  517. foreignKey.setReferedTableName(rset
  518. .getString("PKTABLE_NAME"));
  519. }
  520. foreignKey.getReferedColumnNames().add(
  521. rset.getString("PKCOLUMN_NAME"));
  522. // find reference table column
  523. String colName = rset.getString("FKCOLUMN_NAME");
  524. boolean found = false;
  525. for (int j = 0; j < table.getColumns().size(); j++) {
  526. Column column = (Column) (table.getColumns().get(j));
  527. if (column.getName().compareToIgnoreCase(colName) == 0) {
  528. foreignKey.getColumns().add(column);
  529. found = true;
  530. break;
  531. }
  532. }
  533. if (!found)
  534. Grt.getInstance().addErr(
  535. "Column " + colName + " not found in table "
  536. + table.getName() + ".");
  537. }
  538. if (foreignKey != null)
  539. table.getForeignKeys().add(foreignKey);
  540. } catch (Exception e) {
  541. Grt.getInstance().addErr(e.getMessage());
  542. }
  543. }
  544. protected void reverseEngineerUpdateFkReferences(Catalog catalog) {
  545. SchemaList schemata = catalog.getSchemata();
  546. // do for all schemata
  547. for (int i = 0; i < schemata.size(); i++) {
  548. Schema schema = schemata.get(i);
  549. TableList tables = schema.getTables();
  550. // do for all tables
  551. for (int j = 0; j < tables.size(); j++) {
  552. ForeignKeyList fks = tables.get(j).getForeignKeys();
  553. // do for all foreign keys
  554. for (int k = 0; k < fks.size(); k++) {
  555. ForeignKey fk = fks.get(k);
  556. String refSchemaName = fk.getReferedTableSchemaName();
  557. Schema refSchema;
  558. // get the refered schema
  559. if ((refSchemaName != null) && (!refSchemaName.equals(""))
  560. && !refSchemaName.equals(schema.getName()))
  561. refSchema = schemata.getItemByName(refSchemaName);
  562. else
  563. refSchema = schema;
  564. if (refSchema != null) {
  565. String refTableName = fk.getReferedTableName();
  566. // get the refered table
  567. Table refTable = refSchema.getTables().getItemByName(
  568. refTableName);
  569. if (refTable != null) {
  570. GrtStringList refColNames = fk
  571. .getReferedColumnNames();
  572. ColumnList refTableCols = refTable.getColumns();
  573. ColumnList refCols = fk.getReferedColumns();
  574. if (refCols == null) {
  575. fk.setColumns(new ColumnList());
  576. refCols = fk.getReferedColumns();
  577. }
  578. // set the table reference in the fk
  579. fk.setReferedTable(refTable);
  580. for (int l = 0; l < refColNames.size(); l++) {
  581. Column refCol = refTableCols
  582. .getItemByName(refColNames.get(l));
  583. if (refCol != null) {
  584. // add column reference to the fk column
  585. // list
  586. fk.getReferedColumns().add(refCol);
  587. }
  588. }
  589. }
  590. }
  591. }
  592. }
  593. }
  594. }
  595. protected void reverseEngineerViews(java.sql.Connection conn,
  596. Catalog catalog, Schema schema) throws Exception {
  597. Grt.getInstance().addMsg("Fetch all views of the given schemata.");
  598. }
  599. protected void reverseEngineerProcedures(java.sql.Connection conn,
  600. Catalog catalog, Schema schema) throws Exception {
  601. Grt.getInstance().addMsg(
  602. "Fetch all stored procedures of the given schemata.");
  603. }
  604. }