Author: andy
Date: Wed Sep 10 13:11:35 2014
New Revision: 1623993
URL: http://svn.apache.org/r1623993
Log:
JENA-774 : Add RDF Thrift (result sets, graphs) to conneg.
Added:
jena/Experimental/jena-fuseki2/pages/
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/DEF.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ResponseResultSet.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/DEF.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseResultSet.java
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/DEF.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/DEF.java?rev=1623993&r1=1623992&r2=1623993&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/DEF.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/DEF.java
Wed Sep 10 13:11:35 2014
@@ -38,7 +38,8 @@ public class DEF
contentTypeNTriplesAlt,
contentTypeRDFXML,
contentTypeJSONLD,
-
contentTypeRDFJSON
+
contentTypeRDFJSON,
+
contentTypeRDFThrift
) ;
public static final AcceptList quadsOffer =
AcceptList.create(contentTypeTriG,
@@ -50,12 +51,23 @@ public class DEF
contentTypeNQuadsAlt2
) ;
- public static final AcceptList rsOffer =
AcceptList.create(contentTypeResultsJSON,
+ // Offer for SELECT
+ public static final AcceptList rsOfferTable =
AcceptList.create(contentTypeResultsJSON,
contentTypeTextCSV,
contentTypeTextTSV,
contentTypeResultsXML,
+
contentTypeResultsThrift,
contentTypeTextPlain
) ;
+
+ // Offer for ASK
+ public static final AcceptList rsOfferBoolean =
AcceptList.create(contentTypeResultsJSON,
+
contentTypeTextCSV,
+
contentTypeTextTSV,
+
contentTypeResultsXML,
+
contentTypeTextPlain
+ ) ;
+
// Names for services in the default configuration
public static final String ServiceQuery = "query" ;
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ResponseResultSet.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ResponseResultSet.java?rev=1623993&r1=1623992&r2=1623993&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ResponseResultSet.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ResponseResultSet.java
Wed Sep 10 13:11:35 2014
@@ -20,7 +20,15 @@ package org.apache.jena.fuseki.servlets;
import static java.lang.String.format ;
import static org.apache.jena.atlas.lib.Lib.equal ;
-import static org.apache.jena.riot.WebContent.* ;
+import static org.apache.jena.riot.WebContent.charsetUTF8 ;
+import static org.apache.jena.riot.WebContent.contentTypeRDFXML ;
+import static org.apache.jena.riot.WebContent.contentTypeResultsJSON ;
+import static org.apache.jena.riot.WebContent.contentTypeResultsThrift ;
+import static org.apache.jena.riot.WebContent.contentTypeResultsXML ;
+import static org.apache.jena.riot.WebContent.contentTypeTextCSV ;
+import static org.apache.jena.riot.WebContent.contentTypeTextPlain ;
+import static org.apache.jena.riot.WebContent.contentTypeTextTSV ;
+import static org.apache.jena.riot.WebContent.contentTypeXML ;
import java.io.IOException ;
import java.util.HashMap ;
@@ -35,6 +43,9 @@ import org.apache.jena.atlas.web.MediaTy
import org.apache.jena.fuseki.DEF ;
import org.apache.jena.fuseki.FusekiException ;
import org.apache.jena.fuseki.conneg.ConNeg ;
+import org.apache.jena.riot.ResultSetMgr ;
+import org.apache.jena.riot.WebContent ;
+import org.apache.jena.riot.resultset.ResultSetLang ;
import org.apache.jena.web.HttpSC ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
@@ -56,6 +67,7 @@ public class ResponseResultSet
private static final String contentOutputText = "text" ;
private static final String contentOutputCSV = "csv" ;
private static final String contentOutputTSV = "tsv" ;
+ private static final String contentOutputThrift = "thrift" ;
public static Map<String,String> shortNamesResultSet = new HashMap<>() ;
static {
@@ -66,21 +78,19 @@ public class ResponseResultSet
ResponseOps.put(shortNamesResultSet, contentOutputText,
contentTypeTextPlain) ;
ResponseOps.put(shortNamesResultSet, contentOutputCSV,
contentTypeTextCSV) ;
ResponseOps.put(shortNamesResultSet, contentOutputTSV,
contentTypeTextTSV) ;
+ ResponseOps.put(shortNamesResultSet, contentOutputThrift,
contentTypeResultsThrift) ;
}
interface OutputContent { void output(ServletOutputStream out) ; }
- static AcceptList prefContentTypeResultSet = DEF.rsOffer ;
- static AcceptList prefContentTypeRDF = DEF.rdfOffer ;
-
public static void doResponseResultSet(HttpAction action, Boolean
booleanResult)
{
- doResponseResultSet$(action, null, booleanResult, null) ;
+ doResponseResultSet$(action, null, booleanResult, null,
DEF.rsOfferBoolean) ;
}
public static void doResponseResultSet(HttpAction action, ResultSet
resultSet, Prologue qPrologue)
{
- doResponseResultSet$(action, resultSet, null, qPrologue) ;
+ doResponseResultSet$(action, resultSet, null, qPrologue,
DEF.rsOfferTable) ;
}
// If we refactor the conneg into a single function, we can split boolean
and result set handling.
@@ -88,7 +98,8 @@ public class ResponseResultSet
// One or the other argument must be null
private static void doResponseResultSet$(HttpAction action,
ResultSet resultSet, Boolean
booleanResult,
- Prologue qPrologue)
+ Prologue qPrologue,
+ AcceptList contentTypeOffer)
{
HttpServletRequest request = action.request ;
HttpServletResponse response = action.response ;
@@ -107,7 +118,7 @@ public class ResponseResultSet
}
String mimeType = null ;
- MediaType i = ConNeg.chooseContentType(request, DEF.rsOffer,
DEF.acceptRSXML) ;
+ MediaType i = ConNeg.chooseContentType(request, contentTypeOffer,
DEF.acceptRSXML) ;
if ( i != null )
mimeType = i.getContentType() ;
@@ -142,6 +153,8 @@ public class ResponseResultSet
csvOutput(action, contentType, resultSet, booleanResult) ;
else if (equal(serializationType, contentTypeTextTSV) )
tsvOutput(action, contentType, resultSet, booleanResult) ;
+ else if (equal(serializationType, WebContent.contentTypeResultsThrift)
)
+ thriftOutput(action, contentType, resultSet, booleanResult) ;
else
ServletOps.errorBadRequest("Can't determine output serialization:
"+serializationType) ;
}
@@ -264,6 +277,20 @@ public class ResponseResultSet
} ;
output(action, contentType, charsetUTF8, proc) ;
}
+
+ private static void thriftOutput(HttpAction action, String contentType,
final ResultSet resultSet, final Boolean booleanResult) {
+ OutputContent proc = new OutputContent(){
+ @Override
+ public void output(ServletOutputStream out)
+ {
+ if ( resultSet != null )
+ ResultSetMgr.write(out, resultSet,
ResultSetLang.SPARQLResultSetThrift) ;
+ if ( booleanResult != null )
+ xlog.error("Can't write boolen result in thrift") ;
+ }
+ } ;
+ output(action, contentType, WebContent.charsetUTF8, proc) ;
+ }
private static void output(HttpAction action, String contentType, String
charset, OutputContent proc)
{
Modified: jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/DEF.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/DEF.java?rev=1623993&r1=1623992&r2=1623993&view=diff
==============================================================================
--- jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/DEF.java
(original)
+++ jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/DEF.java Wed
Sep 10 13:11:35 2014
@@ -35,7 +35,8 @@ public class DEF
contentTypeNTriplesAlt,
contentTypeRDFXML,
contentTypeJSONLD,
-
contentTypeRDFJSON
+
contentTypeRDFJSON,
+
contentTypeRDFThrift
) ;
public static final AcceptList quadsOffer =
AcceptList.create(contentTypeTriG,
@@ -47,10 +48,19 @@ public class DEF
contentTypeNQuadsAlt2
) ;
- public static final AcceptList rsOffer =
AcceptList.create(contentTypeResultsJSON,
+ public static final AcceptList rsOfferTable =
AcceptList.create(contentTypeResultsJSON,
contentTypeTextCSV,
contentTypeTextTSV,
contentTypeResultsXML,
+
contentTypeResultsThrift,
contentTypeTextPlain
) ;
+
+ public static final AcceptList rsOfferBoolean =
AcceptList.create(contentTypeResultsJSON,
+
contentTypeTextCSV,
+
contentTypeTextTSV,
+
contentTypeResultsXML,
+
contentTypeTextPlain
+ ) ;
+
}
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseResultSet.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseResultSet.java?rev=1623993&r1=1623992&r2=1623993&view=diff
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseResultSet.java
(original)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseResultSet.java
Wed Sep 10 13:11:35 2014
@@ -38,7 +38,9 @@ import org.apache.jena.atlas.web.MediaTy
import org.apache.jena.fuseki.DEF ;
import org.apache.jena.fuseki.FusekiException ;
import org.apache.jena.fuseki.conneg.ConNeg ;
+import org.apache.jena.riot.ResultSetMgr ;
import org.apache.jena.riot.WebContent ;
+import org.apache.jena.riot.resultset.ResultSetLang ;
import org.apache.jena.web.HttpSC ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
@@ -61,6 +63,7 @@ public class ResponseResultSet
private static final String contentOutputText = "text" ;
private static final String contentOutputCSV = "csv" ;
private static final String contentOutputTSV = "tsv" ;
+ private static final String contentOutputThrift = "thrift" ;
public static Map<String,String> shortNamesResultSet = new HashMap<String,
String>() ;
static {
@@ -71,21 +74,19 @@ public class ResponseResultSet
ResponseOps.put(shortNamesResultSet, contentOutputText,
WebContent.contentTypeTextPlain) ;
ResponseOps.put(shortNamesResultSet, contentOutputCSV,
WebContent.contentTypeTextCSV) ;
ResponseOps.put(shortNamesResultSet, contentOutputTSV,
WebContent.contentTypeTextTSV) ;
+ ResponseOps.put(shortNamesResultSet, contentOutputThrift,
WebContent.contentTypeResultsThrift) ;
}
interface OutputContent { void output(ServletOutputStream out) ; }
- static AcceptList prefContentTypeResultSet = DEF.rsOffer ;
- static AcceptList prefContentTypeRDF = DEF.rdfOffer ;
-
public static void doResponseResultSet(HttpAction action, Boolean
booleanResult)
{
- doResponseResultSet$(action, null, booleanResult, null) ;
+ doResponseResultSet$(action, null, booleanResult, null,
DEF.rsOfferTable) ;
}
public static void doResponseResultSet(HttpAction action, ResultSet
resultSet, Prologue qPrologue)
{
- doResponseResultSet$(action, resultSet, null, qPrologue) ;
+ doResponseResultSet$(action, resultSet, null, qPrologue,
DEF.rsOfferTable) ;
}
// If we refactor the conneg into a single function, we can split boolean
and result set handling.
@@ -93,7 +94,8 @@ public class ResponseResultSet
// One or the other argument must be null
private static void doResponseResultSet$(HttpAction action,
ResultSet resultSet, Boolean
booleanResult,
- Prologue qPrologue)
+ Prologue qPrologue,
+ AcceptList contentTypeOffer)
{
HttpServletRequest request = action.request ;
HttpServletResponse response = action.response ;
@@ -112,7 +114,7 @@ public class ResponseResultSet
}
String mimeType = null ;
- MediaType i = ConNeg.chooseContentType(request, DEF.rsOffer,
DEF.acceptRSXML) ;
+ MediaType i = ConNeg.chooseContentType(request, contentTypeOffer,
DEF.acceptRSXML) ;
if ( i != null )
mimeType = i.getContentType() ;
@@ -137,6 +139,7 @@ public class ResponseResultSet
contentType = WebContent.contentTypeTextPlain ;
// Better : dispatch on MediaType
+ // Fuseki2 uses the SPARQL parser/write registry.
if ( equal(serializationType, WebContent.contentTypeResultsXML) )
sparqlXMLOutput(action, contentType, resultSet, stylesheetURL,
booleanResult) ;
else if ( equal(serializationType, WebContent.contentTypeResultsJSON) )
@@ -147,6 +150,8 @@ public class ResponseResultSet
csvOutput(action, contentType, resultSet, booleanResult) ;
else if (equal(serializationType, WebContent.contentTypeTextTSV) )
tsvOutput(action, contentType, resultSet, booleanResult) ;
+ else if (equal(serializationType, WebContent.contentTypeResultsThrift)
)
+ thriftOutput(action, contentType, resultSet, booleanResult) ;
else
errorBadRequest("Can't determine output serialization:
"+serializationType) ;
}
@@ -272,6 +277,20 @@ public class ResponseResultSet
output(action, contentType, WebContent.charsetUTF8, proc) ;
}
+ private static void thriftOutput(HttpAction action, String contentType,
final ResultSet resultSet, final Boolean booleanResult) {
+ OutputContent proc = new OutputContent(){
+ @Override
+ public void output(ServletOutputStream out)
+ {
+ if ( resultSet != null )
+ ResultSetMgr.write(out, resultSet,
ResultSetLang.SPARQLResultSetThrift) ;
+ if ( booleanResult != null )
+ slog.error("Can't write boolen result in thrift") ;
+ }
+ } ;
+ output(action, contentType, WebContent.charsetUTF8, proc) ;
+ }
+
private static void output(HttpAction action, String contentType, String
charset, OutputContent proc)
{
try {