package uk.org.mafoo.selfdefined; import javax.servlet.annotation.WebServlet; import javax.management.RuntimeErrorException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.sql.*; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import org.sqlite.*; @WebServlet("/Checker") public class Checker extends HttpServlet { Connection db; PreparedStatement p_checkWord, p_getWord; String urlBase = "https://www.selfdefined.app/definitions/"; public void init() throws ServletException { // Do required initialization try { db = DriverManager.getConnection( "jdbc:sqlite:" + getServletContext().getRealPath("/WEB-INF/files/defs.db")); p_checkWord = db.prepareStatement("SELECT word, ref FROM words WHERE word LIKE ?"); p_getWord = db.prepareStatement("SELECT title, slug, flag_level, flag_text, flag_for FROM definitions WHERE title LIKE ?"); } catch (SQLException e) { throw new RuntimeException("Failed to load database: " + e.toString()); } } private HashMap getWord(String word) { try { p_getWord.setString(1, word); ResultSet rs = p_getWord.executeQuery(); if(rs.next()) { HashMap _return = new HashMap(); _return.put("word", rs.getString(1)); _return.put("slug", rs.getString(2)); _return.put("flagLevel", rs.getString(3)); _return.put("flagText", rs.getString(4)); _return.put("flagFor", rs.getString(5)); return _return; } else { return null; } } catch (SQLException e) { return null; } } private void checkWord(String word, HashMap wordMap, HashMap wordCounts) { assert(p_checkWord != null); assert(word != null); wordCounts.put(word, wordCounts.getOrDefault(word, 0) + 1); // Do we already know the answer? if(wordMap.containsKey(word)) { // If so, just increment the wordcount and return return; } try { p_checkWord.setString(1, word); ResultSet rs = p_checkWord.executeQuery(); while(rs.next()) { if(rs.getString(1).equalsIgnoreCase(rs.getString(2))) { wordMap.put(rs.getString(1), null); } else { wordMap.put(rs.getString(1), rs.getString(2)); } } } catch (SQLException e) { // FIXME } } private Report process(String[] input) { HashMap wordMap = new HashMap(); HashMap wordCounts = new HashMap(); for(String line : input) { for(String word : line.split("\\s+")) { checkWord(word, wordMap, wordCounts); } } Report report = new Report(); for (String word : wordMap.keySet()) { String ref = wordMap.get(word); if(ref == null) ref = word; HashMap canonicalWord = getWord(ref); report.add( canonicalWord.get("word"), wordCounts.get(word), canonicalWord.get("flagLevel"), canonicalWord.get("flagText"), canonicalWord.get("flagFor"), urlBase.concat(canonicalWord.get("slug")) ); } return report; } public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String[] vals = req.getParameterValues("input"); if(vals != null) { Report r = process(vals); PrintWriter out = resp.getWriter(); ArrayList acceptHeaders = new ArrayList(); for(Enumeration acceptHeaders_e = req.getHeaders("Accept"); acceptHeaders_e.hasMoreElements(); ) { acceptHeaders.add(acceptHeaders_e.nextElement()); } if(acceptHeaders.contains("text/json")) { resp.setContentType("text/json"); out.println(r.toJSONObject()); } else { out.println(""); out.println(""); out.println(""); out.println(" Language Checker"); out.println(" "); out.println(" "); out.println(""); out.println(""); out.println("

Language checker results

"); out.println(r.toHTML()); out.println(""); } } else { throw new RuntimeException("No data"); } } // public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // ArrayList arr = new ArrayList(); // try { // BufferedReader inputData = req.getReader(); // String line; // while((line = inputData.readLine()) != null) { // arr.add(line); // } // } catch (IOException e) { // // FIXME // } // if(arr.size() > 0) { // Report r = process((String[]) arr.toArray(new String[0])); // PrintWriter out = resp.getWriter(); // out.println(r.toJSONObject()); // } else { // throw new RuntimeException("No data"); // } // } public void destroy() { // Close the database } }