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 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 link = f.getUrl(); System.out.println("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; super.init(); List parameters = mapParameters(filePublicLink, annotations); super.execute(parameters); } catch (Exception e) { logger.error(e.getLocalizedMessage()); throw new NlpHubException(e.getLocalizedMessage(), e); } } } public ArrayList 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); writeResponse(links); } } private void writeResponse(String[] content) { if (response != null) { response.setContentType("application/json;charset=UTF-8"); try { PrintWriter writer = response.getWriter(); writer.println(new JsonManager().getSuccessJsonResponse(content)); } catch (Exception ex) { logger.error(ex.getLocalizedMessage()); } } } private void writeResponse(String content, boolean isOk) { if (response != null) { response.setContentType("application/json;charset=UTF-8"); try { PrintWriter writer = response.getWriter(); if (isOk) { writer.println(new JsonManager().getSuccessJsonResponse("" + content)); } else { writer.println(new JsonManager().getErrorJsonResponse("" + content)); } } catch (Exception ex) { logger.error(ex.getLocalizedMessage()); } } } private List mapParameters(String publicLink, String annotations) { List parameters = new ArrayList<>(); try { List 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 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(); // } } */ }