All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.joseki.validation.DataValidator Maven / Gradle / Ivy

/*
 * (c) Copyright 2010 Epimorphics Ltd.
 * All rights reserved.
 * [See end of file]
 */

package org.joseki.validation;

//import static org.openjena.riot.SysRIOT.fmtMessage ;

import java.io.IOException;
import java.io.PrintStream;
import java.io.Reader;
import java.io.StringReader;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.jena.atlas.io.IO;
import org.apache.jena.atlas.lib.Sink;
import org.apache.jena.atlas.lib.SinkWrapper;
import org.apache.jena.riot.lang.LangRIOT;
import org.apache.jena.riot.system.ErrorHandler;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.system.StreamRDF;
import org.apache.jena.riot.tokens.Tokenizer;
import org.apache.jena.riot.tokens.TokenizerFactory;
//import org.openjena.riot.Lang;
import org.openjena.riot.RIOT;
import org.openjena.riot.RiotException;
import org.openjena.riot.RiotReader;
import org.openjena.riot.SysRIOT;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.sparql.core.Quad;
import com.hp.hpl.jena.sparql.serializer.SerializationContext;
import com.hp.hpl.jena.sparql.util.FmtUtils;
//import com.hp.hpl.jena.util.Tokenizer;

//import org.openjena.riot.ErrorHandler ;
//import org.openjena.riot.LangRIOT ;

public class DataValidator extends HttpServlet
{
	protected static Logger log = LoggerFactory.getLogger("Data Validator");

	public DataValidator()
	{
		log.info("-------- Data Validator");
	}

	@Override public void init() throws ServletException
	{
		super.init();
	}

	@Override public void init(ServletConfig config) throws ServletException
	{
		super.init(config);
	}

	@Override public void destroy()
	{
		log.debug("destroy");
	}

	@Override public void doGet(HttpServletRequest httpRequest, HttpServletResponse httpResponse)
	{
		validationRequest(httpRequest, httpResponse);
	}

	@Override public void doPost(HttpServletRequest httpRequest, HttpServletResponse httpResponse)
	{
		validationRequest(httpRequest, httpResponse);
	}

	static final String paramLineNumbers = "linenumbers";
	static final String paramFormat = "outputFormat";
	static final String paramIndirection = "url";
	static final String paramData = "data";
	static final String paramSyntax = "languageSyntax";
	//static final String paramSyntaxExtended   = "extendedSyntax" ;
	static final String respService = "X-Service";

	private void validationRequest(HttpServletRequest httpRequest, HttpServletResponse httpResponse)
	{
		try {
			if (log.isDebugEnabled())
				log.debug("data validation request");

			Tokenizer tokenizer = createTokenizer(httpRequest, httpResponse);
			if (tokenizer == null)
				return;

			String syntax = httpRequest.getParameter(paramSyntax);
			if (syntax == null || syntax.equals(""))
				syntax = Lang.NQUADS.getName();

			Lang language = org.apache.jena.riot.Lang.get(syntax);
			if (language == null)
			{
				httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "Unknown syntax: " + syntax);
				return;
			}

			ServletOutputStream outStream = httpResponse.getOutputStream();
			ErrorHandlerMsg errorHandler = new ErrorHandlerMsg(outStream);

			PrintStream stdout = System.out;
			PrintStream stderr = System.err;
			System.setOut(new PrintStream(outStream));
			System.setErr(new PrintStream(outStream));

			httpResponse.setCharacterEncoding("UTF-8");
			httpResponse.setContentType("text/html");
			httpResponse.setHeader(respService, "Joseki/ARQ RDF Data Validator: http://jena.sourceforge.net/ARQ");

			outStream.println("");
			printHead(outStream);
			outStream.println("");
			outStream.println("");

			outStream.println("

RIOT Parser Report

"); outStream.println("

Line and column numbers refer to original input

"); outStream.println("

 

"); try { LangRIOT parser = setupParser(tokenizer, language, errorHandler, outStream); startFixed(outStream); RiotException exception = null; try { parser.parse(); System.out.flush(); System.err.flush(); } catch (RiotException ex) { exception = ex; } } finally { finishFixed(outStream); System.out.flush(); System.err.flush(); System.setOut(stdout); System.setErr(stdout); } outStream.println(""); } catch (Exception ex) { log.warn("Exception in validationRequest", ex); } } static final long LIMIT = 50000; private LangRIOT setupParser(Tokenizer tokenizer, Lang language, ErrorHandler errorHandler, final ServletOutputStream outStream) { Sink sink = new Sink() { SerializationContext sCxt = new SerializationContext(); public void send(Quad quad) { // Clean up! StringBuilder sb = new StringBuilder(); sb.append(formatNode(quad.getSubject())); sb.append(" "); sb.append(formatNode(quad.getPredicate())); sb.append(" "); sb.append(formatNode(quad.getObject())); if (!quad.isTriple()) { sb.append(" "); sb.append(formatNode(quad.getGraph())); } String $ = htmlQuote(sb.toString()); try { outStream.print($); outStream.println(" ."); } catch (IOException ex) { IO.exception(ex); } } public void close() { } public void flush() { } String formatNode(Node n) { return FmtUtils.stringForNode(n, sCxt); } }; Sink sink2 = new SinkWrapper(sink) { long count = 0; @Override public void close() { } @Override public void flush() { } @Override public void send(Quad quad) { super.send(quad); count++; if (count > LIMIT) throw new RiotException("Limit exceeded"); } }; // Language? LangRIOT parser = RiotReader.createParserQuads(tokenizer, language, (String) null, (StreamRDF) sink); parser.getProfile().setHandler(errorHandler); parser.getProfile().setHandler(errorHandler); return parser; } // Error handler that records messages private static class ErrorHandlerMsg implements ErrorHandler { private ServletOutputStream out; ErrorHandlerMsg(ServletOutputStream out) { this.out = out; } public void warning(String message, long line, long col) { output(message, line, col, "Warning", "warning"); } // Attempt to continue. public void error(String message, long line, long col) { output(message, line, col, "Error", "error"); } public void fatal(String message, long line, long col) { output(message, line, col, "Fatal", "error"); throw new RiotException(fmtMessage(message, line, col)); } private void output(String message, long line, long col, String typeName, String className) { try { String str = fmtMessage(message, line, col); //String str = typeName+": "+message ; str = htmlQuote(str); out.print("
"); out.print(str); out.print("
"); } catch (IOException ex) { IO.exception(ex); } } } private Tokenizer createTokenizer(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws Exception { Reader reader = null; String[] args = httpRequest.getParameterValues(paramIndirection); if (args == null || args.length == 0) { reader = httpRequest.getReader(); } else if (args.length > 1) { httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "Too many parameters for '" + paramIndirection + "='"); return null; } // else // { // reader = // get from afar. // } args = httpRequest.getParameterValues(paramData); if (args == null || args.length == 0) { } else if (args.length > 1) { httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "Too many parameters for '" + paramData + "='"); return null; } else { reader = new StringReader(args[0]); } if (reader == null) { httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "Can't find data to validate"); return null; } return TokenizerFactory.makeTokenizer(reader); } static public String fmtMessage(String message, long line, long col) { return org.apache.jena.riot.SysRIOT.fmtMessage(message, line, col); } private static String htmlQuote(String str) { StringBuffer sBuff = new StringBuffer(); for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i); switch (ch) { case '<': sBuff.append("<"); break; case '>': sBuff.append(">"); break; case '&': sBuff.append("&"); break; default: // Work around Eclipe bug with StringBuffer.append(char) //try { sBuff.append(ch) ; } catch (Exception ex) {} sBuff.append(ch); break; } } return sBuff.toString(); } private static void startFixed(ServletOutputStream outStream) throws IOException { outStream.println("
");
	}

	private static void columns(String prefix, ServletOutputStream outStream) throws IOException
	{
		outStream.print(prefix);
		outStream.println("         1         2         3         4         5         6         7");
		outStream.print(prefix);
		outStream.println("12345678901234567890123456789012345678901234567890123456789012345678901234567890");
	}

	private static void finishFixed(ServletOutputStream outStream) throws IOException
	{
		outStream.println("
"); } private static void printHead(ServletOutputStream outStream) throws IOException { outStream.println(""); outStream.println(" Jena Data Validator Report"); outStream.println(" "); //outStream.println() ; outStream.println(""); } } /* * (c) Copyright 2010 Epimorphics Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */




© 2015 - 2025 Weber Informatics LLC | Privacy Policy