From 07fb54148b27a85286c48d9c711519f90380278a Mon Sep 17 00:00:00 2001 From: Erik Perrone Date: Fri, 9 Mar 2018 13:40:21 +0000 Subject: [PATCH] Integrated automatic language recognition algorithm. Some other minor change. git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/data-analysis/nlphub@164886 82a268e6-3cf1-43bd-a215-b396298e98cf --- src/main/java/org/gcube/nlphub/NLPHub.java | 4 +- .../java/org/gcube/nlphub/NLPUploader.java | 9 +- .../org/gcube/nlphub/legacy/Constants.java | 8 - .../org/gcube/nlphub/legacy/JsonManager.java | 12 + .../nlphub/nlp/NLpLanguageRecognizer.java | 87 +- .../org/gcube/nlphub/nlp/NlpNerRunner.java | 5 +- .../java/org/gcube/nlphub/nlp/NlpUtils.java | 53 ++ src/main/webapp/colors.html | 60 ++ src/main/webapp/index.jsp | 686 +------------- src/main/webapp/js/main.js | 889 +++++++++++++++--- 10 files changed, 947 insertions(+), 866 deletions(-) create mode 100644 src/main/java/org/gcube/nlphub/nlp/NlpUtils.java create mode 100644 src/main/webapp/colors.html diff --git a/src/main/java/org/gcube/nlphub/NLPHub.java b/src/main/java/org/gcube/nlphub/NLPHub.java index 5fe3e81..c31d556 100644 --- a/src/main/java/org/gcube/nlphub/NLPHub.java +++ b/src/main/java/org/gcube/nlphub/NLPHub.java @@ -36,7 +36,7 @@ import org.gcube.nlphub.nlp.NlpNerRunner; public class NLPHub extends HttpServlet { private Logger logger = Logger.getLogger(NLPHub.class.getSimpleName()); private static final long serialVersionUID = 1L; - private String service = "http://dataminer-prototypes.d4science.org/wps/"; + public static final String service = "http://dataminer-prototypes.d4science.org/wps/"; private String token = "df2cc5f5-63ee-48c1-b2a6-1210030c57b8-843339462"; private boolean devMode = true; @@ -77,8 +77,6 @@ public class NLPHub extends HttpServlet { if (algs.length >= 1) { - // single algorithm execution - System.out.println("algs[0]: " + algs[0]); NlpNerRunner runner = new NlpNerRunner(service, algs, token, response); runner.run(request.getParameter("plink"), request.getParameter("annotations"), request.getParameter("lang")); diff --git a/src/main/java/org/gcube/nlphub/NLPUploader.java b/src/main/java/org/gcube/nlphub/NLPUploader.java index 8c7c91c..f7cc0b3 100644 --- a/src/main/java/org/gcube/nlphub/NLPUploader.java +++ b/src/main/java/org/gcube/nlphub/NLPUploader.java @@ -25,6 +25,8 @@ import org.apache.log4j.Logger; import org.gcube.nlphub.legacy.Constants; import org.gcube.nlphub.legacy.JsonManager; import org.gcube.nlphub.legacy.NlpHubException; +import org.gcube.nlphub.nlp.NLpLanguageRecognizer; +import org.gcube.nlphub.nlp.NlpUtils; import org.gcube.nlphub.workspace.WorkspaceManager; /** @@ -141,7 +143,12 @@ public class NLPUploader extends HttpServlet { } String link = ws.getPublicLink(fileName, token); - writer.println(new JsonManager().getSuccessJsonResponse("" + link)); + String sentence = NlpUtils.getLanguageRecognizerDigest(stringContent); + System.out.println(sentence); + NLpLanguageRecognizer recognizer = new NLpLanguageRecognizer(NLPHub.service, token, sentence, link, response); + recognizer.run(); + + //writer.println(new JsonManager().getSuccessJsonResponse("" + link)); } catch (Exception x) { x.printStackTrace(); logger.error(x.getClass().getName() + ": " + x.getLocalizedMessage()); diff --git a/src/main/java/org/gcube/nlphub/legacy/Constants.java b/src/main/java/org/gcube/nlphub/legacy/Constants.java index 3a23763..a239627 100644 --- a/src/main/java/org/gcube/nlphub/legacy/Constants.java +++ b/src/main/java/org/gcube/nlphub/legacy/Constants.java @@ -27,12 +27,4 @@ public class Constants { } return new String(hexChars); } -/* - public static void main(String[] args) { - String text = "I am here in\nPisa."; - System.out.println(text); - System.out.println(hexDump(text.getBytes())); - text = text.replaceAll("\n", "\\\\n"); - System.out.println(hexDump(text.getBytes())); - }*/ } diff --git a/src/main/java/org/gcube/nlphub/legacy/JsonManager.java b/src/main/java/org/gcube/nlphub/legacy/JsonManager.java index 30f6126..81e9d99 100644 --- a/src/main/java/org/gcube/nlphub/legacy/JsonManager.java +++ b/src/main/java/org/gcube/nlphub/legacy/JsonManager.java @@ -51,6 +51,7 @@ public class JsonManager { return jsonObjectRoot.toString(); } + public String getSuccessJsonResponse(String message) { return getResponse(true, message); } @@ -58,6 +59,10 @@ public class JsonManager { public String getErrorJsonResponse(String message) { return getResponse(false, message); } + + public String getSuccessJsonResponse(String language, String message) { + return getResponse(true, language, message); + } private String getResponse(boolean success, String message) { jsonObjectRoot.addProperty(RESPONSE, (success ? OK : ERROR)); @@ -65,6 +70,13 @@ public class JsonManager { return jsonObjectRoot.toString(); } + private String getResponse(boolean success, String language, String message) { + jsonObjectRoot.addProperty(RESPONSE, (success ? OK : ERROR)); + jsonObjectRoot.addProperty(LANGUAGE, language); + jsonObjectRoot.addProperty(MESSAGE, message); + return jsonObjectRoot.toString(); + } + /* public void buildNerOutputJson(NerOutput nerOut) { // build the root json object initial property fields diff --git a/src/main/java/org/gcube/nlphub/nlp/NLpLanguageRecognizer.java b/src/main/java/org/gcube/nlphub/nlp/NLpLanguageRecognizer.java index 533c379..cbf1d75 100644 --- a/src/main/java/org/gcube/nlphub/nlp/NLpLanguageRecognizer.java +++ b/src/main/java/org/gcube/nlphub/nlp/NLpLanguageRecognizer.java @@ -1,8 +1,14 @@ package org.gcube.nlphub.nlp; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; import java.util.ArrayList; import java.util.List; +import javax.servlet.http.HttpServletResponse; + import org.apache.log4j.Logger; import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClient; import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData; @@ -15,14 +21,17 @@ import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ListParamete import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ObjectParameter; import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ParameterType; +import org.gcube.nlphub.legacy.Constants; import org.gcube.nlphub.legacy.DataminerClient; +import org.gcube.nlphub.legacy.JsonManager; import org.gcube.nlphub.legacy.NlpHubException; public class NLpLanguageRecognizer extends DataminerClient { + private HttpServletResponse response; private Logger logger = Logger.getLogger(NLpLanguageRecognizer.class.getSimpleName()); - private String sentence; + private String sentence, publicLink; public final static String RECOGNIZER_ID = "org.gcube.dataanalysis.wps.statisticalmanager.synchserver.mappedclasses.transducerers.LANGUAGE_RECOGNIZER"; // private String service = "http://dataminer-prototypes.d4science.org/wps/"; // private String token = "df2cc5f5-63ee-48c1-b2a6-1210030c57b8-843339462"; @@ -30,8 +39,15 @@ public class NLpLanguageRecognizer extends DataminerClient { public NLpLanguageRecognizer(String service, String token, String sentence) { super(service, "", token); this.sentence = sentence; + response = null; } + public NLpLanguageRecognizer(String service, String token, String sentence, String publicLink, HttpServletResponse response) { + super(service, "", token); + this.sentence = sentence; + this.response = response; + this.publicLink = publicLink; + } public void run() throws NlpHubException { try { @@ -61,13 +77,14 @@ public class NLpLanguageRecognizer extends DataminerClient { Resource r = mapResource.getMap().get(key); if (r.isFile()) { FileResource f = (FileResource) r; - String mimeType = f.getMimeType(); - if (mimeType.equalsIgnoreCase("application/d4science")) { - String link = f.getUrl(); - System.out.println("url: " + link); - String op = computationId.getOperatorId(); - op = op.substring(op.lastIndexOf(".") + 1); - //testEndOfProcess(op + ":::" + link); + String name = f.getName(); + String link = f.getUrl(); + if(name.equalsIgnoreCase("outfile")) { + String content = readFileContent(link); + System.out.println(content + "."); + if(response != null) { + response.getWriter().println(new JsonManager().getSuccessJsonResponse(content, publicLink)); + } } } } @@ -78,23 +95,41 @@ public class NLpLanguageRecognizer extends DataminerClient { } } - public static void main(String[] args) { -// String service = "http://dataminer-prototypes.d4science.org/wps/"; -// String token = "df2cc5f5-63ee-48c1-b2a6-1210030c57b8-843339462"; -// String sentence = "Per me si va nella città dolente"; -// -// NLpLanguageRecognizer recognizer = new NLpLanguageRecognizer(service, token, sentence); -// try { -// recognizer.run(); -// } catch (Exception x) { -// x.printStackTrace(); -// } - /* - String test = "Anch'io ho voglia di dare il mio contributo\n alla causa"; - String regularized = test.replaceAll("[\\s]+", " "); - System.out.println("Before: " + test + "\n" + "After: " + regularized); - regularized = test.replaceAll("[\\n]+", " "); - System.out.println("After: " + regularized); - */ + private String readFileContent(String link) throws Exception { + URL url = new URL(link); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestProperty(Constants.TOKEN_PARAMETER, super.getToken()); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setUseCaches(false); + connection.setRequestMethod("GET"); + + BufferedReader r = new BufferedReader(new InputStreamReader(connection.getInputStream())); + + StringBuffer response = new StringBuffer(); + String inputLine; + while ((inputLine = r.readLine()) != null) { + response.append(inputLine); + } + + String out = response.toString(); + return out; } + + /* + public static void main(String[] args) { + String service = "http://dataminer-prototypes.d4science.org/wps/"; + String token = "df2cc5f5-63ee-48c1-b2a6-1210030c57b8-843339462"; + String sentence = "Per me si va nella città dolente"; + sentence = "Querido amigo, te escribo, así que me distraigo un poco."; + sentence = "Per me si va in città"; + + NLpLanguageRecognizer recognizer = new NLpLanguageRecognizer(service, token, sentence); + try { + recognizer.run(); + } catch (Exception x) { + x.printStackTrace(); + } + + }*/ } diff --git a/src/main/java/org/gcube/nlphub/nlp/NlpNerRunner.java b/src/main/java/org/gcube/nlphub/nlp/NlpNerRunner.java index 3cfda31..86fdc82 100644 --- a/src/main/java/org/gcube/nlphub/nlp/NlpNerRunner.java +++ b/src/main/java/org/gcube/nlphub/nlp/NlpNerRunner.java @@ -80,7 +80,6 @@ public class NlpNerRunner extends DataminerClient { for (String key : mapResource.getMap().keySet()) { Resource r = mapResource.getMap().get(key); if (r.isFile()) { - FileResource f = (FileResource) r; String mimeType = f.getMimeType(); if (mimeType.equalsIgnoreCase("application/d4science")) { @@ -104,9 +103,11 @@ public class NlpNerRunner extends DataminerClient { for (String id : identifiers) { try { super.identifier = id; + System.out.println("Running: " + id); super.init(); List parameters = mapParameters(filePublicLink, annotations); super.execute(parameters); + System.out.println("Runned: " + id); } catch (Exception e) { logger.error(e.getLocalizedMessage()); throw new NlpHubException(e.getLocalizedMessage(), e); @@ -123,7 +124,7 @@ public class NlpNerRunner extends DataminerClient { if (outputLinks.size() == identifiers.length) { String[] links = new String[outputLinks.size()]; links = outputLinks.toArray(links); - System.out.println("testEndOfProcess"); + //System.out.println("testEndOfProcess"); writeResponse(links); } } diff --git a/src/main/java/org/gcube/nlphub/nlp/NlpUtils.java b/src/main/java/org/gcube/nlphub/nlp/NlpUtils.java new file mode 100644 index 0000000..ca36e4a --- /dev/null +++ b/src/main/java/org/gcube/nlphub/nlp/NlpUtils.java @@ -0,0 +1,53 @@ +package org.gcube.nlphub.nlp; + +import java.util.ArrayList; + +public class NlpUtils { + + public static String getLanguageRecognizerDigest(String content) { + int minToken = 10; + + content = content.trim(); + String[] tokens = content.split("\\."); + if(tokens.length == 1) + tokens = content.split(";"); + if(tokens.length == 1) + return content; + + ArrayList list = new ArrayList<>(); + + for(int i=0; i= minToken) { + list.add(tokens[i]); + } + } + + if(list.isEmpty()) + return content; + + String digest = list.get(0); + for(String s : list) { + if(s.length() < digest.length()) + digest = s; + } + return digest; + } + + public static int countTokens(String content) { + return content.split("\\s").length; + } + + +/* + public static void main(String[] args) { + String text = "Per me si va nella Città dolente.\n Per me si va tra la perduta Gente"; + text = "North Korea has agreed to send a delegation to next month's Winter Olympics in South Korea, the first notable breakthrough to come out of a face-to-face meeting Tuesday between the neighboring nations."; + text += "In talks, held at the border village of Panmunjom or \"truce village,\" in the Korean peninsula\'s heavily fortified demilitarized zone, North Korea negotiators agreed to send a \"high-level delegation\" comprising athletes, a cheering squad, an art troupe, a visitors\' group, a Taekwondo demonstration team and a press corps, South Korea\'s Unification Ministry told reporters in Seoul."; + text += "Unification Vice Minister Chun Hae-sung also announced that both sides plan to re-open a military hotline on the western Korean Peninsula."; + text += "The hotline was one of many that were closed as inter-Korean relations soured."; + + System.out.println(getLanguageRecognizerDigest(text)); + } + */ +} diff --git a/src/main/webapp/colors.html b/src/main/webapp/colors.html new file mode 100644 index 0000000..f57ca1a --- /dev/null +++ b/src/main/webapp/colors.html @@ -0,0 +1,60 @@ + + + + +Colors + + + +
+ TEST COLORE +
+
+ TEST COLORE + SFONDO +
+ + \ No newline at end of file diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index b87c9d2..f642740 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -17,692 +17,8 @@ + - - - diff --git a/src/main/webapp/js/main.js b/src/main/webapp/js/main.js index c2f485a..e1c72b1 100644 --- a/src/main/webapp/js/main.js +++ b/src/main/webapp/js/main.js @@ -1,156 +1,763 @@ -$(document).ready(function(){ +var tableRawSize = 5; +var annotations = []; +var algorithms = []; +var languages = []; +var publicLink = null; +var pageGreen = "#4CAF50"; +var pageGray = "#A0A0A0"; +var savedAnnotations = ""; +var jsonContent = null; +var named = null; +var resultText = ""; +var hexLetters = '0123456789ABCDEF'; -// $("#upload-button").uploadFile({ -// url : "uploader.php", -// fileName : "myfile", -// maxFileCount : 100, -// multiple : false, -// maxFileSize : 1024 * 1000 * 1, -// showFileCounter : false, -// showCancel : true, -// allowedTypes : "txt", -// //dragDropStr : "", -// doneStr : "Done", -// abortStr : "End", -// cancelStr : "Cancel", -// extErrorStr : "Only text file (.txt), please", -// sizeErrorStr : "Max size: 1 Mb", -// onLoad : function(obj) { -// //resizeTutor(); -// }, -// onSuccess : function(files, data, xhr) { -// alert("Success"); -// /*$(".ajax-file-upload-statusbar") -// .hide(); -// $(".obfuscating").css('opacity', '0.6'); -// $(".obfuscating").show(); -// $("#uploadedimg").attr("src", "images/" + uName + "/" + files[0]); -// source = $("#uploadedimg").attr("src"); -// window.setTimeout(function(){ sizePopupUpload(); $("#popup-1-section").show();}, 500);*/ -// }, -// onError : function(files, status, -// errMsg, pd) { -// alert(errMsg); -// } -// }); +// ------------------------------------------------------------------------------------------------------ +// Starting point: get the csv file with algorithm parameters and set the page +// with valid algs info. +// ------------------------------------------------------------------------------------------------------ - - $( "#execute-button" ).click(function() { - var firstnameBox = $.trim( $('#input-textarea').val() ) - if (firstnameBox == "") { - $('#input-textarea').css("border-color","red"); - $('#input-textarea').attr("placeholder", "Paste your text here!"); - } - else { - $('#input-textarea').css("border-color","#555"); - doStartComputation(); - } - }); +$ + .ajax({ + url : "https://data.d4science.org/bnp4UDNyb21lSURkQXdDUnlSS0JkVWgzWk1KMUxWVGZHbWJQNStIS0N6Yz0", + type : "GET", + async : true, + contentType : "text/plain; charset=utf-8", + success : function(data, stato) { + $("#ner-result-container").hide(); + var lineTokens = manageCsvData(data); + getAlgorithms(lineTokens); + buildLanguageSelection(); + buildLanguageList(); + buildAnnotations(); + resizeTable(); + resizeLogo(); - doCallback = function(uri) { - $.ajax({ - url : "nlphub-servlet", - type : 'GET', - datatype : 'json', - data : { - uri : uri + $("#back-ner-ui-button").click(function() { + $("#ner-result-container").hide(); + $("#ner-ui").show(); + $("#input-textarea").val(""); + publicLink = null; + jsonContent = null; + }); + + $("#execute-button").css("background-color", pageGray); + + $("#upload-button") + .uploadFile( + { + url : "/nlphub/nlphub-uploader-servlet", + fileName : "mytxtfile", + maxFileCount : 100, + multiple : false, + maxFileSize : 1024 * 1000 * 6.14, + showFileCounter : false, + showCancel : true, + dragDropStr : "", + extErrorStr : "Error. Text file only", + sizeErrorStr : "Error. Max size: 6 Mb", + onLoad : function(obj) { + $("#file-info").remove(); + $("#reset-upload").remove(); + $("#fu-container") + .append( + "
"); + $("#right-child") + .append( + "
"); + $("#right-child") + .append( + "
Cancel
"); + $("#reset-upload").hide(); + $("#reset-upload").click( + function() { + resetExecuteButton(); + $("#file-info").empty(); + $("#reset-upload").css( + "display", "none"); + textAreaEnable(true); + }); + savedAnnotations = ""; + setEventListeners(); + }, + onSelect : function(files) { + showProgress(); + textAreaEnable(false); + $("#input-textarea").val(""); + }, + onSuccess : function(files, data, xhr) { + hideProgress(); + console.log('' + data.language); + checkLanguage(data.language); + selectAnnotationsByLanguage(); + $("#reset-upload").css("display", + "inline"); + console.log("files: " + files); + $("#file-info").empty(); + $("#file-info") + .append( + "Uploaded: " + + files + + ""); + publicLink = data.message; + $("#execute-button").css( + "background-color", pageGreen); + if (publicLink == null) { + alert("Error uploading file."); + } + }, + onError : function(files, status, errMsg, + pd) { + hideProgress(); + textAreaEnable(true); + alert(errMsg); + } + }); }, - success : function(data) { - var obj = eval("(" + data + ")"); - var str = JSON.stringify(obj, undefined, 4); - $('#result').html(syntaxHighlight(str)); + error : function(richiesta, stato, errori) { + alert("Unexpected Error. Status: " + richiesta.status); } }); - } - doStartComputation = function() { - var options = "default"; - options = $("input[type=checkbox]:checked").map( - function () {return this.value;}).get().join("|"); - $('#result').html(""); - //var token2Send = getUrlParameter("token") == null ? "" : getUrlParameter("token"); - var tokenParam = getUrlParameter("token"); - var token2Send = ((tokenParam == null) || (tokenParam.length == 0)) ? "18fed2d9-030b-4c77-93af-af2015d945f7-843339462" : getUrlParameter("token"); - - webSocket.send({ - 'action': 'start', - 'text' : $("#input-textarea").val(), - 'options' : options, - 'token' : token2Send - }).done(function() { - showProgressBar(true); - enableCommands(false); - }).fail(function(e) { - console.log("failed"); - }); - } - - doHandleResponse = function(message) { - if (message.response == "error") { - $('#result').html(""+message.value+""); - enableCommands(true); - showProgressBar(false); - } - else if (message.response == "computing") { - showProgressBar(true); - enableCommands(false); - } - else if (message.response == "computed") { - showProgressBar(false); - enableCommands(true); - console.log("message="+message.value); - if (message.value.startsWith("http")) { - $('#downloadLink').html("Result: Download " + - "View"); - } +/* + * Utility function processing the language indication returned by the language recognition service + */ +checkLanguage = function(lang) { + var options = $("#language-select option"); + for(var i=0; i 0) { + var thereIs = false; + for (k in annotations) { + if (annotations[k].toUpperCase() == a[j].toUpperCase()) { + thereIs = true; + break; + } + } + if (!thereIs) + annotations[annotations.length] = a[j]; + } + } + } +} + +/* + * Build the language array + */ +buildLanguageSelection = function() { + for (i in algorithms) { + var languageList = algorithms[i].lang; + var langs = languageList.split(/\s|,/); + for (j in langs) { + langs[j] = langs[j].trim(); + if (langs[j].length > 0) { + var thereIs = false; + for (k in languages) { + if (languages[k].toUpperCase() == langs[j].toUpperCase()) { + thereIs = true; + break; + } + } + if (!thereIs) + languages[languages.length] = langs[j]; + } + } + } +} + +/* + * Set the listeners on the text area and the execute button + */ +setEventListeners = function() { + $("#input-textarea").on("keyup", function() { + if ($("#input-textarea").val() == "") + $("#execute-button").css("background-color", pageGray); + else + $("#execute-button").css("background-color", pageGreen); + }); + + $("#execute-button") + .click( + function() { + if ((publicLink == null) + && ($("#input-textarea").val() == "")) { + alert("You must upload a file or write some text in the text area before submit a request."); + return; + } + + showProgress(); + // if some text has been written in the text area, then + // a corresponding text file + // must be written in the workspace and the public link + // is set. + if ($("#input-textarea").val().length > 0) { + freeText = $("#input-textarea").val(); + $ + .ajax({ + url : "/nlphub/nlphub-uploader-servlet?freetext=" + + encodeURI(freeText), + type : "POST", + async : true, + contentType : "text/plain; charset=utf-8", + success : function(data, stato) { + publicLink = data.message; + // console.log(data.language); + if (publicLink == null) { + alert("Error uploading file."); + } + launchAlgorithm(); + }, + error : function(richiesta, stato, + errori) { + alert("Unexpected Error. Status: " + + richiesta.status); + hideProgress(); + textAreaEnable(true); + $("#file-info").empty(); + } + }); + } + + else { + launchAlgorithm(); + } + }); +} + +/* + * show the in-progress popup + */ +showProgress = function() { + var width = $(".progress-circular-div").width(); + var height = $(".progress-circular-div").height(); + var left = parseInt((window.innerWidth - width) / 2); + var top = parseInt((window.innerHeight - height) / 2); + $(".progress-circular-div").css("left", left); + $(".progress-circular-div").css("top", top); + $(".hidden-div").css("display", "block"); +} + +/* + * hide the in-progress popup + */ +hideProgress = function() { + $(".hidden-div").css("display", "none"); +} + +/* + * run the algorithms selected by the chosen language + */ +launchAlgorithm = function() { + if (publicLink == null) { + alert("No input text available for the service."); + return; + } + var list = buildInputAnnotationList(); + var annList = ""; + for (i in list) { + annList += list[i] + ","; + } + annList = annList.substring(0, annList.length - 1); + savedAnnotations = annList; + + var algList = ""; + for (j in algorithms) { + if (algorithms[j].lang.toLowerCase().indexOf( + $("#language-select").val().toLowerCase()) >= 0) { + algList += encodeURI(algorithms[j].id) + ","; + } + } + if (algList.length == 0) { + alert("Warning. No algorithm matching with selected language."); + return; + } + algList = algList.substring(0, algList.length - 1); + + var parameters = "annotations=" + annList; + parameters += "&lang=" + $("#language-select").val(); + parameters += "&plink=" + encodeURI(publicLink); + parameters += "&algs=" + algList; + + $.ajax({ + url : "/nlphub/nlphub-servlet?" + parameters, + type : "POST", + async : true, + success : function(data, stato) { + textAreaEnable(true); + $("#file-info").empty(); + if (typeof (data.response) != 'undefined') { + var jsonOut = getOutputJson(data.message); + } else if (typeof (data.error) != 'undefined') { + hideProgress(); + alert(data.message); + } else { + hideProgress(); + alert("Unexpected response"); + } + resetExecuteButton(); + }, + error : function(richiesta, stato, errori) { + hideProgress(); + textAreaEnable(true); + alert("Unexpected Error. Status: " + richiesta.status); + resetExecuteButton(); + } + }); +} + +/* + * Get the final json returned by the server + */ +getOutputJson = function(message) { + var tobemap = ""; + for (var i = 0; i < message.length; i++) { + tobemap += message[i] + "|"; + } + + tobemap = tobemap.substring(0, tobemap.length - 1); + + var parameters = "annotations=" + savedAnnotations; + parameters += "&plink=" + encodeURI(publicLink); + parameters += "&lang=" + $("#language-select").val(); + parameters += "&tobemap=" + encodeURI(tobemap); + console.log(parameters); + + $.ajax({ + url : "/nlphub/nlphub-mapper-servlet?" + parameters, + type : "POST", + async : true, + success : function(data, stato) { + hideProgress(); + console.log(data); + if ((typeof (data.response) != "undefined") + && (data.response.trim().toUpperCase() == "ERROR")) { + alert("ERROR\n" + data.message); + } else { + $("#reset-upload").hide(); + savedAnnotations = ""; + publicLink = null; + showResult(data); + } + }, + error : function(richiesta, stato, errori) { + hideProgress(); + $("#reset-upload").hide(); + savedAnnotations = ""; + publicLink = null; + alert("Unexpected Error. Status: " + richiesta.status); + } + }); +} + +/* + * Show the computation result + */ +showResult = function(data) { + $("#ner-ui").hide(); + $("#ner-result-container").show(); + + jsonContent = data; + resultText = jsonContent.output.text; + + $("#result-header").empty(); + $("#result-params-div").empty(); + $("#result-text-div").empty(); + + $("#result-header").append( + "

You can download the overall result as a JSON file here

"); + var localText = resultText; + localText = resultText.replace(/\n/g, "
"); + $("#result-text-div").empty(); + $("#result-text-div").append("

" + localText + "

"); + + showAnnotationList(jsonContent.output.annotations); +} + +showAnnotationList = function(list) { + var colorDisabled = "CCCCCC"; + var color; + var colors = []; + var annotations = list.split(","); + for (var i = 0; i < annotations.length; i++) { + do { + color = randomRGB(); + } while (color == colorDisabled); + colors[colors.length] = color; + } + + $("#result-params-div").append("
"); + for (var i = 0; i < annotations.length; i++) { + var cb = ""; + cb += "
"; + $("#colored-annotations").append(cb); + } + $("#colored-annotations :radio").change(function() { + if (this.checked) { + rewriteText(this.getAttribute("named"), "#" + this.value); + } + }); +} + +/* + * Utility function + */ +countSubstringOccurrencies = function(string, substring) { + var occurrencies = 0; + var index = 0; + var s = string; + while (index >= 0) { + index = s.indexOf(substring); + if (index >= 0) { + occurrencies++; + s = s.substring(index + 1); + } + } + return occurrencies; +} + + +/* + * Utility + */ + +enhanceColor = function(color) { + var c = eval("0x" + color); + var hi = Math.round(c / 16); + if(hi < 15) { + hi += Math.round((15 - hi) / 1.5); + } + if(hi > 15) hi = 15; + return '' + hexLetters[hi] + hexLetters[c%16]; +} + +/* + * Write the html paragraph

containing the text highlighted on annotation value + */ +rewriteText = function(annotation, color) { + $("#result-text-div").empty(); + + var complemetar = 0xFFFFFF - eval("0x" + color.substring(1)); + var complement = complemetar.toString(16); + var R = enhanceColor(complement.substring(0,2)); + var G = enhanceColor(complement.substring(2,4)); + var B = enhanceColor(complement.substring(4)); + complement = "#" + R + G + B; + var indices = getIndices(annotation); + var indexedText = ""; + + if ((typeof (indices) == 'undefined') || (indices.length == 0)) { + indexedText = resultText; + indexedText = indexedText.replace(/\n/g, "
"); + $("#result-text-div").append("

" + indexedText + "

"); + return; + } + + var t = 0; + var offset = 0; + for (var i = 0; i < indices.length; i++) { + var index = indices[i]; + var start = index[0]; + var end = index[1]; + indexedText += resultText.substring(t, start); + offset += countSubstringOccurrencies(resultText.substring(t, start), + "\n"); + offset += countSubstringOccurrencies(resultText.substring(t, start), + "\r"); + offset += countSubstringOccurrencies(resultText.substring(t, start), + "\t"); + start += offset; + end += offset; + var colored = "" + + resultText.substring(start, end) + ""; + indexedText += colored; + t = end; + } + if (t < resultText.length) + indexedText += resultText.substring(t); + + indexedText = indexedText.replace(/\n/g, "
"); + $("#result-text-div").append("

" + indexedText + "

"); +} + +/* + * Find if the annotation is presente in the json + */ +checkAnnotation = function(annotation) { + for (var i = 0; i < jsonContent.output.result.length; i++) { + var entities = jsonContent.output.result[i].entities; + for (var j = 0; j < entities.length; j++) { + a = entities[j][annotation]; + if (typeof a != 'undefined') { + return true; + } + } + } + return false; +} + +/* + * Retrieve the annotation indices from the json + */ +getIndices = function(annotation) { + var indices = []; + // get indices + for (var i = 0; i < jsonContent.output.result.length; i++) { + var entities = jsonContent.output.result[i].entities; + for (var j = 0; j < entities.length; j++) { + a = entities[j][annotation]; + if (typeof a != 'undefined') { + indices[i] = []; + for (var k = 0; k < a.length; k++) { + var index = a[k].indices; + indices[i][k] = index; + } + } + } + } + + var indices2 = []; + for (var i = 0; i < indices.length; i++) { + if (typeof (indices[i]) != 'undefined') + indices2[indices2.length] = indices[i]; + } + + return mergeIndices(indices2); +} + +/* + * Merge the indices + */ +mergeIndices = function(indices) { + var newIndices = [] + if (indices.length <= 1) + newIndices = indices[0]; + else + newIndices = mergeAll(indices); + return newIndices; +} + +/* + * Utility function + */ +resetExecuteButton = function() { + publicLink = null; + $("#execute-button").css("background-color", pageGray); +} + +/* + * Resize the annotation table based on the screen geometry + */ +resizeTable = function() { + // resize the annotation table + $("#annotations-table").empty(); + var rowId = ""; + var ratio = window.innerWidth / window.innerHeight; + + if (ratio <= 0.35) { + tableRawSize = 1; + } else if ((ratio > 0.35) && (ratio <= 0.75)) { + tableRawSize = 2; + } else if ((ratio > 0.75) && (ratio <= 1)) { + tableRawSize = 3; + } else if ((ratio > 1) && (ratio <= 1.5)) { + tableRawSize = 4; + } else { + tableRawSize = 5; + } + + for (var i = 0; i < annotations.length; i++) { + if (i % tableRawSize == 0) { + rowId = "row-" + i; + $("#annotations-table").append(""); + } + var annotationElement = " "; + $("#" + rowId).append("" + annotationElement + ""); + } +} + +/* + * Resize the page logo image based on the screen geometry + */ +resizeLogo = function() { + if (window.innerWidth < 200) + $("#logo-image").width(window.innerWidth - 10); +} + +/* + * Build the annotation list for the service invocation + */ +buildInputAnnotationList = function() { + var list = []; + for (var i = 0; i < annotations.length; i++) { + if ($("#check-" + i).is(":Checked")) + list[list.length] = $("#check-" + i).val(); + } + return list; +} + +/* + * Handler for the window resize event + */ +window.onresize = function(event) { + resizeTable(); + resizeLogo(); +}; + +/* + * Handler for the file upload control + */ +$(".ajax-file-upload-abort").on("DOMAttrModified", function(event) { + $(".ajax-file-upload-abort").css("display", "none"); + if (event.attributeName == "display") { // which attribute you want to watch + // for changes + $(".ajax-file-upload-abort").css("display", "none"); + } }); -function showProgressBar(show) { - var display = (show) ? "visible" : "hidden"; - $('#progressBar').css('visibility', display); -} - -function enableCommands(enable) { - if (enable) { - $('#execute-button').removeAttr("disabled"); - $('#execute-button').text('Execute'); - $('input[type=checkbox]').removeAttr("disabled"); - } else { - $('#execute-button').text('Computing ...'); - $('input[type=checkbox]').attr('disabled', 'true'); - $('#execute-button').attr('disabled', 'disabled'); - $('#downloadLink').html(""); +/* + * Build the option list of supported language + */ +buildLanguageList = function() { + // build the language selection input control + for (i in languages) { + var opt = ""; + if (i > 1) + opt = ""; + $("#language-select").append(opt); } -} - -function syntaxHighlight(json) { - if (typeof json != 'string') { - json = JSON.stringify(json, undefined, 1); - } - json = json.replace(/&/g, '&').replace(//g, '>'); - return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) { - var cls = 'number'; - if (/^"/.test(match)) { - if (/:$/.test(match)) { - cls = 'key'; - } else { - cls = 'string'; - } - } else if (/true|false/.test(match)) { - cls = 'boolean'; - } else if (/null/.test(match)) { - cls = 'null'; - } - return '' + match + ''; - + $("#language-select").on("change", function() { + selectAnnotationsByLanguage(); }); } -function getUrlParameter(name) { - name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); - var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); - var results = regex.exec(location.search); - return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); -}; \ No newline at end of file +/* + * Utility + */ +selectAnnotationsByLanguage = function() { + buildAnnotations(); + resizeTable(); +} + +/* + * Enable/disable the input text area + */ +textAreaEnable = function(enable) { + if (enable == true) + $("#input-textarea").prop('disabled', false); + else + $("#input-textarea").prop('disabled', true); +} + +/* + * Get a random RGB color + */ +randomRGB = function() { + var color = ''; + var couple = ''; + for (var i = 0; i < 3; i++) { + couple = '' + hexLetters[Math.floor(Math.random() * 10)] + hexLetters[Math.floor(Math.random() * 16)]; + color += couple; + } + + return color; +}