You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by rv...@apache.org on 2014/09/16 14:48:35 UTC

svn commit: r1625265 - in /jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request: UpdateWriter.java UpdateWriterVisitor.java

Author: rvesse
Date: Tue Sep 16 12:48:34 2014
New Revision: 1625265

URL: http://svn.apache.org/r1625265
Log:
Make UpdateWriter API extensible

Added:
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriterVisitor.java
Modified:
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java?rev=1625265&r1=1625264&r2=1625265&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java Tue Sep 16 12:48:34 2014
@@ -19,26 +19,18 @@
 package com.hp.hpl.jena.sparql.modify.request;
 
 import java.util.Iterator ;
-import java.util.List ;
 
 import org.apache.jena.atlas.io.IndentedWriter ;
-import org.apache.jena.atlas.iterator.Iter ;
 import org.apache.jena.atlas.lib.Closeable ;
-import org.apache.jena.atlas.lib.Sink ;
-import org.apache.jena.riot.out.SinkQuadBracedOutput ;
 import org.apache.jena.riot.system.IRIResolver ;
 
 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.Prologue ;
 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.sparql.util.NodeToLabelMapBNode ;
 import com.hp.hpl.jena.update.Update ;
 import com.hp.hpl.jena.update.UpdateRequest ;
@@ -77,13 +69,13 @@ public class UpdateWriter implements Clo
         opened = true;
     }
     
-    private void checkOpen()
+    protected void checkOpen()
     {
         if (!opened)
             throw new IllegalStateException("UpdateStreamWriter is not opened.  Call open() first.");
     }
     
-    private void prologue()
+    protected void prologue()
     {
         int row1 = out.getRow() ;
         PrologueSerializer.output(out, sCxt.getPrologue()) ;
@@ -92,7 +84,7 @@ public class UpdateWriter implements Clo
             out.newline() ;
     }
     
-    private void prepareForDataUpdate(UpdateMode mode)
+    protected void prepareForDataUpdate(UpdateMode mode)
     {
         if ((null != udw) && !udw.getMode().equals(mode))
         {
@@ -190,11 +182,19 @@ public class UpdateWriter implements Clo
         {
             out.println(" ;");
         }
-        Writer writer = new Writer(out, sCxt) ;
+        UpdateVisitor writer = prepareWriterVisitor() ;
         update.visit(writer) ; 
         
         firstOp = false;
     }
+
+    /**
+     * Prepares a visitor which is used to visit the actual updates that make up the update request and write them out
+     * @return Update visitor
+     */
+    protected UpdateVisitor prepareWriterVisitor() {
+        return new UpdateWriterVisitor(out, sCxt);
+    }
     
     public void update(Iterable<? extends Update> updates)
     {
@@ -259,259 +259,4 @@ public class UpdateWriter implements Clo
         uw.update(update);
         uw.close();
     }
-
-    // newline policy - don't add until needed.
-    private static class Writer implements UpdateVisitor
-    {
-        private static final int BLOCK_INDENT = 2 ;
-        private final IndentedWriter out ;
-        private final SerializationContext sCxt ;
-
-        public Writer(IndentedWriter out, SerializationContext sCxt)
-        {
-            this.out = out ;
-            this.sCxt = sCxt ;
-        }
-
-        private void visitDropClear(String name, UpdateDropClear update)
-        {
-            out.ensureStartOfLine() ;
-            out.print(name) ;
-            out.print(" ") ;
-            if ( update.isSilent() )
-                out.print("SILENT ") ;
-            
-            printTarget(update.getTarget()) ;
-            
-        }
-    
-        private void printTarget(Target target)
-        {
-            if ( target.isAll() )               { out.print("ALL") ; }
-            else if ( target.isAllNamed() )     { out.print("NAMED") ; }
-            else if ( target.isDefault() )      { out.print("DEFAULT") ; }
-            else if ( target.isOneNamedGraph() )
-            { 
-                out.print("GRAPH ") ;
-                String s = FmtUtils.stringForNode(target.getGraph(), sCxt) ;
-                out.print(s) ;
-            }
-            else
-            {
-                out.print("Target BROKEN") ;
-                throw new ARQException("Malformed Target") ;
-            }
-        }
-
-        @Override
-        public void visit(UpdateDrop update)
-        { visitDropClear("DROP", update) ; }
-
-        @Override
-        public void visit(UpdateClear update)
-        { visitDropClear("CLEAR", update) ; }
-
-        @Override
-        public void visit(UpdateCreate update)
-        {
-            out.ensureStartOfLine() ;
-            out.print("CREATE") ;
-            out.print(" ") ;
-            if ( update.isSilent() )
-                out.print("SILENT ") ;
-            out.print("GRAPH") ;
-            out.print(" ") ;
-            String s = FmtUtils.stringForNode(update.getGraph(), sCxt) ;
-            out.print(s) ;
-        }
-
-        @Override
-        public void visit(UpdateLoad update)
-        {
-            out.ensureStartOfLine() ;
-            out.print("LOAD") ;
-            out.print(" ") ;
-            if ( update.getSilent() )
-                out.print("SILENT ") ;
-            
-            outputStringAsURI(update.getSource()) ;
-            
-            if ( update.getDest() != null )
-            {
-                out.print(" INTO GRAPH ") ;
-                output(update.getDest()) ;
-            }
-        }
-
-        private void outputStringAsURI(String uriStr)
-        {
-            String x = FmtUtils.stringForURI(uriStr, sCxt) ;
-            out.print(x) ;
-        }
-        
-        private void printTargetUpdate2(Target target)
-        {
-            if ( target.isDefault() )      { out.print("DEFAULT") ; }
-            else if ( target.isOneNamedGraph() )
-            { 
-                //out.print("GRAPH ") ;
-                String s = FmtUtils.stringForNode(target.getGraph(), sCxt) ;
-                out.print(s) ;
-            }
-            else
-            {
-                out.print("Target BROKEN / Update2") ;
-                throw new ARQException("Malformed Target / Update2") ;
-            }
-        }
-        
-        private void printUpdate2(UpdateBinaryOp update, String name)
-        {
-            out.print(name) ;
-            if ( update.getSilent() )
-                out.print(" SILENT") ;
-            out.print(" ") ;
-            printTargetUpdate2(update.getSrc()) ;
-            out.print(" TO ") ;
-            printTargetUpdate2(update.getDest()) ;
-        }
-        
-        
-        @Override
-        public void visit(UpdateAdd update)
-        { printUpdate2(update, "ADD") ; }
-
-        @Override
-        public void visit(UpdateCopy update)
-        { printUpdate2(update, "COPY") ; }
-
-        @Override
-        public void visit(UpdateMove update)
-        { printUpdate2(update, "MOVE") ; }
-
-
-        @Override
-        public Sink<Quad> createInsertDataSink()
-        {
-            UpdateDataWriter udw = new UpdateDataWriter(UpdateMode.INSERT, out, sCxt);
-            udw.open();
-            return udw;
-        }
-
-        @Override
-        public void visit(UpdateDataInsert update)
-        {
-            Iter.sendToSink(update.getQuads(), createInsertDataSink());  // Iter.sendToSink() will call close() on the sink
-        }
-        
-        @Override
-        public Sink<Quad> createDeleteDataSink()
-        {
-            UpdateDataWriter udw = new UpdateDataWriter(UpdateMode.DELETE, out, sCxt);
-            udw.open();
-            return udw;
-        }
-
-        @Override
-        public void visit(UpdateDataDelete update)
-        {
-            Iter.sendToSink(update.getQuads(), createDeleteDataSink()); // Iter.sendToSink() will call close() on the sink
-        }
-
-        // Prettier later.
-        
-        private void outputQuadsBraced(List<Quad> quads)
-        {
-            if ( quads.size() == 0 )
-            {
-                out.print("{ }") ;
-                return ;
-            }
-            
-            SinkQuadBracedOutput sink = new SinkQuadBracedOutput(out, sCxt);
-            sink.open();
-            Iter.sendToSink(quads, sink);
-        }
-        
-        private void output(Node node)
-        { 
-            String $ = FmtUtils.stringForNode(node, sCxt) ;
-            out.print($) ;
-        }
-
-        
-        @Override
-        public void visit(UpdateDeleteWhere update)
-        {
-            out.ensureStartOfLine() ;
-            out.println("DELETE WHERE ") ;
-            outputQuadsBraced(update.getQuads()) ;
-        }
-
-        @Override
-        public void visit(UpdateModify update)
-        {
-            out.ensureStartOfLine() ;
-            if ( update.getWithIRI() != null )
-            {
-                //out.ensureStartOfLine() ;
-                out.print("WITH ") ;
-                output(update.getWithIRI()) ;
-            }
-            
-            
-            if ( update.hasDeleteClause() )
-            {
-                List<Quad> deleteQuads = update.getDeleteQuads() ;
-                out.ensureStartOfLine() ;
-                out.print("DELETE ") ;
-                outputQuadsBraced(deleteQuads) ;
-            }
-            
-            
-            if ( update.hasInsertClause() )
-            {
-                List<Quad> insertQuads = update.getInsertQuads() ;
-                out.ensureStartOfLine() ;
-                out.print("INSERT ") ;
-                outputQuadsBraced(insertQuads) ;
-            }
-            
-            if ( ! update.hasInsertClause() && ! update.hasDeleteClause() )
-            {
-                // Fake a clause to make it legal syntax.
-                out.ensureStartOfLine() ;
-                out.println("INSERT { }") ;
-            }
-            
-            for ( Node x : update.getUsing() )
-            {
-                out.ensureStartOfLine() ;
-                out.print("USING ") ;
-                output(x) ;
-            }
-            
-            for ( Node x : update.getUsingNamed() )
-            {
-                out.ensureStartOfLine() ;
-                out.print("USING NAMED ") ;
-                output(x) ;
-            }
-             
-            Element el = update.getWherePattern() ;
-            out.ensureStartOfLine() ;
-            out.print("WHERE") ;
-            out.incIndent(BLOCK_INDENT) ;
-            out.newline() ;
-
-            if ( el != null )
-            {
-                FormatterElement fmtElement = new FormatterElement(out, sCxt) ;
-                fmtElement.visitAsGroup(el) ;
-            }
-            else
-                out.print("{}") ;
-            out.decIndent(BLOCK_INDENT) ;
-        }
-    }
 }

Added: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriterVisitor.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriterVisitor.java?rev=1625265&view=auto
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriterVisitor.java (added)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriterVisitor.java Tue Sep 16 12:48:34 2014
@@ -0,0 +1,272 @@
+package com.hp.hpl.jena.sparql.modify.request;
+
+import java.util.List;
+
+import org.apache.jena.atlas.io.IndentedWriter;
+import org.apache.jena.atlas.iterator.Iter;
+import org.apache.jena.atlas.lib.Sink;
+import org.apache.jena.riot.out.SinkQuadBracedOutput;
+
+import com.hp.hpl.jena.graph.Node;
+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.SerializationContext;
+import com.hp.hpl.jena.sparql.syntax.Element;
+import com.hp.hpl.jena.sparql.util.FmtUtils;
+
+// newline policy - don't add until needed.
+class UpdateWriterVisitor implements UpdateVisitor
+{
+    private static final int BLOCK_INDENT = 2 ;
+    private final IndentedWriter out ;
+    private final SerializationContext sCxt ;
+
+    public UpdateWriterVisitor(IndentedWriter out, SerializationContext sCxt)
+    {
+        this.out = out ;
+        this.sCxt = sCxt ;
+    }
+
+    protected void visitDropClear(String name, UpdateDropClear update)
+    {
+        out.ensureStartOfLine() ;
+        out.print(name) ;
+        out.print(" ") ;
+        if ( update.isSilent() )
+            out.print("SILENT ") ;
+        
+        printTarget(update.getTarget()) ;
+        
+    }
+
+    protected void printTarget(Target target)
+    {
+        if ( target.isAll() )               { out.print("ALL") ; }
+        else if ( target.isAllNamed() )     { out.print("NAMED") ; }
+        else if ( target.isDefault() )      { out.print("DEFAULT") ; }
+        else if ( target.isOneNamedGraph() )
+        { 
+            out.print("GRAPH ") ;
+            String s = FmtUtils.stringForNode(target.getGraph(), sCxt) ;
+            out.print(s) ;
+        }
+        else
+        {
+            out.print("Target BROKEN") ;
+            throw new ARQException("Malformed Target") ;
+        }
+    }
+
+    @Override
+    public void visit(UpdateDrop update)
+    { visitDropClear("DROP", update) ; }
+
+    @Override
+    public void visit(UpdateClear update)
+    { visitDropClear("CLEAR", update) ; }
+
+    @Override
+    public void visit(UpdateCreate update)
+    {
+        out.ensureStartOfLine() ;
+        out.print("CREATE") ;
+        out.print(" ") ;
+        if ( update.isSilent() )
+            out.print("SILENT ") ;
+        out.print("GRAPH") ;
+        out.print(" ") ;
+        String s = FmtUtils.stringForNode(update.getGraph(), sCxt) ;
+        out.print(s) ;
+    }
+
+    @Override
+    public void visit(UpdateLoad update)
+    {
+        out.ensureStartOfLine() ;
+        out.print("LOAD") ;
+        out.print(" ") ;
+        if ( update.getSilent() )
+            out.print("SILENT ") ;
+        
+        outputStringAsURI(update.getSource()) ;
+        
+        if ( update.getDest() != null )
+        {
+            out.print(" INTO GRAPH ") ;
+            output(update.getDest()) ;
+        }
+    }
+
+    protected void outputStringAsURI(String uriStr)
+    {
+        String x = FmtUtils.stringForURI(uriStr, sCxt) ;
+        out.print(x) ;
+    }
+    
+    protected void printTargetUpdate2(Target target)
+    {
+        if ( target.isDefault() )      { out.print("DEFAULT") ; }
+        else if ( target.isOneNamedGraph() )
+        { 
+            //out.print("GRAPH ") ;
+            String s = FmtUtils.stringForNode(target.getGraph(), sCxt) ;
+            out.print(s) ;
+        }
+        else
+        {
+            out.print("Target BROKEN / Update2") ;
+            throw new ARQException("Malformed Target / Update2") ;
+        }
+    }
+    
+    protected void printUpdate2(UpdateBinaryOp update, String name)
+    {
+        out.print(name) ;
+        if ( update.getSilent() )
+            out.print(" SILENT") ;
+        out.print(" ") ;
+        printTargetUpdate2(update.getSrc()) ;
+        out.print(" TO ") ;
+        printTargetUpdate2(update.getDest()) ;
+    }
+    
+    
+    @Override
+    public void visit(UpdateAdd update)
+    { printUpdate2(update, "ADD") ; }
+
+    @Override
+    public void visit(UpdateCopy update)
+    { printUpdate2(update, "COPY") ; }
+
+    @Override
+    public void visit(UpdateMove update)
+    { printUpdate2(update, "MOVE") ; }
+
+
+    @Override
+    public Sink<Quad> createInsertDataSink()
+    {
+        UpdateDataWriter udw = new UpdateDataWriter(UpdateMode.INSERT, out, sCxt);
+        udw.open();
+        return udw;
+    }
+
+    @Override
+    public void visit(UpdateDataInsert update)
+    {
+        Iter.sendToSink(update.getQuads(), createInsertDataSink());  // Iter.sendToSink() will call close() on the sink
+    }
+    
+    @Override
+    public Sink<Quad> createDeleteDataSink()
+    {
+        UpdateDataWriter udw = new UpdateDataWriter(UpdateMode.DELETE, out, sCxt);
+        udw.open();
+        return udw;
+    }
+
+    @Override
+    public void visit(UpdateDataDelete update)
+    {
+        Iter.sendToSink(update.getQuads(), createDeleteDataSink()); // Iter.sendToSink() will call close() on the sink
+    }
+
+    // Prettier later.
+    
+    protected void outputQuadsBraced(List<Quad> quads)
+    {
+        if ( quads.size() == 0 )
+        {
+            out.print("{ }") ;
+            return ;
+        }
+        
+        SinkQuadBracedOutput sink = new SinkQuadBracedOutput(out, sCxt);
+        sink.open();
+        Iter.sendToSink(quads, sink);
+    }
+    
+    protected void output(Node node)
+    { 
+        String $ = FmtUtils.stringForNode(node, sCxt) ;
+        out.print($) ;
+    }
+
+    
+    @Override
+    public void visit(UpdateDeleteWhere update)
+    {
+        out.ensureStartOfLine() ;
+        out.println("DELETE WHERE ") ;
+        outputQuadsBraced(update.getQuads()) ;
+    }
+
+    @Override
+    public void visit(UpdateModify update)
+    {
+        out.ensureStartOfLine() ;
+        if ( update.getWithIRI() != null )
+        {
+            //out.ensureStartOfLine() ;
+            out.print("WITH ") ;
+            output(update.getWithIRI()) ;
+        }
+        
+        
+        if ( update.hasDeleteClause() )
+        {
+            List<Quad> deleteQuads = update.getDeleteQuads() ;
+            out.ensureStartOfLine() ;
+            out.print("DELETE ") ;
+            outputQuadsBraced(deleteQuads) ;
+        }
+        
+        
+        if ( update.hasInsertClause() )
+        {
+            List<Quad> insertQuads = update.getInsertQuads() ;
+            out.ensureStartOfLine() ;
+            out.print("INSERT ") ;
+            outputQuadsBraced(insertQuads) ;
+        }
+        
+        if ( ! update.hasInsertClause() && ! update.hasDeleteClause() )
+        {
+            // Fake a clause to make it legal syntax.
+            out.ensureStartOfLine() ;
+            out.println("INSERT { }") ;
+        }
+        
+        for ( Node x : update.getUsing() )
+        {
+            out.ensureStartOfLine() ;
+            out.print("USING ") ;
+            output(x) ;
+        }
+        
+        for ( Node x : update.getUsingNamed() )
+        {
+            out.ensureStartOfLine() ;
+            out.print("USING NAMED ") ;
+            output(x) ;
+        }
+         
+        Element el = update.getWherePattern() ;
+        out.ensureStartOfLine() ;
+        out.print("WHERE") ;
+        out.incIndent(BLOCK_INDENT) ;
+        out.newline() ;
+
+        if ( el != null )
+        {
+            FormatterElement fmtElement = new FormatterElement(out, sCxt) ;
+            fmtElement.visitAsGroup(el) ;
+        }
+        else
+            out.print("{}") ;
+        out.decIndent(BLOCK_INDENT) ;
+    }
+}
\ No newline at end of file