You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2012/08/29 13:12:16 UTC
svn commit: r1378505 - in /jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki: http/DatasetGraphAccessorHTTP.java server/SPARQLServer.java servlets/SPARQL_Dataset.java servlets/SPARQL_REST.java servlets/SPARQL_ÜberServlet.java
Author: andy
Date: Wed Aug 29 11:12:16 2012
New Revision: 1378505
URL: http://svn.apache.org/viewvc?rev=1378505&view=rev
Log:
Tidy up general SPARQL request dispatch.
Add direct naming support to SPARQL_REST_* servlets.
Added:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ÜberServlet.java
- copied, changed from r1378236, jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Dataset.java
Removed:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Dataset.java
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/http/DatasetGraphAccessorHTTP.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java
Modified: jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/http/DatasetGraphAccessorHTTP.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/http/DatasetGraphAccessorHTTP.java?rev=1378505&r1=1378504&r2=1378505&view=diff
==============================================================================
--- jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/http/DatasetGraphAccessorHTTP.java (original)
+++ jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/http/DatasetGraphAccessorHTTP.java Wed Aug 29 11:12:16 2012
@@ -59,9 +59,6 @@ import com.hp.hpl.jena.sparql.graph.Grap
public class DatasetGraphAccessorHTTP implements DatasetGraphAccessor
{
private final String remote ;
- // Library
- static final String paramGraph = "graph" ;
- static final String paramDefault = "default" ;
/** Create a DatasetUpdater for the remote URL */
public DatasetGraphAccessorHTTP(String remote)
@@ -159,7 +156,7 @@ public class DatasetGraphAccessorHTTP im
private String targetDefault()
{
- return remote+"?"+paramDefault+"=" ;
+ return remote+"?"+HttpNames.paramGraphDefault+"=" ;
}
private String target(Node name)
@@ -169,7 +166,7 @@ public class DatasetGraphAccessorHTTP im
String guri = name.getURI() ;
// Encode
guri = IRILib.encodeUriComponent(guri) ;
- return remote+"?"+paramGraph+"="+guri ;
+ return remote+"?"+HttpNames.paramGraph+"="+guri ;
}
static private HttpParams httpParams = createHttpParams() ;
Modified: jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java?rev=1378505&r1=1378504&r2=1378505&view=diff
==============================================================================
--- jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java (original)
+++ jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java Wed Aug 29 11:12:16 2012
@@ -229,14 +229,14 @@ public class SPARQLServer
HttpServlet sparqlUpload = new SPARQL_Upload(verboseLogging) ;
HttpServlet sparqlHttpR = new SPARQL_REST_R(verboseLogging) ;
HttpServlet sparqlHttpRW = new SPARQL_REST_RW(verboseLogging) ;
- HttpServlet sparqlDataset = new SPARQL_Dataset(verboseLogging) ; // Rename SPARQL_ÃberServlet
+ HttpServlet sparqlDataset = new SPARQL_ÃberServlet(verboseLogging) ;
// The überservlet sits on the daatset name and handles all requests.
// Includes direct naming.
// Need to control as it allows PUT/POST to the dataset as quads.
- final boolean uberServlet = false ;
+ final boolean überServlet = false ;
- if ( ! uberServlet )
+ if ( ! überServlet )
{
// If uberserver, these are unnecessary but can be used.
// If just means the überservlet isn't handling these operations.
@@ -248,13 +248,12 @@ public class SPARQLServer
}
else
{
- //** May need to split into direct naming and uberservlet.
- // This is the servlet that:
- // 1/ handles Graph Store Protocol direct naming.
- // 2/ Handles dataset?operation.
- // 3/ Handles GET dataset
- // The servlet naming rules and priorities are a bit obscure - this takes priority over the above!
- // ??No compression support because it is right sometimes and not others.
+ // This is the servlet that analyses requests and dispatches them to the appropriate servlet.
+ // SPARQL Query, SPARQL Update -- handles dataset?query= dataset?update=
+ // Graph Store Protocol (direct and indirect naming).
+ // GET/PUT/POST on the dataset itself.
+ // It also checks for a request that looks like a service request and passes it
+ // on to the service (this takes precedence over direct naming).
addServlet(context, datasetPath, sparqlDataset, epDataset, enableCompression) ;
}
}
Modified: jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java?rev=1378505&r1=1378504&r2=1378505&view=diff
==============================================================================
--- jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java (original)
+++ jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java Wed Aug 29 11:12:16 2012
@@ -74,10 +74,11 @@ public abstract class SPARQL_REST extend
_target = Target.createNamed(desc.dataset, absUri, gn) ;
}
- private Target _target = null ;
+ private final Target _target ;
protected HttpActionREST(long id, DatasetRef desc, HttpServletRequest request, HttpServletResponse response, boolean verbose)
{
super(id, desc, request, response, verbose) ;
+ _target = targetGraph(request, desc, super.getActiveDSG() ) ;
}
protected final boolean hasTarget()
@@ -89,8 +90,6 @@ public abstract class SPARQL_REST extend
protected final Target getTarget()
{
- if ( _target == null )
- _target = targetGraph(request, super.getActiveDSG() ) ;
return _target ;
}
}
@@ -193,7 +192,11 @@ public abstract class SPARQL_REST extend
protected void perform(long id, DatasetRef desc, HttpServletRequest request, HttpServletResponse response)
{
validate(request) ;
+ //Indirect
HttpActionREST action = new HttpActionREST(id, desc, request, response, verbose_debug) ;
+
+ // Direct
+
dispatch(action) ;
}
@@ -358,6 +361,14 @@ public abstract class SPARQL_REST extend
if ( g == null && d == null )
errorBadRequest("Neither ?default nor ?graph in the query string of the request") ;
+ int x1 = SPARQL_Protocol.countParamOccurences(request, HttpNames.paramGraph) ;
+ int x2 = SPARQL_Protocol.countParamOccurences(request, HttpNames.paramGraphDefault) ;
+
+ if ( x1 > 1 )
+ errorBadRequest("Multiple ?default in the query string of the request") ;
+ if ( x2 > 1 )
+ errorBadRequest("Multiple ?graph in the query string of the request") ;
+
@SuppressWarnings("unchecked")
Enumeration<String> en = request.getParameterNames() ;
for ( ; en.hasMoreElements() ; )
@@ -371,13 +382,17 @@ public abstract class SPARQL_REST extend
}
}
- protected static Target targetGraph(HttpServletRequest request, DatasetGraph dsg)
+ protected static Target targetGraph(HttpServletRequest request, DatasetRef desc, DatasetGraph dsg)
{
boolean dftGraph = getOneOnly(request, HttpNames.paramGraphDefault) != null ;
String uri = getOneOnly(request, HttpNames.paramGraph) ;
if ( !dftGraph && uri == null )
- errorBadRequest("Neither default graph nor named graph specificed") ;
+ {
+ // Direct naming or error.
+ uri = request.getRequestURL().toString() ;
+ //errorBadRequest("Neither default graph nor named graph specificed") ;
+ }
if ( dftGraph )
return Target.createDefault(dsg) ;
Copied: jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ÜberServlet.java (from r1378236, jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Dataset.java)
URL: http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_%C3%9CberServlet.java?p2=jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_%C3%9CberServlet.java&p1=jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Dataset.java&r1=1378236&r2=1378505&rev=1378505&view=diff
==============================================================================
--- jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Dataset.java (original)
+++ jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ÜberServlet.java Wed Aug 29 11:12:16 2012
@@ -32,7 +32,6 @@ import org.apache.jena.fuseki.conneg.Con
import org.apache.jena.fuseki.http.HttpSC ;
import org.apache.jena.fuseki.server.DatasetRef ;
import org.apache.jena.fuseki.server.DatasetRegistry ;
-import org.apache.jena.fuseki.servlets.SPARQL_REST.HttpActionREST ;
import org.openjena.atlas.iterator.Filter ;
import org.openjena.atlas.iterator.Iter ;
import org.openjena.atlas.web.MediaType ;
@@ -42,23 +41,25 @@ import org.openjena.riot.WebContent ;
* and acts as a router for all SPARQL operations
* (query, update, graph store, both direct and indirect naming).
*/
-public class SPARQL_Dataset extends SPARQL_ServletBase
+public class SPARQL_ÃberServlet extends SPARQL_ServletBase
{
- /* This can be used for
- * 1/ a single servlet for everything (über-servlet)
- * 2/ just direct naming for a dataset with other services
- * May need refactoring to separate those 2 functions.
- */
+ /* This can be used for a single servlet for everything (über-servlet)
+ *
+ * It can check for a request that looks like a service request and passes it on.
+ * This takes precedence over direct naming.
+ */
+
+ // Refactor? Extract the direct naming handling.
// To test: enable in SPARQLServer.configureOneDataset
private final SPARQL_ServletBase queryServlet = new SPARQL_QueryDataset(verbose_debug) ;
private final SPARQL_ServletBase updateServlet = new SPARQL_Update(verbose_debug) ;
- private SPARQL_ServletBase uploadServlet = new SPARQL_Upload(verbose_debug) ;
+ private final SPARQL_ServletBase uploadServlet = new SPARQL_Upload(verbose_debug) ;
private final SPARQL_REST restServlet_RW = new SPARQL_REST_RW(verbose_debug) ;
private final SPARQL_REST restServlet_R = new SPARQL_REST_R(verbose_debug) ;
- private SPARQL_ServletBase restQuads = new REST_Quads(verbose_debug) ;
+ private final SPARQL_ServletBase restQuads = new REST_Quads(verbose_debug) ;
- public SPARQL_Dataset(boolean verbose_debug)
+ public SPARQL_ÃberServlet(boolean verbose_debug)
{
super(verbose_debug) ;
}
@@ -93,7 +94,7 @@ public class SPARQL_Dataset extends SPAR
@Override
protected void validate(HttpServletRequest request)
{
- // Left to the underlying implementations.
+ // Left to the undeSPARQL_RESTrlying implementations.
}
@Override
@@ -129,104 +130,118 @@ public class SPARQL_Dataset extends SPAR
if ( ! hasTrailing && ! hasParams )
{
- restQuads.doCommonWorker(id, request, response) ;
+ // Security checking?
+ //executeRequest(desc, restQuads, id, request, response) ;
+ errorBadRequest("Request not support (quad operation)") ;
return ;
}
if ( ! hasTrailing )
{
// Has params of some kind.
- if ( hasParamQuery ||
- WebContent.contentTypeSPARQLQuery.equalsIgnoreCase(ct) )
-
+ if ( hasParamQuery || WebContent.contentTypeSPARQLQuery.equalsIgnoreCase(ct) )
{
// query
executeRequest(desc, queryServlet, desc.queryEP, id, request, response) ;
return ;
}
- if ( hasParamUpdate ||
- WebContent.contentTypeSPARQLUpdate.equalsIgnoreCase(ct) )
+ if ( hasParamUpdate || WebContent.contentTypeSPARQLUpdate.equalsIgnoreCase(ct) )
{
// update
executeRequest(desc, updateServlet, desc.updateEP, id, request, response) ;
return ;
-
}
if ( hasParamGraph || hasParamGraphDefault )
{
- // Direct naming. Convert to indirect naming, Graph store protocol.
- // Prefer the RW service.
+ // Indirct naming. Prefer the RW service if available.
if ( desc.readWriteGraphStoreEP.size() > 0 )
executeRequest(desc, restServlet_RW, desc.readWriteGraphStoreEP, id, request, response) ;
else
executeRequest(desc, restServlet_R, desc.readGraphStoreEP, id, request, response) ;
return ;
}
+
errorBadRequest("Malformed request") ;
}
-
- // There is a trailing part.
- // Check it's not the same name as a registered service.
- // If so, dispatch to that service.
- if ( checkDispatch(desc.queryEP, trailing, queryServlet, desc, id, request, response) ) return ;
- if ( checkDispatch(desc.updateEP, trailing, updateServlet, desc, id, request, response) ) return ;
- if ( checkDispatch(desc.uploadEP, trailing, uploadServlet, desc, id, request, response) ) return ;
- if ( checkDispatch(desc.readGraphStoreEP, trailing, restServlet_R, desc, id, request, response) ) return ;
- if ( checkDispatch(desc.readWriteGraphStoreEP, trailing, restServlet_RW, desc, id, request, response) ) return ;
-
- // There is a trailing part - params are illegal by this point.
+
+ final boolean checkForPossibleService = true ;
+ if ( checkForPossibleService )
+ {
+ // There is a trailing part.
+ // Check it's not the same name as a registered service.
+ // If so, dispatch to that service.
+ if ( checkDispatch(desc.queryEP, trailing, queryServlet, desc, id, request, response) ) return ;
+ if ( checkDispatch(desc.updateEP, trailing, updateServlet, desc, id, request, response) ) return ;
+ if ( checkDispatch(desc.uploadEP, trailing, uploadServlet, desc, id, request, response) ) return ;
+ if ( checkDispatch(desc.readGraphStoreEP, trailing, restServlet_R, desc, id, request, response) ) return ;
+ if ( checkDispatch(desc.readWriteGraphStoreEP, trailing, restServlet_RW, desc, id, request, response) ) return ;
+ }
+ // There is a trailing paSPARQL_RESTrt - params are illegal by this point.
if ( hasParams )
// Revisit to include query-on-one-graph
errorBadRequest("Can't invoke a query-string service on a direct named graph") ;
// There is a trailing part - not a service, no params ==> direct naming.
// Direct naming to indirect naming.
- doCommonWorkerDirectNaming(id, request, response) ;
+ doDirectNaming(desc, id, request, response) ;
}
- private void doCommonWorkerDirectNaming(long id, HttpServletRequest request, HttpServletResponse response)
+ private void doDirectNaming(DatasetRef desc , long id, HttpServletRequest request, HttpServletResponse response)
{
- // again ... but ready for a direct naming servlet.
- String uri = request.getRequestURI() ;
- String dsname = findDataset(uri) ;
- DatasetRef desc = DatasetRegistry.get().get(dsname) ;
-
- String absURI = request.getRequestURL().toString() ;
- HttpActionREST a = new HttpActionREST(id, desc, absURI, request, response, verbose_debug) ;
-
if ( desc.readWriteGraphStoreEP.size() > 0 )
- // ****
- restServlet_RW.dispatch(a) ;
+ executeRequest(desc, restServlet_RW, desc.readWriteGraphStoreEP, id, request, response) ;
else if ( desc.readGraphStoreEP.size() > 0 )
- // ****
- restServlet_R.dispatch(a) ;
+ executeRequest(desc, restServlet_R, desc.readGraphStoreEP, id, request, response) ;
else
errorMethodNotAllowed(request.getMethod()) ;
+
+ // If direct naming not supported by SPARQL_REST_*
+// String uri = request.getRequestURI() ;
+// String dsname = findDataset(uri) ;
+// DatasetRef desc = DatasetRegistry.get().get(dsname) ;
+//
+// String absURI = request.getRequestURL().toString() ;
+// HttpActionREST a = new HttpActionREST(id, desc, absURI, request, response, verbose_debug) ;
+//
+// if ( desc.readWriteGraphStoreEP.size() > 0 )
+// // ****
+// restServlet_RW.dispatch(a) ;
+// else if ( desc.readGraphStoreEP.size() > 0 )
+// // ****
+// restServlet_R.dispatch(a) ;
+// else
+// errorMethodNotAllowed(request.getMethod()) ;
}
private void executeRequest(DatasetRef desc, SPARQL_ServletBase servlet, List<String> endpointList, long id,
HttpServletRequest request, HttpServletResponse response)
{
- // Direct dispatch
- if ( endpointList.size() > 0 )
- servlet.doCommonWorker(id, request, response) ;
- else
+ if ( endpointList == null || endpointList.size() == 0 )
errorMethodNotAllowed(request.getMethod()) ;
-// // Forwarded dispatch.
-// try
-// {
-// String target = getEPName(desc.name, endpointList) ;
-// if ( target == null )
-// errorMethodNotAllowed(request.getMethod()) ;
-// // ** relative servlet forward
-// request.getRequestDispatcher(target).forward(request, response) ;
-// // ** absolute srvlet forward
-// // getServletContext().getRequestDispatcher(target) ;
-// } catch (Exception e) { errorOccurred(e) ; }
+ servlet.doCommonWorker(id, request, response) ;
+ }
+
+ private void executeRequest(DatasetRef desc, SPARQL_ServletBase servlet, long id,
+ HttpServletRequest request, HttpServletResponse response)
+ {
+ servlet.doCommonWorker(id, request, response) ;
+// // Forwarded dispatch.
+// try
+// {
+// String target = getEPName(desc.name, endpointList) ;
+// if ( target == null )
+// errorMethodNotAllowed(request.getMethod()) ;
+// // ** relative servlet forward
+// request.getRequestDispatcher(target).forward(request, response) ;
+// // ** absolute srvlet forward
+// // getServletContext().getRequestDispatcher(target) ;
+// } catch (Exception e) { errorOccurred(e) ; }
}
+
+
protected static MediaType contentNegotationQuads(HttpAction action)
{
MediaType mt = ConNeg.chooseContentType(action.request, DEF.quadsOffer, DEF.acceptNQuads) ;