/******************************************************************************/ /* Copyright (C) 2010-2011, Sebastian Hellmann */ /* */ /* Licensed under the Apache License, Version 2.0 (the "License"); */ /* you may not use this file except in compliance with the License. */ /* You may obtain a copy of the License at */ /* */ /* http://www.apache.org/licenses/LICENSE-2.0 */ /* */ /* Unless required by applicable law or agreed to in writing, software */ /* distributed under the License is distributed on an "AS IS" BASIS, */ /* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ /* See the License for the specific language governing permissions and */ /* limitations under the License. */ /******************************************************************************/ package org.nlp2rdf.webservice; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.rdf.model.Model; import com.jamonapi.Monitor; import com.jamonapi.MonitorFactory; import org.aksw.rdfunit.enums.TestCaseExecutionType; import org.aksw.rdfunit.io.writer.*; import org.aksw.rdfunit.validate.wrappers.RDFUnitStaticValidator; import org.aksw.rdfunit.validate.wrappers.RDFUnitTestSuiteGenerator; import org.nlp2rdf.core.NIFParameters; import org.nlp2rdf.core.RDFUnitValidatorWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.security.InvalidParameterException; /** * User: hellmann * Date: 20.09.13 */ public abstract class NIFServlet extends HttpServlet { private static Logger log = LoggerFactory.getLogger(NIFServlet.class); private int counter = 0; @Override protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { handle(httpServletRequest, httpServletResponse); } @Override protected void doOptions(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { //The following are CORS headers httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET, PUT, POST, OPTIONS, DELETE"); httpServletResponse.setHeader("Access-Control-Max-Age", "*"); httpServletResponse.setHeader("Access-Control-Allow-Headers", "*"); } @Override protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { handle(httpServletRequest, httpServletResponse); } public abstract OntModel execute(NIFParameters nifParameters) throws Exception; /** * this method answers GET and POST requests, which are treated the same. * - Validates parameters * - does the work (execute) * * @param httpServletRequest * @param httpServletResponse * @throws ServletException * @throws IOException */ private void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { //The following are CORS headers httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET, PUT, POST, OPTIONS, DELETE"); httpServletResponse.setHeader("Access-Control-Max-Age", "*"); httpServletResponse.setHeader("Access-Control-Allow-Headers", "*"); try { //Validate parameters and normalize input Monitor mon = MonitorFactory.getTimeMonitor("NIFParameters.getInstance").start(); String defaultPrefix = httpServletRequest.getRequestURL().toString() + "#"; NIFParameters nifParameters = NIFParameterWebserviceFactory.getInstance(httpServletRequest, defaultPrefix); log.debug("NIFParameters Object created: " + logMonitor(mon.stop())); //execute the task mon = MonitorFactory.getTimeMonitor("NIFServlet.execute").start(); OntModel out = execute(nifParameters); out.setNsPrefix("p", defaultPrefix); log.debug("NIF Component executed task: " + logMonitor(mon.stop())); //validation if(nifParameters.isValidate()) { new RDFUnitValidatorWrapper().process(nifParameters.getInputModel(),nifParameters.getInputModel(),nifParameters); } //write the response write(httpServletResponse, out, nifParameters.getOutputFormat()); log.info("output (" + nifParameters.getOutputFormat() + ", " + nifParameters.getOutputFormat() + ") written, triples from input: " + nifParameters.getInputModel().size() + ", added by component: " + out.size()); writeJamonLog(); } catch (IllegalArgumentException e) { e.printStackTrace(); writeError(e.getMessage(), httpServletResponse); /*String msg = e.getMessage() + printParameterMap(httpServletRequest); log.error(msg); eu.lod2.nlp2rdf.schema.error.Error fatalerror = ErrorHandling.createError(true, requestUrl, msg, model); fatalerror.addSource(requestUrl); if (nifParameters != null) { write(httpServletResponse, model, nifParameters.getFormat()); } else { write(httpServletResponse, model, "rdfxml"); } */ } catch (Exception e) { e.printStackTrace(); writeError(e.getMessage(), httpServletResponse); /*String msg = "An error occured: " + e.getMessage() + printParameterMap(httpServletRequest); log.error(msg, e); eu.lod2.nlp2rdf.schema.error.Error fatalerror = ErrorHandling.createError(true, requestUrl, msg, model); fatalerror.addSource(requestUrl); if (nifParameters != null) { write(httpServletResponse, model, nifParameters.getFormat()); } else { write(httpServletResponse, model, "rdfxml"); }*/ } } protected static String logMonitor(Monitor m) { return "needed: " + m.getLastValue() + " ms. (" + m.getTotal() + " total)"; } protected void write(HttpServletResponse httpServletResponse, OntModel out, String format) throws IOException { //this is the printer where the output has to be on OutputStream outputStream = httpServletResponse.getOutputStream(); //Default writer (RDFUnit) RDFWriter outputWriter = null; String contentType = ""; switch (format.toLowerCase()) { // treat them the same case "turtle": outputWriter = new RDFStreamWriter(outputStream, "TURTLE"); contentType = "text/turtle"; break; case "rdfxml": outputWriter = new RDFStreamWriter(outputStream, "RDF/XML"); contentType = "application/rdf+xml"; break; case "n3": outputWriter = new RDFStreamWriter(outputStream, "N3"); contentType = "text/rdf+n3"; case "ntriples": outputWriter = new RDFStreamWriter(outputStream, "NTRIPLES"); contentType = "text/rdf+n3"; break; case "html": { outputWriter = RDFWriterFactory.createHTMLWriter(TestCaseExecutionType.rlogTestCaseResult, outputStream); contentType = "text/html"; break; } case "text": { contentType = "text"; break; } default: outputStream.close(); throw new InvalidParameterException("There is no " + format + " output implemented at the moment. Sorry!"); } httpServletResponse.setContentType(contentType); httpServletResponse.setCharacterEncoding("UTF-8"); /*out.setNsPrefix("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#"); out.setNsPrefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#"); out.setNsPrefix("owl", "http://www.w3.org/2002/07/owl#"); out.setNsPrefix("sso", "http://nlp2rdf.lod2.eu/schema/sso/"); out.setNsPrefix("str", "http://nlp2rdf.lod2.eu/schema/string/"); out.setNsPrefix("topic", "http://nlp2rdf.lod2.eu/schema/topic/"); out.setNsPrefix("error", "http://nlp2rdf.lod2.eu/schema/error/"); out.setNsPrefix("olia", "http://purl.org/olia/olia.owl#"); out.setNsPrefix("olia-top", "http://purl.org/olia/olia-top.owl#"); out.setNsPrefix("olia_system", "http://purl.org/olia/system.owl#"); out.setNsPrefix("penn", "http://purl.org/olia/penn.owl#"); out.setNsPrefix("penn-syntax", "http://purl.org/olia/penn-syntax.owl#"); out.setNsPrefix("stanford", "http://purl.org/olia/stanford.owl#"); out.setNsPrefix("brown", "http://purl.org/olia/brown.owl#"); */ try { if (outputWriter != null) outputWriter.write(out); else { // ct -> text outputStream.write(outputStream.toString().getBytes()); } } catch (RDFWriterException e) { System.err.println("Cannot write to output: " + e.getMessage()); e.printStackTrace(); } //RDFWriter writer = out.getWriter(jenaFormat); //writer.setProperty("showXmlDeclaration", "true"); //writer.setProperty("showDoctypeDeclaration", "true"); //writer.write(out, outputStream, ""); outputStream.close(); } protected void writeError(String error, HttpServletResponse httpServletResponse) throws IOException { httpServletResponse.setContentType("text/plain"); httpServletResponse.setCharacterEncoding("UTF-8"); //this is the printer where the output has to be on PrintWriter pw = httpServletResponse.getWriter(); pw.println(error); pw.close(); } public static String printParameterMap(HttpServletRequest httpServletRequest) { log.error("printing map:\n" + httpServletRequest.getRequestURL() + "\n" + httpServletRequest.getContextPath() + "\n" + httpServletRequest + "\n" + "parameters: " + httpServletRequest.getParameterMap().keySet() + "\n" + ""); StringBuffer buf = new StringBuffer(); for (Object key : httpServletRequest.getParameterMap().keySet()) { buf.append("\nParameter: " + key + " Values: "); for (String s : httpServletRequest.getParameterValues((String) key)) { buf.append(((s.length() > 200) ? s.substring(0, 200) + "..." : s) + " "); } } return buf.toString(); } public synchronized void writeJamonLog() { counter++; if (counter % 100 == 0) { try { // Create file FileWriter fstream = new FileWriter("log/jamonlog.html"); BufferedWriter out = new BufferedWriter(fstream); out.write(MonitorFactory.getReport()); //Close the output stream out.close(); } catch (Exception e) {//Catch exception if any //we don't care //System.err.println("Error: " + e.getMessage()); } } } }