Skip to content

Commit

Permalink
default fallback to json-result in SparqlEndpoint instead of yasgui
Browse files Browse the repository at this point in the history
  • Loading branch information
SimonBin committed Jun 15, 2023
1 parent 9e90b3d commit 10e0377
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 112 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,21 @@
import org.apache.jena.riot.WebContent;


/** Adjust wildcard accept header with a specific one based on the sparql query / update type */
/**
* Adjust wildcard accept header with a specific one based on the sparql query / update type
*/
@WebFilter
public class SparqlStmtTypeAcceptHeaderFilter
implements Filter
{
/** The parser defaults to jena's arq parser */
implements Filter {
/**
* The parser defaults to jena's arq parser
*/
protected SparqlStmtParser sparqlStmtParser;

public SparqlStmtTypeAcceptHeaderFilter(SparqlStmtParser sparqlStmtParser) {
super();
this.sparqlStmtParser = sparqlStmtParser;
}
super();
this.sparqlStmtParser = sparqlStmtParser;
}

// public SparqlStmtParser getSparqlStmtParser() {
// return sparqlStmtParser == null ? SparqlEndpointBase;
Expand All @@ -58,8 +61,8 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
throws IOException, ServletException {


HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;

String payload = null;

Expand All @@ -69,92 +72,93 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
// If we don't do it here, jersey will consume the data and we won't be able to access it here anymore
Enumeration<String> it = req.getHeaders("Accept");
boolean isWildcard = true;
boolean isSparqlRequest = false;
org.apache.jena.atlas.web.MediaType type = null;
while (it.hasMoreElements()) {
String item = it.nextElement();
if (!item.equals("*/*")) {
isWildcard = false;
}
if(!isSparqlRequest) {
type = org.apache.jena.atlas.web.MediaType.createFromContentType(item);
if (DEF.constructOffer.match(type) != null
|| DEF.quadsOffer.match(type) != null
|| DEF.rdfOffer.match(type) != null
|| DEF.rsOfferTable.match(type) != null
|| DEF.rsOfferBoolean.match(type) != null) {
isSparqlRequest = true;
}
}
boolean isSparqlRequest = false;
org.apache.jena.atlas.web.MediaType type = null;
while (it.hasMoreElements()) {
String item = it.nextElement();
if (!item.equals("*/*")) {
isWildcard = false;
}
if (!isSparqlRequest) {
type = org.apache.jena.atlas.web.MediaType.createFromContentType(item);
if (DEF.constructOffer.match(type) != null
|| DEF.quadsOffer.match(type) != null
|| DEF.rdfOffer.match(type) != null
|| DEF.rsOfferTable.match(type) != null
|| DEF.rsOfferBoolean.match(type) != null) {
isSparqlRequest = true;
}
}
}

// HttpServletRequest subReq = req;
if (isWildcard || isSparqlRequest) {
List<String> strs = new ArrayList<>();

String contentTypeStr = req.getContentType();
boolean isSparqlPayload = WebContent.contentTypeSPARQLQuery.equals(contentTypeStr) || WebContent.contentTypeSPARQLUpdate.equals(contentTypeStr);
if (isSparqlPayload) {
isSparqlRequest = true;

// req = new ContentCachingRequestWrapper(req);
try (InputStream in = req.getInputStream()) {
payload = IOUtils.toString(in, StandardCharsets.UTF_8);
}
strs.add(payload);
List<String> strs = new ArrayList<>();

String contentTypeStr = req.getContentType();
boolean isSparqlPayload = WebContent.contentTypeSPARQLQuery.equals(contentTypeStr) || WebContent.contentTypeSPARQLUpdate.equals(contentTypeStr);
if (isSparqlPayload) {
isSparqlRequest = true;

// req = new ContentCachingRequestWrapper(req);
try (InputStream in = req.getInputStream()) {
payload = IOUtils.toString(in, StandardCharsets.UTF_8);
}
strs.add(payload);
} else {
Map<String, String[]> params = req.getParameterMap();
Map<String, String[]> params = req.getParameterMap();

List<String> queryValues = Optional.ofNullable(params.get("query")).map(Arrays::asList).orElse(Collections.emptyList());
List<String> updateValues = Optional.ofNullable(params.get("update")).map(Arrays::asList).orElse(Collections.emptyList());

strs.addAll(queryValues);
strs.addAll(updateValues);

List<String> queryValues = Optional.ofNullable(params.get("query")).map(Arrays::asList).orElse(Collections.emptyList());
List<String> updateValues = Optional.ofNullable(params.get("update")).map(Arrays::asList).orElse(Collections.emptyList());
isSparqlRequest = !strs.isEmpty();
}

strs.addAll(queryValues);
strs.addAll(updateValues);
String acceptTypeStr = type != null ? type.getContentTypeStr() : null;
if (isSparqlRequest) {
SparqlQueryFmts fmts = new SparqlQueryFmtOverResultFmt(SparqlResultFmtsImpl.DEFAULT);

String str = strs.size() == 1 ? strs.iterator().next() : null;

if (str != null && (acceptTypeStr == null || isWildcard)) {
SparqlStmt stmt = sparqlStmtParser.apply(str);
if (stmt.isParsed()) {
if (stmt.isQuery()) {
Lang lang = SparqlQueryFmtsUtils.getLang(fmts, stmt.getQuery());
acceptTypeStr = lang.getContentType().getContentTypeStr();
}
}
}
}

isSparqlRequest = !strs.isEmpty();
// Fallback to json; in any case we don't want text/html which might
// redirect to the HTML frontend
if (acceptTypeStr == null || isWildcard) {
acceptTypeStr = MediaType.APPLICATION_JSON;
}

if (isSparqlRequest) {
SparqlQueryFmts fmts = new SparqlQueryFmtOverResultFmt(SparqlResultFmtsImpl.DEFAULT);

String str = strs.size() == 1 ? strs.iterator().next() : null;

String acceptTypeStr = type != null ? type.getContentTypeStr() : null;
if (str != null && acceptTypeStr == null) {
SparqlStmt stmt = sparqlStmtParser.apply(str);
if (stmt.isParsed()) {
if (stmt.isQuery()) {
Lang lang = SparqlQueryFmtsUtils.getLang(fmts, stmt.getQuery());
acceptTypeStr = lang.getContentType().getContentTypeStr();
}
}
}

// Fallback to json; in any case we don't want text/html which might
// redirect to the HTML frontend
if (acceptTypeStr == null) {
acceptTypeStr = MediaType.APPLICATION_JSON;
}

HeaderMapRequestWrapper tmp = new HeaderMapRequestWrapper(req, true);
tmp.addHeader("Accept", acceptTypeStr);
req = tmp;

}
HeaderMapRequestWrapper tmp = new HeaderMapRequestWrapper(req, true);
tmp.addHeader("Accept", acceptTypeStr);
req = tmp;

}

// If the payload has been read then re-set it via a wrapper
if (payload != null) {
byte[] bytes = payload.getBytes();
req = new RepeatablePayloadReadWrapper(req, StandardCharsets.UTF_8, () -> new ByteArrayInputStream(bytes));
}
if (payload != null) {
byte[] bytes = payload.getBytes();
req = new RepeatablePayloadReadWrapper(req, StandardCharsets.UTF_8, () -> new ByteArrayInputStream(bytes));
}


chain.doFilter(req, res);
}

@Override
public void destroy() { }
public void destroy() {
}

@Override
public void init(FilterConfig arg0) throws ServletException {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package org.aksw.jenax.web.servlet;

import java.io.InputStream;
import org.aksw.jenax.stmt.core.SparqlStmtParser;
import org.apache.jena.rdfconnection.RDFConnection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
Expand All @@ -9,11 +12,7 @@
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.aksw.jenax.stmt.core.SparqlStmtParser;
import org.apache.jena.rdfconnection.RDFConnection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import java.io.InputStream;


/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,37 +1,12 @@
package org.aksw.jenax.web.servlet;

import java.io.OutputStream;
import java.util.function.Consumer;

import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.CompletionCallback;
import javax.ws.rs.container.ConnectionCallback;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.StreamingOutput;

import org.aksw.jenax.arq.util.fmt.SparqlQueryFmtOverResultFmt;
import org.aksw.jenax.arq.util.fmt.SparqlQueryFmts;
import org.aksw.jenax.arq.util.fmt.SparqlQueryFmtsUtils;
import org.aksw.jenax.arq.util.fmt.SparqlResultFmts;
import org.aksw.jenax.arq.util.fmt.SparqlResultFmtsImpl;
import org.aksw.jenax.arq.util.fmt.*;
import org.aksw.jenax.connection.query.QueryExecutionDecoratorBase;
import org.aksw.jenax.stmt.core.SparqlStmt;
import org.aksw.jenax.stmt.core.SparqlStmtParser;
import org.aksw.jenax.stmt.core.SparqlStmtParserImpl;
import org.aksw.jenax.stmt.core.SparqlStmtQuery;
import org.aksw.jenax.stmt.core.SparqlStmtUpdate;
import org.aksw.jenax.stmt.core.*;
import org.aksw.jenax.stmt.resultset.SPARQLResultEx;
import org.aksw.jenax.stmt.util.SparqlStmtUtils;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryException;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.Syntax;
import org.apache.jena.rdfconnection.RDFConnection;
Expand All @@ -48,6 +23,18 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.ws.rs.*;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.CompletionCallback;
import javax.ws.rs.container.ConnectionCallback;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.StreamingOutput;
import java.io.OutputStream;
import java.util.function.Consumer;


/**
* Jersey resource for an abstract SPARQL endpoint based on the AKSW SPARQL API.
Expand Down Expand Up @@ -307,11 +294,11 @@ public void executeUpdatePost(

public void processStmtAsync(AsyncResponse response, String queryStr, String updateStr, SparqlResultFmts format) {
if(queryStr == null && updateStr == null) {
throw new RuntimeException("No query/update statement provided");
throw new QueryException("No query/update statement provided");
}

if (queryStr != null && updateStr != null && !updateStr.equals(queryStr)) {
throw new RuntimeException(String.format("Both 'query' and 'update' statement strings provided in a single request; query=%s update=%s", queryStr, updateStr));
throw new QueryException(String.format("Both 'query' and 'update' statement strings provided in a single request; query=%s update=%s", queryStr, updateStr));
}

String stmtStr = queryStr != null ? queryStr : updateStr;
Expand Down

0 comments on commit 10e0377

Please sign in to comment.