From 7965c415164b017261856102198cfd8e0a206097 Mon Sep 17 00:00:00 2001 From: Matthew Slowe Date: Sun, 31 May 2020 10:06:14 +0100 Subject: [PATCH] working poc --- README.md | 33 ++++ WEB-INF/classes/.keep | 0 WEB-INF/files/defs.db | Bin 0 -> 208896 bytes WEB-INF/lib/.keep | 0 .../src/uk/org/mafoo/selfdefined/Checker.java | 176 ++++++++++++++++++ .../src/uk/org/mafoo/selfdefined/Report.java | 62 ++++++ .../uk/org/mafoo/selfdefined/ReportWord.java | 54 ++++++ WEB-INF/web.xml | 21 +++ index.jsp | 22 +++ 9 files changed, 368 insertions(+) create mode 100644 README.md create mode 100644 WEB-INF/classes/.keep create mode 100644 WEB-INF/files/defs.db create mode 100644 WEB-INF/lib/.keep create mode 100644 WEB-INF/src/uk/org/mafoo/selfdefined/Checker.java create mode 100644 WEB-INF/src/uk/org/mafoo/selfdefined/Report.java create mode 100644 WEB-INF/src/uk/org/mafoo/selfdefined/ReportWord.java create mode 100644 WEB-INF/web.xml create mode 100644 index.jsp diff --git a/README.md b/README.md new file mode 100644 index 0000000..391eca8 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +Self-defined checker +==================== + +Proof-of-concept language checker using the [Self-defined project](https://www.selfdefined.app/). + +Requirements +------------ + +* J2EE compatible web server (eg. Tomcat) + +Preparation +----------- + +1. Clone the repository +2. Get the dependencies and ensure they're either in `WEB-INF/lib` or the webserver's shared `lib`: + * SQLite JDBC driver (eg. https://bitbucket.org/xerial/sqlite-jdbc/downloads/sqlite-jdbc-3.30.1.jar) + * JSON library (eg. http://stleary.github.io/JSON-java/index.html) +3. Compile the code (YMMV) + ```shell + cd WEB-INF + export LIBPATH=/path/to/shared/java/libraries + javac -d classes -classpath src:classes:lib/json-20200518.jar:$LIBPATH/el-api.jar:$LIBPATH/servlet-api.jar:$LIBPATH/sqlite-jdbc.jar src/uk/org/mafoo/selfdefined/Checker.java + ``` +4. Build a war file + ```shell + jar -cvf self-defined.war . + ``` +5. Deploy! (move the war file to your webservers `/webapps` folder and wait for it to deploy) + +Notes +----- + +The included database is build using the data from https://github.com/tatianamac/selfdefined. diff --git a/WEB-INF/classes/.keep b/WEB-INF/classes/.keep new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/files/defs.db b/WEB-INF/files/defs.db new file mode 100644 index 0000000000000000000000000000000000000000..f6bc49f7d071263b7f60111179bce4130fe0a0ca GIT binary patch literal 208896 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 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 + } + +} \ No newline at end of file diff --git a/WEB-INF/src/uk/org/mafoo/selfdefined/Report.java b/WEB-INF/src/uk/org/mafoo/selfdefined/Report.java new file mode 100644 index 0000000..1d98e60 --- /dev/null +++ b/WEB-INF/src/uk/org/mafoo/selfdefined/Report.java @@ -0,0 +1,62 @@ +package uk.org.mafoo.selfdefined; + +import java.util.ArrayList; +import org.json.*; + +class Report { + + ArrayList data; + + public Report() { + data = new ArrayList(); + } + + public void add(String word, Integer count, String flagLevel, String flagText, String flagFor, String url) { + data.add(new ReportWord(word, count, flagLevel, flagText, flagFor, url)); + } + + public String toString() { + StringBuilder s = new StringBuilder(); + s.append("["); + int n = 0; + for (ReportWord w : data) { + if(n++ > 0) { s.append(","); } + s.append(w); + } + s.append("]"); + + return s.toString(); + } + + public JSONObject toJSONObject() { + JSONArray arr = new JSONArray(); + for(ReportWord w : data) { + arr.put(w.toJSONObject()); + } + + JSONObject obj = new JSONObject(); + obj.put("results", arr); + return obj; + } + + public String toHTML() { + StringBuilder str = new StringBuilder(); + str.append("\n"); + str.append(" \n"); + str.append(" \n"); + str.append(" \n"); + str.append(" \n"); + str.append(" \n"); + str.append(" \n"); + str.append(" \n"); + str.append(" \n"); + str.append(" \n"); + for(ReportWord w : data) { + str.append(w.toHTML()); + } + str.append(" \n"); + str.append("
WordCountFlag LevelFlag TextSee-AlsoURL
\n"); + + return str.toString(); + } +} \ No newline at end of file diff --git a/WEB-INF/src/uk/org/mafoo/selfdefined/ReportWord.java b/WEB-INF/src/uk/org/mafoo/selfdefined/ReportWord.java new file mode 100644 index 0000000..baad700 --- /dev/null +++ b/WEB-INF/src/uk/org/mafoo/selfdefined/ReportWord.java @@ -0,0 +1,54 @@ +package uk.org.mafoo.selfdefined; + +import org.json.JSONObject; + +class ReportWord { + String word; + Integer count; + String flagLevel; + String flagText; + String flagFor; + String url; + + public ReportWord(String word, Integer count, String flagLevel, String flagText, String flagFor, String url) { + this.word = word; + this.count = count; + this.flagLevel = flagLevel; + this.flagText = flagText; + this.flagFor = flagFor; + this.url = url; + } + + public String toString() { + return String.format( + "{word=%s,count=%d,flagLevel=%s,flagText=%s,flagFor=%s,url=%s}", + word, count, flagLevel, flagText, flagFor, url + ); + } + + public JSONObject toJSONObject() { + JSONObject jo = new JSONObject(); + jo.put("word", word); + jo.put("count", count); + jo.put("flagLevel", flagLevel); + jo.put("flagText", flagText); + jo.put("flagFor", flagFor); + jo.put("url", url); + + return jo; + } + + public String toHTML() { + StringBuilder str = new StringBuilder(); + str.append("\n"); + str.append(" "); str.append(word); str.append("\n"); + str.append(" "); str.append(count); str.append("\n"); + str.append(" "); str.append(flagLevel); str.append("\n"); + str.append(" "); str.append(flagText); str.append("\n"); + str.append(" "); str.append(flagFor); str.append("\n"); + str.append(" ref\n"); + str.append("\n"); + + return str.toString(); + } +} \ No newline at end of file diff --git a/WEB-INF/web.xml b/WEB-INF/web.xml new file mode 100644 index 0000000..c22acae --- /dev/null +++ b/WEB-INF/web.xml @@ -0,0 +1,21 @@ + + + + + S + S + + + CheckerServlet + uk.org.mafoo.selfdefined.Checker + + + + CheckerServlet + /c + + + \ No newline at end of file diff --git a/index.jsp b/index.jsp new file mode 100644 index 0000000..9c24daf --- /dev/null +++ b/index.jsp @@ -0,0 +1,22 @@ + + + + Language Checker + + + + +

Language checker

+

Language checker based on the Self Defined project

+
+ Self-Defined seeks to provide more inclusive, holistic, and fluid definitions to reflect the diverse perspectives of the modern world. + + With the foundation of vocabulary, we can begin to understand lived experiences of people different than us. Words can provide us with a sense of identify and allow us to find kinship through common experiences. +
+
+ + + +
+

You can also POST to the /Checker endpoint specifying Accept: text/json.

+ \ No newline at end of file