if ( form == null ) {
form = "html";
}
QueryResult queryResult = new QueryResult();
SPARQLQuery sq = new SPARQLQuery();
sq.setTripleStore(_conn.ts);
sq.setQuery(sparqlQuery);
sq.setIncludeInferred(infer);
boolean useRun = false;
// NOTE about AG bugs:
// 1) SPARQLQuery.run throws an exception! argh!
// 2) the AG serializers are not working (not even in the examples provided by them)
// because of 1), commenting out the following so SPARQLQuery.run() is not called below.
// if ( form.equalsIgnoreCase("owl") || form.equalsIgnoreCase("rdf") ) {
// useRun = true;
// sq.setResultsFormat("sparql-xml");
// // TODO: contentType should be sparql-related
// queryResult.setContentType("Application/rdf+xml");
// }
// // else: TODO what other formats are possible?
if ( useRun ) {
String res = sq.run();
queryResult.setIsEmpty(res.trim().length() == 0);
queryResult.setResult(res);
return queryResult;
}
// use Jena to determine what kind of query this is (AG doesn't seem to provide an operation for this)
// so we call the appropriate execution method:
Query query = QueryFactory.create(sparqlQuery);
// only one of these results is captured
TriplesIterator tripleIter = null;
ValueSetIterator valSetIter = null;
Boolean askResult = null;
queryResult.setContentType("text/plain");
// SELECT
if ( query.isSelectType() ) {
valSetIter = sq.select();
}
// DESCRIBE
else if ( query.isDescribeType() ) {
tripleIter = sq.describe();
}
// CONSTRUCT
else if ( query.isConstructType() ) {
tripleIter = sq.construct();
}
// ASK
else if ( query.isAskType() ) {
askResult = Boolean.valueOf(sq.ask());
}
if ( valSetIter != null ) {
queryResult.setIsEmpty(! valSetIter.hasNext());
String res;
if ( form.equalsIgnoreCase("html") ) {
queryResult.setContentType("text/html");
res = AgUtils.getResultInHtml(log, valSetIter);
}
else if ( form.equalsIgnoreCase("n3") ) {
queryResult.setContentType("text/plain");
res = AgUtils.getResultInN3(log, valSetIter);
}
else if ( form.equalsIgnoreCase("nt") ) {
queryResult.setContentType("text/plain");
res = AgUtils.getResultInNTriples(log, valSetIter);
}
else if ( form.equalsIgnoreCase("csv") ) {
queryResult.setContentType("text/plain");
res = AgUtils.getResultInCsv(log, valSetIter);
}
else if ( form.equalsIgnoreCase("json") ) {
queryResult.setContentType("application/json");
res = AgUtils.getResultInJson(log, valSetIter);
}
else {
queryResult.setContentType("text/html");
res = AgUtils.getResultInHtml(log, valSetIter);
}
queryResult.setResult(res);
}
else if ( tripleIter != null ) {
queryResult.setIsEmpty(! tripleIter.hasNext());
// TODO: NOTE: the AG serializers are not working (not even in the examples provided by them)
String res = null;
if ( form.equalsIgnoreCase("owl") || form.equalsIgnoreCase("rdf") ) {
queryResult.setContentType("Application/rdf+xml");
res = AgUtils.getResultInRdf(log, tripleIter);
}
else if ( form.equalsIgnoreCase("html") ) {
queryResult.setContentType("text/html");
res = AgUtils.getResultInHtml(log, tripleIter);
}
else if ( form.equalsIgnoreCase("n3") ) {
queryResult.setContentType("text/plain");
if ( true ) {
res = AgUtils.getResultInN3(log, tripleIter);
}
else {
// AG serializers do not work.
AllegroGraphSerializer serializer = new RDFN3Serializer();
serializer.setDestination(null); // ie., to string to be returned by run()
Object resObj = serializer.run(tripleIter);
res = String.valueOf(resObj);
}
}
else if ( form.equalsIgnoreCase("nt") ) {
queryResult.setContentType("text/plain");
if ( true ) {
res = AgUtils.getResultInNTriples(log, tripleIter);
}
else {
// AG serializers do not work.
AllegroGraphSerializer serializer = new NTriplesSerializer();
serializer.setDestination(null); // ie., to string to be returned by run()
Object resObj = serializer.run(tripleIter);
res = String.valueOf(resObj);
}
}
else if ( form.equalsIgnoreCase("csv") ) {
queryResult.setContentType("text/plain");
res = AgUtils.getResultInCsv(log, tripleIter);
}
else if ( form.equalsIgnoreCase("json") ) {
// FIXME 261: JSON output format not honored
// Returning CSV for the moment.
res = AgUtils.getResultInCsv(log, tripleIter);
queryResult.setContentType("text/plain");
// queryResult.setContentType("application/json");
// res = AgUtils.getResultInJson(log, tripleIter);
}
else {
queryResult.setContentType("text/html");
res = AgUtils.getResultInHtml(log, tripleIter);
}
queryResult.setResult(res);
}
else if ( askResult != null ) {
queryResult.setIsEmpty(false);
queryResult.setResult(askResult.toString());
}
else {
log.warn("SHOULD NOT HAPPEN: unexpected type of query");
queryResult.setIsEmpty(false);
queryResult.setResult("Internal error: unexpected type of query. Please report this bug.");
}
return queryResult;
}