You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by sa...@apache.org on 2012/05/19 03:14:40 UTC

svn commit: r1340329 - in /jena/Experimental/jena-client/src/main/java/org/apache/jena/client: ParameterizerBase.java QueryParameterizerBase.java QueryStatementBase.java UpdateStatementBase.java http/SparqlHttpUpdater.java

Author: sallen
Date: Sat May 19 01:14:40 2012
New Revision: 1340329

URL: http://svn.apache.org/viewvc?rev=1340329&view=rev
Log:
jena-client Fixed SPARQL Update HTTP Protocol.

Added:
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/ParameterizerBase.java
Removed:
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/QueryParameterizerBase.java
Modified:
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/QueryStatementBase.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatementBase.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/SparqlHttpUpdater.java

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/ParameterizerBase.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/ParameterizerBase.java?rev=1340329&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/ParameterizerBase.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/ParameterizerBase.java Sat May 19 01:14:40 2012
@@ -0,0 +1,189 @@
+package org.apache.jena.client;
+
+import java.net.URL;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import org.apache.jena.iri.IRI;
+import org.openjena.atlas.lib.NotImplemented;
+
+import com.hp.hpl.jena.datatypes.RDFDatatype;
+import com.hp.hpl.jena.datatypes.xsd.XSDDatatype;
+import com.hp.hpl.jena.datatypes.xsd.XSDDateTime;
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.impl.LiteralLabel;
+import com.hp.hpl.jena.graph.impl.LiteralLabelFactory;
+import com.hp.hpl.jena.query.Query;
+import com.hp.hpl.jena.rdf.model.Literal;
+import com.hp.hpl.jena.rdf.model.RDFNode;
+import com.hp.hpl.jena.sparql.serializer.SerializationContext;
+import com.hp.hpl.jena.sparql.util.FmtUtils;
+import com.hp.hpl.jena.sparql.util.NodeFactory;
+
+/**
+ * 
+ */
+// TODO we're currently taking the approach of just creating Nodes.  We don't prevent users from shooting themselves in the foot by creating invalid nodes...
+abstract class ParameterizerBase implements Parameterizer
+{
+    protected final Map<String,Node> params = new HashMap<String,Node>();
+//    protected String[] rawStrings = new String[]{};
+    
+    // TODO think about getting rid of the regex and use a true SPARQL parser, so we can understand quotes and comments
+    protected String buildFromString(String queryString, SerializationContext context)
+    {
+        if (null == context) context = new SerializationContext();
+        
+//        // Do the raw strings first
+//        Object[] escapedStrings = new Object[rawStrings.length];
+//        for (int i=0; i<rawStrings.length; i++)
+//        {
+//            escapedStrings[i] = FmtUtils.stringEsc(rawStrings[i]);
+//        }
+//        // TODO check the sparql injection implications of this
+//        String toReturn = String.format(queryString, (Object[])rawStrings);
+        
+        // Then do the regular parameters second
+        String toReturn = queryString;
+        for (Map.Entry<String, Node> entry : params.entrySet())
+        {
+            // TODO Grabbed this from Rob's ParameterizedSparqlString class, doesn't limit itself to only variables (which is bad)...
+            Pattern p = Pattern.compile("([?$]" + entry.getKey() + ")([^\\w]|$)");
+            toReturn = p.matcher(toReturn).replaceAll(FmtUtils.stringForNode(entry.getValue(), context) + "$2");
+        }
+        
+        return toReturn;
+    }
+    
+    protected Query buildFromQuery(Query query)
+    {
+        throw new NotImplemented("Building from a Query object is not implemented yet!");
+    }
+
+    @Override
+    public void clearParam(String var)
+    {
+        params.remove(var);
+    }
+    
+    @Override
+    public void clearParams()
+    {
+        params.clear();
+    }
+
+    @Override
+    public void setParam(String var, Node node)
+    {
+        if (var == null) throw new IllegalArgumentException("var cannot be null");
+        if (var.startsWith("?") || var.startsWith("$")) var = var.substring(1);
+        if (node != null)
+        {
+            params.put(var, node);
+        }
+        else
+        {
+            clearParam(var);
+        }
+    }
+
+    @Override
+    public void setParam(String var, RDFNode node)
+    {
+        setParam(var, node.asNode());
+    }
+
+    @Override
+    public void setIri(String var, String iri)
+    {
+        setParam(var, Node.createURI(iri));
+    }
+
+    @Override
+    public void setIri(String var, IRI iri)
+    {
+        setIri(var, iri.toString());
+    }
+
+    @Override
+    public void setIri(String var, URL url)
+    {
+        setIri(var, url.toString());
+    }
+
+    @Override
+    public void setLiteral(String var, Literal lit)
+    {
+        setParam(var, lit);
+    }
+
+    @Override
+    public void setLiteral(String var, String value)
+    {
+        setParam(var, Node.createLiteral(value));
+    }
+
+    @Override
+    public void setLiteral(String var, String value, String lang)
+    {
+        setParam(var, NodeFactory.createLiteralNode(value, lang, null));
+    }
+
+    @Override
+    public void setLiteral(String var, String value, RDFDatatype datatype)
+    {
+        setParam(var, Node.createLiteral(value, datatype));
+    }
+
+    @Override
+    public void setLiteral(String var, boolean value)
+    {
+        setParam(var, Node.createLiteral(Boolean.toString(value), XSDDatatype.XSDboolean));
+    }
+
+    @Override
+    public void setLiteral(String var, int i)
+    {
+        setParam(var, Node.createLiteral(Integer.toString(i), XSDDatatype.XSDinteger));
+    }
+
+    @Override
+    public void setLiteral(String var, long l)
+    {
+        setParam(var, Node.createLiteral(Long.toString(l), XSDDatatype.XSDlong));
+    }
+
+    @Override
+    public void setLiteral(String var, float f)
+    {
+        setParam(var, Node.createLiteral(Float.toString(f), XSDDatatype.XSDfloat));
+    }
+
+    @Override
+    public void setLiteral(String var, double d)
+    {
+        setParam(var, Node.createLiteral(Double.toString(d), XSDDatatype.XSDdouble));
+    }
+
+    @Override
+    public void setLiteral(String var, Calendar dt)
+    {
+        Object value = new XSDDateTime(dt);
+        LiteralLabel ll = LiteralLabelFactory.create(value, "", XSDDatatype.XSDdateTime);
+        setParam(var, Node.createLiteral(ll));
+    }
+    
+//    @Override
+//    public void clearRawStrings()
+//    {
+//        rawStrings = new String[]{};
+//    }
+//
+//    @Override
+//    public void setRawStrings(String... args)
+//    {
+//        rawStrings = args;
+//    }
+}

Modified: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/QueryStatementBase.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/QueryStatementBase.java?rev=1340329&r1=1340328&r2=1340329&view=diff
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/QueryStatementBase.java (original)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/QueryStatementBase.java Sat May 19 01:14:40 2012
@@ -11,7 +11,7 @@ import com.hp.hpl.jena.rdf.model.Stateme
 import com.hp.hpl.jena.rdf.model.impl.StmtIteratorImpl;
 import com.hp.hpl.jena.sparql.util.ModelUtils;
 
-public abstract class QueryStatementBase extends QueryParameterizerBase implements QueryStatement
+public abstract class QueryStatementBase extends ParameterizerBase implements QueryStatement
 {
     private final Connection connection;
     private long timeout1;

Modified: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatementBase.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatementBase.java?rev=1340329&r1=1340328&r2=1340329&view=diff
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatementBase.java (original)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatementBase.java Sat May 19 01:14:40 2012
@@ -2,7 +2,7 @@ package org.apache.jena.client;
 
 import java.util.concurrent.TimeUnit;
 
-public abstract class UpdateStatementBase extends QueryParameterizerBase implements UpdateStatement
+public abstract class UpdateStatementBase extends ParameterizerBase implements UpdateStatement
 {
     protected final Connection connection;
     private long timeout1;

Modified: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/SparqlHttpUpdater.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/SparqlHttpUpdater.java?rev=1340329&r1=1340328&r2=1340329&view=diff
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/SparqlHttpUpdater.java (original)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/SparqlHttpUpdater.java Sat May 19 01:14:40 2012
@@ -10,6 +10,7 @@ import java.util.Iterator;
 
 import org.apache.jena.client.UpdaterBase;
 import org.openjena.atlas.io.IndentedWriter;
+import org.openjena.riot.WebContent;
 
 import com.hp.hpl.jena.sparql.core.Quad;
 import com.hp.hpl.jena.sparql.modify.request.UpdateWriter;
@@ -51,13 +52,21 @@ public class SparqlHttpUpdater extends U
             }
             conn = (HttpURLConnection)urlConn;
             conn.setDoOutput(true);
-            
-            // TODO Need to enable chunking mode to support streaming.  Otherwise it is all buffered up in memory.
-            //conn.setChunkedStreamingMode(0);
+            conn.setRequestMethod("POST");
+            conn.setRequestProperty("Content-Type", WebContent.contentTypeSPARQLUpdate);
+            //conn.setRequestProperty("Content-Type", WebContent.contentTypeForm);
+            // TODO Potential optimization: allow gzip when we know we're dealing with Fuseki (also update Fuseki to allow this!)
+            //conn.setRequestProperty("Content-Encoding", "gzip");
+            conn.setChunkedStreamingMode(4096);
+            conn.connect();
             
             out = conn.getOutputStream();
+            //out = new GZIPOutputStream(conn.getOutputStream());
+            
+            IndentedWriter iw = new IndentedWriter(out);
+            //iw.print("update=");
             
-            writer = new UpdateWriter(new IndentedWriter(out), sCxt);
+            writer = new UpdateWriter(iw, sCxt);
             writer.open();
             
             opened = true;
@@ -114,6 +123,7 @@ public class SparqlHttpUpdater extends U
                 // Get the response
                 int responseCode = conn.getResponseCode();
                 String responseMessage = conn.getResponseMessage();
+                conn.disconnect();
                 
                 if (responseCode == 204) // No content
                 {