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/04/13 03:48:03 UTC
svn commit: r1325586 - in
/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http:
QuadEntity.java QuadIteratorEntity.java TripleEntity.java
TripleIteratorEntity.java UpdateRemote.java
Author: sallen
Date: Fri Apr 13 01:48:03 2012
New Revision: 1325586
URL: http://svn.apache.org/viewvc?rev=1325586&view=rev
Log:
More changes for streaming update support.
Added:
incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/QuadIteratorEntity.java
incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/TripleIteratorEntity.java
Removed:
incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/QuadEntity.java
incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/TripleEntity.java
Modified:
incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/UpdateRemote.java
Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/QuadIteratorEntity.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/QuadIteratorEntity.java?rev=1325586&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/QuadIteratorEntity.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/QuadIteratorEntity.java Fri Apr 13 01:48:03 2012
@@ -0,0 +1,142 @@
+package org.apache.jena.client.http;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.util.Iterator;
+
+import org.apache.http.entity.AbstractHttpEntity;
+import org.openjena.atlas.io.IO;
+import org.openjena.atlas.iterator.PeekIterator;
+import org.openjena.atlas.lib.NotImplemented;
+import org.openjena.riot.out.NodeFormatter;
+import org.openjena.riot.out.NodeFormatterNT;
+
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.sparql.core.Quad;
+
+class QuadIteratorEntity extends AbstractHttpEntity
+{
+ private final boolean insert;
+ private final Iterator<Quad> it;
+ private final NodeFormatter nodeFmt = new NodeFormatterNT() ;
+
+ public QuadIteratorEntity(boolean insert, Iterator<Quad> it)
+ {
+ this.insert = insert;
+ this.it = it;
+ }
+
+ @Override
+ public boolean isRepeatable()
+ {
+ return false;
+ }
+
+ @Override
+ public long getContentLength()
+ {
+ return -1;
+ }
+
+ @Override
+ public boolean isStreaming()
+ {
+ return true;
+ }
+
+ @Override
+ public InputStream getContent() throws IOException, IllegalStateException
+ {
+ throw new NotImplemented("TripleIteratorEntity is only meant to be used as a Request entity.");
+ }
+
+ @Override
+ public void writeTo(OutputStream outstream) throws IOException
+ {
+ if (outstream == null)
+ {
+ throw new IllegalArgumentException("Output stream may not be null");
+ }
+
+ if (!it.hasNext()) return;
+
+ // TODO Move this to UpdateWriter
+ // TODO Would be cool to use a Trig writer here
+ Writer out = IO.asBufferedUTF8(outstream) ;
+ try
+ {
+ String instruction = insert ? "INSERT" : "DELETE";
+ out.write(String.format("%1$s DATA {\n", instruction));
+
+ PeekIterator<Quad> pit = new PeekIterator<Quad>(it);
+ while (pit.hasNext())
+ {
+ Quad quad = pit.next();
+ Node graphName = quad.isDefaultGraph() ? null : quad.getGraph();
+
+ if (null != graphName)
+ {
+ out.write(String.format(" graph <%1$s> {\n", graphName.getURI()));
+ }
+
+ // This is a little optimization to not repeat the graph block if consecutive quads have the same graph
+ while (true)
+ {
+ out.write(null != graphName ? " " : " ");
+ write(out, quad);
+
+ if (!pit.hasNext()) break;
+
+ Quad nextQuad = pit.peek();
+ Node nextGraphName = nextQuad.isDefaultGraph() ? null : nextQuad.getGraph();
+
+ if (!nodesAreEqual(graphName, nextGraphName)) break;
+
+ quad = pit.next();
+
+ }
+
+ if (null != graphName)
+ {
+ out.write("\n }");
+ }
+ }
+
+ out.write("\n}");
+ }
+ finally
+ {
+ if (null != out)
+ {
+ out.flush();
+ }
+ }
+
+ }
+
+ private boolean nodesAreEqual(Node a, Node b)
+ {
+ if (null == a && null == b) return true;
+ if (null != a && null == b) return false;
+ return a.equals(b);
+ }
+
+ // really just writing the triple part of the quad
+ private void write(Writer out, Quad quad) throws IOException
+ {
+ Node s = quad.getSubject() ;
+ Node p = quad.getPredicate() ;
+ Node o = quad.getObject() ;
+
+ nodeFmt.format(out, s) ;
+ out.write(" ") ;
+ nodeFmt.format(out, p) ;
+ out.write(" ") ;
+ nodeFmt.format(out, o) ;
+ out.write(" .\n") ;
+
+ }
+
+}
Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/TripleIteratorEntity.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/TripleIteratorEntity.java?rev=1325586&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/TripleIteratorEntity.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/TripleIteratorEntity.java Fri Apr 13 01:48:03 2012
@@ -0,0 +1,88 @@
+package org.apache.jena.client.http;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Iterator;
+
+import org.apache.http.entity.AbstractHttpEntity;
+import org.openjena.atlas.lib.NotImplemented;
+import org.openjena.riot.RiotWriter;
+
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.sparql.core.Quad;
+
+class TripleIteratorEntity extends AbstractHttpEntity
+{
+ private final Node graphName;
+ private final boolean insert;
+ private final Iterator<Triple> it;
+
+ public TripleIteratorEntity(Node graphName, boolean insert, Iterator<Triple> it)
+ {
+ if (Quad.isDefaultGraph(graphName))
+ {
+ graphName = null;
+ }
+ this.graphName = graphName;
+ this.insert = insert;
+ this.it = it;
+ }
+
+ @Override
+ public boolean isRepeatable()
+ {
+ return false;
+ }
+
+ @Override
+ public long getContentLength()
+ {
+ return -1;
+ }
+
+ @Override
+ public boolean isStreaming()
+ {
+ return true;
+ }
+
+ @Override
+ public InputStream getContent() throws IOException, IllegalStateException
+ {
+ throw new NotImplemented("TripleIteratorEntity is only meant to be used as a Request entity.");
+ }
+
+ @Override
+ public void writeTo(OutputStream outstream) throws IOException
+ {
+ if (outstream == null)
+ {
+ throw new IllegalArgumentException("Output stream may not be null");
+ }
+
+ if (!it.hasNext()) return;
+
+ // TODO Move this to UpdateWriter
+ String instruction = insert ? "INSERT" : "DELETE";
+ write(outstream, String.format("%1$s DATA {\n", instruction));
+ if (null != graphName)
+ {
+ write(outstream, String.format("graph <%1$s> {\n", graphName.getURI()));
+ }
+
+ RiotWriter.writeTriples(outstream, it);
+
+ if (null != graphName)
+ {
+ write(outstream, "\n}");
+ }
+ write(outstream, "\n}");
+ }
+
+ private void write(OutputStream out, String s) throws IOException
+ {
+ out.write(s.getBytes("UTF-8"));
+ }
+}
Modified: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/UpdateRemote.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/UpdateRemote.java?rev=1325586&r1=1325585&r2=1325586&view=diff
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/UpdateRemote.java (original)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/UpdateRemote.java Fri Apr 13 01:48:03 2012
@@ -18,29 +18,29 @@
package org.apache.jena.client.http;
-import java.io.ByteArrayOutputStream ;
-import java.io.IOException ;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
import java.util.Iterator;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse ;
-import org.apache.http.client.HttpClient ;
-import org.apache.http.client.methods.HttpPost ;
-import org.apache.http.entity.AbstractHttpEntity ;
-import org.apache.http.entity.ByteArrayEntity ;
-import org.apache.http.entity.InputStreamEntity;
-import org.apache.http.impl.client.DefaultHttpClient ;
-import org.apache.http.protocol.HTTP ;
-import org.openjena.atlas.io.IndentedWriter ;
-import org.openjena.riot.WebContent ;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.AbstractHttpEntity;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.protocol.HTTP;
+import org.openjena.atlas.io.IndentedWriter;
+import org.openjena.riot.WebContent;
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.Triple;
import com.hp.hpl.jena.sparql.core.Quad;
-import com.hp.hpl.jena.sparql.modify.request.Target ;
-import com.hp.hpl.jena.sparql.modify.request.UpdateDrop ;
-import com.hp.hpl.jena.sparql.modify.request.UpdateWriter ;
-import com.hp.hpl.jena.update.Update ;
-import com.hp.hpl.jena.update.UpdateException ;
-import com.hp.hpl.jena.update.UpdateRequest ;
+import com.hp.hpl.jena.sparql.modify.request.Target;
+import com.hp.hpl.jena.sparql.modify.request.UpdateDrop;
+import com.hp.hpl.jena.sparql.modify.request.UpdateWriter;
+import com.hp.hpl.jena.update.Update;
+import com.hp.hpl.jena.update.UpdateException;
+import com.hp.hpl.jena.update.UpdateRequest;
public class UpdateRemote
{
@@ -71,24 +71,34 @@ public class UpdateRemote
out.flush() ;
byte[] bytes = b_out.toByteArray() ;
AbstractHttpEntity reqEntity = new ByteArrayEntity(bytes) ;
- reqEntity.setContentType(WebContent.contentTypeSPARQLUpdate) ;
- reqEntity.setContentEncoding(HTTP.UTF_8) ;
- execute(reqEntity);
+ execute(reqEntity) ;
}
+ public void add(Node graphName, Iterator<Triple> triples)
+ {
+ TripleIteratorEntity reqEntity = new TripleIteratorEntity(graphName, true, triples) ;
+ execute(reqEntity) ;
+ }
+
public void add(Iterator<Quad> quads)
{
-
+ QuadIteratorEntity reqEntity = new QuadIteratorEntity(true, quads) ;
+ execute(reqEntity) ;
}
+ public void delete(Node graphName, Iterator<Triple> triples)
+ {
+ TripleIteratorEntity reqEntity = new TripleIteratorEntity(graphName, false, triples) ;
+ execute(reqEntity) ;
+ }
public void delete(Iterator<Quad> quads)
{
-
+ QuadIteratorEntity reqEntity = new QuadIteratorEntity(false, quads) ;
+ execute(reqEntity) ;
}
-
protected void execute(AbstractHttpEntity reqEntity)
{
HttpPost httpPost = new HttpPost(serviceURL) ;