package com.oreilly.rdf.tenuki.jaxrs;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryException;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.Syntax;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.sdb.SDB;
import com.hp.hpl.jena.sparql.resultset.SPARQLResult;
@Path("/sparql")
public class SparqlQueryResource extends DatasetAccessResource {
@Produces("application/sparql-results+xml, application/sparql-results+json, application/rdf+xml, text/turtle, text/rdf+n3, text/csv,text/plain")
@GET
public SPARQLResult getQuery(@QueryParam("query") String queryString) {
return doQuery(queryString);
}
@Produces("application/sparql-results+xml, application/sparql-results+json, application/rdf+xml, text/turtle, text/rdf+n3, text/csv,text/plain")
@POST
public SPARQLResult postQuery(@FormParam("query") String queryString) {
return doQuery(queryString);
}
private SPARQLResult doQuery(String queryString) {
Query query = null;
try {
query = QueryFactory.create(queryString, Syntax.syntaxARQ);
} catch (QueryException e) {
throw e;
}
QueryExecution qexec = QueryExecutionFactory.create(query, this.getDataset());
qexec.getContext().set(SDB.unionDefaultGraph, true);
if ( query.isSelectType() )
{
ResultSet rs = qexec.execSelect() ;
return new SPARQLResult(rs) ;
}
if ( query.isConstructType() )
{
Model model = qexec.execConstruct() ;
return new SPARQLResult(model) ;
}
if ( query.isDescribeType() )
{
Model model = qexec.execDescribe() ;
return new SPARQLResult(model) ;
}
if ( query.isAskType() )
{
boolean b = qexec.execAsk() ;
return new SPARQLResult(b) ;
}
return null;
}
}