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/06/19 21:28:06 UTC

svn commit: r1351810 - in /jena/Experimental/jena-client: pom.xml src/main/java/org/apache/jena/client/http/HttpConnection.java src/main/java/org/apache/jena/client/http/HttpUpdater.java

Author: sallen
Date: Tue Jun 19 19:28:06 2012
New Revision: 1351810

URL: http://svn.apache.org/viewvc?rev=1351810&view=rev
Log:
jena-client - 1) Bumped version to 0.0.2-SNAPSHOT.  2) Added ability to choose between "application/sparql-update" and "application/x-www-form-urlencoded" encoding for HttpUpdater.

Modified:
    jena/Experimental/jena-client/pom.xml
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpConnection.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdater.java

Modified: jena/Experimental/jena-client/pom.xml
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/pom.xml?rev=1351810&r1=1351809&r2=1351810&view=diff
==============================================================================
--- jena/Experimental/jena-client/pom.xml (original)
+++ jena/Experimental/jena-client/pom.xml Tue Jun 19 19:28:06 2012
@@ -20,7 +20,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.apache.jena</groupId>
   <artifactId>jena-client</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
+  <version>0.0.2-SNAPSHOT</version>
   <name>JenaClient</name>
   <description>A Jena library for interacting with SPARQL endpoints.</description>
   

Modified: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpConnection.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpConnection.java?rev=1351810&r1=1351809&r2=1351810&view=diff
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpConnection.java (original)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpConnection.java Tue Jun 19 19:28:06 2012
@@ -17,6 +17,8 @@ public class HttpConnection extends Conn
     private String queryEndpoint;
     private String updateEndpoint;
     
+    private boolean useContentTypeSPARQLUpdate = true;
+    
     HttpConnection(HttpRepository repo, String queryEndpoint, String updateEndpoint)
     {
         if (null == repo)
@@ -29,6 +31,18 @@ public class HttpConnection extends Conn
         this.updateEndpoint = updateEndpoint;
     }
     
+    /**
+     * Whether or not to use <code>"application/sparql-update"</code> as the content type for SPARQL Update.  Defaults to true.
+     * If set to false then <code>"application/x-www-form-urlencoded"</code> is used instead (however, be warned that urlencoded
+     * is not streaming and will buffer the entire update into memory.
+     * 
+     * @param useContentTypeSPARQLUpdate true if <code>"application/sparql-update"</code> is desired; true is the default
+     */
+    public void useContentTypeSPARQLUpdate(boolean useContentTypeSPARQLUpdate)
+    {
+        this.useContentTypeSPARQLUpdate = useContentTypeSPARQLUpdate;
+    }
+    
     @Override
     public boolean hasBulkUpdater()
     {
@@ -38,7 +52,7 @@ public class HttpConnection extends Conn
     @Override
     protected Updater doCreateBulkUpdater()
     {
-        HttpUpdater updater = new HttpUpdater(updateEndpoint);
+        HttpUpdater updater = new HttpUpdater(updateEndpoint, useContentTypeSPARQLUpdate);
         updater.open();
         return updater;
     }

Modified: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdater.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdater.java?rev=1351810&r1=1351809&r2=1351810&view=diff
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdater.java (original)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdater.java Tue Jun 19 19:28:06 2012
@@ -1,8 +1,10 @@
 package org.apache.jena.client.http;
 
-import java.io.FilterOutputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -24,24 +26,33 @@ public class HttpUpdater extends Updater
 {
     private final String updateEndpoint;
     private final SerializationContext sCxt;
+    private final boolean useContentTypeSPARQLUpdate;
     
     private HttpURLConnection conn;
     private OutputStream out;
     private UpdateWriter writer;
     private boolean opened = false;
     
+    private ByteArrayOutputStream baos;
+    
     public HttpUpdater(String updateEndpoint)
     {
-        this(updateEndpoint, null);
+        this(updateEndpoint, true);
+    }
+    
+    public HttpUpdater(String updateEndpoint, boolean useContentTypeSPARQLUpdate)
+    {
+        this(updateEndpoint, useContentTypeSPARQLUpdate, null);
     }
     
-    public HttpUpdater(String updateEndpoint, SerializationContext sCxt)
+    public HttpUpdater(String updateEndpoint, boolean useContentTypeSPARQLUpdate, SerializationContext sCxt)
     {
         if (null == updateEndpoint) {
             throw new IllegalArgumentException("updateEndpoint must be specified if performing update operations");
         }
         
         this.updateEndpoint = updateEndpoint;
+        this.useContentTypeSPARQLUpdate = useContentTypeSPARQLUpdate;
         this.sCxt = sCxt;
     }
     
@@ -59,20 +70,30 @@ public class HttpUpdater extends Updater
             conn = (HttpURLConnection)urlConn;
             conn.setDoOutput(true);
             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);
+            
+            String contentType = useContentTypeSPARQLUpdate ? WebContent.contentTypeSPARQLUpdate : WebContent.contentTypeForm;
+            conn.setRequestProperty("Content-Type", contentType);
+            
             conn.connect();
             
             out = conn.getOutputStream();
             //out = new GZIPOutputStream(conn.getOutputStream());
             
-            //IndentedWriter iw = new IndentedWriter(out);
-            out.write("update=".getBytes("UTF-8"));
-            IndentedWriter iw = new IndentedWriter(new URLEncoderOutputStream(out));
-            
+            IndentedWriter iw;
+            if (useContentTypeSPARQLUpdate)
+            {
+                iw = new IndentedWriter(out);
+            }
+            else
+            {
+                out.write("update=".getBytes("UTF-8"));
+                //iw = new IndentedWriter(new URLEncoderOutputStream(out));
+                baos = new ByteArrayOutputStream();
+                iw = new IndentedWriter(baos);
+            }
             
             writer = new UpdateWriter(iw, sCxt);
             writer.open();
@@ -124,6 +145,28 @@ public class HttpUpdater extends Updater
         if (opened)
         {
             writer.close();
+            
+            if (!useContentTypeSPARQLUpdate)
+            {
+                OutputStreamWriter o = new OutputStreamWriter(out);
+                try
+                {
+                    String encoded = URLEncoder.encode(baos.toString(), "UTF-8");
+                    baos = null;
+                    o.write(encoded);
+                    o.close();
+                }
+                catch (UnsupportedEncodingException e)
+                {
+                    // Should never happen...
+                    throw new UpdateException(e);
+                }
+                catch (IOException e)
+                {
+                    throw new UpdateException(e);
+                }
+            }
+            
             try
             {
                 out.close();
@@ -153,19 +196,19 @@ public class HttpUpdater extends Updater
     }
     
     
-    // TODO this is not efficient.  And is it even correct?  Will it properly escape UTF codepoints over a byte in size?
-    private class URLEncoderOutputStream extends FilterOutputStream
-    {
-        public URLEncoderOutputStream(OutputStream out)
-        {
-            super(out);
-        }
-        
-        @Override
-        public void write(int b) throws IOException
-        {
-            String enc = URLEncoder.encode(new String(new byte[] { (byte)b }), "UTF-8");
-            out.write(enc.getBytes("UTF-8"));
-        }
-    }
+//    // TODO this is not efficient.  And is it even correct?  Will it properly escape UTF codepoints over a byte in size?
+//    private class URLEncoderOutputStream extends FilterOutputStream
+//    {
+//        public URLEncoderOutputStream(OutputStream out)
+//        {
+//            super(out);
+//        }
+//        
+//        @Override
+//        public void write(int b) throws IOException
+//        {
+//            String enc = URLEncoder.encode(new String(new byte[] { (byte)b }), "UTF-8");
+//            out.write(enc.getBytes("UTF-8"));
+//        }
+//    }
 }