1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package net.sourceforge.addam.ddlgen.generic;
20
21 import org.apache.velocity.VelocityContext;
22
23 import java.sql.Connection;
24 import java.sql.DatabaseMetaData;
25 import java.sql.ResultSet;
26 import java.sql.SQLException;
27 import java.util.ArrayList;
28 import java.util.HashMap;
29 import java.util.List;
30 import java.util.Map;
31
32 /**
33 * User: mkrishna, tim.dawson
34 * Date: Nov 11, 2004
35 */
36
37 public class TableGenerator extends VelocityGenerator {
38 private List<TableColumn> columns = new ArrayList<TableColumn>();
39 private List<TableColumn> nonNullableColumns = new ArrayList<TableColumn>();
40 private List<TableColumn> defaultValueColumns = new ArrayList<TableColumn>();
41 private List<TableIndex> columnIndexes = new ArrayList<TableIndex>();
42 private List<TablePrimaryKey> primaryKeys = new ArrayList<TablePrimaryKey>();
43
44 protected VelocityContext getContext(String catalog, String schema, String object,
45 Connection connection, DatabaseMetaData metadata)
46 throws Exception {
47 VelocityContext context = new VelocityContext();
48
49 ResultSet columnMetaData = null;
50 ResultSet primaryKeysInfo = null;
51 ResultSet indexInfo = null;
52 try {
53 addPrimaryKeyInfo(metadata, catalog, schema, object);
54 addIndexInfo(metadata, catalog, schema, object);
55 columnMetaData = metadata.getColumns(catalog, schema, object, "%");
56 while (columnMetaData.next()) {
57 columns.add(getColumnDDL(columnMetaData));
58 }
59 } finally {
60 if (columnMetaData != null) columnMetaData.close();
61 if (indexInfo != null) indexInfo.close();
62 if (primaryKeysInfo != null) primaryKeysInfo.close();
63 }
64
65 context.put("tableName", object);
66 context.put("columns", columns);
67 context.put("nonNullableColumns", nonNullableColumns);
68 context.put("defaultValueColumns", defaultValueColumns);
69 context.put("columnIndexes", columnIndexes);
70 context.put("primaryKeys", primaryKeys);
71 return context;
72 }
73
74 private void addPrimaryKeyInfo(DatabaseMetaData dbmd, String catalog, String schema, String tableName) throws SQLException {
75 ResultSet primaryKeysInfo = dbmd.getPrimaryKeys(catalog, schema, tableName);
76
77 Map<String,TablePrimaryKey> primaryKeyColumnMap = new HashMap<String,TablePrimaryKey>();
78 while (primaryKeysInfo.next()) {
79 String primaryKeyName = primaryKeysInfo.getString(6);
80 if (primaryKeyName != null) {
81 if (primaryKeyColumnMap.get(primaryKeyName) == null) {
82 net.sourceforge.addam.ddlgen.generic.TablePrimaryKey primaryKey = new net.sourceforge.addam.ddlgen.generic.TablePrimaryKey(primaryKeyName, primaryKeysInfo.getString(4));
83 primaryKeyColumnMap.put(primaryKeyName, primaryKey);
84 } else {
85 net.sourceforge.addam.ddlgen.generic.TablePrimaryKey addedprimaryKey = (net.sourceforge.addam.ddlgen.generic.TablePrimaryKey) primaryKeyColumnMap.get(primaryKeyName);
86 addedprimaryKey.addColumn(primaryKeysInfo.getString(4));
87 }
88 }
89 }
90 primaryKeys.addAll(primaryKeyColumnMap.values());
91 primaryKeysInfo.close();
92 }
93
94 private void addIndexInfo(DatabaseMetaData dbmd, String catalog, String schema, String tableName) throws SQLException {
95 ResultSet indexInfo = dbmd.getIndexInfo(catalog, schema, tableName, false, false);
96 Map<String,TableIndex> indexColumnMap = new HashMap<String,TableIndex>();
97 while (indexInfo.next()) {
98 String indexName = indexInfo.getString(6);
99 if (indexName != null && !isIndexAPrimaryKey(indexName)) {
100 if (indexColumnMap.get(indexName) == null) {
101 TableIndex index = new TableIndex(indexName, indexInfo.getString(9), indexInfo.getBoolean(4));
102 indexColumnMap.put(indexName, index);
103 } else {
104 TableIndex addedIndex = (TableIndex) indexColumnMap.get(indexName);
105 addedIndex.addColumn(indexInfo.getString(9));
106 }
107 }
108 }
109 columnIndexes.addAll(indexColumnMap.values());
110 indexInfo.close();
111 }
112
113 private boolean isIndexAPrimaryKey(String indexName) {
114 for (int i = 0; i < primaryKeys.size(); i++) {
115 net.sourceforge.addam.ddlgen.generic.TablePrimaryKey primaryKey = (net.sourceforge.addam.ddlgen.generic.TablePrimaryKey) primaryKeys.get(i);
116 if (primaryKey.getPrimaryKeyName().equals(indexName)) return true;
117 }
118 return false;
119 }
120
121 private TableColumn getColumnDDL(ResultSet columnMetaData) throws SQLException {
122 String defaultValue = columnMetaData.getString(13);
123 String columnName = columnMetaData.getString(4);
124 TableColumn column = new TableColumn(columnName, columnMetaData.getString(6), columnMetaData.getString(7), columnMetaData.getString(9), defaultValue);
125 if (columnMetaData.getString(18).trim().equals("NO")) {
126 nonNullableColumns.add(column);
127 }
128 if (defaultValue != null) {
129 defaultValueColumns.add(column);
130 }
131 return column;
132 }
133 }