View Javadoc

1   /***
2    * Copyright 2009 ATG DUST Project Licensed under the Apache License, Version
3    * 2.0 (the "License"); you may not use this file except in compliance with the
4    * License. You may obtain a copy of the License at
5    * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
6    * or agreed to in writing, software distributed under the License is
7    * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
8    * KIND, either express or implied. See the License for the specific language
9    * governing permissions and limitations under the License.
10   */
11  
12  package atg.service.idgen;
13  
14  import java.sql.DatabaseMetaData;
15  import java.sql.ResultSet;
16  import java.sql.SQLException;
17  import java.sql.Statement;
18  import java.util.HashMap;
19  import java.util.Map;
20  
21  import javax.sql.DataSource;
22  
23  import org.apache.log4j.Logger;
24  
25  /*
26   * IdGeneratorInitializer contains logic used to create and drop the schema used
27   * for IdGenerators.
28   */
29  public class IdGeneratorInitializer {
30  
31    private static final String     SELECT_COUNT_FROM_TEMPLATE = "select count(*) from";
32  
33    private static final String     DROP_TABLE_TEMPLATE        = "DROP TABLE";
34  
35    private InitializingIdGenerator mGenerator;
36    Logger                          log                        = Logger
37                                                                   .getLogger(IdGeneratorInitializer.class);
38  
39    /***
40     * Creates a new IdGeneratorInitializer used for the given generator,
41     * pGenerator.
42     * 
43     * @param pGenerator
44     */
45    public IdGeneratorInitializer(InitializingIdGenerator pGenerator) {
46      mGenerator = pGenerator;
47    }
48  
49    /***
50     * Creates a new schema for the current generator. If the schema exists, it's
51     * dropped and a new one is created.
52     * @throws SQLException 
53     */
54    public void initialize() throws SQLException {
55      if (tablesExist()) {
56        dropTables();
57      }
58      initializeTables();
59    }
60  
61  // --------------------------
62    /***
63     * Drops the tables required for this component
64     * @throws SQLException 
65     */
66    void dropTables() throws SQLException {
67      executeUpdateStatement(DROP_TABLE_TEMPLATE + " "
68          + mGenerator.getTableName());
69    }
70  
71    public Map<DataSource,DatabaseMetaData> mMetaDataMap = new HashMap<DataSource,DatabaseMetaData>();
72    
73    
74    /***
75     * Returns a cached instance of the DB metadata for the current connection
76     * @return
77     */
78    DatabaseMetaData getDatabaseMetaData() {
79      DataSource ds = mGenerator.getDataSource();
80      if (mMetaDataMap.get(ds) == null)
81        try {
82          mMetaDataMap.put(ds,ds.getConnection().getMetaData());
83        } catch (SQLException e) {
84          // TODO Auto-generated catch block
85          e.printStackTrace();
86        }
87      return mMetaDataMap.get(ds);
88    }
89    // --------------------------
90    /***
91     * Returns true if the tables required for this component exist
92     * 
93     * @return
94     */
95    boolean tablesExist() {
96      String [] types = {"TABLE"};
97      boolean exists = false;
98      try {
99        ResultSet rs = getDatabaseMetaData().getTables(null, null, mGenerator.getTableName(),types);
100       while (rs.next()) {
101         exists = true;
102       }
103     } catch (SQLException e) {
104       ; // eat it
105     }
106     return exists;        
107   }
108 
109   // --------------------------
110   /***
111    * Creates the table required for this component
112    * @throws SQLException 
113    */
114   void initializeTables() throws SQLException {
115     String statement = mGenerator.getCreateStatement();
116     log.info("Creating IdGenerator tables : " + statement);
117     executeUpdateStatement(statement);
118   }
119 
120   // --------------------------
121   /***
122    * @return TODO
123    * @throws SQLException 
124    */
125   private boolean executeUpdateStatement(String pStatement) throws SQLException {
126     boolean success = false;
127     Statement st = null;
128     try {
129       st = mGenerator.getDataSource().getConnection().createStatement(); // statements
130       int i = st.executeUpdate(pStatement); // run the query
131       if (i == -1) {
132         log.error("Error creating tables with statement" + pStatement);
133       }
134       success = true;
135     } finally {
136       try {
137         st.close();
138       } catch (SQLException e) {
139         ; // eat it
140       }
141     }
142     return success;
143   }
144 }