View Javadoc

1   /*
2    * Copyright (c) 2004 International Decision Systems, Inc.  All Rights Reserved.
3    *
4    * By using this Software, You acknowledge that the Software is a valuable asset
5    * and trade secret of either International Decision Systems, Inc. ("IDSI") or a
6    * third party supplier of IDSI and constitutes confidential and proprietary
7    * information.
8    *
9    * NEITHER IDSI NOR ANY AGENT OR PERSON ACTING FOR OR WITH IDSI HAS MADE OR DOES
10   * MAKE ANY STATEMENTS, AFFIRMATIONS, REPRESENTATIONS OR WARRANTIES WHATSOEVER
11   * TO YOU, WHETHER EXPRESS OR IMPLIED, AS TO THE SOFTWARE, THE QUALITY OR
12   * CONDITION OF THE SOFTWARE, OR THE OPERATING CHARACTERISTICS OR RELIABILITY OF
13   * THE SOFTWARE, OR ITS SUITABILITY FOR ANY GENERAL OR PARTICULAR PURPOSE, OR AS
14   * TO ANY OTHER MATTER WHATSOEVER; ANY AND ALL OTHER WARRANTIES INCLUDING
15   * WITHOUT LIMITATION ANY WARRANTIES IMPLIED BY LAW, SUCH AS THE IMPLIED
16   * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND TITLE,
17   * USE AND NON-INFRINGEMENT; ARE HEREBY EXPRESSLY DISCLAIMED AND EXCLUDED.
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 }