/*
* Copyright (c) 2001, Xiaoping Jia.
* All Rights Reserved.
*/
package db;
import java.io.*;
import java.util.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
/**
* A servlet that counts the votes for the Best Pictures of the 2001 Acadamy Awards, and
* for the favorate pictures.
* This version uses JDBC 2.0 features, which requres a JDBC 2.0 compliant driver.
* Another version of the program, db.Oscar
, uses only JDBC 1.0 features.
*
* The votes are stored in a database, which is created by a separate application
* OscarDB
. The database must be created before the Oscar2 servlet is started
* for the first time.
*
* @version 1.1 2001/04/29
* @since 1.0
* @author Xiaoping Jia
* @see db.OscarDB
* @see db.Oscar
*/
public class Oscar2 extends HttpServlet {
public void init() {
ServletContext ctx = getServletContext();
DBConnector.setDBPropertiesFileName(ctx.getRealPath("WEB-INF/classes/db.properties"));
DBConnector db = DBConnector.getInstance();
try {
db.startup(OscarDB.dbName);
conn = db.getConnection();
// set the attributes needed to use JDBC 2.0 result set update features
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(ClassNotFoundException e) {
} catch (SQLException e) {
conn = null;
stmt = null;
}
}
public void destroy() {
try {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {}
DBConnector db = DBConnector.getInstance();
db.shutdown();
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String oscar = request.getParameter("oscar");
String title1 = request.getParameter("first");
String title2 = request.getParameter("second");
String title3 = request.getParameter("third");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("");
out.println("
Oscar: Best Picture");
out.println("");
out.println("Your vote among the nominated pictures
");
if (oscar != null) {
if ("Brockovich".equals(oscar)) {
out.println("Erin Brockovich");
} else if ("Dragon".equals(oscar)) {
out.println("Crouching Tiger, Hidden Dragon");
} else {
out.println(oscar);
}
} else {
out.println("None.");
}
out.println("Top 3 picks of your favorate pictures of the year
");
out.println("");
out.println("First: | " + title1 + " |
");
out.println("Second: | " + title2 + " |
");
out.println("Third: | " + title3 + " |
");
out.println("
");
out.println("
");
out.println(" Voting results
");
if (conn != null &&
stmt != null) {
try {
synchronized (stmt) {
String queryString;
out.println(" Best picture");
out.println("
");
queryString = "SELECT * FROM " + OscarDB.bestPictureTableName;
ResultSet rset = stmt.executeQuery(queryString);
while (rset.next()) {
String id = rset.getString("id");
String title = rset.getString("title");
int count = rset.getInt("count1");
if (oscar != null &&
oscar.equals(id)) {
// JDBC 2.0 feature
rset.updateInt("count", ++count);
rset.updateRow();
}
out.println("" + title + " | " + count + " |
");
}
rset.close();
out.println("
");
String id1 = normalize(title1);
String id2 = normalize(title2);
String id3 = normalize(title3);
if (id1 != null) {
queryString = "SELECT * FROM " + OscarDB.favoratePictureTableName +
" WHERE id = '" + id1 + "'";
rset = stmt.executeQuery(queryString);
if (rset.next()) {
// JDBC 2.0 feature
int count1 = rset.getInt("count1st");
rset.updateInt("count1st", ++count1);
rset.updateRow();
} else {
// JDBC 2.0 feature
rset.moveToInsertRow();
rset.updateString("id", id1);
rset.updateString("title", title1);
rset.updateInt("count1st", 1);
rset.updateInt("count2nd", 0);
rset.updateInt("count3rd", 0);
rset.insertRow();
}
rset.close();
}
if (id2 != null) {
queryString = "SELECT * FROM " + OscarDB.favoratePictureTableName +
" WHERE id = '" + id2 + "'";
rset = stmt.executeQuery(queryString);
if (rset.next()) {
// JDBC 2.0 feature
int count2 = rset.getInt("count2st");
rset.updateInt("count2st", ++count2);
rset.updateRow();
} else {
// JDBC 2.0 feature
rset.moveToInsertRow();
rset.updateString("id", id2);
rset.updateString("title", title2);
rset.updateInt("count1st", 0);
rset.updateInt("count2nd", 1);
rset.updateInt("count3rd", 0);
rset.insertRow();
}
rset.close();
}
if (id3 != null) {
queryString = "SELECT * FROM " + OscarDB.favoratePictureTableName +
" WHERE id = '" + id3 + "'";
rset = stmt.executeQuery(queryString);
if (rset.next()) {
// JDBC 2.0 feature
int count3 = rset.getInt("count3rd");
rset.updateInt("count3rd", ++count3);
rset.updateRow();
} else {
// JDBC 2.0 feature
rset.moveToInsertRow();
rset.updateString("id", id3);
rset.updateString("title", title3);
rset.updateInt("count1st", 0);
rset.updateInt("count2nd", 0);
rset.updateInt("count3rd", 1);
rset.insertRow();
}
rset.close();
}
out.println("Favorite pictures");
out.println("
");
out.println("Title> | First | Second | Third |
");
queryString = "SELECT * FROM " + OscarDB.favoratePictureTableName +
" ORDER BY count1st, count2nd, count3rd";
rset = stmt.executeQuery(queryString);
while (rset.next()) {
String id = rset.getString("id");
String title = rset.getString("title");
int count1 = rset.getInt("count1st");
int count2 = rset.getInt("count2nd");
int count3 = rset.getInt("count3rd");
out.println("" + title +
" | " + count1 + " | " +
" | " + count2 + " | " +
" | " + count3 + " |
");
}
rset.close();
out.println("
");
}
} catch (SQLException se) {
se.printStackTrace();
}
}
out.println("");
out.println("");
}
protected Connection conn;
protected Statement stmt;
protected Set stopWords;
// initialization block
{
stopWords = new HashSet();
stopWords.add("a");
stopWords.add("an");
stopWords.add("and");
stopWords.add("for");
stopWords.add("of");
stopWords.add("the");
stopWords.add("with");
}
protected String normalize(String title) {
if (title != null) {
StringTokenizer st = new StringTokenizer(title);
StringBuffer sb = new StringBuffer();
boolean first = true;
while (st.hasMoreTokens()) {
String word = st.nextToken();
word = word.trim().toLowerCase();
if (!stopWords.contains(word)) {
if (!first) {
sb.append(' ');
} else {
first = false;
}
sb.append(word);
}
}
return sb.toString();
}
return null;
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}