Erik Perrone 6 years ago
parent 732b90ad8b
commit cee6ef152a

@ -41,13 +41,12 @@
<scope>compile</scope>
</dependency>
<!-- GCube -->
<dependency>
<groupId>org.gcube.data.analysis</groupId>
<artifactId>data-miner-manager-cl</artifactId>
<version>[1.0.0-SNAPSHOT, 3.0.0-SNAPSHOT)</version>
<!-- <version>1.3.0-4.5.0-148453</version>-->
<scope>compile</scope>
</dependency>
<!-- <dependency> -->
<!-- <groupId>org.gcube.data.analysis</groupId> -->
<!-- <artifactId>data-miner-manager-cl</artifactId> -->
<!-- <version>[1.0.0-SNAPSHOT, 3.0.0-SNAPSHOT)</version> -->
<!-- <scope>compile</scope> -->
<!-- </dependency> -->
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>common-authorization</artifactId>

@ -12,7 +12,6 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.gcube.nlphub.legacy.Constants;
import org.gcube.nlphub.legacy.JsonManager;
import org.gcube.nlphub.nlp.NlpNerRunner;
import org.gcube.nlphub.nlp.RunnerCommander;
/**

@ -4,12 +4,9 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -18,7 +15,6 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.gcube.nlphub.nlp.NlpNerRunner;
import org.gcube.nlphub.workspace.WorkspaceManager;
import org.gcube.nlphub.mapper.JsonMapper;
import org.gcube.nlphub.legacy.Constants;
@ -67,9 +63,7 @@ public class NLPMapper extends HttpServlet {
response.setCharacterEncoding("utf-8");
token = Constants.getToken(request, devMode);
String documentLink = request.getParameter("plink"); // link to text file (workspace)
//System.out.println("documentLink\n: " + documentLink);
String toBeMap = request.getParameter("tobemap");
//System.out.println("tobemap:\n" + toBeMap);
String[] tokens;
if(toBeMap.indexOf("|") > 0)
tokens = toBeMap.split("\\|");

@ -1,217 +0,0 @@
package org.gcube.nlphub.legacy;
//package dataminerclient;
import java.util.List;
import org.gcube.data.analysis.dataminermanagercl.server.DataMinerService;
import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClient;
import org.gcube.data.analysis.dataminermanagercl.server.monitor.DMMonitor;
import org.gcube.data.analysis.dataminermanagercl.server.monitor.DMMonitorListener;
import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData;
import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId;
import org.gcube.data.analysis.dataminermanagercl.shared.data.output.MapResource;
import org.gcube.data.analysis.dataminermanagercl.shared.data.output.Resource;
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter;
import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DataminerClient {
private String service, token;
protected String identifier;
private static Logger logger = LoggerFactory.getLogger(DataminerClient.class);
private DataMinerService dataMinerService = null;
private SClient sClient = null;
private Operator operator = null;
public DataminerClient(String service, String identifier, String token) {
this.service = service;
this.identifier = identifier;
this.token = token;
dataMinerService = new DataMinerService();
}
public void init() throws DataminerClientException {
try {
sClient = dataMinerService.getClient(getToken(), getService());
operator = sClient.getOperatorById(getIdentifier());
} catch (Exception e) {
logger.error(e.getClass().getName() + ": " + e.getLocalizedMessage());
throw new DataminerClientException(e.getLocalizedMessage(), e);
}
}
public String getOperatorName() {
if (operator != null) {
return operator.getName();
}
return "";
}
public String getOperatorDescription() {
if (operator != null) {
return operator.getDescription();
}
return "";
}
public String getOperatorBriefDescription() {
if (operator != null) {
return operator.getBriefDescription();
}
return "";
}
public List<Parameter> getOperatorInputParameters() throws DataminerClientException {
if (operator != null) {
try {
return sClient.getInputParameters(operator);
}
catch (Exception x) {
throw new DataminerClientException(x.getLocalizedMessage(), x);
}
}
return null;
}
public ComputationId execute(List<Parameter> parameters) throws DataminerClientException {
try {
operator.setOperatorParameters(parameters);
ComputationId computationId = sClient.startComputation(operator);
monitoringComputation(computationId, sClient);
return computationId;
} catch (Exception e) {
logger.error(e.getClass().getName() + ": " + e.getLocalizedMessage());
throw new DataminerClientException(e.getLocalizedMessage(), e);
}
}
public String getService() {
return service;
}
public String getIdentifier() {
return identifier;
}
public String getToken() {
return token;
}
public void setIdentifier(String indentifier) {
this.identifier = identifier;
}
public void retrieveOutput(ComputationId computationId, SClient sClient) {
try {
OutputData output = sClient.getOutputDataByComputationId(computationId);
// logger.debug("Output: " + output);
Resource resource = output.getResource();
if (resource.isMap()) {
MapResource mapResource = (MapResource) resource;
for (String key : mapResource.getMap().keySet()) {
logger.debug("Entry: " + key + " = " + mapResource.getMap().get(key));
System.out.println("Entry: " + key + " = " + mapResource.getMap().get(key));
}
}
} catch (Exception e) {
logger.error(e.getLocalizedMessage());
e.printStackTrace();
}
}
private void monitoringComputation(ComputationId computationId, SClient sClient) {
DMMonitorListener listener = new DMMonitorListener() {
@Override
public void running(double percentage) {
//logger.debug("Operation Running: " + percentage);
//System.out.println("Operation Running: " + percentage);
}
@Override
public void failed(String message, Exception exception) {
logger.error("Operation Failed");
logger.error(message);
logger.error(exception.getStackTrace().toString());
//System.out.println(exception.getLocalizedMessage());
}
@Override
public void complete(double percentage) {
logger.debug("Operation Completed");
logger.debug("Perc: " + percentage);
retrieveOutput(computationId, sClient);
}
@Override
public void cancelled() {
logger.debug("Operation Cancelled");
}
@Override
public void accepted() {
logger.debug("Operation Accepted");
}
};
DMMonitor dmMonitor = new DMMonitor(computationId, sClient);
dmMonitor.setDelay(1000);
dmMonitor.setSleep(1000);
dmMonitor.setPeriod(1000);
dmMonitor.add(listener);
dmMonitor.start();
}
/*
public static void main(String[] args) {
String service = "http://dataminer-prototypes.d4science.org/wps/";
String identifier = "";
identifier = "org.gcube.dataanalysis.wps.statisticalmanager.synchserver.mappedclasses.transducerers.ENGLISH_NAMED_ENTITY_RECOGNIZER";
identifier = "org.gcube.dataanalysis.wps.statisticalmanager.synchserver.mappedclasses.transducerers.NEWSTANBOLWRAPPER";
//identifier = "org.gcube.dataanalysis.wps.statisticalmanager.synchserver.mappedclasses.transducerers.GENERIC_OPINION_MINING_ENGLISH";
String token = "df2cc5f5-63ee-48c1-b2a6-1210030c57b8-843339462";
DataminerClient dmc = new DataminerClient(service, identifier, token);
try {
dmc.init();
System.out.println(dmc.getOperatorBriefDescription());
System.out.println(dmc.getOperatorDescription());
System.out.println(dmc.getOperatorName());
List<Parameter> parameters = dmc.getOperatorInputParameters();
if (parameters != null) {
System.out.println("Parameter number: " + parameters.size());
for (Parameter p : parameters) {
System.out.println("name : " + p.getName());
System.out.println("value: " + p.getValue());
System.out.println("type : " + p.getTypology());
System.out.println("desc : " + p.getDescription());
System.out.println("toString: " + p.toString());
System.out.println();
}
}
// List<Parameter> parameters = new ArrayList<>();
//
// FileParameter fileName = new FileParameter();
// fileName.setName("inputTextFile");
// fileName.setValue("http://data.d4science.org/cWRQbHNjRVR4YjdkQXdDUnlSS0JkZVlmLzk2WnJIb1ZHbWJQNStIS0N6Yz0");
// parameters.add(fileName);
//
// ObjectParameter options = new ObjectParameter();
// options.setName("annotationsList");
// //options.setValue("Address|Date|Location|Organization|Person|Money|Percent|SpaceToken");
// options.setValue("SpaceToken");
// parameters.add(options);
//
// ComputationId cid = dmc.execute(parameters);
// System.out.println("urlId: " + cid.getUrlId());
} catch (Exception e) {
System.out.println("-" + e.getClass().getName() + "-\n" + e.getLocalizedMessage());
e.printStackTrace();
}
}
*/
}

@ -14,7 +14,6 @@ import org.apache.log4j.Logger;
import org.gcube.nlphub.legacy.NerAlgorithm;
import org.gcube.nlphub.legacy.NerAnnotationData;
import org.gcube.nlphub.legacy.NerEntity;
import org.gcube.nlphub.nlp.NlpNerRunner;
public class DefaultMapper implements JsonMapper {
private Logger logger = Logger.getLogger(DefaultMapper.class.getSimpleName());

@ -12,19 +12,7 @@ import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.log4j.Logger;
import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClient;
import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData;
import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId;
import org.gcube.data.analysis.dataminermanagercl.shared.data.output.FileResource;
import org.gcube.data.analysis.dataminermanagercl.shared.data.output.MapResource;
import org.gcube.data.analysis.dataminermanagercl.shared.data.output.Resource;
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.FileParameter;
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ListParameter;
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;
import org.w3c.dom.Document;
@ -32,7 +20,7 @@ import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
public class NLpLanguageRecognizer extends DataminerClient {
public class NLpLanguageRecognizer {
private HttpServletResponse response;
private Logger logger = Logger.getLogger(NLpLanguageRecognizer.class.getSimpleName());
private String sentence, publicLink;
@ -40,14 +28,12 @@ public class NLpLanguageRecognizer extends DataminerClient {
private String dataMiner = null;
public NLpLanguageRecognizer(String service, String token, String sentence) {
super(service, "", token);
this.sentence = sentence;
response = null;
}
public NLpLanguageRecognizer(String dataMiner, String service, String token, String sentence, String publicLink,
HttpServletResponse response) {
super(service, "", token);
this.sentence = sentence;
this.response = response;
this.publicLink = publicLink;
@ -105,57 +91,6 @@ public class NLpLanguageRecognizer extends DataminerClient {
}
public void run() throws NlpHubException {
runUsingClientLibrary();
}
@Override
public void retrieveOutput(ComputationId computationId, SClient sClient) {
try {
OutputData output = sClient.getOutputDataByComputationId(computationId);
Resource resource = output.getResource();
if (resource.isMap()) {
MapResource mapResource = (MapResource) resource;
for (String key : mapResource.getMap().keySet()) {
Resource r = mapResource.getMap().get(key);
if (r.isFile()) {
FileResource f = (FileResource) r;
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));
}
}
}
}
}
} catch (Exception e) {
logger.error(e.getLocalizedMessage());
// writeResponse(e.getLocalizedMessage(), false);
}
}
private void runUsingClientLibrary() throws NlpHubException {
try {
super.identifier = RECOGNIZER_ID;
super.init();
ObjectParameter inputParameter = new ObjectParameter();
inputParameter.setName("sentence");
inputParameter.setValue(sentence);
ArrayList<Parameter> parameters = new ArrayList<>();
parameters.add(inputParameter);
super.execute(parameters);
} catch (Exception e) {
logger.error(e.getLocalizedMessage());
throw new NlpHubException(e.getLocalizedMessage(), e);
}
}
private static String readFileContent(String link, String token) throws Exception {
URL url = new URL(link);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
@ -175,7 +110,7 @@ public class NLpLanguageRecognizer extends DataminerClient {
String out = response.toString();
return out;
}
/*
private String readFileContent(String link) throws Exception {
URL url = new URL(link);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
@ -194,22 +129,6 @@ public class NLpLanguageRecognizer extends DataminerClient {
connection.disconnect();
String out = response.toString();
return out;
}
}*/
/*
public static void main(String[] args) {
//String pLink = "http://data.d4science.org/RkNBSmNFRG9MOHFLSWsrWUNQdHk3NTU0UC85ekRnSXNHbWJQNStIS0N6Yz0";
String token = Constants.TEST_TOKEN;
String sentence = "Questa mattina mi sono alzato ed ho trovato l'invasore.";
try {
//String sentence, String token, String publicLink, HttpServletResponse response
NLpLanguageRecognizer.run(sentence, token, "http://cazziemazzi", null);
} catch (NlpHubException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
*/
}

@ -1,234 +0,0 @@
package org.gcube.nlphub.nlp;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClient;
import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData;
import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId;
import org.gcube.data.analysis.dataminermanagercl.shared.data.output.FileResource;
import org.gcube.data.analysis.dataminermanagercl.shared.data.output.MapResource;
import org.gcube.data.analysis.dataminermanagercl.shared.data.output.Resource;
import org.gcube.data.analysis.dataminermanagercl.shared.data.output.Resource.ResourceType;
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.FileParameter;
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ObjectParameter;
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ListParameter;
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter;
import org.gcube.nlphub.NLPUploader;
import org.gcube.nlphub.legacy.Constants;
import org.gcube.nlphub.legacy.DataminerClient;
import org.gcube.nlphub.legacy.JsonManager;
import org.gcube.nlphub.legacy.NlpHubException;
import org.apache.log4j.Logger;
public class NlpNerRunner extends DataminerClient {
private Logger logger = Logger.getLogger(NlpNerRunner.class.getSimpleName());
private HttpServletResponse response = null;
private ArrayList<String> outputLinks;
private String[] identifiers;
private String currentId;
/**
* This constructor is useful for local test cases...
*
* @param service
* @param identifier
* @param token
*/
public NlpNerRunner(String service, String identifier, String token) {
super(service, identifier, token);
outputLinks = new ArrayList<>();
}
/**
* This constructor is the "canonical one"
*
* @param service
* @param identifier
* @param token
* @param response
*/
public NlpNerRunner(String service, String[] identifiers, String token) {
super(service, "", token);
outputLinks = new ArrayList<>();
}
/**
* This constructor is useful when multiple alogrithm identifiers are given
*
* @param service
* @param identifiers
* @param token
*/
public NlpNerRunner(String service, String[] identifiers, String token, HttpServletResponse response) {
super(service, "", token);
this.response = response;
this.identifiers = identifiers;
outputLinks = new ArrayList<>();
}
@Override
public void retrieveOutput(ComputationId computationId, SClient sClient) {
try {
OutputData output = sClient.getOutputDataByComputationId(computationId);
Resource resource = output.getResource();
if (resource.isMap()) {
MapResource mapResource = (MapResource) resource;
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")) {
String link = f.getUrl();
//System.out.println("url: " + link);
logger.debug("url: " + link);
logger.error("url: " + link);
String op = computationId.getOperatorId();
op = op.substring(op.lastIndexOf(".") + 1);
testEndOfProcess(op + ":::" + link);
}
}
}
}
} catch (Exception e) {
logger.error(e.getLocalizedMessage());
writeResponse(e.getLocalizedMessage(), false);
}
}
public void run(String filePublicLink, String annotations, String language) throws NlpHubException {
for (String id : identifiers) {
try {
super.identifier = id;
logger.error("Running: " + id);
super.init();
List<Parameter> parameters = mapParameters(filePublicLink, annotations);
super.execute(parameters);
logger.error("Runned: " + id);
} catch (Exception e) {
logger.error(e.getLocalizedMessage());
throw new NlpHubException(e.getLocalizedMessage(), e);
}
}
}
public ArrayList<String> getOutputLinks() {
return outputLinks;
}
private synchronized void testEndOfProcess(String link) {
outputLinks.add(link);
if (outputLinks.size() == identifiers.length) {
String[] links = new String[outputLinks.size()];
links = outputLinks.toArray(links);
//System.out.println("testEndOfProcess");
writeResponse(links);
}
}
private void writeResponse(String[] content) {
if (response != null) {
response.setContentType("application/json;charset=UTF-8");
PrintWriter writer = null;
try {
writer = response.getWriter();
String msg = new JsonManager().getSuccessJsonResponse(content);
//System.out.println("msg: " + msg);
writer.println(msg);
if(writer.checkError()) {
logger.error("writeResponse method has some problem in writing result.");
//System.out.println("writeResponse method has some problem in writing result.");
}
} catch (Exception ex) {
logger.error(ex.getLocalizedMessage());
ex.printStackTrace();
} finally {
if(writer != null)
writer.close();
}
}
}
private void writeResponse(String content, boolean isOk) {
if (response != null) {
response.setContentType("application/json;charset=UTF-8");
PrintWriter writer = null;
try {
writer = response.getWriter();
if (isOk) {
writer.println(new JsonManager().getSuccessJsonResponse("" + content));
} else {
writer.println(new JsonManager().getErrorJsonResponse("" + content));
}
writer.flush();
} catch (Exception ex) {
logger.error(ex.getLocalizedMessage());
} finally {
if(writer != null)
writer.close();
}
}
}
private List<Parameter> mapParameters(String publicLink, String annotations) {
List<Parameter> parameters = new ArrayList<>();
try {
List<Parameter> inputParameters = super.getOperatorInputParameters();
//System.out.println("n. " + inputParameters.size());
for (Parameter p : inputParameters) {
switch (p.getTypology()) {
case FILE:
FileParameter fileName = new FileParameter();
fileName.setName(p.getName());
fileName.setValue(publicLink);
parameters.add(fileName);
//System.out.println(fileName.toString());
break;
case LIST:
ListParameter list = new ListParameter();
list.setName(p.getName());
list.setValue(annotations.replace(",", "|"));
parameters.add(list);
//System.out.println(list.toString());
break;
case ENUM:
// to be managed...
break;
}
}
} catch (Exception ex) {
logger.error(ex.getLocalizedMessage());
}
return parameters;
}
/*
* public static void main(String[] args) { String service =
* "http://dataminer-prototypes.d4science.org/wps/"; String identifier = "";
* identifier =
* "org.gcube.dataanalysis.wps.statisticalmanager.synchserver.mappedclasses.transducerers.ENGLISH_NAMED_ENTITY_RECOGNIZER";
* // identifier = // //
* "org.gcube.dataanalysis.wps.statisticalmanager.synchserver.mappedclasses.transducerers.NEWSTANBOLWRAPPER";
* // identifier = // //
* "org.gcube.dataanalysis.wps.statisticalmanager.synchserver.mappedclasses.transducerers.GENERIC_OPINION_MINING_ENGLISH";
* String token = "df2cc5f5-63ee-48c1-b2a6-1210030c57b8-843339462"; String
* pLink =
* "http://data.d4science.org/RW9KZDJ0eU9ZZlRNWEhLYmtVa3ltL0Y1UWdhdmZvTlVHbWJQNStIS0N6Yz0";
*
* ArrayList<NlpParameter> params = new ArrayList<>(); NlpParameter p = new
* NlpParameter(NlpParameter.ANNOTATION_LIST, "", "Person,Token", 0);
* params.add(p);
*
* NlpNerRunner runner = new NlpNerRunner(service, identifier, token); //
* try { runner.run(pLink, service, identifier, params); } catch
* (NlpHubException e) { e.printStackTrace(); } }
*/
}

@ -158,19 +158,4 @@ public class RunnerCommander extends Thread {
}
}
/*
public static void main(String[] args) {
String id1 = "org.gcube.dataanalysis.wps.statisticalmanager.synchserver.mappedclasses.transducerers.ENGLISH_NAMED_ENTITY_RECOGNIZER";
String id2 = "org.gcube.dataanalysis.wps.statisticalmanager.synchserver.mappedclasses.transducerers.ENGLISH_NER_CORENLP";
String tokken = "df2cc5f5-63ee-48c1-b2a6-1210030c57b8-843339462";
String ann = "Organization,Location,Person";
String file = "http://data.d4science.org/TWhNTS9DdVdXaTZLSWsrWUNQdHk3OUdZSU93SXRFbjhHbWJQNStIS0N6Yz0";
file = "http://data.d4science.org/L0txb3o3Tk9GaW1LSWsrWUNQdHk3MG1ZWFdtWkJENU5HbWJQNStIS0N6Yz0";
String[] ids = new String[2];
ids[0] = id1;
ids[1] = id2;
RunnerCommander rc = new RunnerCommander(ids, file, ann, tokken);
rc.start();
} */
}

@ -333,6 +333,10 @@ backHandler = function() {
$("#ner-ui").show();
if(publicLink != null) {
enableExecuteButton();
if(document.getElementById("reset-upload") != null) {
if($("#reset-upload").is(":visible"))
textAreaEnable(false);
}
}
}

@ -0,0 +1,5 @@
#Generated by Maven
#Tue Mar 27 17:00:52 CEST 2018
version=0.0.1-SNAPSHOT
groupId=org.gcube
artifactId=nlphub

@ -0,0 +1,18 @@
org/gcube/nlphub/legacy/NlpHubException.class
org/gcube/nlphub/legacy/NerAlgorithm.class
org/gcube/nlphub/legacy/NerOutput.class
org/gcube/nlphub/nlp/NlpUtils.class
org/gcube/nlphub/legacy/NerEntity.class
org/gcube/nlphub/legacy/AsyncHttpRequest.class
org/gcube/nlphub/mapper/JsonMapper.class
org/gcube/nlphub/workspace/WorkspaceManager.class
org/gcube/nlphub/legacy/DataminerClientException.class
org/gcube/nlphub/legacy/Constants.class
org/gcube/nlphub/nlp/NlpParameter.class
org/gcube/nlphub/NLPHub.class
org/gcube/nlphub/nlp/RunnerCommander.class
org/gcube/nlphub/nlp/NLpLanguageRecognizer.class
org/gcube/nlphub/legacy/NerAnnotationData.class
org/gcube/nlphub/nlp/NlpAsyncNerRunner.class
org/gcube/nlphub/legacy/JsonManager.class
org/gcube/nlphub/NLPUploader.class

@ -0,0 +1,20 @@
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/nlp/NlpAsyncNerRunner.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/legacy/NerOutput.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/mapper/JsonMapper.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/nlp/NlpUtils.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/legacy/NlpHubException.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/NLPHub.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/mapper/DefaultMapper.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/NLPUploader.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/nlp/NLpLanguageRecognizer.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/workspace/WorkspaceManager.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/legacy/NerEntity.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/legacy/DataminerException.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/legacy/NerAlgorithm.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/legacy/AsyncHttpRequest.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/nlp/NlpParameter.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/nlp/RunnerCommander.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/legacy/JsonManager.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/NLPMapper.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/legacy/NerAnnotationData.java
/home/erico/workspace/nlphub/src/main/java/org/gcube/nlphub/legacy/Constants.java

Binary file not shown.

@ -0,0 +1,12 @@
log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# Print the date in ISO 8601 format
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
# Print only messages of level TRACE or above in the package org.gcube
log4j.logger.org.gcube=TRACE
log4j.logger.org.gcube.application.framework.core.session=INFO
log4j.logger.org.gcube.common.scope.impl.DefaultScopeProvider=ERROR
log4j.logger.com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor=ERROR

@ -0,0 +1,8 @@
log4j.rootLogger=INFO,stdout
log4j.logger.com.endeca=INFO
# Logger for crawl metrics
log4j.logger.com.endeca.itl.web.metrics=INFO
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%p\t%d{ISO8601}\t%r\t%c\t[%t]\t%m%n

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{0}: %msg%n</pattern>
</encoder>
</appender>
<logger name="org.gcube" level="INFO" />
<logger name="org.gcube.vremanagement.smartexecutor" level="TRACE" />
<logger name="org.gcube.dataharvest" level="TRACE" />
<root level="WARN">
<appender-ref ref="STDOUT" />
</root>
</configuration>

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" metadata-complete="true" version="3.0">
<display-name>NLPHub</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>NLPServlet</servlet-name>
<servlet-class>org.gcube.nlphub.NLPHub</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>NLPServlet</servlet-name>
<url-pattern>/nlphub-servlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>NLPUploader</servlet-name>
<servlet-class>org.gcube.nlphub.NLPUploader</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>NLPUploader</servlet-name>
<url-pattern>/nlphub-uploader-servlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>NLPMapper</servlet-name>
<servlet-class>org.gcube.nlphub.NLPMapper</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>NLPMapper</servlet-name>
<url-pattern>/nlphub-mapper-servlet</url-pattern>
</servlet-mapping>
</web-app>

@ -0,0 +1,71 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Colors</title>
<script type="text/javascript">
var hexLetters = '0123456789ABCDEF';
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];
}
randomRGB = function() {
var color = '';
var couple = '';
for (var i = 0; i < 3; i++) {
//do {
couple = '' + hexLetters[Math.floor(Math.random() * 10)]
+ hexLetters[Math.floor(Math.random() * 16)];
// for (j = 0; j < 2; j++) {
// couple += letters[Math.floor(Math.random() * 16)];
// }
//} while ((255 - parseInt("0x" + couple)) < 128)
color += couple;
}
return color;
}
changeColor = function() {
var color = randomRGB();
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 span = document.getElementsByTagName("SPAN");
span[0].setAttribute("style", "color:#" + color + "; font-weight:bold;");
span[1].setAttribute("style", "color:#" + color + "; background:"
+ complement + "; font-weight:bold;");
}
testReplace = function() {
var text = "<< Text between >>";
text = text.replace(/</g, "&lt;");
text = text.replace(/>/g, "&gt;");
console.log(text);
document.getElementById("between-text").innerHtml = text;
}
</script>
</head>
<body onload="testReplace()">
<div>
<span>TEST COLORE</span>
</div>
<div>
<span>TEST COLORE + SFONDO</span>
</div>
<div id="between-text">
</div>
</body>
</html>

@ -0,0 +1,456 @@
[type="checkbox"]+label {
margin-right: 15px !important;
}
.my-textarea {
border: 1px solid #555;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
padding: 4px;
height: 100px;
}
pre {
padding: 5px;
margin: 5px;
}
.string {
color: green;
}
.number {
color: darkorange;
}
.boolean {
color: blue;
}
.null {
color: magenta;
}
.key {
color: red;
}
.column {
margin-left: 1px;
float: left;
}
.half-width {
width: 48%;
}
.margin-left-10px {
margin-left: 10px;
}
.margin-right-10px {
margin-right: 10px;
}
.clearfix::after {
content: "";
clear: both;
display: table;
}
.fixed-height {
min-height: 200px;
}
.margin-3 {
margin: 2px;
}
.text-align-left {
text-align: left;
}
.text-align-right {
text-align: right;
}
.align-left {
float: left;
width: 80%;
}
.align-left-33 {
float: right;
width: 33%;
}
.centered {
margin-left: auto;
margin-right: auto;
}
.full-width {
width: 100%;
}
.vscrollable {
height: 220px;
overflow-y: auto;
}
.ajax-file-upload {
float: left;
margin: 10px;
color: white;
background-color: #4CAF50; /*!important;*/
padding: 0.6rem;
text-transform: uppercase;
vertical-align: middle;
border-radius: 2px;
display: inline-block;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
cursor: pointer;
}
#execute-button {
margin: 10px;
color: white;
padding: 0.6rem;
text-transform: uppercase;
vertical-align: middle;
border-radius: 2px;
display: inline-block;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
cursor: pointer;
}
.green-button {
margin: 10px;
background-color: #4CAF50;
color: white;
padding: 0.6rem;
text-transform: uppercase;
vertical-align: middle;
border-radius: 2px;
display: inline-block;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
cursor: pointer;
}
#reset-upload {
color: white;
background-color: #4CAF50;
padding: 0.2rem;
text-transform: uppercase;
vertical-align: middle;
border-radius: 2px;
display: inline-block;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
cursor: pointer;
}
.ajax-file-upload-statusbar {
height: 1.3em;
width: 100% !important;
/*display: none !important;*/
}
.ajax-upload-dragdrop {
float: right;
border: solid 1px #dfdfdf;
width: 200px !important;
}
#file-info {
/*float: right;
margin-left: 10px;*/
}
.ajax-file-upload-progress {
height: 2em !important;
}
.full-width-bar {
width: 100%;
border-bottom: solid 1px gray;
}
.title-box {
width: 69%;
float: right;
padding-left: 3em;
}
.logo {
width: 100%;
}
#logo-image {
width: 200px;
height: auto;
cursor: pointer;
}
.ajax-file-upload-container {
display: none !important;
float: right;
margin-left: 10px;
}
select {
display: block;
visibility: visible;
}
.hidden-div {
display: none;
}
.progress-circular-div {
position: absolute;
z-index: 100;
border: solid 1px gray;
padding: 10px;
background: white;
/*width:300px;
height:300px;*/
margin:0 auto;
left:50%;
top:50%;
transform: translate(-50%, -50%);
}
#progress-caption {
margin-top: 3px;
margin-left: auto;
margin-right: auto;
}
.float-right-div {
float: right;
margin-left: 10px;
}
.left-side {
float: left;
width: 78%;
border: 1px solid silver;
height: 60vh;
margin: 2px;
}
.right-side {
float: left;
width: 20%;
border: 1px solid silver;
height: 60vh;
margin: 2px;
overflow-y: auto;
}
#ner-result-accordion {
height: 60vh;
margin: 2px;
}
.left-side-half {
float: left;
width: 49%;
height: 3vh;
margin: 1px;
}
.right-side::after {
content: "";
clear: both;
display: table;
}
.left-side-half::after {
content: "";
clear: both;
display: table;
}
.header-side {
float: left;
width: 100%;
margin-top: 1px;
margin-bottom: 1px;
padding: 5px;
}
@media (max-width: 600px) {
.left-side {
width: 100%;
height: 100%;
}
.right-side {
width: 100%;
height: 100%;
}
.left-side-half {
height: 4vh;
}
}
@media (width: 600px) {
.left-side {
width: 100%;
height: 100%;
}
.right-side {
width: 100%;
height: 100%;
}
.left-side-half {
height: 4vh;
}
}
@media (max-width: 430px) {
.left-side {
width: 100%;
height: 100%;
}
.right-side {
width: 100%;
height: 100%;
}
.left-side-half {
height: 6vh;
}
}
@media (width: 430px) {
.left-side {
width: 100%;
height: 100%;
}
.right-side {
width: 100%;
height: 100%;
}
.left-side-half {
height: 6vh;
}
}
@media (max-width: 300px) {
.left-side {
width: 100%;
height: 100%;
}
.right-side {
width: 100%;
height: 100%;
}
.left-side-half {
height: 8vh;
}
}
@media (width: 300px) {
.left-side {
width: 100%;
height: 100%;
}
.right-side {
width: 100%;
height: 100%;
}
.left-side-half {
height: 8vh;
}
}
@media (max-width: 250px) {
.left-side {
width: 100%;
height: 100%;
}
.right-side {
width: 100%;
height: 100%;
}
.left-side-half {
height: 10vh;
}
}
@media (width: 250px) {
.left-side {
width: 100%;
height: 100%;
}
.right-side {
width: 100%;
height: 100%;
}
.left-side-half {
height: 10vh;
}
}
#algorithm-param_div {
font-size: 12px !important;
}
#result-text-div {
overflow-y: auto;
}
#result-params-div {
overflow-y: auto;
}
.collapsible-body {
padding-left: 2px !important;
padding-right: 2px !important;
}
.collapsible-header {
color: white;
background-color: #4CAF50;
}
/*
input[type="checkbox"]:not(:checked){
position: unset !important;
opacity: unset !important;
padding: 3px;
}
input[type="checkbox"]:checked {
position: unset !important;
opacity: unset !important;
padding: 3px;
}
*/
.input-field label {
pointer-events: auto;
}
.collapsible {
-webkit-box-shadow: none !important;
-moz-box-shadow: none !important;;
box-shadow: none !important;;
}
/*
#result-params-div input[type="checkbox"]:not(:checked){
position: unset !important;
opacity: unset !important;
padding: 3px;
}
#result-params-div input[type="checkbox"]:checked {
position: unset !important;
opacity: unset !important;
padding: 3px;
}
*/

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>External Test</title>
<script type="text/javascript">
externalTest = function() {
var link = "http://data.d4science.org/SCs1TC9zdDYzYm1LSWsrWUNQdHk3MXo3YzBtWStMUEJHbWJQNStIS0N6Yz0";
//link = "http://www.dropbox.com/s/cnyzf1bc3b5onj3/italian-text-4.txt?dl=0";
//link = "https://goo.gl/QgT25h";
location.href="index.jsp?input=" + encodeURIComponent(link);
}
</script>
</head>
<body onload="externalTest()">
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

@ -0,0 +1,152 @@
<%@ page import="org.gcube.nlphub.legacy.Constants" %>
<!DOCTYPE html>
<html>
<head>
<!-- input=http%3A%2F%2Fws1-clarind.esc.rzg.mpg.de%2Fdrop-off%2Fstorage%2F1513257926038.txt&lang=en&analysis=const-parsing -->
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>NLPHub v1.2</title>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons"
rel="stylesheet" />
<!--Import materialize.css-->
<link type="text/css" rel="stylesheet" href="css/materialize.min.css"
media="screen,projection" />
<link type="text/css" rel="stylesheet" href="css/custom.css" />
<!-- jQuery library -->
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript" src="js/materialize.min.js"></script>
<script type="text/javascript" src="js/jquery.simple.websocket.min.js"></script>
<script type="text/javascript" src="js/jquery.uploadfile.min.js"></script>
<script type="text/javascript" src="js/main.js"></script>
<script type="text/javascript" src="js/merge.js"></script>
<script type="text/javascript">
var activePage = "Named Entity Recognition";
var inputFile = '<%= ((request.getParameter(Constants.INPUT_FILE_PARAMETER) == null) ? "" : "" + request.getParameter(Constants.INPUT_FILE_PARAMETER)) %>';
var gCubeToken = '<%= ((request.getParameter(Constants.TOKEN_PARAMETER) == null) ? "" : "" + request.getParameter(Constants.TOKEN_PARAMETER)) %>';
var scheme = '<%= request.getScheme() %>';
</script>
</head>
<body style="padding: 0 15px;">
<div class="logo">
<img id="logo-image" src="img/nlphub-logo-3.png">
</div>
<!-- the "main-div" contains all tabs and contents -->
<div class="main-div">
<!-- tabs div: each tab must refer a page div -->
<div class="col s12">
<ul class="tabs">
<li class="tab col s3"><a href="#ner" onclick="activePage='Named Entity Recognition'">NER</a></li>
<!-- <li class="tab col s3"><a href="#other" onclick="activePage='Other'">other</a></li>-->
</ul>
</div>
<!-- "ner" div: contains the name entity recognizer interface -->
<div id="ner">
<div id="ner-ui">
<p class="flow-text">Named Entity Recognition</p>
<fieldset>
<legend>Language selection</legend>
<div class="row">
<div class="clearfix">
<div class="column half-width">
<p class="margin-3 text-align-right"></p>
</div>
<div class="column half-width">
<select id="language-select" class="margin-3 align-left">
</select>
</div>
</div>
</div>
</fieldset>
<fieldset>
<legend>Input text</legend>
<div class="row">
<div class="clearfix">
<div class="column margin-right-10px">
<p>Drag a .TXT file on the Upload box, or select a file from your PC, or paste a text.</p>
</div>
<div class="column margin-left-10px">
<div class="centered full-width" id="fu-container">
<div class="waves-effect waves-light darken-1"
id="upload-button">Upload text file</div>
</div>
</div>
</div>
<div class="input-field col s12">Write or paste a text in the text area (<span style="color:red;">max 4000 characters</span>)
<textarea maxlength="4000" id="input-textarea" class="my-textarea" rows="8"
placeholder="paste your text here"></textarea>
</div>
</div>
</fieldset>
<fieldset>
<legend>Annotations (deselect those you don't want to be reported)</legend>
<div class="vscrollable">
<table id="annotations-table">
</table>
</div>
</fieldset>
<!-- this is the "execute button" -->
<div style="text-align: center; padding: 5px;">
<a id="execute-button">Analyse</a>
</div>
</div>
<!-- this is the main result container -->
<div id="ner-result-container">
<div id="result-header" class="header-side">
<div class="left-side-half" id="result-header-left"></div>
<div class="left-side-half" id="result-header-right"></div>
</div>
<div></div>
<div class="left-side" id="result-text-div"></div>
<div class="right-side">
<ul class="collapsible" data-collapsible="accordion" id="ner-result-accordion">
<li>
<div class="collapsible-header waves-effect waves-teal">Algorithms</div>
<div class="collapsible-body" id="algorithm-params-div"></div>
</li>
<li>
<div class="collapsible-header waves-effect waves-teal">Annotations</div>
<div class="collapsible-body" id="result-params-div"></div>
</li>
</ul>
</div>
<div style="text-align: left;">
<div class="green-button float-right-div" id="back-ner-ui-button">back</div>
</div>
</div>
</div>
<!-- end "#ner" -->
<div id="#other"></div>
<!-- this section is used only for the operation progress indicator -->
<div class="hidden-div progress-circular-div">
<div class="preloader-wrapper big active">
<div class="spinner-layer spinner-blue-only">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
<div id="progress-caption">In progress</div>
</div>
</div>
<!-- end "#main-div" -->
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -0,0 +1,106 @@
mergeSegment = function(segment1, segment2) {
var merged = [];
if(segment1[0] <= segment2[0]) {
if(segment1[1] < segment2[0]) {
merged = [segment1, segment2];
}
else {
if(segment1[1] >= segment2[1])
merged = [segment1];
else
merged = [[segment1[0], segment2[1]]];
}
}
else {
if(segment2[1] < segment1[0]) {
merged = [segment2, segment1];
}
else {
if(segment2[1] >= segment1[1])
merged = [segment2];
else
merged = [[segment2[0], segment1[1]]];
}
}
return merged;
}
compareSegment = function(segment1, segment2) {
// inclusi o coincidenti
if((segment1[0] >= segment2[0]) && (segment1[1] <= segment2[1]))
return 0;
if((segment1[0] <= segment2[0]) && (segment1[1] >= segment2[1]))
return 0;
// esterni
if((segment1[1] < segment2[0]) || ((segment1[0] > segment2[1])))
return 1;
// intersecanti
return -1;
}
compareSegments = function(s1, s2) {
return (s1[0] - s2[0]);
}
/**
* mergeAll: merge indices
* parameters: indices = Array of Array of indices (index = [start, end])
* Example: indices = [[[1,2], [4,5]], [[0,5], [7,11]]];
*/
mergeAll = function(indices) {
var m = [];
// first of all: creates a 1-dimension array with all data
for(var i=0; i<indices.length; i++) {
m = m.concat(indices[i]);
}
//
// second step: sort the array
// for our purposes a segment is 'lower than' another segment if the left value of the segment
// is lower than the left value of the other segment. In other words:
// [a, b] < [c, d] if a < c
//
m = m.sort(compareSegments);
var m2 = [];
//
// merging procedure:
// the procedure uses the functions:
// [1] 'compareSegment'.
// when two segment are equals or included compareSegment returns 0
// when two segment are intersecting compareSegment returns -1
// when two segment are external (no intersection) compareSegment returns 1
//
// [2] 'mergeSegment'
// returns the "union" of two segments
//
var current = m[0];
for(var i=0; i<m.length; i++) {
var cfr = compareSegment(current, m[i]);
switch(cfr) {
case 0:
case -1:
// if segments are the same or intersected the result is the merged segment
current = mergeSegment(current, m[i])[0];
break;
default:
// if segments are external mergeSegment produce two segments: the first is ready to be stored in the output vector
// the second is to be compared with others
var s = mergeSegment(current, m[i]);
m2[m2.length] = s[0];
current = s[1];
break;
}
}
if(m2.length == 0) {
m2[0] = current;
}
else if((current[0] != m2[m2.length-1][0]) || (current[1] != m2[m2.length-1][1]))
m2[m2.length] = current;
return m2;
}

@ -0,0 +1,58 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Merge TEST</title>
<script type="text/javascript" src="js/merge.js"></script>
<script type="text/javascript">
var indices = [
[[0,5], [7,9], [15,19]],
[[6,10]],
[[1,6], [9,16], [21,23]],
[[7,9], [12,13]]
];
//var newIndices = mergeIndices(indices);
//console.log(newIndices);
// answer is: [0,19], [21,23]
indices1 = [
[[7,19], [21,25]],
[[1,5], [18,22]]
];
//answer is: [1,5], [7,25]
indices2 = [
[[7,16], [21,25]],
[[1,5], [18,22]]
];
//answer is: [1,5], [7,16], [18,25]
indices3 = [
[[7,16], [21,25]],
[[1,5], [18,22]],
[[2,30]]
];
//answer is: [1,30]
indices4 = [
[[1,4], [5, 8], [21,25]],
[[1,5], [18,22]],
[[0,2], [11,15], [27,31]]
];
//answer is: [0,8],[11,15],[18,25],[27,31]
var indices = indices4;
var mm = mergeAll(indices);
console.log(mm);
</script>
</head>
<body>
</body>
</html>
Loading…
Cancel
Save