JDBCBayesianAnalyzerpublic abstract class JDBCBayesianAnalyzer extends BayesianAnalyzer Manages the persistence of the spam bayesian analysis corpus using a JDBC database.
This class is abstract to allow implementations to
take advantage of different logging capabilities/interfaces in
different parts of the code. |
Fields Summary |
---|
public static final String | DATABASE_LOCKPublic object representing a lock on database activity. | private final JDBCUtil | theJDBCUtilThe JDBCUtil helper class | private SqlResources | sqlQueriesContains all of the sql strings for this component. | private String | sqlFileNameHolds value of property sqlFileName. | private File | sqlFile | private Map | sqlParametersHolds value of property sqlParameters. | private static long | lastDatabaseUpdateTimeHolds value of property lastDatabaseUpdateTime. |
Constructors Summary |
---|
public JDBCBayesianAnalyzer()Default constructor.
|
Methods Summary |
---|
private void | checkTables(java.sql.Connection conn)
DatabaseMetaData dbMetaData = conn.getMetaData();
// Need to ask in the case that identifiers are stored, ask the DatabaseMetaInfo.
// Try UPPER, lower, and MixedCase, to see if the table is there.
boolean dbUpdated = false;
dbUpdated = createTable(conn, "hamTableName", "createHamTable");
dbUpdated = createTable(conn, "spamTableName", "createSpamTable");
dbUpdated = createTable(conn, "messageCountsTableName", "createMessageCountsTable");
//Commit our changes if necessary.
if (conn != null && dbUpdated && !conn.getAutoCommit()) {
conn.commit();
dbUpdated = false;
}
| private boolean | createTable(java.sql.Connection conn, java.lang.String tableNameSqlStringName, java.lang.String createSqlStringName)
String tableName = sqlQueries.getSqlString(tableNameSqlStringName, true);
DatabaseMetaData dbMetaData = conn.getMetaData();
// Try UPPER, lower, and MixedCase, to see if the table is there.
if (theJDBCUtil.tableExists(dbMetaData, tableName)) {
return false;
}
PreparedStatement createStatement = null;
try {
createStatement =
conn.prepareStatement(sqlQueries.getSqlString(createSqlStringName, true));
createStatement.execute();
StringBuffer logBuffer = null;
logBuffer =
new StringBuffer(64)
.append("Created table '")
.append(tableName)
.append("' using sqlResources string '")
.append(createSqlStringName)
.append("'.");
delegatedLog(logBuffer.toString());
} finally {
theJDBCUtil.closeJDBCStatement(createStatement);
}
return true;
| protected abstract void | delegatedLog(java.lang.String errorString)An abstract method which child classes override to handle logging of
errors in their particular environments.
| public static long | getLastDatabaseUpdateTime()Getter for static lastDatabaseUpdateTime.
return lastDatabaseUpdateTime;
| public java.lang.String | getSqlFileName()Getter for property sqlFileName.
return this.sqlFileName;
| public java.util.Map | getSqlParameters()Getter for property sqlParameters.
return this.sqlParameters;
| public void | initSqlQueries(java.sql.Connection conn, org.apache.mailet.MailetContext mailetContext)Initializes the sql query environment from the SqlResources file.
Will look for conf/sqlResources.xml.
try {
if (conn.getAutoCommit()) {
conn.setAutoCommit(false);
}
this.sqlFile = new File((String) mailetContext.getAttribute("confDir"), "sqlResources.xml").getCanonicalFile();
sqlQueries.init(this.sqlFile, JDBCBayesianAnalyzer.class.getName() , conn, getSqlParameters());
checkTables(conn);
} finally {
theJDBCUtil.closeJDBCConnection(conn);
}
| public void | loadHamNSpam(java.sql.Connection conn)Loads the token frequencies from the database.
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = conn.prepareStatement(sqlQueries.getSqlString("selectHamTokens", true));
rs = pstmt.executeQuery();
Map ham = getHamTokenCounts();
while (rs.next()) {
String token = rs.getString(1);
int count = rs.getInt(2);
// to reduce memory, use the token only if the count is > 1
if (count > 1) {
ham.put(token, new Integer(count));
}
}
//Verbose.
delegatedLog("Ham tokens count: " + ham.size());
rs.close();
pstmt.close();
//Get the spam tokens/counts.
pstmt = conn.prepareStatement(sqlQueries.getSqlString("selectSpamTokens", true));
rs = pstmt.executeQuery();
Map spam = getSpamTokenCounts();
while (rs.next()) {
String token = rs.getString(1);
int count = rs.getInt(2);
// to reduce memory, use the token only if the count is > 1
if (count > 1) {
spam.put(token, new Integer(count));
}
}
//Verbose.
delegatedLog("Spam tokens count: " + spam.size());
rs.close();
pstmt.close();
//Get the ham/spam message counts.
pstmt = conn.prepareStatement(sqlQueries.getSqlString("selectMessageCounts", true));
rs = pstmt.executeQuery();
if (rs.next()) {
setHamMessageCount(rs.getInt(1));
setSpamMessageCount(rs.getInt(2));
}
rs.close();
pstmt.close();
} finally {
if (rs != null) {
try {
rs.close();
} catch (java.sql.SQLException se) {
}
rs = null;
}
if (pstmt != null) {
try {
pstmt.close();
} catch (java.sql.SQLException se) {
}
pstmt = null;
}
}
| private void | setMessageCount(java.sql.Connection conn, java.lang.String sqlStatement, int count)
PreparedStatement init = null;
PreparedStatement update = null;
try {
//set the ham/spam message counts.
init = conn.prepareStatement(sqlQueries.getSqlString("initializeMessageCounts", true));
update = conn.prepareStatement(sqlStatement);
update.setInt(1, count);
if (update.executeUpdate() == 0) {
init.executeUpdate();
update.executeUpdate();
}
} finally {
if (init != null) {
try {
init.close();
} catch (java.sql.SQLException ignore) {
}
}
if (update != null) {
try {
update.close();
} catch (java.sql.SQLException ignore) {
}
}
}
| public void | setSqlFileName(java.lang.String sqlFileName)Setter for property sqlFileName.
this.sqlFileName = sqlFileName;
| public void | setSqlParameters(java.util.Map sqlParameters)Setter for property sqlParameters.
this.sqlParameters = sqlParameters;
| public static void | touchLastDatabaseUpdateTime()Sets static lastDatabaseUpdateTime to System.currentTimeMillis().
lastDatabaseUpdateTime = System.currentTimeMillis();
| public void | updateHamTokens(java.sql.Connection conn)Updates the database with new "ham" token frequencies.
updateTokens(conn, getHamTokenCounts(),
sqlQueries.getSqlString("insertHamToken", true),
sqlQueries.getSqlString("updateHamToken", true));
setMessageCount(conn, sqlQueries.getSqlString("updateHamMessageCounts", true), getHamMessageCount());
| public void | updateSpamTokens(java.sql.Connection conn)Updates the database with new "spam" token frequencies.
updateTokens(conn, getSpamTokenCounts(),
sqlQueries.getSqlString("insertSpamToken", true),
sqlQueries.getSqlString("updateSpamToken", true));
setMessageCount(conn, sqlQueries.getSqlString("updateSpamMessageCounts", true), getSpamMessageCount());
| private void | updateTokens(java.sql.Connection conn, java.util.Map tokens, java.lang.String insertSqlStatement, java.lang.String updateSqlStatement)
PreparedStatement insert = null;
PreparedStatement update = null;
try {
//Used to insert new token entries.
insert = conn.prepareStatement(insertSqlStatement);
//Used to update existing token entries.
update = conn.prepareStatement(updateSqlStatement);
Iterator i = tokens.keySet().iterator();
while (i.hasNext()) {
String key = (String) i.next();
int value = ((Integer) tokens.get(key)).intValue();
update.setInt(1, value);
update.setString(2, key);
//If the update affected 0 (zero) rows, then the token hasn't been
//encountered before, and we need to add it to the corpus.
if (update.executeUpdate() == 0) {
insert.setString(1, key);
insert.setInt(2, value);
insert.executeUpdate();
}
}
} finally {
if (insert != null) {
try {
insert.close();
} catch (java.sql.SQLException ignore) {
}
insert = null;
}
if (update != null) {
try {
update.close();
} catch (java.sql.SQLException ignore) {
}
update = null;
}
}
|
|