package edu.wiki.service;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.HashMap;
import java.util.Locale;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.w3c.dom.Document;
import com.sun.org.apache.xerces.internal.dom.DocumentImpl;
import com.sun.org.apache.xerces.internal.parsers.DOMParser;
import edu.wiki.api.concept.IConceptIterator;
import edu.wiki.api.concept.IConceptVector;
import edu.wiki.search.ESASearcher;
import edu.wiki.search.NormalizedWikipediaDistance;
public class ESAServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected ServletContext context;
protected NormalizedWikipediaDistance nwd;
protected ESASearcher esa;
DOMParser parser = new DOMParser() ;
protected Document doc = new DocumentImpl();
// protected DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(Locale.US);
protected DecimalFormat df = new DecimalFormat("#.##########");
static Connection connection;
static Statement stmtQuery;
static String strTitles = "SELECT id,title FROM article WHERE id IN ";
public static void initDB() throws ClassNotFoundException, SQLException, IOException {
// Load the JDBC driver
String driverName = "com.mysql.jdbc.Driver"; // MySQL Connector
Class.forName(driverName);
// read DB config
InputStream is = ESASearcher.class.getResourceAsStream("/config/db.conf");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String serverName = br.readLine();
String mydatabase = br.readLine();
String username = br.readLine();
String password = br.readLine();
br.close();
// Create a connection to the database
String url = "jdbc:mysql://" + serverName + "/" + mydatabase; // a JDBC url
connection = DriverManager.getConnection(url, username, password);
stmtQuery = connection.createStatement();
stmtQuery.setFetchSize(100);
}
public void init(ServletConfig config) throws ServletException {
super.init(config);
context = config.getServletContext() ;
nwd = new NormalizedWikipediaDistance(context.getInitParameter("index_path"));
try {
esa = new ESASearcher();
initDB();
} catch (Exception e) {
e.printStackTrace();
throw new ServletException();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
doGet(request, response) ;
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
try {
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding("UTF-8") ;
String task = request.getParameter("task") ;
//redirect to home page if there is no task
if (task==null) {
response.setContentType("text/html");
response.getWriter().append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"><html><head><meta http-equiv=\"REFRESH\" content=\"0;url=" + context.getInitParameter("server_path") + "></head><body></body></html>") ;
return ;
}
//process compare request
if (task.equals("nwd")) {
String term1 = request.getParameter("term1");
String term2 = request.getParameter("term2") ;
if (term1 == null || term2 == null) {
response.setContentType("text/html");
response.getWriter().append("-1") ;
return ;
}
else {
final double distance = nwd.getDistance(term1, term2);
response.setContentType("text/html");
if(distance == 10000.0){
response.getWriter().append(String.valueOf(distance)) ;
}
else if(distance == -1){
response.getWriter().append(String.valueOf(distance)) ;
}
else {
response.getWriter().append(df.format(distance)) ;
}
return ;
}
}
//process compare request
if (task.equals("esa")) {
String term1 = request.getParameter("term1");
String term2 = request.getParameter("term2") ;
if (term1 == null || term2 == null) {
response.setContentType("text/html");
response.getWriter().append("-1") ;
return ;
}
else {
final double sim = esa.getRelatedness(term1, term2);
response.setContentType("text/html");
if(sim == -1){
response.getWriter().append(String.valueOf(sim)) ;
}
else {
response.getWriter().append(df.format(sim)) ;
}
esa.clean();
return ;
}
}
//process compare request
if (task.equals("vector")) {
final String source = request.getParameter("source");
final String strLimit = request.getParameter("limit");
int limit;
if(strLimit == null){
limit = 10;
}
else {
limit = Integer.valueOf(strLimit);
}
if (source == null) {
response.setContentType("text/html");
response.getWriter().append("null") ;
return ;
}
else {
response.setContentType("text/html");
final IConceptVector cv = esa.getConceptVector(source);
if(cv == null){
response.getWriter().append("null") ;
}
else {
final IConceptVector ncv = esa.getNormalVector(cv, limit);
final IConceptIterator it = ncv.orderedIterator();
HashMap<Integer, Double> vals = new HashMap<Integer, Double>(10);
HashMap<Integer, String> titles = new HashMap<Integer, String>(10);
String inPart = "(";
int count = 0;
while(it.next() && count < limit){
inPart += it.getId() + ",";
vals.put(it.getId(),it.getValue());
count++;
}
inPart = inPart.substring(0,inPart.length()-1) + ")";
ResultSet r = stmtQuery.executeQuery(strTitles + inPart);
while(r.next()){
titles.put(r.getInt(1), new String(r.getBytes(2),"UTF-8"));
}
it.reset();
count = 0;
while(it.next() && count < limit){
int id = it.getId();
response.getWriter().append(id + "\t" + titles.get(id) + "\t" + df.format(vals.get(id)) + "\n") ;
count++;
}
}
return ;
}
}
} catch (Exception error) {
response.reset() ;
response.setContentType("application/xml");
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding("UTF8") ;
response.getWriter().append("error");
}
}
}