package org.aksw.jena_sparql_api.sparql.ext.http; import java.io.IOException; import java.net.URI; import java.util.GregorianCalendar; import java.util.concurrent.TimeUnit; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpRequestInterceptor; import org.apache.http.HttpResponse; import org.apache.http.HttpResponseInterceptor; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.impl.client.RequestWrapper; import org.apache.http.protocol.HttpContext; import org.apache.jena.atlas.lib.Sink; import com.google.common.base.Stopwatch; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.rdf.model.Resource; import org.apache.jena.vocabulary.DCTerms; import org.apache.jena.vocabulary.RDF; /** * Interceptor for HTTP requests and responses that generates RDF and puts it into * a sink * * @author raven * */ public class HttpInterceptorRdfLogging implements HttpRequestInterceptor, HttpResponseInterceptor { private Sink<Model> modelSink; public HttpInterceptorRdfLogging(Sink<Model> modelSink) { super(); this.modelSink = modelSink; } public static HttpRequest unwrap(HttpRequest result) { if(result instanceof RequestWrapper) { HttpRequest tmp = ((RequestWrapper)result).getOriginal(); result = tmp == null ? result : unwrap(tmp); } return result; } /** * * :logMsg123 * a :LogMessage ; * http:uri <http://localhost/foobar> ; * dc:created "timestamp" ; * sparql:query "query string" * timeTaken: // we could use start and end time instead * * * */ public static void writeHttpLogMsg(Model target, Resource root) { } @Override public void process(HttpRequest request, HttpContext context) throws HttpException, IOException { //String queryStr = request.getFirstHeader("query").getValue(); Stopwatch sw = Stopwatch.createStarted(); //System.out.println("Request started"); HttpRequest orig = unwrap(request); //RequestLine rq = request.getRequestLine(); if(orig instanceof HttpRequestBase) { HttpRequestBase x = (HttpRequestBase)orig; //System.out.println("XXXX" + x.getURI()); } context.setAttribute("stopwatch", sw); context.setAttribute("request", orig); } @Override public void process(HttpResponse response, HttpContext context) throws HttpException, IOException { HttpRequestBase orig = (HttpRequestBase)context.getAttribute("request"); URI uri = orig.getURI(); String uriStr = uri.toString(); //System.out.println("ARGHREQ " + uriStr); if(!uriStr.contains("log")) { Stopwatch sw = (Stopwatch)context.getAttribute("stopwatch"); //HttpEntity entity = response.getEntity(); int statusCode = response.getStatusLine().getStatusCode(); //System.out.println(statusCode); //response.getR long requestDuration = sw.elapsed(TimeUnit.MILLISECONDS); //System.out.println("TIME TAKEN: " + requestDuration); //HttpRequest r Model m = ModelFactory.createDefaultModel(); String prefix = "http://example.org/log/"; Resource s = m.createResource(prefix + "msg-" + System.nanoTime()); String http = "http://jsa.aksw.org/ontology/http/"; String u = "http://jsa.aksw.org/ontology/uri/"; m.add(s, RDF.type, http + "Message"); m.add(s, m.createProperty(u + "uri"), uri.toString()); m.add(s, m.createProperty(u + "scheme"), uri.getScheme()); m.add(s, m.createProperty(u + "host"), uri.getHost()); m.add(s, m.createProperty(u + "path"), uri.getPath()); //m.add(s, m.createProperty(u + "query"), uri.getQuery()); m.add(s, m.createProperty(u + "port"), m.createTypedLiteral(uri.getPort())); m.add(s, m.createProperty(u + "fragment"), StringUtils.defaultIfEmpty(uri.getFragment(), "")); m.add(s, m.createProperty(u + "authority"), uri.getAuthority()); m.add(s, DCTerms.created, m.createTypedLiteral(new GregorianCalendar())); m.add(s, m.createProperty(http + "duration"), m.createTypedLiteral(requestDuration)); m.add(s, m.createProperty(http + "statusCode"), m.createTypedLiteral(statusCode)); modelSink.send(m); } //System.out.println("Request: " + context.getAttribute("request")); } }