/*
* Copyright 2013 Matt Sicker and Contributors
*
* 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.tools.dynunit.service.idgen;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.sql.DataSource;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
/*
* 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 final InitializingIdGenerator mGenerator;
private static final Logger logger = LogManager.getLogger();
/**
* 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()
);
}
private final 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 ) {
logger.catching(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 ) {
logger.catching(e);
}
return exists;
}
// --------------------------
/**
* Creates the table required for this component
*
* @throws SQLException
*/
void initializeTables()
throws SQLException {
String statement = mGenerator.getCreateStatement();
logger.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 ) {
logger.error("Error creating tables with statement {}", pStatement);
}
success = true;
} finally {
try {
if ( st != null ) {
st.close();
}
} catch ( SQLException e ) {
logger.catching(e);
}
}
return success;
}
}