package tbx2rdf.service; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; import tbx2rdf.TBX2RDF_Converter; import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; import java.io.SequenceInputStream; import java.io.StringReader; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.http.*; import org.apache.commons.fileupload.FileItemIterator; import org.apache.commons.fileupload.FileItemStream; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload.util.Streams; import org.apache.commons.io.FileUtils; import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4; import org.apache.log4j.Logger; import tbx2rdf.Mappings; /** * Servlet for the web tbx2rdf.appspot.com Expects a "content" parameter with * the input XML Will generate a page containing the RDF . * The beautiful serialization of the Result is presented using this great library: * http://codemirror.net/mode/turtle/index.html * * @author Philipp Cimiano, John McCrae - Universität Bielefeld * @author Victor Rodriguez - Universidad Politécnica de Madrid */ public class tbx2rdfServlet extends HttpServlet { private static final Logger log = Logger.getLogger(tbx2rdfServlet.class.getName()); /** * Processes the HTTP POST command. Expects a parameter called "content" * with the XML as input Responses with an HTML page containing the answer. * * @param req HTTP request * @param resp HTTP response */ @Override public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/html"); resp.setCharacterEncoding("UTF-8"); if (req.getMethod().equals("GET")) { final PrintWriter writer = resp.getWriter(); writer.println(getHeader()); writer.println(getForm()); writer.close(); return; } String content = null; String resourceURI = null; String mappings = null; if (ServletFileUpload.isMultipartContent(req)) { final ServletFileUpload upload = new ServletFileUpload(); try { final FileItemIterator iterator = upload.getItemIterator(req); while (iterator.hasNext()) { final FileItemStream item = iterator.next(); if (item.isFormField() && item.getFieldName().equalsIgnoreCase("resourceURI")) { resourceURI = Streams.asString(item.openStream()); } else if (item.getFieldName().equalsIgnoreCase("mappings")) { mappings = Streams.asString(item.openStream()); } else if (item.getFieldName().equalsIgnoreCase("content")) { content = Streams.asString(item.openStream()); } else { showError(req, resp); return; } } } catch (FileUploadException x) { throw new IOException(x); } } if (content == null || content.isEmpty()) { System.err.println("No content"); showError(req, resp); return; } if (resourceURI == null || resourceURI.isEmpty()) { System.err.println("No resource"); showError(req, resp); return; } try { storeInputTBX(content, req.getRemoteAddr()); String result0 = convert(content, resourceURI, mappings); formatOutput(resp, result0); } catch (RuntimeException x) { x.printStackTrace(); throw x; } } /** * Formats the result the response, with a beautiful layout. */ public static void formatOutput(HttpServletResponse resp, String result0) { try { resp.getWriter().println(getHeader()); resp.getWriter().println("<h1>RDF Version of the XML TBX data</h1>"); result0 = escapeHtml4(result0); String result = "<form><textarea id=\"code\" name=\"code\" cols=80 rows=25>"; result = result + result0 + "</textarea></form><script>var editor = CodeMirror.fromTextArea(document.getElementById(\"code\"), {mode: \"text/turtle\",matchBrackets: true});</script>"; resp.getWriter().println("<div sytle=\"margin-top: 100px;margin-bottom: 100px;margin-right: 150px;margin-left: 50px;\">"); resp.getWriter().println(result); resp.getWriter().println("</div>"); resp.getWriter().println("<hr/><p><small>Thanks for using our service.</small></p>"); resp.getWriter().println("<center><a href=\"tbx2rdf\"> back</a></center>"); resp.getWriter().println("</body></html>"); } catch (Exception e) { e.printStackTrace(); } } /** * Reads a text file. * * @param filename Path to the file */ public static String readTextFile(String filename) { String str = ""; try { InputStream in = tbx2rdf.service.tbx2rdfServlet.class.getResourceAsStream(filename); BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); String line = ""; while ((line = br.readLine()) != null) { str += line; } } catch (Exception e) { e.printStackTrace(); } return str; } /** * Serves the request with an error message. */ public static void showError(HttpServletRequest req, HttpServletResponse resp) { resp.setContentType("text/plain"); try { resp.getWriter().println("Ooops we are sorry, we have experienced an error"); } catch (Exception e) { } } /** * Get the submission form */ private static String getForm() { return "<h1>TBX2RDF Converter</h1>\n" + "<form action='' method='post' enctype='multipart/form-data'>\n" + " <label for='content'>TBX Document:</label>\n" + " <input type='file' name='content' id='content'><br>\n" + " <label for='content'>Resource URI (where you intend to publish the RDF document):</label>\n" + " <input type='text' name='resourceURI' id='resourceURI' value='http://'><br>\n" + " <label for='content'>Extra mappings:</label><br>\n" + " <textarea name='mappings' cols='80' rows='10'></textarea><br>\n" + " <input type='submit' value='Submit'><br>\n" + "</form></body></html>"; } /** * Gets an standard header */ private static String getHeader() { return "<html><head>" + "<link rel=stylesheet href=\"docs.css\"><link rel=\"stylesheet\" href=\"codemirror.css\"><script src=\"codemirror.js\"></script><script src=\"turtle.js\"></script>" + "<link type=\"text/css\" rel=\"stylesheet\" href=\"http://www.licensius.com/css/vroddon.css\" /><title>TBX2RDF Converter</title>" + " </head><body>"; } /** * @param str String to be transformed. * @param resourceURI DOCUMENT THIS * @param mappingStr DOCUMENT THIS. WE WILL FORGET THE FORMAT OF THE MAPPINGS FILE :( * @return String transformed */ public static String convert(String str, String resourceURI, String mappingStr) { String strout = "Error happened during conversion - \n"; try { final Mappings mappings; if (mappingStr == null) { mappings = Mappings.readInMappings(new InputStreamReader(tbx2rdfServlet.class.getResourceAsStream("/mappings.default"))); } else { mappings = Mappings.readInMappings(new InputStreamReader(new SequenceInputStream( tbx2rdfServlet.class.getResourceAsStream("/mappings.default"), new ByteArrayInputStream(mappingStr.getBytes())))); } TBX2RDF_Converter converter = new TBX2RDF_Converter(); strout = converter.convert(str, mappings, resourceURI); } catch (Exception e) { e.printStackTrace(); strout += "Error: " + e.getMessage(); } return strout; } private static void storeInputTBX(String content, String ip) { File folder = new File("inputs"); try{ if (!folder.exists()){ boolean result = folder.mkdir(); if(!result){ log.warn("Folder with input queries could not be created"); return; } } }catch(Exception e){ log.warn(e.getMessage()); return; } SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); String timestamp = sdf.format(new Date()); String path = "./inputs/"+timestamp+"_"+ ip +".xml"; path = path.replace(":", "_"); try{ PrintWriter out = new PrintWriter(path, "UTF-8"); out.write(content); out.close(); }catch(Exception e) { log.warn(e.getMessage()); } } /** * Test function */ public static void main(String[] args) throws Exception { storeInputTBX("hola", "127.0.0.1"); /* String str = ""; str = readTextFile("input.xml");// (JMC 20.08) There was no attempt to initialize the mappings, should there be?? Mappings mappings = new Mappings(); TBX2RDF_Converter converter = new TBX2RDF_Converter(); str = converter.convert(str, mappings, null); //These two lines are like a System.out but making sure that UTF-8 is used PrintStream out = new PrintStream(System.out, true, "UTF-8"); out.println(str);*/ } }