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/17 03:59:34 UTC
svn commit: r1326877 - in /incubator/jena/Jena2/ARQ/trunk/src/main/java:
com/hp/hpl/jena/sparql/modify/request/UpdateDataWriter.java
com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java
org/openjena/riot/out/SinkQuadBracedOutput.java
Author: sallen
Date: Tue Apr 17 01:59:33 2012
New Revision: 1326877
URL: http://svn.apache.org/viewvc?rev=1326877&view=rev
Log:
Added streaming support to UpdateWriter.
Added:
incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDataWriter.java
incubator/jena/Jena2/ARQ/trunk/src/main/java/org/openjena/riot/out/SinkQuadBracedOutput.java
Modified:
incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java
Added: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDataWriter.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDataWriter.java?rev=1326877&view=auto
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDataWriter.java (added)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDataWriter.java Tue Apr 17 01:59:33 2012
@@ -0,0 +1,42 @@
+package com.hp.hpl.jena.sparql.modify.request;
+
+import org.openjena.atlas.io.IndentedWriter;
+import org.openjena.riot.out.SinkQuadBracedOutput;
+
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.sparql.serializer.SerializationContext;
+
+public class UpdateDataWriter extends SinkQuadBracedOutput
+{
+ /**
+ * The mode an UpdateDataWriter is in.
+ */
+ public enum UpdateMode
+ {
+ INSERT,
+ DELETE,
+ }
+
+ private final UpdateMode mode;
+ private Node currentGraph;
+
+ public UpdateDataWriter(UpdateMode mode, IndentedWriter out, SerializationContext sCxt)
+ {
+ super(out, sCxt);
+ this.mode = mode;
+ }
+
+ public UpdateMode getMode()
+ {
+ return mode;
+ }
+
+ @Override
+ public void open()
+ {
+ out.ensureStartOfLine();
+ out.print(mode.toString());
+ out.print(" DATA ");
+ super.open();
+ }
+}
Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java?rev=1326877&r1=1326876&r2=1326877&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java Tue Apr 17 01:59:33 2012
@@ -18,82 +18,197 @@
package com.hp.hpl.jena.sparql.modify.request;
-import java.util.List ;
+import java.util.List;
-import org.openjena.atlas.io.IndentedWriter ;
+import org.openjena.atlas.io.IndentedWriter;
+import org.openjena.atlas.iterator.Iter;
+import org.openjena.atlas.lib.Closeable;
+import org.openjena.riot.out.SinkQuadBracedOutput;
+
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.sparql.ARQException;
+import com.hp.hpl.jena.sparql.core.Quad;
+import com.hp.hpl.jena.sparql.modify.request.UpdateDataWriter.UpdateMode;
+import com.hp.hpl.jena.sparql.serializer.FormatterElement;
+import com.hp.hpl.jena.sparql.serializer.PrologueSerializer;
+import com.hp.hpl.jena.sparql.serializer.SerializationContext;
+import com.hp.hpl.jena.sparql.syntax.Element;
+import com.hp.hpl.jena.sparql.util.FmtUtils;
+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.graph.Node ;
-import com.hp.hpl.jena.sparql.ARQException ;
-import com.hp.hpl.jena.sparql.core.Prologue ;
-import com.hp.hpl.jena.sparql.core.Quad ;
-import com.hp.hpl.jena.sparql.serializer.FormatterElement ;
-import com.hp.hpl.jena.sparql.serializer.PrologueSerializer ;
-import com.hp.hpl.jena.sparql.serializer.SerializationContext ;
-import com.hp.hpl.jena.sparql.syntax.Element ;
-import com.hp.hpl.jena.sparql.util.FmtUtils ;
-import com.hp.hpl.jena.update.Update ;
-import com.hp.hpl.jena.update.UpdateRequest ;
-
-public class UpdateWriter
+public class UpdateWriter implements Closeable
{
- public static void output(UpdateRequest request, IndentedWriter out)
+ private final IndentedWriter out;
+ private final SerializationContext sCxt;
+
+ private UpdateDataWriter udw;
+ private boolean firstOp = true;
+ private boolean opened = false;
+ private boolean closed = false;
+
+ public UpdateWriter(IndentedWriter out, SerializationContext sCxt)
{
- output(request, out, new SerializationContext(request)) ;
+ this.out = out;
+ this.sCxt = sCxt;
}
- public static void output(UpdateRequest request, IndentedWriter out, SerializationContext sCxt)
+ public void open()
{
- if ( sCxt == null )
- sCxt = new SerializationContext(request) ;
- prologue(out, sCxt.getPrologue()) ;
- boolean addSeparator = (request.getOperations().size() > 1) ;
- boolean first = true ;
-
- for ( Update update : request.getOperations() )
+ if (null != sCxt)
{
- out.ensureStartOfLine() ;
- if ( ! first )
- out.println() ;
- first = false ;
- outputUpdate(update, out, sCxt) ;
- if ( addSeparator )
- out.print(" ;") ;
+ prologue();
+ }
+ opened = true;
+ }
+
+ private void checkOpen()
+ {
+ if (!opened)
+ {
+ throw new UpdateException("UpdateStreamWriter is not opened. Call open() first.");
+ }
+ }
+
+ private void prologue()
+ {
+ int row1 = out.getRow() ;
+ PrologueSerializer.output(out, sCxt.getPrologue()) ;
+ int row2 = out.getRow() ;
+ if ( row1 != row2 )
+ out.newline() ;
+ }
+
+ private void prepareForDataUpdate(UpdateMode mode)
+ {
+ if ((null != udw) && !udw.getMode().equals(mode))
+ {
+ udw.close();
+ udw = null;
+ firstOp = false;
}
- // Update requests always end in newline.
- out.ensureStartOfLine() ;
- out.flush() ;
+ if (null == udw)
+ {
+ if (!firstOp)
+ {
+ out.println(" ;");
+ }
+ udw = new UpdateDataWriter(mode, out, sCxt);
+ udw.open();
+ firstOp = false;
+ }
}
- public static void output(Update update, IndentedWriter out, SerializationContext sCxt)
+ public void insert(Quad quad)
{
- if ( sCxt == null )
- sCxt = new SerializationContext() ;
- prologue(out, sCxt.getPrologue()) ;
- outputUpdate(update, out, sCxt) ;
- // Update operations do not end in newline.
- out.flush() ;
+ insert(quad.getGraph(), quad.asTriple());
+ }
+
+ public void insert(Node graph, Triple triple)
+ {
+ checkOpen();
+ prepareForDataUpdate(UpdateMode.INSERT);
+ udw.send(graph, triple);
+ }
+
+ public void delete(Quad quad)
+ {
+ delete(quad.getGraph(), quad.asTriple());
}
+ public void delete(Node graph, Triple triple)
+ {
+ checkOpen();
+ prepareForDataUpdate(UpdateMode.DELETE);
+ udw.send(graph, triple);
+ }
- private static void outputUpdate(Update update, IndentedWriter out, SerializationContext sCxt)
+ public void update(Update update)
{
+ checkOpen();
+ if (null != udw)
+ {
+ udw.close();
+ udw = null;
+ }
+
+ if (!firstOp)
+ {
+ out.println(" ;");
+ }
Writer writer = new Writer(out, sCxt) ;
update.visit(writer) ;
+
+ firstOp = false;
}
-
- private static void prologue(IndentedWriter out, Prologue prologue)
+
+ public void update(Iterable<Update> updates)
{
- int row1 = out.getRow() ;
- PrologueSerializer.output(out, prologue) ;
- int row2 = out.getRow() ;
- if ( row1 != row2 )
- out.newline() ;
+ for (Update update : updates)
+ {
+ update(update);
+ }
}
-
+
+ public void flush()
+ {
+ out.flush();
+ }
+
+ @Override
+ public void close()
+ {
+ if (!closed)
+ {
+ if (null != udw)
+ {
+ udw.close();
+ udw = null;
+ }
+
+ // Update requests always end in newline.
+ out.ensureStartOfLine();
+ flush();
+ closed = true;
+ }
+ }
+
+
+ // -- Convenience static methods -----------------------
+
+ public static void output(UpdateRequest request, IndentedWriter out)
+ {
+ output(request, out, null);
+ }
+
+ public static void output(UpdateRequest request, IndentedWriter out, SerializationContext sCxt)
+ {
+ if ( sCxt == null )
+ sCxt = new SerializationContext(request);
+
+ UpdateWriter uw = new UpdateWriter(out, sCxt);
+ uw.open();
+ uw.update(request.getOperations());
+ uw.close();
+ }
+
+ public static void output(Update update, IndentedWriter out, SerializationContext sCxt)
+ {
+ if ( sCxt == null )
+ sCxt = new SerializationContext();
+
+ UpdateWriter uw = new UpdateWriter(out, sCxt);
+ uw.open();
+ uw.update(update);
+ uw.close();
+ }
+
// newline policy - don't add until needed.
- public static class Writer implements UpdateVisitor
+ private static class Writer implements UpdateVisitor
{
private static final int BLOCK_INDENT = 2 ;
private final IndentedWriter out ;
@@ -224,17 +339,17 @@ public class UpdateWriter
@Override
public void visit(UpdateDataInsert update)
{
- out.ensureStartOfLine() ;
- out.print("INSERT DATA ") ;
- outputQuadsBraced(update.getQuads()) ;
+ UpdateDataWriter udw = new UpdateDataWriter(UpdateMode.INSERT, out, sCxt);
+ udw.open();
+ Iter.sendToSink(update.getQuads(), udw); // udw.close() is called by Iter.sendToSink()
}
@Override
public void visit(UpdateDataDelete update)
{
- out.ensureStartOfLine() ;
- out.print("DELETE DATA ") ;
- outputQuadsBraced(update.getQuads()) ;
+ UpdateDataWriter udw = new UpdateDataWriter(UpdateMode.DELETE, out, sCxt);
+ udw.open();
+ Iter.sendToSink(update.getQuads(), udw);
}
// Prettier later.
@@ -246,55 +361,10 @@ public class UpdateWriter
out.print("{ }") ;
return ;
}
- out.println("{") ;
- outputQuads(quads) ;
- out.print("}") ;
- }
-
- private void outputQuads(List<Quad> quads)
- {
- out.incIndent(BLOCK_INDENT) ;
- Node g = Quad.tripleInQuad ;
- boolean inBlock = false ;
- for ( Quad q : quads )
- {
- if ( q.getGraph() != g )
- {
- // New graph (default or named)
- if ( inBlock )
- {
- // In named - end it.
- out.decIndent(BLOCK_INDENT) ;
- out.println("}") ;
- inBlock = false ;
- }
-
- g = q.getGraph() ;
-
- // Start new block.
- // Two cases for no braces:
- // Quad.tripleInQuad and Quad.defaultGraphNodeGenerated ;
- if ( ! q.isTriple() && ! q.isDefaultGraphGenerated() )
- {
- out.print("GRAPH ") ;
- output(g) ;
- out.println(" {") ;
- out.incIndent(BLOCK_INDENT) ;
- inBlock = true ;
- }
- }
-
- outputTripleOfQuad(q) ;
- out.println(" .") ;
- }
-
- if ( inBlock )
- {
- out.decIndent(BLOCK_INDENT) ;
- out.println("}") ;
- inBlock = false ;
- }
- out.decIndent(BLOCK_INDENT) ;
+
+ SinkQuadBracedOutput sink = new SinkQuadBracedOutput(out, sCxt);
+ sink.open();
+ Iter.sendToSink(quads, sink);
}
private void output(Node node)
@@ -303,34 +373,6 @@ public class UpdateWriter
out.print($) ;
}
- private void outputQuad(Quad quad)
- {
- String qs = FmtUtils.stringForQuad(quad, sCxt.getPrefixMapping()) ;
-
- if ( quad.getGraph() != null )
- {
- String g = FmtUtils.stringForNode(quad.getGraph(), sCxt) ;
- out.print(g) ;
- out.print(" ") ;
- }
- outputTripleOfQuad(quad) ;
- out.println(" .") ;
- }
-
- private void outputTripleOfQuad(Quad quad)
- {
- String s = FmtUtils.stringForNode(quad.getSubject(), sCxt) ;
- String p = FmtUtils.stringForNode(quad.getPredicate(), sCxt) ;
- String o = FmtUtils.stringForNode(quad.getObject(), sCxt) ;
-
- out.print(s) ;
- out.print(" ") ;
- out.print(p) ;
- out.print(" ") ;
- out.print(o) ;
- }
-
-
@Override
public void visit(UpdateDeleteWhere update)
Added: incubator/jena/Jena2/ARQ/trunk/src/main/java/org/openjena/riot/out/SinkQuadBracedOutput.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/org/openjena/riot/out/SinkQuadBracedOutput.java?rev=1326877&view=auto
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/org/openjena/riot/out/SinkQuadBracedOutput.java (added)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/org/openjena/riot/out/SinkQuadBracedOutput.java Tue Apr 17 01:59:33 2012
@@ -0,0 +1,149 @@
+package org.openjena.riot.out;
+
+import java.io.OutputStream;
+
+import org.openjena.atlas.io.IndentedWriter;
+import org.openjena.atlas.lib.Closeable;
+import org.openjena.atlas.lib.Lib;
+import org.openjena.atlas.lib.Sink;
+
+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.serializer.SerializationContext;
+import com.hp.hpl.jena.sparql.util.FmtUtils;
+import com.hp.hpl.jena.update.UpdateException;
+
+/**
+ * A class that print quads, SPARQL style (maybe good for Trig too?)
+ */
+public class SinkQuadBracedOutput implements Sink<Quad>, Closeable
+{
+ protected static final int BLOCK_INDENT = 2 ;
+
+ protected final IndentedWriter out;
+ protected final SerializationContext sCxt;
+ protected boolean opened = false;
+ protected boolean closed = false;
+
+ private Node currentGraph;
+
+ public SinkQuadBracedOutput(OutputStream out)
+ {
+ this(out, new SerializationContext());
+ }
+
+ public SinkQuadBracedOutput(OutputStream out, SerializationContext sCxt)
+ {
+ this(new IndentedWriter(out), sCxt);
+ }
+
+ public SinkQuadBracedOutput(IndentedWriter out, SerializationContext sCxt)
+ {
+ if (out == null)
+ {
+ throw new IllegalArgumentException("out may not be null") ;
+ }
+
+ this.out = out;
+ this.sCxt = sCxt;
+ }
+
+ public void open()
+ {
+ out.println("{");
+ out.incIndent(BLOCK_INDENT);
+ opened = true;
+ }
+
+ private void checkOpen()
+ {
+ if (!opened)
+ {
+ throw new UpdateException("SinkQuadBracedOutput is not opened. Call open() first.");
+ }
+ }
+
+ @Override
+ public void send(Quad quad)
+ {
+ send(quad.getGraph(), quad.asTriple());
+ }
+
+ public void send(Node graphName, Triple triple)
+ {
+ checkOpen();
+ if (Quad.isDefaultGraph(graphName))
+ {
+ graphName = null;
+ }
+
+ if (!Lib.equal(currentGraph, graphName))
+ {
+ if (null != currentGraph)
+ {
+ out.decIndent(BLOCK_INDENT);
+ out.println("}");
+ }
+
+ if (null != graphName)
+ {
+ out.print("GRAPH ");
+ output(graphName);
+ out.println(" {");
+ out.incIndent(BLOCK_INDENT);
+ }
+ }
+
+ output(triple);
+ out.println(" .");
+
+ currentGraph = graphName;
+ }
+
+ private void output(Node node)
+ {
+ String n = FmtUtils.stringForNode(node, sCxt);
+ out.print(n);
+ }
+
+ private void output(Triple triple)
+ {
+ String s = FmtUtils.stringForNode(triple.getSubject(), sCxt) ;
+ String p = FmtUtils.stringForNode(triple.getPredicate(), sCxt) ;
+ String o = FmtUtils.stringForNode(triple.getObject(), sCxt) ;
+
+ out.print(s);
+ out.print(" ");
+ out.print(p);
+ out.print(" ");
+ out.print(o);
+ }
+
+ @Override
+ public void flush()
+ {
+ out.flush();
+ }
+
+ @Override
+ public void close()
+ {
+ if (!closed)
+ {
+ checkOpen();
+ if (null != currentGraph)
+ {
+ out.decIndent(BLOCK_INDENT);
+ out.println("}");
+ }
+
+ out.decIndent(BLOCK_INDENT);
+ out.print("}");
+
+ // Since we didn't create the OutputStream, we'll just flush it
+ flush();
+ closed = true;
+ }
+ }
+}