package net.fortytwo.sesametools.ldserver.query; import org.restlet.Request; import org.restlet.Response; import org.restlet.data.MediaType; import org.restlet.data.Method; import org.restlet.data.Status; import org.restlet.resource.ResourceException; import java.util.Map; /** * A RESTful resource serving as a SPARQL endpoint. * * @author Joshua Shinavier (http://fortytwo.net) */ public class SparqlResource extends QueryResource { @Override public void handle(final Request request, final Response response) { MediaType mt; String query = null; Map<String, String> arguments; try { arguments = getArguments(request); if (request.getMethod() == Method.POST) { String type = request.getEntity().getMediaType().toString(); String ent = request.getEntity().getText(); switch (type) { case "application/x-www-form-urlencoded": arguments = parseParams(ent); break; case "application/sparql-query": query = ent; break; default: throw new IllegalArgumentException("POST entity has unsupported media type for SPARQL"); } } if (null == query) { query = arguments.get("query"); } if (null == query) { throw new IllegalArgumentException("no query argument specified"); } String output = arguments.get("output"); // If an "output" argument is provided, use it. if (null != output) { switch (output) { case "json": mt = SparqlTools.SparqlResultFormat.JSON.getMediaType(); break; case "xml": mt = SparqlTools.SparqlResultFormat.XML.getMediaType(); break; default: throw new IllegalArgumentException("bad value for 'output' parameter: " + output); } } else { mt = SparqlTools.SparqlResultFormat.getVariants().get(0).getMediaType(); } } catch (Throwable t) { t.printStackTrace(System.err); throw new ResourceException(t); } try { response.setEntity(new SparqlQueryRepresentation(query, sail, readLimit(arguments), mt)); } catch (QueryException e) { throw new ResourceException(Status.CLIENT_ERROR_BAD_REQUEST, e); } catch (Throwable e) { // TODO: use logging instead e.printStackTrace(System.err); System.err.flush(); throw new ResourceException(Status.SERVER_ERROR_INTERNAL, e); } } }