/**
* Copyright 2009 ATG DUST Project Licensed under the Apache License, Version
* 2.0 (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
* or agreed to in writing, software distributed under the License is
* distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package atg.service.idgen;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.log4j.Logger;
/*
* IdGeneratorInitializer contains logic used to create and drop the schema used
* for IdGenerators.
* $Id: //test/UnitTests/base/main/src/Java/atg/service/idgen/IdGeneratorInitializer.java#4 $
* @author Adam Belmont
*/
public class IdGeneratorInitializer {
private static final String SELECT_COUNT_FROM_TEMPLATE = "select count(*) from";
private static final String DROP_TABLE_TEMPLATE = "DROP TABLE";
private InitializingIdGenerator mGenerator;
Logger log = Logger.getLogger(IdGeneratorInitializer.class);
/**
* Creates a new IdGeneratorInitializer used for the given generator,
* pGenerator.
*
* @param pGenerator
*/
public IdGeneratorInitializer(InitializingIdGenerator pGenerator) {
mGenerator = pGenerator;
}
/**
* Creates a new schema for the current generator. If the schema exists, it's
* dropped and a new one is created.
*
* @throws SQLException
*/
public void initialize() throws SQLException {
if (tablesExist()) {
dropTables();
}
initializeTables();
}
// --------------------------
/**
* Drops the tables required for this component
*
* @throws SQLException
*/
void dropTables() throws SQLException {
executeUpdateStatement(DROP_TABLE_TEMPLATE + " "
+ mGenerator.getTableName());
}
public Map<DataSource, DatabaseMetaData> mMetaDataMap = new HashMap<DataSource, DatabaseMetaData>();
/**
* Returns a cached instance of the DB metadata for the current connection
*
* @return
*/
public DatabaseMetaData getDatabaseMetaData() {
DataSource ds = mGenerator.getDataSource();
if (mMetaDataMap.get(ds) == null)
try {
mMetaDataMap.put(ds, ds.getConnection().getMetaData());
} catch (SQLException e) {
log.error("Failed to get DatabaseMetaData.", e);
}
return mMetaDataMap.get(ds);
}
// --------------------------
/**
* Returns true if the tables required for this component exist
*
* @return
*/
public boolean tablesExist() {
String[] types = { "TABLE" };
boolean exists = false;
try {
ResultSet rs = getDatabaseMetaData().getTables(null, null,
mGenerator.getTableName(), types);
while (rs.next()) {
exists = true;
}
} catch (SQLException e) {
; // eat it
}
return exists;
}
// --------------------------
/**
* Creates the table required for this component
*
* @throws SQLException
*/
void initializeTables() throws SQLException {
String statement = mGenerator.getCreateStatement();
log.info("Creating IdGenerator tables : " + statement);
executeUpdateStatement(statement);
}
// --------------------------
/**
* @return TODO
* @throws SQLException
*/
private boolean executeUpdateStatement(String pStatement) throws SQLException {
boolean success = false;
Statement st = null;
try {
st = mGenerator.getDataSource().getConnection().createStatement(); // statements
int i = st.executeUpdate(pStatement); // run the query
if (i == -1) {
log.error("Error creating tables with statement" + pStatement);
}
success = true;
} finally {
try {
st.close();
} catch (SQLException e) {
; // eat it
}
}
return success;
}
}