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) ;