package org.gcube.data.analysis.nlphub; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.URL; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.stream.FactoryConfigurationError; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import org.gcube.data.analysis.nlphub.session.SessionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Servlet implementation class NLPHub */ @WebServlet(asyncSupported = true, name = "DiscoverDataMinerServlet", urlPatterns = { "/discover-dataminer-servlet" }) public class DiscoverDataMinerService extends HttpServlet { private static final long serialVersionUID = 1L; private static final Logger logger = LoggerFactory.getLogger(DiscoverDataMinerService.class); /** * @see HttpServlet#HttpServlet() */ public DiscoverDataMinerService() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doWork(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doWork(request, response); } private void doWork(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { logger.debug("Discover DataMinerService"); String token = SessionUtils.getToken(request); discoverDataMinerService(request, response, token); } private void discoverDataMinerService(HttpServletRequest request, HttpServletResponse response, String token) throws ServletException, IOException { HttpURLConnection connection = null; String dataMinerServiceUrl = ""; response.setContentType("text/plain;charset=UTF-8"); try (PrintWriter writer = response.getWriter()) { try { String urlInformationSystem = "http://registry.d4science.org/icproxy/gcube/service/ServiceEndpoint/DataAnalysis/DataMiner?"; logger.debug("Request url: " + urlInformationSystem); urlInformationSystem += "gcube-token=" + token; URL url = new URL(urlInformationSystem); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setDoInput(true); connection.setDoOutput(false); connection.setUseCaches(false); try (BufferedReader r = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { dataMinerServiceUrl = readProfileInfo(r); } } catch (Exception e) { logger.error("Discover DataMiner Service error: " + e.getLocalizedMessage(), e); } finally { try { if (connection != null) connection.disconnect(); } catch (Exception e) { logger.error("Discover DataMiner Service error: " + e.getLocalizedMessage(), e); } } writer.println(dataMinerServiceUrl); } catch (Throwable e) { logger.error("Error discovering DataMiner Service Url: " + e.getLocalizedMessage(), e); } } private String readProfileInfo(BufferedReader r) throws FactoryConfigurationError, XMLStreamException { String dataMinerServiceUrl = null; XMLInputFactory xmlInFact = XMLInputFactory.newInstance(); XMLStreamReader reader = xmlInFact.createXMLStreamReader(r); while (reader.hasNext()) { int eventType = reader.next(); if (eventType == XMLStreamConstants.START_ELEMENT) { logger.debug("Read Element: " + reader.getLocalName()); if (reader.getLocalName().compareToIgnoreCase("EndPoint") == 0) { logger.debug("Attribute count:" + reader.getAttributeCount()); for (int i = 0; i < reader.getAttributeCount(); i++) { logger.debug("Attribute Name: " + reader.getAttributeName(i)); logger.debug("Attribute Value: " + reader.getAttributeValue(i)); if (reader.getAttributeName(i).toString().compareToIgnoreCase("EntryName") == 0 && reader.getAttributeValue(i).toString() .compareToIgnoreCase("dataminer-prototypes.d4science.org") == 0) { dataMinerServiceUrl = reader.getElementText(); dataMinerServiceUrl=dataMinerServiceUrl.trim(); dataMinerServiceUrl = dataMinerServiceUrl.replace("\\n", "").replace("\\r", ""); logger.debug("url lenght: "+dataMinerServiceUrl.length()); logger.debug("DataMiner service url retrieved: " + dataMinerServiceUrl); return dataMinerServiceUrl; } } } } } return dataMinerServiceUrl; } }