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/15 21:16:05 UTC

svn commit: r1373579 - in /jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki: HttpNames.java servlets/SPARQL_Query.java servlets/SPARQL_Update.java

Author: andy
Date: Wed Aug 15 19:16:05 2012
New Revision: 1373579

URL: http://svn.apache.org/viewvc?rev=1373579&view=rev
Log:
JENA-295 (partial)
Support for using-graph-uri and using-named-graph-uri

Modified:
    jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/HttpNames.java
    jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java
    jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java

Modified: jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/HttpNames.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/HttpNames.java?rev=1373579&r1=1373578&r2=1373579&view=diff
==============================================================================
--- jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/HttpNames.java (original)
+++ jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/HttpNames.java Wed Aug 15 19:16:05 2012
@@ -62,6 +62,8 @@ public class HttpNames
     
     public static final String paramUpdate          = "update" ;
     public static final String paramRequest         = "request" ; 
+    public static final String paramUsingGraphURI        = "using-graph-uri" ;
+    public static final String paramUsingNamedGraphURI   = "using-named-graph-uri" ;
     
     public static final String METHOD_DELETE        = "DELETE";
     public static final String METHOD_HEAD          = "HEAD";

Modified: jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java?rev=1373579&r1=1373578&r2=1373579&view=diff
==============================================================================
--- jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java (original)
+++ jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java Wed Aug 15 19:16:05 2012
@@ -33,10 +33,7 @@ import static org.apache.jena.fuseki.Htt
 
 import java.io.IOException ;
 import java.io.InputStream ;
-import java.util.Arrays ;
-import java.util.Enumeration ;
-import java.util.HashSet ;
-import java.util.Set ;
+import java.util.* ;
 
 import javax.servlet.http.HttpServletRequest ;
 import javax.servlet.http.HttpServletResponse ;
@@ -52,15 +49,7 @@ import org.openjena.atlas.io.IndentedLin
 import org.openjena.atlas.web.MediaType ;
 import org.openjena.riot.WebContent ;
 
-import com.hp.hpl.jena.query.Dataset ;
-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.QueryParseException ;
-import com.hp.hpl.jena.query.ResultSet ;
-import com.hp.hpl.jena.query.Syntax ;
+import com.hp.hpl.jena.query.* ;
 import com.hp.hpl.jena.rdf.model.Model ;
 import com.hp.hpl.jena.sparql.core.DatasetDescription ;
 import com.hp.hpl.jena.sparql.resultset.SPARQLResult ;
@@ -138,34 +127,32 @@ public abstract class SPARQL_Query exten
     }
 
     // All the params we support
-    private static String[] params_1 = { paramQuery, 
-                                        paramDefaultGraphURI, paramNamedGraphURI, 
-                                        paramQueryRef,
-                                        paramStyleSheet,
-                                        paramAccept,
-                                        paramOutput1, paramOutput2, 
-                                        paramCallback, 
-                                        paramForceAccept,
-                                        paramTimeout } ;
-    private static String[] params_2 = { paramQuery, 
-        // paramDefaultGraphURI, paramNamedGraphURI,
-        paramQueryRef,
-        paramStyleSheet,
-        paramAccept,
-        paramOutput1, paramOutput2, 
-        paramCallback, 
-        paramForceAccept,
-        paramTimeout } ;
 
-    protected static Set<String> allParams  = new HashSet<String>(Arrays.asList(params_1)) ;
-    protected static Set<String> dsParams   = new HashSet<String>(Arrays.asList(params_2)) ;
+    protected static List<String> allParams  = Arrays.asList(paramQuery, 
+                                                             paramDefaultGraphURI, paramNamedGraphURI, 
+                                                             paramQueryRef,
+                                                             paramStyleSheet,
+                                                             paramAccept,
+                                                             paramOutput1, paramOutput2, 
+                                                             paramCallback, 
+                                                             paramForceAccept,
+                                                             paramTimeout) ;
+    protected static List<String> dsParams   = Arrays.asList(paramQuery, 
+                                                             // paramDefaultGraphURI, paramNamedGraphURI,
+                                                             paramQueryRef,
+                                                             paramStyleSheet,
+                                                             paramAccept,
+                                                             paramOutput1, paramOutput2, 
+                                                             paramCallback, 
+                                                             paramForceAccept,
+                                                             paramTimeout) ;
     
     /** Called to validate arguments */
     @Override
     protected abstract void validate(HttpServletRequest request) ;
     
     /** Helper for validating request */
-    protected void validate(HttpServletRequest request, Set<String> params)
+    protected void validate(HttpServletRequest request, Collection<String> params)
     {
         MediaType ct = FusekiLib.contentType(request) ;
         boolean mustHaveQueryParam = true ;

Modified: jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java?rev=1373579&r1=1373578&r2=1373579&view=diff
==============================================================================
--- jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java (original)
+++ jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java Wed Aug 15 19:16:05 2012
@@ -22,10 +22,15 @@ import static java.lang.String.format ;
 import static org.apache.jena.fuseki.Fuseki.requestLog ;
 import static org.apache.jena.fuseki.HttpNames.paramRequest ;
 import static org.apache.jena.fuseki.HttpNames.paramUpdate ;
+import static org.apache.jena.fuseki.HttpNames.paramUsingGraphURI ;
+import static org.apache.jena.fuseki.HttpNames.paramUsingNamedGraphURI ;
 
 import java.io.IOException ;
 import java.io.InputStream ;
+import java.util.Arrays ;
+import java.util.Collection ;
 import java.util.Enumeration ;
+import java.util.List ;
 
 import javax.servlet.ServletException ;
 import javax.servlet.http.HttpServletRequest ;
@@ -35,21 +40,23 @@ import org.apache.jena.fuseki.FusekiLib 
 import org.apache.jena.fuseki.HttpNames ;
 import org.apache.jena.fuseki.http.HttpSC ;
 import org.apache.jena.fuseki.server.DatasetRef ;
+import org.apache.jena.iri.IRI ;
 import org.openjena.atlas.io.IO ;
 import org.openjena.atlas.lib.Bytes ;
 import org.openjena.atlas.web.MediaType ;
 import org.openjena.riot.WebContent ;
+import org.openjena.riot.system.IRIResolver ;
 
+import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.query.QueryParseException ;
 import com.hp.hpl.jena.query.Syntax ;
-import com.hp.hpl.jena.update.UpdateAction ;
-import com.hp.hpl.jena.update.UpdateException ;
-import com.hp.hpl.jena.update.UpdateFactory ;
-import com.hp.hpl.jena.update.UpdateRequest ;
+import com.hp.hpl.jena.sparql.modify.request.UpdateWithUsing ;
+import com.hp.hpl.jena.update.* ;
 
 public class SPARQL_Update extends SPARQL_Protocol
 {
     private static String updateParseBase = "http://example/base/" ;
+    private static IRIResolver resolver = IRIResolver.create(updateParseBase) ;
     
     private class HttpActionUpdate extends HttpActionProtocol {
         public HttpActionUpdate(long id, DatasetRef desc, HttpServletRequest request, HttpServletResponse response, boolean verbose)
@@ -104,6 +111,12 @@ public class SPARQL_Update extends SPARQ
         // ----
         // using-graph-uri
         // using-named-graph-uri
+        // then modify the parsed query - find all UpdateWithUsing and .
+        
+        /* [It is an error to supply the using-graph-uri or using-named-graph-uri parameters 
+         * when using this protocol to convey a SPARQL 1.1 Update request that contains an 
+         * operation that uses the USING, USING NAMED, or WITH clause.]
+         */
         
         if (WebContent.contentTypeSPARQLUpdate.equals(ctStr))
         {
@@ -118,6 +131,10 @@ public class SPARQL_Update extends SPARQ
         error(HttpSC.UNSUPPORTED_MEDIA_TYPE_415, "Bad content type: " + request.getContentType()) ;
     }
 
+    protected static List<String> paramsForm = Arrays.asList(paramRequest, paramUpdate, 
+                                                             paramUsingGraphURI, paramUsingNamedGraphURI) ;
+    protected static List<String> paramsPOST = Arrays.asList(paramUsingGraphURI, paramUsingNamedGraphURI) ;
+    
     @Override
     protected void validate(HttpServletRequest request)
     {
@@ -136,18 +153,10 @@ public class SPARQL_Update extends SPARQ
         
         if ( WebContent.contentTypeSPARQLUpdate.equals(ctStr) )
         {
-            // For now, all query string stuff is not allowed.
-            if ( request.getQueryString() != null )
-                errorBadRequest("No query string allowed: found: "+request.getQueryString()) ;
-            // For later...
-            @SuppressWarnings("unchecked")
-            Enumeration<String> en = request.getParameterNames() ;
-            if ( en.hasMoreElements() )
-                errorBadRequest("No request parameters allowed") ;
-            
             String charset = request.getCharacterEncoding() ;
             if ( charset != null && ! charset.equalsIgnoreCase(WebContent.charsetUTF8) )
                 errorBadRequest("Bad charset: "+charset) ;
+            validate(request, paramsPOST) ;
             return ;
         }
         
@@ -158,19 +167,27 @@ public class SPARQL_Update extends SPARQ
                 requestStr = request.getParameter(paramRequest) ;
             if ( requestStr == null )
                 errorBadRequest("SPARQL Update: No update= in HTML form") ;
+            validate(request, paramsForm) ;
+            return ;
+        }
+        
+        
+        error(HttpSC.UNSUPPORTED_MEDIA_TYPE_415, "Must be "+WebContent.contentTypeSPARQLUpdate+" or "+WebContent.contentTypeForm+" (got "+ctStr+")") ;
+    }
+    
+    protected void validate(HttpServletRequest request, Collection<String> params)
+    {
+        if ( params != null )
+        {
             @SuppressWarnings("unchecked")
             Enumeration<String> en = request.getParameterNames() ;
             for ( ; en.hasMoreElements() ; )
             {
                 String name = en.nextElement() ;
-                if ( !name.equals(paramRequest) && !name.equals(paramUpdate) )
-                    errorBadRequest("SPARQL Update: Unrecognized update request parameter: "+name) ;
+                if ( ! params.contains(name) )
+                    warning("SPARQL Update: Unrecognize request parameter (ignored): "+name) ;
             }
-            
-            return ;
         }
-        
-        error(HttpSC.UNSUPPORTED_MEDIA_TYPE_415, "Must be "+WebContent.contentTypeSPARQLUpdate+" or "+WebContent.contentTypeForm+" (got "+ctStr+")") ;
     }
 
     private void executeBody(HttpActionUpdate action)
@@ -225,7 +242,8 @@ public class SPARQL_Update extends SPARQ
     
     private void execute(HttpActionUpdate action, UpdateRequest updateRequest)
     {
-        //GraphStore graphStore = GraphStoreFactory.create(action.dsg) ;
+        processProtocol(action.request, updateRequest) ;
+        
         action.beginWrite() ;
         try {
             UpdateAction.execute(updateRequest, action.getActiveDSG()) ;
@@ -234,4 +252,50 @@ public class SPARQL_Update extends SPARQ
         catch ( UpdateException ex) { action.abort() ; errorBadRequest(ex.getMessage()) ; }
         finally { action.endWrite() ; }
     }
+
+    private void processProtocol(HttpServletRequest request, UpdateRequest updateRequest)
+    {
+        String[] usingArgs = request.getParameterValues(paramUsingGraphURI) ;
+        String[] usingNamedArgs = request.getParameterValues(paramUsingNamedGraphURI) ;
+        if ( usingArgs == null && usingNamedArgs == null )
+            return ;
+        if ( usingArgs == null )
+            usingArgs = new String[0] ;
+        if ( usingNamedArgs == null )
+            usingNamedArgs = new String[0] ;
+        // Impossible.
+//        if ( usingArgs.length == 0 && usingNamedArgs.length == 0 )
+//            return ;
+        // ---- check USING/USING NAMED/WITH not used.
+        // ---- update request to have USING/USING NAMED 
+        for ( Update up : updateRequest.getOperations() )
+        {
+            if ( up instanceof UpdateWithUsing )
+            {
+                UpdateWithUsing upu = (UpdateWithUsing)up ;
+                if ( upu.getUsing().size() != 0 || upu.getUsingNamed().size() != 0 || upu.getWithIRI() != null )
+                    errorBadRequest("SPARQL Update: Protocol using-graph-uri or using-named-graph-uri present where update request has USING, USING NAMED or WITH") ;
+                for ( String a : usingArgs )
+                    upu.addUsing(createNode(a)) ;
+                for ( String a : usingNamedArgs )
+                    upu.addUsingNamed(createNode(a)) ;
+            }
+        }
+        
+//        String x = formatForLog(updateRequest.toString()) ;
+//        requestLog.info("Processed: "+x) ;
+    }
+    
+    private static Node createNode(String x)
+    {
+        try {
+            IRI iri = resolver.resolve(x) ;
+            return Node.createURI(iri.toString()) ;
+        } catch (Exception ex)
+        {
+            errorBadRequest("SPARQL Update: bad IRI: "+x) ;
+            return null ;
+        }
+        
+    }
 }