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 ;
+ }
+
+ }
}