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