/**
*
*/
package com.grendelscan.scan.data;
import java.sql.SQLException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.grendelscan.data.database.CommandJob;
import com.grendelscan.data.database.DataNotFoundException;
import com.grendelscan.data.database.Database;
import com.grendelscan.data.database.DatabaseUser;
import com.grendelscan.scan.Scan;
/**
* @author david
*
*/
public class PersistedTestData implements DatabaseUser {
private static final Logger LOGGER = LoggerFactory
.getLogger(PersistedTestData.class);
private static final String dbFile = "test-data.db";
private static final String INT_TABLE = "int_data";
private static final String OBJECT_TABLE = "object_data";
private static final String STRING_TABLE = "string_data";
private final Database database;
public PersistedTestData() {
database = new Database(Scan.getInstance().getOutputDirectory()
+ dbFile);
initializeDatabase();
}
public boolean containsItem(final String name) {
try {
getObject(name);
} catch (DataNotFoundException e) {
return false;
}
return true;
}
public void deleteInt(final String name) {
deleteItem(name, INT_TABLE);
}
private void deleteItem(final String name, final String table) {
CommandJob job = new CommandJob("DELETE FROM " + table
+ " WHERE name = ?", new Object[] { name });
try {
database.execute(job);
} catch (Throwable e) {
LOGGER.error(
"Problem deleting from " + table + ": " + e.toString(), e);
}
}
public void deleteObject(final String name) {
deleteItem(name, OBJECT_TABLE);
}
public void deleteString(final String name) {
deleteItem(name, STRING_TABLE);
}
public boolean getBoolean(final String name) throws DataNotFoundException {
return getInt(name) == 1;
}
public final Database getDatabase() {
return database;
}
public int getInt(final String name) throws DataNotFoundException {
try {
return database.selectSimpleInt("SELECT value FROM " + INT_TABLE
+ " WHERE name = ?", new Object[] { name });
} catch (DataNotFoundException e) {
throw e;
} catch (Throwable e) {
LOGGER.error("Weird problem getting test data: " + e.toString(), e);
throw new DataNotFoundException(e);
}
}
public Object getObject(final String name) throws DataNotFoundException {
try {
return database.selectSimpleObject("SELECT value FROM "
+ OBJECT_TABLE + " WHERE name = ?", new Object[] { name });
} catch (DataNotFoundException e) {
throw e;
} catch (Throwable e) {
LOGGER.error("Weird problem getting test data: " + e.toString(), e);
throw new DataNotFoundException(e);
}
}
public String getString(final String name) throws DataNotFoundException {
try {
return (String) database.selectSimpleObject("SELECT value FROM "
+ STRING_TABLE + " WHERE name = ?", new Object[] { name });
} catch (DataNotFoundException e) {
throw e;
} catch (Throwable e) {
LOGGER.error("Weird problem getting test data: " + e.toString(), e);
throw new DataNotFoundException(e);
}
}
public void initializeDatabase() {
LOGGER.debug("Initializing database for test module persisted data storage");
try {
initializeTable(STRING_TABLE, "varchar(200)");
initializeTable(INT_TABLE, "int");
initializeTable(OBJECT_TABLE, "blob");
} catch (Throwable e) {
LOGGER.error(
"Problem with creating database for persisted test data: "
+ e.toString(), e);
System.exit(1);
}
}
private void initializeTable(final String tableName, final String dataType)
throws SQLException, Throwable {
if (!database.tableExists(tableName)) {
String tableQuery = "CREATE TABLE " + tableName
+ " (name varchar(100), value " + dataType
+ ", PRIMARY KEY (name))";
String indexQuery = "CREATE INDEX IDX_DEFAULT_" + tableName
+ " ON " + tableName + " (name)";
database.execute(tableQuery);
database.execute(indexQuery);
}
}
public void setBoolean(final String name, final boolean value) {
setInt(name, value ? 1 : 0);
}
public void setInt(final String name, final Integer i) {
deleteInt(name);
CommandJob job = new CommandJob("INSERT INTO " + INT_TABLE
+ " (name, value) VALUES (?, ?)", new Object[] { name, i });
try {
database.execute(job);
} catch (Throwable e) {
LOGGER.error("Problem saving integer: " + e.toString(), e);
}
}
public void setObject(final String name, final Object object) {
deleteObject(name);
CommandJob job = new CommandJob("INSERT INTO " + OBJECT_TABLE
+ " (name, value) VALUES (?, ?)", new Object[] { name, object });
try {
database.execute(job);
} catch (Throwable e) {
LOGGER.error("Problem saving object: " + e.toString(), e);
}
}
public void setString(final String name, final String string) {
deleteString(name);
CommandJob job = new CommandJob("INSERT INTO " + STRING_TABLE
+ " (name, value) VALUES (?, ?)", new Object[] { name, string });
try {
database.execute(job);
} catch (Throwable e) {
LOGGER.error("Problem saving string: " + e.toString(), e);
}
}
@Override
public void shutdown(final boolean gracefully) throws InterruptedException {
LOGGER.debug("Shutting down PersistedTestData");
database.stop(gracefully).join();
}
}